Skip to content

Commit

Permalink
improved horizontal popup.
Browse files Browse the repository at this point in the history
  • Loading branch information
kosh committed Sep 24, 2015
1 parent 2a18dcb commit 013a05b
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
import java.util.ArrayList;
import java.util.List;

import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
import static android.view.WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
Expand All @@ -52,7 +52,7 @@
*/
public class FloatingHorizontalLayout implements OnFloatingTouchListener, OnItemClickListener {

private LayoutParams mParams;
private LayoutParams mParams, rParams;
private WindowManager windowManager;
private Context context;
private LayoutParams paramsF;
Expand All @@ -67,7 +67,6 @@ public class FloatingHorizontalLayout implements OnFloatingTouchListener, OnItem
private MyPopupAppsLoader onMyAppsLoader;
private Tracker tracker = AppController.getController().tracker();
private View view;
private RecyclerView recyclerView;

public FloatingHorizontalLayout(Context context) {
this.context = context;
Expand All @@ -90,60 +89,82 @@ private void initWindows() {
windowManager.getDefaultDisplay().getSize(szWindow);
mParams = new LayoutParams(TYPE_PRIORITY_PHONE /* to appear on top of keyboard */, FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
rParams = new LayoutParams(TYPE_PRIORITY_PHONE /* to appear on top of keyboard */, FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
setupParams();
mParams.gravity = Gravity.LEFT | Gravity.TOP;
rParams.gravity = Gravity.LEFT | Gravity.TOP;
initView();
}

private void setupParams() {
int gapSize = AppHelper.getFinalSize(context);
mParams.width = WRAP_CONTENT;
mParams.height = gapSize * 2;
int iconSize = AppHelper.getFinalSize(context);
int pX = AppHelper.getPositionX(context);
int pY = AppHelper.getPositionY(context);
rParams.width = MATCH_PARENT;
rParams.height = iconSize;
mParams.width = iconSize;
mParams.height = iconSize;
if (AppHelper.isSavePositionEnabled(context)) {
mParams.x = AppHelper.getPositionX(context);
mParams.y = AppHelper.getPositionY(context);
mParams.x = pX;
mParams.y = pY;
rParams.y = pY + iconSize;
rParams.x = pX;
} else {
mParams.x = 0;
mParams.y = 100;
rParams.x = 0;
rParams.y = 100 + iconSize;
}
}

private void initView() {
view = LayoutInflater.from(context).inflate(R.layout.floating_layout_list, null);
floatingImage = (ImageView) view.findViewById(R.id.floatingImage);
recyclerView = (RecyclerView) view.findViewById(R.id.recycler);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler);
recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
recyclerView.setItemAnimator(new DefaultItemAnimator());
setupBackground();
hideRecycler();
recyclerView.setAdapter(adapter);
windowManager.addView(view, rParams);
if (floatingImage == null) floatingImage = new ImageView(context);
setupFloatingImage(false);
windowManager.addView(view, mParams);
floatingImage.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
gestureDetector.onTouchEvent(event);
return FloatingHorizontalLayout.this.onTouch(v, event);
}
});
windowManager.addView(floatingImage, mParams);
onMyAppsLoader = new MyPopupAppsLoader(context, this);
onMyAppsLoader.registerListener(3, onLoadCompleteListener);
onMyAppsLoader.startLoading();
}

private void hideRecycler() {
recyclerView.setVisibility(View.GONE);
view.setVisibility(View.GONE);
}

private void showRecycler() {
recyclerView.setVisibility(View.VISIBLE);
int iconSize = AppHelper.getFinalSize(context);
if (paramsF != null) {
rParams.x = paramsF.x;
if (paramsF.y + iconSize / 2 > szWindow.y / 2) {
rParams.y = paramsF.y - iconSize;
} else if (paramsF.y + iconSize / 2 <= szWindow.y / 2) {
rParams.y = paramsF.y + iconSize;
}
windowManager.updateViewLayout(view, rParams);
}
view.setVisibility(View.VISIBLE);
}

private void setupBackground() {
Drawable drawable = AppHelper.getColorDrawable(AppHelper.getFABackground(context));
drawable.setAlpha(AppHelper.getBackgroundAlpha(context));
if (recyclerView != null) {
recyclerView.setBackground(drawable);
if (view != null) {
view.setBackground(drawable);
showRecycler();
}
}
Expand All @@ -154,22 +175,21 @@ private void setupFloatingImage(boolean update) {
} else {
floatingImage.setImageResource(R.mipmap.ic_launcher);
}
int gapSize = AppHelper.getFinalSize(context);
floatingImage.getLayoutParams().width = gapSize;
floatingImage.requestLayout();
if (adapter != null) adapter.notifyDataSetChanged();
if (update) {
if (windowManager != null)
try {
windowManager.updateViewLayout(FloatingHorizontalLayout.this.view, mParams);
windowManager.updateViewLayout(FloatingHorizontalLayout.this.floatingImage, mParams);
windowManager.updateViewLayout(FloatingHorizontalLayout.this.view, rParams);
} catch (Exception e) {
e.printStackTrace();
}
}
}

public void onDestroy() {
if (windowManager != null && view != null) {
if (windowManager != null && floatingImage != null) {
windowManager.removeViewImmediate(floatingImage);
windowManager.removeViewImmediate(view);
}
if (onMyAppsLoader != null) {
Expand All @@ -193,7 +213,7 @@ public void onClick() {
animateShowing();
try {
HitBuilders.EventBuilder eventBuilder = new HitBuilders.EventBuilder();
if (recyclerView.isShown()) {
if (view.isShown()) {
hideRecycler();
eventBuilder.setCategory("FloatingHorizontalLayout")
.setAction("hide")
Expand Down Expand Up @@ -231,7 +251,6 @@ public void onDoubleClick() {
context.startActivity(startMain);
}
HitBuilders.EventBuilder eventBuilder = new HitBuilders.EventBuilder();

eventBuilder
.setCategory("FloatingHorizontalLayout")
.setAction("onDoubleClick")
Expand All @@ -249,7 +268,7 @@ public boolean onTouch(View v, MotionEvent event) {
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
animateShowing();
return true;
break;
case MotionEvent.ACTION_UP:
if (AppHelper.isEdged(context)) {
moveToEdge();
Expand All @@ -259,17 +278,25 @@ public boolean onTouch(View v, MotionEvent event) {
}
}
animateHidden();
return true;
break;
case MotionEvent.ACTION_MOVE:
paramsF.x = initialX + (int) (event.getRawX() - initialTouchX);
paramsF.y = initialY + (int) (event.getRawY() - initialTouchY);
try {
windowManager.updateViewLayout(FloatingHorizontalLayout.this.view, paramsF);
} catch (Exception e) {
e.printStackTrace();
if (paramsF.y >= 0 && paramsF.y < (szWindow.y - AppHelper.getFinalSize(context))) {
paramsF.x = initialX + (int) (event.getRawX() - initialTouchX);
paramsF.y = initialY + (int) (event.getRawY() - initialTouchY);
try {
windowManager.updateViewLayout(FloatingHorizontalLayout.this.floatingImage, paramsF);
rParams.x = paramsF.x;
rParams.y = paramsF.y + AppHelper.getFinalSize(context);
windowManager.updateViewLayout(FloatingHorizontalLayout.this.view, rParams);
} catch (Exception e) {
e.printStackTrace();
}
animateShowing();
}
animateShowing();
return true;
if (paramsF.y < 0) {
paramsF.y = 0;
}
break;
}
return false;
}
Expand All @@ -284,14 +311,14 @@ public void onTick(long t) {
long step = (500 - t) / 5;
paramsF.x = (int) (double) bounceValue(step, x) - floatingImage.getWidth();
try {
windowManager.updateViewLayout(FloatingHorizontalLayout.this.view, paramsF);
windowManager.updateViewLayout(FloatingHorizontalLayout.this.floatingImage, paramsF);
} catch (Exception ignored) {}
}

public void onFinish() {
paramsF.x = 0;
try {
windowManager.updateViewLayout(FloatingHorizontalLayout.this.view, paramsF);
windowManager.updateViewLayout(FloatingHorizontalLayout.this.floatingImage, paramsF);
} catch (Exception ignored) {}
if (AppHelper.isSavePositionEnabled(context)) {
AppHelper.savePosition(context, paramsF.y, paramsF.x);
Expand All @@ -306,14 +333,14 @@ public void onTick(long t) {
long step = (500 - t) / 5;
paramsF.x = szWindow.x + (int) (double) bounceValue(step, x);
try {
windowManager.updateViewLayout(FloatingHorizontalLayout.this.view, paramsF);
windowManager.updateViewLayout(FloatingHorizontalLayout.this.floatingImage, paramsF);
} catch (Exception ignored) {}
}

public void onFinish() {
paramsF.x = szWindow.x - floatingImage.getWidth();
try {
windowManager.updateViewLayout(FloatingHorizontalLayout.this.view, paramsF);
windowManager.updateViewLayout(FloatingHorizontalLayout.this.floatingImage, paramsF);
} catch (Exception ignored) {}
if (AppHelper.isSavePositionEnabled(context)) {
AppHelper.savePosition(context, paramsF.y, paramsF.x);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ public boolean onTouch(View v, MotionEvent event) {
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
animateShowing();
return true;
break;
case MotionEvent.ACTION_UP:
if (AppHelper.isEdged(context)) {
moveToEdge();
Expand All @@ -279,7 +279,7 @@ public boolean onTouch(View v, MotionEvent event) {
}
}
animateHidden();
return true;
break;
case MotionEvent.ACTION_MOVE:
paramsF.x = initialX + (int) (event.getRawX() - initialTouchX);
paramsF.y = initialY + (int) (event.getRawY() - initialTouchY);
Expand All @@ -299,7 +299,7 @@ public boolean onTouch(View v, MotionEvent event) {
e.printStackTrace();
}
animateShowing();
return true;
break;
}
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
android:animateLayoutChanges="true"
android:orientation="horizontal">

<ImageView
android:id="@+id/floatingImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"/>
<!--<ImageView-->
<!--android:id="@+id/floatingImage"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:adjustViewBounds="true"/>-->

<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
Expand Down

0 comments on commit 013a05b

Please sign in to comment.