summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--res/layout/dialtacts_activity.xml51
-rw-r--r--src/com/android/dialer/DialtactsActivity.java46
-rw-r--r--src/com/android/dialer/list/DragDropController.java40
-rw-r--r--src/com/android/dialer/list/PhoneFavoriteListView.java48
-rw-r--r--src/com/android/dialer/list/RemoveView.java53
5 files changed, 141 insertions, 97 deletions
diff --git a/res/layout/dialtacts_activity.xml b/res/layout/dialtacts_activity.xml
index 2cd796b60..e4e2a238b 100644
--- a/res/layout/dialtacts_activity.xml
+++ b/res/layout/dialtacts_activity.xml
@@ -46,30 +46,37 @@
android:id="@+id/search_and_remove_view_container"
android:visibility="gone"
>
- <com.android.dialer.list.RemoveView
- android:layout_width="match_parent"
- android:layout_height="56dp"
- android:id="@+id/remove_view_container"
- android:orientation="horizontal"
- android:gravity="center">
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/remove_view_icon"
- android:src="@drawable/ic_remove"
- android:contentDescription="@string/remove_contact"
- />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/remove_view_text"
- android:textSize="@dimen/remove_text_size"
- android:textColor="@color/remove_text_color"
- android:text="@string/remove_contact"
- />
- </com.android.dialer.list.RemoveView>
</FrameLayout>
</RelativeLayout>
+ <com.android.dialer.list.RemoveView
+ android:layout_width="match_parent"
+ android:layout_height="56dp"
+ android:id="@+id/remove_view"
+ android:layout_alignParentTop="true"
+ >
+ <LinearLayout
+ android:id="@+id/remove_view_container"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:gravity="center"
+ android:orientation="horizontal">
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/remove_view_icon"
+ android:src="@drawable/ic_remove"
+ android:contentDescription="@string/remove_contact"
+ />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/remove_view_text"
+ android:textSize="@dimen/remove_text_size"
+ android:textColor="@color/remove_text_color"
+ android:text="@string/remove_contact"
+ />
+ </LinearLayout>
+ </com.android.dialer.list.RemoveView >
<FrameLayout
android:layout_height="@dimen/floating_action_button_height"
android:layout_width="@dimen/floating_action_button_width"
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index e0e976285..7aaa89742 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -44,10 +44,12 @@ import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
+import android.view.DragEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.view.View.OnDragListener;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
@@ -184,9 +186,6 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
*/
private String mPendingSearchViewQuery;
- // This view points to the Framelayout that houses both the search view and remove view
- // containers.
- private View mSearchAndRemoveViewContainer;
private EditText mSearchView;
private View mSearchViewCloseButton;
private View mVoiceSearchButton;
@@ -195,13 +194,14 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
* If the user releases a contact when hovering on top of this, the contact is unfavorited and
* removed from the speed dial list.
*/
- private RemoveView mRemoveViewContainer;
+ private View mRemoveViewContainer;
final Interpolator hideActionBarInterpolator = new AccelerateInterpolator(1.5f);
final Interpolator showActionBarInterpolator = new DecelerateInterpolator(1.5f);
private String mSearchQuery;
private DialerDatabaseHelper mDialerDatabaseHelper;
+ private DragDropController mDragDropController;
private class OverflowPopupMenu extends PopupMenu {
public OverflowPopupMenu(Context context, View anchor) {
@@ -219,6 +219,21 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
}
/**
+ * Listener that listens to drag events and sends their x and y coordinates to a
+ * {@link DragDropController}.
+ */
+ private class LayoutOnDragListener implements OnDragListener {
+ @Override
+ public boolean onDrag(View v, DragEvent event) {
+ if (event.getAction() == DragEvent.ACTION_DRAG_LOCATION) {
+ mDragDropController.handleDragHovered(v, (int) event.getX(),
+ (int) event.getY());
+ }
+ return true;
+ }
+ }
+
+ /**
* Listener used when one of phone numbers in search UI is selected. This will initiate a
* phone call using the phone number.
*/
@@ -362,11 +377,12 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
mDialpadButton = findViewById(R.id.dialpad_button);
mDialpadButton.setOnClickListener(this);
- mRemoveViewContainer = (RemoveView) findViewById(R.id.remove_view_container);
- mSearchAndRemoveViewContainer = findViewById(R.id.search_and_remove_view_container);
+ mRemoveViewContainer = findViewById(R.id.remove_view_container);
mDialerDatabaseHelper = DatabaseHelperManager.getDatabaseHelper(this);
SmartDialPrefix.initializeNanpSettings(this);
+
+ findViewById(R.id.dialtacts_mainlayout).setOnDragListener(new LayoutOnDragListener());
}
@Override
@@ -574,13 +590,6 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
ft.commit();
}
- final AnimatorListener mHideListener = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mSearchAndRemoveViewContainer.setVisibility(View.GONE);
- }
- };
-
private boolean getInSearchUi() {
return mInDialpadSearch || mInRegularSearch;
}
@@ -936,11 +945,12 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
@Override
public void onDragStarted(int x, int y, PhoneFavoriteSquareTileView view) {
getActionBar().hide();
- mSearchAndRemoveViewContainer.setVisibility(View.VISIBLE);
+ mRemoveViewContainer.setVisibility(View.VISIBLE);
}
@Override
- public void onDragHovered(int x, int y, PhoneFavoriteSquareTileView view) {}
+ public void onDragHovered(int x, int y, PhoneFavoriteSquareTileView view) {
+ }
/**
* Called when the user has released a contact tile after long-pressing it.
@@ -948,7 +958,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
@Override
public void onDragFinished(int x, int y) {
getActionBar().show();
- mSearchAndRemoveViewContainer.setVisibility(View.GONE);
+ mRemoveViewContainer.setVisibility(View.GONE);
}
@Override
@@ -960,7 +970,9 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
*/
@Override
public void setDragDropController(DragDropController dragController) {
- mRemoveViewContainer.setDragDropController(dragController);
+ mDragDropController = dragController;
+ ((RemoveView) findViewById(R.id.remove_view))
+ .setDragDropController(dragController);
}
@Override
diff --git a/src/com/android/dialer/list/DragDropController.java b/src/com/android/dialer/list/DragDropController.java
index db4dd5937..8cd1046e6 100644
--- a/src/com/android/dialer/list/DragDropController.java
+++ b/src/com/android/dialer/list/DragDropController.java
@@ -1,5 +1,8 @@
package com.android.dialer.list;
+import android.util.Log;
+import android.view.View;
+
import java.util.ArrayList;
import java.util.List;
@@ -8,27 +11,48 @@ import java.util.List;
* off events to any OnDragDropListeners that have registered for callbacks.
*/
public class DragDropController {
- private List<OnDragDropListener> mOnDragDropListeners = new ArrayList<OnDragDropListener>();
+
+ private final List<OnDragDropListener> mOnDragDropListeners =
+ new ArrayList<OnDragDropListener>();
+ private final DragItemContainer mDragItemContainer;
+ private final int[] mLocationOnScreen = new int[2];
+
+ /**
+ * Callback interface used to retrieve views based on the current touch coordinates of the
+ * drag event. The {@link DragItemContainer} houses the draggable views that this
+ * {@link DragDropController} controls.
+ */
+ public interface DragItemContainer {
+ public PhoneFavoriteSquareTileView getViewForLocation(int x, int y);
+ }
+
+ public DragDropController(DragItemContainer dragItemContainer) {
+ mDragItemContainer = dragItemContainer;
+ }
/**
* @return True if the drag is started, false if the drag is cancelled for some reason.
*/
- boolean handleDragStarted(int x, int y, PhoneFavoriteSquareTileView tileView) {
+ boolean handleDragStarted(int x, int y) {
+ final PhoneFavoriteSquareTileView tileView = mDragItemContainer.getViewForLocation(x, y);
if (tileView == null) {
return false;
}
- if (tileView != null && !mOnDragDropListeners.isEmpty()) {
- for (int i = 0; i < mOnDragDropListeners.size(); i++) {
- mOnDragDropListeners.get(i).onDragStarted(x, y, tileView);
- }
+ for (int i = 0; i < mOnDragDropListeners.size(); i++) {
+ mOnDragDropListeners.get(i).onDragStarted(x, y, tileView);
}
return true;
}
- public void handleDragHovered(int x, int y, PhoneFavoriteSquareTileView view) {
+ public void handleDragHovered(View v, int x, int y) {
+ v.getLocationOnScreen(mLocationOnScreen);
+ final int screenX = x + mLocationOnScreen[0];
+ final int screenY = y + mLocationOnScreen[1];
+ final PhoneFavoriteSquareTileView view = mDragItemContainer.getViewForLocation(
+ screenX, screenY);
for (int i = 0; i < mOnDragDropListeners.size(); i++) {
- mOnDragDropListeners.get(i).onDragHovered(x, y, view);
+ mOnDragDropListeners.get(i).onDragHovered(screenX, screenY, view);
}
}
diff --git a/src/com/android/dialer/list/PhoneFavoriteListView.java b/src/com/android/dialer/list/PhoneFavoriteListView.java
index 6c3d62a59..074cc07d6 100644
--- a/src/com/android/dialer/list/PhoneFavoriteListView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteListView.java
@@ -33,11 +33,13 @@ import android.widget.GridView;
import android.widget.ImageView;
import com.android.dialer.R;
+import com.android.dialer.list.DragDropController.DragItemContainer;
/**
* Viewgroup that presents the user's speed dial contacts in a grid.
*/
-public class PhoneFavoriteListView extends GridView implements OnDragDropListener {
+public class PhoneFavoriteListView extends GridView implements OnDragDropListener,
+ DragItemContainer {
public static final String LOG_TAG = PhoneFavoriteListView.class.getSimpleName();
@@ -59,6 +61,8 @@ public class PhoneFavoriteListView extends GridView implements OnDragDropListene
private ImageView mDragShadowOverlay;
private int mAnimationDuration;
+ final int[] mLocationOnScreen = new int[2];
+
// X and Y offsets inside the item from where the user grabbed to the
// child's left coordinate. This is used to aid in the drawing of the drag shadow.
private int mTouchOffsetToChildLeft;
@@ -67,7 +71,7 @@ public class PhoneFavoriteListView extends GridView implements OnDragDropListene
private int mDragShadowLeft;
private int mDragShadowTop;
- private DragDropController mDragDropController = new DragDropController();
+ private DragDropController mDragDropController = new DragDropController(this);
private final float DRAG_SHADOW_ALPHA = 0.7f;
@@ -138,39 +142,20 @@ public class PhoneFavoriteListView extends GridView implements OnDragDropListene
}
@Override
- public boolean dispatchDragEvent(DragEvent event) {
+ public boolean onDragEvent(DragEvent event) {
final int action = event.getAction();
final int eX = (int) event.getX();
final int eY = (int) event.getY();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED: {
- final int[] coordinates = new int[2];
- getLocationOnScreen(coordinates);
- // Calculate the X and Y coordinates of the drag event relative to the view
- final int viewX = eX - coordinates[0];
- final int viewY = eY - coordinates[1];
- final View child = getViewAtPosition(viewX, viewY);
-
- if (!(child instanceof PhoneFavoriteSquareTileView)) {
- // Bail early.
- return false;
- }
-
- final PhoneFavoriteSquareTileView tile = (PhoneFavoriteSquareTileView) child;
- if (!mDragDropController.handleDragStarted(viewX, viewY, tile)) {
+ if (!mDragDropController.handleDragStarted(eX, eY)) {
return false;
}
break;
}
case DragEvent.ACTION_DRAG_LOCATION:
mLastDragY = eY;
- final View child = getViewAtPosition(eX, eY);
-
- PhoneFavoriteSquareTileView tile = null;
- if (child instanceof PhoneFavoriteSquareTileView) {
- tile = (PhoneFavoriteSquareTileView) child;
- }
- mDragDropController.handleDragHovered(eX, eY, tile);
+ mDragDropController.handleDragHovered(this, eX, eY);
// Kick off {@link #mScrollHandler} if it's not started yet.
if (!mIsDragScrollerRunning &&
// And if the distance traveled while dragging exceeds the touch slop
@@ -313,4 +298,19 @@ public class PhoneFavoriteListView extends GridView implements OnDragDropListene
return bitmap;
}
+
+ @Override
+ public PhoneFavoriteSquareTileView getViewForLocation(int x, int y) {
+ getLocationOnScreen(mLocationOnScreen);
+ // Calculate the X and Y coordinates of the drag event relative to the view
+ final int viewX = x - mLocationOnScreen[0];
+ final int viewY = y - mLocationOnScreen[1];
+ final View child = getViewAtPosition(viewX, viewY);
+
+ if (!(child instanceof PhoneFavoriteSquareTileView)) {
+ return null;
+ }
+
+ return (PhoneFavoriteSquareTileView) child;
+ }
}
diff --git a/src/com/android/dialer/list/RemoveView.java b/src/com/android/dialer/list/RemoveView.java
index 16942fe96..ae358fc9f 100644
--- a/src/com/android/dialer/list/RemoveView.java
+++ b/src/com/android/dialer/list/RemoveView.java
@@ -4,14 +4,16 @@ import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.DragEvent;
+import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.dialer.R;
-public class RemoveView extends LinearLayout {
+public class RemoveView extends FrameLayout {
DragDropController mDragDropController;
TextView mRemoveText;
@@ -49,31 +51,30 @@ public class RemoveView extends LinearLayout {
}
@Override
- public boolean dispatchDragEvent(DragEvent event) {
- final int action = event.getAction();
- switch (action) {
- case DragEvent.ACTION_DRAG_ENTERED:
- setAppearanceHighlighted();
- break;
- case DragEvent.ACTION_DRAG_EXITED:
- setAppearanceNormal();
- break;
- case DragEvent.ACTION_DRAG_LOCATION:
- if (mDragDropController != null) {
- mDragDropController.handleDragHovered((int) event.getX(),
- // the true y-coordinate of the event with respect to the listview is
- // offset by the height of the remove view
- (int) event.getY() - getHeight(), null);
- }
- break;
- case DragEvent.ACTION_DROP:
- if (mDragDropController != null) {
- mDragDropController.handleDragFinished((int) event.getX(), (int) event.getY(), true);
- }
- setAppearanceNormal();
- break;
- }
- return true;
+ public boolean onDragEvent(DragEvent event) {
+ final int action = event.getAction();
+ switch (action) {
+ case DragEvent.ACTION_DRAG_ENTERED:
+ setAppearanceHighlighted();
+ break;
+ case DragEvent.ACTION_DRAG_EXITED:
+ setAppearanceNormal();
+ break;
+ case DragEvent.ACTION_DRAG_LOCATION:
+ if (mDragDropController != null) {
+ mDragDropController.handleDragHovered(this, (int) event.getX(),
+ (int) event.getY());
+ }
+ break;
+ case DragEvent.ACTION_DROP:
+ if (mDragDropController != null) {
+ mDragDropController.handleDragFinished((int) event.getX(), (int) event.getY(),
+ true);
+ }
+ setAppearanceNormal();
+ break;
+ }
+ return true;
}
private void setAppearanceNormal() {