summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--res/layout/lists_fragment.xml8
-rw-r--r--res/values/dimens.xml12
-rw-r--r--res/values/ids.xml22
-rw-r--r--src/com/android/dialer/list/ListsFragment.java48
-rw-r--r--src/com/android/dialer/list/ShortcutCardsManager.java129
-rw-r--r--src/com/android/dialer/list/SwipeHelper.java470
-rw-r--r--src/com/android/dialer/list/SwipeableShortcutCard.java238
7 files changed, 7 insertions, 920 deletions
diff --git a/res/layout/lists_fragment.xml b/res/layout/lists_fragment.xml
index a11c89fef..26f62c7d8 100644
--- a/res/layout/lists_fragment.xml
+++ b/res/layout/lists_fragment.xml
@@ -21,11 +21,11 @@
android:layout_height="match_parent"
android:animateLayoutChanges="true" >
- <com.android.dialer.list.SwipeableShortcutCard
- android:id="@+id/shortcut_card"
+ <!-- TODO: Apply background color to ActionBar instead of a FrameLayout. For now, this is the
+ easiest way to preserve correct pane scrolling and searchbar collapse/expand behaviors. -->
+ <FrameLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="@dimen/action_bar_height_large"
+ android:layout_height="@dimen/action_bar_height_large"
android:background="@color/actionbar_background_color" />
<FrameLayout
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index b8b93cb0a..e4097e3eb 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -64,18 +64,6 @@
<dimen name="favorites_row_end_padding">0dp</dimen>
<dimen name="favorites_row_undo_text_side_padding">32dp</dimen>
- <!-- Dimensions for most recent call shortcut cards -->
- <dimen name="recent_call_log_item_translation_z">3dp</dimen>
- <dimen name="recent_call_log_item_margin_horizontal">8dp</dimen>
- <dimen name="recent_call_log_item_margin_top">4dp</dimen>
- <dimen name="recent_call_log_item_margin_bottom">6dp</dimen>
-
- <!-- The maximum amount to clip on the left and right of the recent call shortcut card -->
- <dimen name="recent_call_log_item_horizontal_clip_limit">20dp</dimen>
- <dimen name="recent_call_log_item_padding_start">8dp</dimen>
- <dimen name="recent_call_log_item_padding_top">12dp</dimen>
- <dimen name="recent_call_log_item_padding_bottom">11dp</dimen>
-
<dimen name="call_log_item_extra_padding_vertical">4dp</dimen>
diff --git a/res/values/ids.xml b/res/values/ids.xml
deleted file mode 100644
index 2b095043a..000000000
--- a/res/values/ids.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2012 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-<resources>
- <item type="id"
- name="is_swipeable_tag" />
- <item type="id"
- name="contact_entry_index_tag" />
-</resources> \ No newline at end of file
diff --git a/src/com/android/dialer/list/ListsFragment.java b/src/com/android/dialer/list/ListsFragment.java
index 9ae5c57f5..098b647a1 100644
--- a/src/com/android/dialer/list/ListsFragment.java
+++ b/src/com/android/dialer/list/ListsFragment.java
@@ -42,7 +42,7 @@ import java.util.ArrayList;
*
* Contains a ViewPager that contains various contact lists like the Speed Dial list and the
* All Contacts list. This will also eventually contain the logic that allows sliding the
- * ViewPager containing the lists up above the shortcut cards and pin it against the top of the
+ * ViewPager containing the lists up above the search bar and pin it against the top of the
* screen.
*/
public class ListsFragment extends Fragment implements CallLogQueryHandler.Listener,
@@ -76,7 +76,6 @@ public class ListsFragment extends Fragment implements CallLogQueryHandler.Liste
private ViewPager mViewPager;
private ViewPagerTabs mViewPagerTabs;
private ViewPagerAdapter mViewPagerAdapter;
- private SwipeableShortcutCard mShortcutCard;
private RemoveView mRemoveView;
private View mRemoveViewContent;
private SpeedDialFragment mSpeedDialFragment;
@@ -107,26 +106,10 @@ public class ListsFragment extends Fragment implements CallLogQueryHandler.Liste
private PanelSlideCallbacks mPanelSlideCallbacks = new PanelSlideCallbacks() {
@Override
public void onPanelSlide(View panel, float slideOffset) {
- // For every 1 percent that the panel is slid upwards, clip 1 percent off the top
- // edge of the shortcut card, to achieve the animated effect of the shortcut card
- // being pushed out of view when the panel is slid upwards. slideOffset is 1 when
- // the shortcut card is fully exposed, and 0 when completely hidden.
- if (mShortcutCard.isShown()) {
- float ratioCardHidden = (1 - slideOffset);
- mShortcutCard.clipCard(ratioCardHidden);
- }
-
if (mActionBar != null) {
- // Amount of available space that is not being hidden by the bottom pane
- final int shortcutCardHeight =
- mShortcutCard.isShown() ? mShortcutCard.getHeight() : 0;
- final int topPaneHeight = (int) (slideOffset * shortcutCardHeight);
-
- final int availableActionBarHeight =
- Math.min(mActionBar.getHeight(), topPaneHeight);
- final ActionBarController controller =
+ ActionBarController controller =
((HostInterface) getActivity()).getActionBarController();
- controller.setHideOffset(mActionBar.getHeight() - availableActionBarHeight);
+ controller.setHideOffset((int) (mActionBar.getHeight() * (1 - slideOffset)));
if (!mActionBar.isShowing()) {
mActionBar.show();
@@ -307,9 +290,6 @@ public class ListsFragment extends Fragment implements CallLogQueryHandler.Liste
mViewPagerTabs.setViewPager(mViewPager);
addOnPageChangeListener(mViewPagerTabs);
- mShortcutCard = (SwipeableShortcutCard) parentView.findViewById(R.id.shortcut_card);
- new ShortcutCardsManager(getActivity(), this, mCallLogAdapter, mShortcutCard);
-
mRemoveView = (RemoveView) parentView.findViewById(R.id.remove_view);
mRemoveViewContent = parentView.findViewById(R.id.remove_view_content);
@@ -349,20 +329,6 @@ public class ListsFragment extends Fragment implements CallLogQueryHandler.Liste
mCallLogQueryHandler.fetchCalls(CallLogQueryHandler.CALL_TYPE_ALL, mLastCallShortcutDate);
}
- public void dismissShortcut(View view) {
- mLastCallShortcutDate = mCurrentCallShortcutDate;
- final SharedPreferences prefs = view.getContext().getSharedPreferences(
- DialtactsActivity.SHARED_PREFS_NAME, Context.MODE_PRIVATE);
- prefs.edit().putLong(KEY_LAST_DISMISSED_CALL_SHORTCUT_DATE, mLastCallShortcutDate)
- .apply();
- fetchCalls();
-
- LayoutTransition transition = mOverlappingPaneLayout.getLayoutTransition();
- // Turns on animations for all types of layout changes so that they occur for
- // height changes.
- transition.enableTransitionType(LayoutTransition.CHANGING);
- }
-
public void addOnPageChangeListener(OnPageChangeListener onPageChangeListener) {
if (!mOnPageChangeListeners.contains(onPageChangeListener)) {
mOnPageChangeListeners.add(onPageChangeListener);
@@ -399,14 +365,6 @@ public class ListsFragment extends Fragment implements CallLogQueryHandler.Liste
mRemoveViewContent.setVisibility(show ? View.VISIBLE : View.GONE);
mRemoveView.setAlpha(show ? 0 : 1);
mRemoveView.animate().alpha(show ? 1 : 0).start();
-
- if (mShortcutCard.isShown()) {
- final View child = mShortcutCard.getChildAt(0);
- if (child != null) {
- child.animate().withLayer()
- .alpha(show ? REMOVE_VIEW_SHOWN_ALPHA : REMOVE_VIEW_HIDDEN_ALPHA).start();
- }
- }
}
public boolean shouldShowActionBar() {
diff --git a/src/com/android/dialer/list/ShortcutCardsManager.java b/src/com/android/dialer/list/ShortcutCardsManager.java
deleted file mode 100644
index 8b8a7ba62..000000000
--- a/src/com/android/dialer/list/ShortcutCardsManager.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2011 Google Inc.
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.dialer.list;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.database.DataSetObserver;
-import android.view.View;
-
-import com.android.dialer.calllog.CallLogAdapter;
-import com.android.dialer.calllog.CallLogNotificationsHelper;
-import com.android.dialer.calllog.CallLogQueryHandler;
-import com.android.dialer.list.SwipeHelper.OnItemGestureListener;
-
-/**
- * Handles the logic that displays call shortcuts from
- * {@link com.android.dialer.calllog.CallLogAdapter} in the form of cards.
- */
-public class ShortcutCardsManager {
-
- private class CustomDataSetObserver extends DataSetObserver {
- @Override
- public void onChanged() {
- updateShortcutCard();
- }
- }
-
- private static final String TAG = ShortcutCardsManager.class.getSimpleName();
-
- // The position of the shortcut card within the CallLogAdapter
- private static final int SHORTCUT_CARD_INDEX = 0;
-
- private final CallLogAdapter mCallLogAdapter;
- private final ListsFragment mFragment;
- private final SwipeableShortcutCard mShortcutCard;
-
- private final Context mContext;
-
- private final DataSetObserver mObserver;
-
- private final CallLogQueryHandler mCallLogQueryHandler;
-
- private final OnItemGestureListener mCallLogOnItemSwipeListener =
- new OnItemGestureListener() {
- @Override
- public void onSwipe(View view) {
- mCallLogQueryHandler.markNewCallsAsOld();
- mCallLogQueryHandler.markNewVoicemailsAsOld();
- CallLogNotificationsHelper.removeMissedCallNotifications(mContext);
- CallLogNotificationsHelper.updateVoicemailNotifications(mContext);
- mFragment.dismissShortcut(view);
- }
-
- @Override
- public void onTouch() {}
-
- @Override
- public boolean isSwipeEnabled() {
- return true;
- }
- };
-
- private final CallLogQueryHandler.Listener mCallLogQueryHandlerListener =
- new CallLogQueryHandler.Listener() {
- @Override
- public void onVoicemailStatusFetched(Cursor statusCursor) {}
-
- @Override
- public boolean onCallsFetched(Cursor combinedCursor) {
- mCallLogAdapter.invalidateCache();
- mCallLogAdapter.changeCursor(combinedCursor);
- mCallLogAdapter.notifyDataSetChanged();
- // Return true; took ownership of cursor
- return true;
- }
- };
-
- public ShortcutCardsManager(Context context,
- ListsFragment fragment,
- CallLogAdapter callLogAdapter,
- SwipeableShortcutCard shortcutCard) {
- mContext = context;
- mFragment = fragment;
- mShortcutCard = shortcutCard;
-
- mCallLogAdapter = callLogAdapter;
- mObserver = new CustomDataSetObserver();
- mCallLogAdapter.registerDataSetObserver(mObserver);
- mCallLogQueryHandler = new CallLogQueryHandler(mContext.getContentResolver(),
- mCallLogQueryHandlerListener);
- mShortcutCard.setOnItemSwipeListener(mCallLogOnItemSwipeListener);
- }
-
- /**
- * Updates the contents of the shortcut card with the view provided by the
- * {@link CallLogAdapter}.
- */
- private void updateShortcutCard() {
- final int count = mCallLogAdapter.getCount();
- final View convertView = mShortcutCard.getChildAt(SHORTCUT_CARD_INDEX);
- if (count <= SHORTCUT_CARD_INDEX) {
- if (convertView != null) {
- convertView.setVisibility(View.GONE);
- }
- } else {
- mShortcutCard.setVisibility(View.VISIBLE);
- final View view = mCallLogAdapter.getView(SHORTCUT_CARD_INDEX, convertView,
- mShortcutCard);
- mShortcutCard.removeAllViews();
- mShortcutCard.prepareChildView(view);
- mShortcutCard.addView(view);
- view.setVisibility(View.VISIBLE);
- }
- }
-}
diff --git a/src/com/android/dialer/list/SwipeHelper.java b/src/com/android/dialer/list/SwipeHelper.java
deleted file mode 100644
index 03300df42..000000000
--- a/src/com/android/dialer/list/SwipeHelper.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc.
- * Licensed to The Android Open Source Project.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.dialer.list;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
-import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.RectF;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.animation.LinearInterpolator;
-
-import com.android.dialer.R;
-
-/**
- * Copy of packages/apps/UnifiedEmail - com.android.mail.ui.SwipeHelper with changes.
- */
-public class SwipeHelper {
- static final String TAG = SwipeHelper.class.getSimpleName();
- private static final boolean DEBUG_INVALIDATE = false;
- private static final boolean CONSTRAIN_SWIPE = true;
- private static final boolean FADE_OUT_DURING_SWIPE = true;
- private static final boolean DISMISS_IF_SWIPED_FAR_ENOUGH = true;
- private static final boolean LOG_SWIPE_DISMISS_VELOCITY = false; // STOPSHIP - DEBUG ONLY
-
- public static final int IS_SWIPEABLE_TAG = R.id.is_swipeable_tag;
- public static final Object IS_SWIPEABLE = new Object();
-
- public static final int X = 0;
- public static final int Y = 1;
-
- private static LinearInterpolator sLinearInterpolator = new LinearInterpolator();
-
- private static int SWIPE_ESCAPE_VELOCITY = -1;
- private static int DEFAULT_ESCAPE_ANIMATION_DURATION;
- private static int MAX_ESCAPE_ANIMATION_DURATION;
- private static int MAX_DISMISS_VELOCITY;
- private static int SNAP_ANIM_LEN;
- private static int SWIPE_SCROLL_SLOP;
- private static float MIN_SWIPE;
- private static float MIN_VERT;
- private static float MIN_LOCK;
-
- public static float ALPHA_FADE_START = 0f; // fraction of thumbnail width
- // where fade starts
- static final float ALPHA_FADE_END = 0.7f; // fraction of thumbnail width
- // beyond which alpha->0
- private static final float FACTOR = 1.2f;
-
- private static final int PROTECTION_PADDING = 50;
-
- private float mMinAlpha = 0.3f;
-
- private float mPagingTouchSlop;
- private final SwipeHelperCallback mCallback;
- private final int mSwipeDirection;
- private final VelocityTracker mVelocityTracker;
-
- private float mInitialTouchPosX;
- private boolean mDragging;
- private View mCurrView;
- private View mCurrAnimView;
- private boolean mCanCurrViewBeDimissed;
- private float mDensityScale;
- private float mLastY;
- private float mInitialTouchPosY;
-
- private float mStartAlpha;
- private boolean mProtected = false;
-
- private float mChildSwipedFarEnoughFactor = 0.4f;
- private float mChildSwipedFastEnoughFactor = 0.05f;
-
- public SwipeHelper(Context context, int swipeDirection, SwipeHelperCallback callback, float densityScale,
- float pagingTouchSlop) {
- mCallback = callback;
- mSwipeDirection = swipeDirection;
- mVelocityTracker = VelocityTracker.obtain();
- mDensityScale = densityScale;
- mPagingTouchSlop = pagingTouchSlop;
- if (SWIPE_ESCAPE_VELOCITY == -1) {
- Resources res = context.getResources();
- SWIPE_ESCAPE_VELOCITY = res.getInteger(R.integer.swipe_escape_velocity);
- DEFAULT_ESCAPE_ANIMATION_DURATION = res.getInteger(R.integer.escape_animation_duration);
- MAX_ESCAPE_ANIMATION_DURATION = res.getInteger(R.integer.max_escape_animation_duration);
- MAX_DISMISS_VELOCITY = res.getInteger(R.integer.max_dismiss_velocity);
- SNAP_ANIM_LEN = res.getInteger(R.integer.snap_animation_duration);
- SWIPE_SCROLL_SLOP = res.getInteger(R.integer.swipe_scroll_slop);
- MIN_SWIPE = res.getDimension(R.dimen.min_swipe);
- MIN_VERT = res.getDimension(R.dimen.min_vert);
- MIN_LOCK = res.getDimension(R.dimen.min_lock);
- }
- }
-
- public void setDensityScale(float densityScale) {
- mDensityScale = densityScale;
- }
-
- public void setPagingTouchSlop(float pagingTouchSlop) {
- mPagingTouchSlop = pagingTouchSlop;
- }
-
- public void setChildSwipedFarEnoughFactor(float factor) {
- mChildSwipedFarEnoughFactor = factor;
- }
-
- public void setChildSwipedFastEnoughFactor(float factor) {
- mChildSwipedFastEnoughFactor = factor;
- }
-
- private float getVelocity(VelocityTracker vt) {
- return mSwipeDirection == X ? vt.getXVelocity() :
- vt.getYVelocity();
- }
-
- private ObjectAnimator createTranslationAnimation(View v, float newPos) {
- ObjectAnimator anim = ObjectAnimator.ofFloat(v,
- mSwipeDirection == X ? "translationX" : "translationY", newPos);
- return anim;
- }
-
- private ObjectAnimator createDismissAnimation(View v, float newPos, int duration) {
- ObjectAnimator anim = createTranslationAnimation(v, newPos);
- anim.setInterpolator(sLinearInterpolator);
- anim.setDuration(duration);
- return anim;
- }
-
- private float getPerpendicularVelocity(VelocityTracker vt) {
- return mSwipeDirection == X ? vt.getYVelocity() :
- vt.getXVelocity();
- }
-
- private void setTranslation(View v, float translate) {
- if (mSwipeDirection == X) {
- v.setTranslationX(translate);
- } else {
- v.setTranslationY(translate);
- }
- }
-
- private float getSize(View v) {
- return mSwipeDirection == X ? v.getMeasuredWidth() :
- v.getMeasuredHeight();
- }
-
- public void setMinAlpha(float minAlpha) {
- mMinAlpha = minAlpha;
- }
-
- private float getAlphaForOffset(View view) {
- float viewSize = getSize(view);
- final float fadeSize = ALPHA_FADE_END * viewSize;
- float result = mStartAlpha;
- float pos = view.getTranslationX();
- if (pos >= viewSize * ALPHA_FADE_START) {
- result = mStartAlpha - (pos - viewSize * ALPHA_FADE_START) / fadeSize;
- } else if (pos < viewSize * (mStartAlpha - ALPHA_FADE_START)) {
- result = mStartAlpha + (viewSize * ALPHA_FADE_START + pos) / fadeSize;
- }
- return Math.max(mMinAlpha, result);
- }
-
- // invalidate the view's own bounds all the way up the view hierarchy
- public static void invalidateGlobalRegion(View view) {
- invalidateGlobalRegion(
- view,
- new RectF(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()));
- }
-
- // invalidate a rectangle relative to the view's coordinate system all the way up the view
- // hierarchy
- public static void invalidateGlobalRegion(View view, RectF childBounds) {
- // childBounds.offset(view.getTranslationX(), view.getTranslationY());
- if (DEBUG_INVALIDATE)
- Log.v(TAG, "-------------");
- while (view.getParent() != null && view.getParent() instanceof View) {
- view = (View) view.getParent();
- view.getMatrix().mapRect(childBounds);
- view.invalidate((int) Math.floor(childBounds.left),
- (int) Math.floor(childBounds.top),
- (int) Math.ceil(childBounds.right),
- (int) Math.ceil(childBounds.bottom));
- if (DEBUG_INVALIDATE) {
- Log.v(TAG, "INVALIDATE(" + (int) Math.floor(childBounds.left)
- + "," + (int) Math.floor(childBounds.top)
- + "," + (int) Math.ceil(childBounds.right)
- + "," + (int) Math.ceil(childBounds.bottom));
- }
- }
- }
-
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- final int action = ev.getAction();
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- mLastY = ev.getY();
- mDragging = false;
- mCurrView = mCallback.getChildAtPosition(ev);
- mVelocityTracker.clear();
- if (mCurrView != null) {
- mCurrAnimView = mCallback.getChildContentView(mCurrView);
- mStartAlpha = mCurrAnimView.getAlpha();
- mCanCurrViewBeDimissed = mCallback.canChildBeDismissed(mCurrView);
- mVelocityTracker.addMovement(ev);
- mInitialTouchPosX = ev.getX();
- mInitialTouchPosY = ev.getY();
- }
- break;
- case MotionEvent.ACTION_MOVE:
- if (mCurrView != null) {
- // Check the movement direction.
- if (mLastY >= 0 && !mDragging) {
- float currY = ev.getY();
- float currX = ev.getX();
- float deltaY = Math.abs(currY - mInitialTouchPosY);
- float deltaX = Math.abs(currX - mInitialTouchPosX);
- if (deltaY > SWIPE_SCROLL_SLOP && deltaY > (FACTOR * deltaX)) {
- mLastY = ev.getY();
- mCallback.onScroll();
- return false;
- }
- }
- mVelocityTracker.addMovement(ev);
- float pos = ev.getX();
- float delta = pos - mInitialTouchPosX;
- if (Math.abs(delta) > mPagingTouchSlop) {
- mCallback.onBeginDrag(mCallback.getChildContentView(mCurrView));
- mDragging = true;
- mInitialTouchPosX = ev.getX() - mCurrAnimView.getTranslationX();
- mInitialTouchPosY = ev.getY();
- }
- }
- mLastY = ev.getY();
- break;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- mDragging = false;
- mCurrView = null;
- mCurrAnimView = null;
- mLastY = -1;
- break;
- }
- return mDragging;
- }
-
- /**
- * @param view The view to be dismissed
- * @param velocity The desired pixels/second speed at which the view should
- * move
- */
- private void dismissChild(final View view, float velocity) {
- final View animView = mCallback.getChildContentView(view);
- final boolean canAnimViewBeDismissed = mCallback.canChildBeDismissed(view);
- float newPos = determinePos(animView, velocity);
- int duration = determineDuration(animView, newPos, velocity);
-
- animView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- ObjectAnimator anim = createDismissAnimation(animView, newPos, duration);
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mCallback.onChildDismissed(view);
- animView.setLayerType(View.LAYER_TYPE_NONE, null);
- }
- });
- anim.addUpdateListener(new AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- if (FADE_OUT_DURING_SWIPE && canAnimViewBeDismissed) {
- animView.setAlpha(getAlphaForOffset(animView));
- }
- invalidateGlobalRegion(animView);
- }
- });
- anim.start();
- }
-
- private int determineDuration(View animView, float newPos, float velocity) {
- int duration = MAX_ESCAPE_ANIMATION_DURATION;
- if (velocity != 0) {
- duration = Math
- .min(duration,
- (int) (Math.abs(newPos - animView.getTranslationX()) * 1000f / Math
- .abs(velocity)));
- } else {
- duration = DEFAULT_ESCAPE_ANIMATION_DURATION;
- }
- return duration;
- }
-
- private float determinePos(View animView, float velocity) {
- float newPos = 0;
- if (velocity < 0 || (velocity == 0 && animView.getTranslationX() < 0)
- // if we use the Menu to dismiss an item in landscape, animate up
- || (velocity == 0 && animView.getTranslationX() == 0 && mSwipeDirection == Y)) {
- newPos = -getSize(animView);
- } else {
- newPos = getSize(animView);
- }
- return newPos;
- }
-
- public void snapChild(final View view, float velocity) {
- final View animView = mCallback.getChildContentView(view);
- final boolean canAnimViewBeDismissed = mCallback.canChildBeDismissed(view);
- ObjectAnimator anim = createTranslationAnimation(animView, 0);
- int duration = SNAP_ANIM_LEN;
- anim.setDuration(duration);
- anim.addUpdateListener(new AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- if (FADE_OUT_DURING_SWIPE && canAnimViewBeDismissed) {
- animView.setAlpha(getAlphaForOffset(animView));
- }
- invalidateGlobalRegion(animView);
- }
- });
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- animView.setAlpha(mStartAlpha);
- mCallback.onDragCancelled(mCurrView);
- }
- });
- anim.start();
- }
-
- public boolean onTouchEvent(MotionEvent ev) {
- if (!mDragging || mProtected) {
- return false;
- }
- mVelocityTracker.addMovement(ev);
- final int action = ev.getAction();
- switch (action) {
- case MotionEvent.ACTION_OUTSIDE:
- case MotionEvent.ACTION_MOVE:
- if (mCurrView != null) {
- float deltaX = ev.getX() - mInitialTouchPosX;
- float deltaY = Math.abs(ev.getY() - mInitialTouchPosY);
- // If the user has gone vertical and not gone horizontalish AT
- // LEAST minBeforeLock, switch to scroll. Otherwise, cancel
- // the swipe.
- if (!mDragging && deltaY > MIN_VERT && (Math.abs(deltaX)) < MIN_LOCK
- && deltaY > (FACTOR * Math.abs(deltaX))) {
- mCallback.onScroll();
- return false;
- }
- float minDistance = MIN_SWIPE;
- if (Math.abs(deltaX) < minDistance) {
- // Don't start the drag until at least X distance has
- // occurred.
- return true;
- }
- // don't let items that can't be dismissed be dragged more
- // than maxScrollDistance
- if (CONSTRAIN_SWIPE && !mCallback.canChildBeDismissed(mCurrView)) {
- float size = getSize(mCurrAnimView);
- float maxScrollDistance = 0.15f * size;
- if (Math.abs(deltaX) >= size) {
- deltaX = deltaX > 0 ? maxScrollDistance : -maxScrollDistance;
- } else {
- deltaX = maxScrollDistance
- * (float) Math.sin((deltaX / size) * (Math.PI / 2));
- }
- }
- setTranslation(mCurrAnimView, deltaX);
- if (FADE_OUT_DURING_SWIPE && mCanCurrViewBeDimissed) {
- mCurrAnimView.setAlpha(getAlphaForOffset(mCurrAnimView));
- }
- invalidateGlobalRegion(mCallback.getChildContentView(mCurrView));
- }
- break;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- if (mCurrView != null) {
- float maxVelocity = MAX_DISMISS_VELOCITY * mDensityScale;
- mVelocityTracker.computeCurrentVelocity(1000 /* px/sec */, maxVelocity);
- float escapeVelocity = SWIPE_ESCAPE_VELOCITY * mDensityScale;
- float velocity = getVelocity(mVelocityTracker);
- float perpendicularVelocity = getPerpendicularVelocity(mVelocityTracker);
-
- // Decide whether to dismiss the current view
- // Tweak constants below as required to prevent erroneous
- // swipe/dismiss
- float translation = Math.abs(mCurrAnimView.getTranslationX());
- float currAnimViewSize = getSize(mCurrAnimView);
- // Long swipe = translation of {@link #mChildSwipedFarEnoughFactor} * width
- boolean childSwipedFarEnough = DISMISS_IF_SWIPED_FAR_ENOUGH
- && translation > mChildSwipedFarEnoughFactor * currAnimViewSize;
- // Fast swipe = > escapeVelocity and translation of
- // {@link #mChildSwipedFastEnoughFactor} * width
- boolean childSwipedFastEnough = (Math.abs(velocity) > escapeVelocity)
- && (Math.abs(velocity) > Math.abs(perpendicularVelocity))
- && (velocity > 0) == (mCurrAnimView.getTranslationX() > 0)
- && translation > mChildSwipedFastEnoughFactor * currAnimViewSize;
- if (LOG_SWIPE_DISMISS_VELOCITY) {
- Log.v(TAG, "Swipe/Dismiss: " + velocity + "/" + escapeVelocity + "/"
- + perpendicularVelocity + ", x: " + translation + "/"
- + currAnimViewSize);
- }
-
- boolean dismissChild = mCallback.canChildBeDismissed(mCurrView)
- && (childSwipedFastEnough || childSwipedFarEnough);
-
- if (dismissChild) {
- dismissChild(mCurrView, childSwipedFastEnough ? velocity : 0f);
- } else {
- snapChild(mCurrView, velocity);
- }
- }
- break;
- }
- return true;
- }
-
- public static void setSwipeable(View view, boolean swipeable) {
- view.setTag(IS_SWIPEABLE_TAG, swipeable ? IS_SWIPEABLE : null);
- }
-
- public static boolean isSwipeable(View view) {
- return IS_SWIPEABLE == view.getTag(IS_SWIPEABLE_TAG);
- }
-
- public interface SwipeHelperCallback {
- View getChildAtPosition(MotionEvent ev);
-
- View getChildContentView(View v);
-
- void onScroll();
-
- boolean canChildBeDismissed(View v);
-
- void onBeginDrag(View v);
-
- void onChildDismissed(View v);
-
- void onDragCancelled(View v);
-
- }
-
- public interface OnItemGestureListener {
- public void onSwipe(View view);
-
- public void onTouch();
-
- public boolean isSwipeEnabled();
- }
-}
diff --git a/src/com/android/dialer/list/SwipeableShortcutCard.java b/src/com/android/dialer/list/SwipeableShortcutCard.java
deleted file mode 100644
index db2210a47..000000000
--- a/src/com/android/dialer/list/SwipeableShortcutCard.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.dialer.list;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Rect;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.dialer.R;
-import com.android.dialer.list.SwipeHelper.OnItemGestureListener;
-import com.android.dialer.list.SwipeHelper.SwipeHelperCallback;
-
-/**
- * The swipeable call log row.
- */
-public class SwipeableShortcutCard extends FrameLayout implements SwipeHelperCallback {
-
- private static final float CLIP_CARD_BARELY_HIDDEN_RATIO = 0.001f;
- private static final float CLIP_CARD_MOSTLY_HIDDEN_RATIO = 0.9f;
- // Fade out 5x faster than the hidden ratio.
- private static final float CLIP_CARD_OPACITY_RATIO = 5f;
-
- final int mCallLogMarginHorizontal;
- final int mCallLogMarginTop;
- final int mCallLogMarginBottom;
- final int mCallLogPaddingStart;
- final int mCallLogPaddingTop;
- final int mCallLogPaddingBottom;
- final int mShortCardBackgroundColor;
-
- private SwipeHelper mSwipeHelper;
- private OnItemGestureListener mOnItemSwipeListener;
-
- private float mPreviousTranslationZ = 0;
- private Rect mClipRect = new Rect();
-
- public SwipeableShortcutCard(Context context) {
- this(context, null);
- }
-
- public SwipeableShortcutCard(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public SwipeableShortcutCard(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- final Resources resources = getResources();
- final float densityScale =resources.getDisplayMetrics().density;
- final float pagingTouchSlop = ViewConfiguration.get(context)
- .getScaledPagingTouchSlop();
- mSwipeHelper = new SwipeHelper(context, SwipeHelper.X, this,
- densityScale, pagingTouchSlop);
-
- mCallLogMarginHorizontal =
- resources.getDimensionPixelSize(R.dimen.recent_call_log_item_margin_horizontal);
- mCallLogMarginTop =
- resources.getDimensionPixelSize(R.dimen.recent_call_log_item_margin_top);
- mCallLogMarginBottom =
- resources.getDimensionPixelSize(R.dimen.recent_call_log_item_margin_bottom);
- mCallLogPaddingStart =
- resources.getDimensionPixelSize(R.dimen.recent_call_log_item_padding_start);
- mCallLogPaddingTop =
- resources.getDimensionPixelSize(R.dimen.recent_call_log_item_padding_top);
- mCallLogPaddingBottom =
- resources.getDimensionPixelSize(R.dimen.recent_call_log_item_padding_bottom);
- mShortCardBackgroundColor =
- resources.getColor(R.color.call_log_expanded_background_color, null);
- }
-
- void prepareChildView(View view) {
- // Override CallLogAdapter's accessibility behavior; don't expand the shortcut card.
- view.setAccessibilityDelegate(null);
- view.setBackgroundResource(R.drawable.rounded_corner_bg);
-
- final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
- FrameLayout.LayoutParams.MATCH_PARENT,
- FrameLayout.LayoutParams.WRAP_CONTENT);
- params.setMargins(mCallLogMarginHorizontal, mCallLogMarginTop, mCallLogMarginHorizontal,
- mCallLogMarginBottom);
- view.setLayoutParams(params);
-
- LinearLayout actionView =
- (LinearLayout) view.findViewById(R.id.primary_action_view);
- actionView.setPaddingRelative(mCallLogPaddingStart, mCallLogPaddingTop,
- actionView.getPaddingEnd(), mCallLogPaddingBottom);
-
- // TODO: Set content description including type/location and time information.
- TextView nameView = (TextView) actionView.findViewById(R.id.name);
-
- actionView.setContentDescription(
- TextUtils.expandTemplate(
- getResources().getString(R.string.description_call_back_action),
- nameView.getText()));
-
- mPreviousTranslationZ = getResources().getDimensionPixelSize(
- R.dimen.recent_call_log_item_translation_z);
- view.setTranslationZ(mPreviousTranslationZ);
-
- final ViewGroup callLogItem = (ViewGroup) view.findViewById(R.id.call_log_list_item);
- // Reset the internal call log item view if it is being recycled
- callLogItem.setTranslationX(0);
- callLogItem.setTranslationY(0);
- callLogItem.setAlpha(1);
- callLogItem.setClipBounds(null);
- setChildrenOpacity(callLogItem, 1.0f);
-
- callLogItem.findViewById(R.id.call_log_row)
- .setBackgroundColor(mShortCardBackgroundColor);
-
- callLogItem.findViewById(R.id.call_indicator_icon).setVisibility(View.VISIBLE);
- }
-
- @Override
- public View getChildAtPosition(MotionEvent ev) {
- return getChildCount() > 0 ? getChildAt(0) : null;
- }
-
- @Override
- public View getChildContentView(View v) {
- return v.findViewById(R.id.call_log_list_item);
- }
-
- @Override
- public void onScroll() {}
-
- @Override
- public boolean canChildBeDismissed(View v) {
- return true;
- }
-
- @Override
- public void onBeginDrag(View v) {
- // We do this so the underlying ScrollView knows that it won't get
- // the chance to intercept events anymore
- requestDisallowInterceptTouchEvent(true);
- }
-
- @Override
- public void onChildDismissed(View v) {
- if (v != null && mOnItemSwipeListener != null) {
- mOnItemSwipeListener.onSwipe(v);
- }
- }
-
- @Override
- public void onDragCancelled(View v) {}
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (mSwipeHelper != null) {
- return mSwipeHelper.onInterceptTouchEvent(ev) || super.onInterceptTouchEvent(ev);
- } else {
- return super.onInterceptTouchEvent(ev);
- }
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- if (mSwipeHelper != null) {
- return mSwipeHelper.onTouchEvent(ev) || super.onTouchEvent(ev);
- } else {
- return super.onTouchEvent(ev);
- }
- }
-
- public void setOnItemSwipeListener(OnItemGestureListener listener) {
- mOnItemSwipeListener = listener;
- }
-
- /**
- * Clips the card by a specified amount.
- *
- * @param ratioHidden A float indicating how much of each edge of the card should be
- * clipped. If 0, the entire card is displayed. If 0.5f, each edge is hidden
- * entirely, thus obscuring the entire card.
- */
- public void clipCard(float ratioHidden) {
- final View viewToClip = getChildAt(0);
- if (viewToClip == null) {
- return;
- }
- int width = viewToClip.getWidth();
- int height = viewToClip.getHeight();
-
- if (ratioHidden <= CLIP_CARD_BARELY_HIDDEN_RATIO) {
- viewToClip.setTranslationZ(mPreviousTranslationZ);
- } else if (viewToClip.getTranslationZ() != 0){
- mPreviousTranslationZ = viewToClip.getTranslationZ();
- viewToClip.setTranslationZ(0);
- }
-
- if (ratioHidden > CLIP_CARD_MOSTLY_HIDDEN_RATIO) {
- mClipRect.set(0, 0 , 0, 0);
- } else {
- int newTop = (int) (ratioHidden * height);
- mClipRect.set(0, newTop, width, height);
-
- // Since the pane will be overlapping with the action bar, apply a vertical offset
- // to top align the clipped card in the viewable area;
- viewToClip.setTranslationY(-newTop);
- }
- viewToClip.setClipBounds(mClipRect);
-
- // If the view has any children, fade them out of view.
- final ViewGroup viewGroup = (ViewGroup) viewToClip;
- setChildrenOpacity(
- viewGroup, Math.max(0, 1 - (CLIP_CARD_OPACITY_RATIO * ratioHidden)));
- }
-
- private void setChildrenOpacity(ViewGroup viewGroup, float alpha) {
- final int count = viewGroup.getChildCount();
- for (int i = 0; i < count; i++) {
- viewGroup.getChildAt(i).setAlpha(alpha);
- }
- }
-} \ No newline at end of file