diff options
author | Andrew Lee <anwlee@google.com> | 2015-03-05 15:01:01 -0800 |
---|---|---|
committer | Andrew Lee <anwlee@google.com> | 2015-03-05 15:10:52 -0800 |
commit | 52efda4d4a71a7b689a68e0ff68beb61bf8ca47b (patch) | |
tree | b0d658e9304d4ef67353d23970af0112e97dae24 | |
parent | 896a443b6e6c701270000542c921bc4e1e26189b (diff) |
Remove the shortcut/recents card.
- Delete SwipeableShortcutCard, ShortcutCardsManager.
- Remove related references in ListsFragment, layouts, helpers for
swipe behavrio, dimensions, and ids.
+ Update sliding logic in ListsFragment.
It's not ideal to use a frame layout to provide spacing/color, but this
is the most straightforward way to maintain behavior for now. This
can/should be revisited if removing the OverlappingPaneLayout.
Bug: 19372817
Change-Id: I789119fb8f87ea19cda545eec7c722306fc2813d
-rw-r--r-- | res/layout/lists_fragment.xml | 8 | ||||
-rw-r--r-- | res/values/dimens.xml | 12 | ||||
-rw-r--r-- | res/values/ids.xml | 22 | ||||
-rw-r--r-- | src/com/android/dialer/list/ListsFragment.java | 48 | ||||
-rw-r--r-- | src/com/android/dialer/list/ShortcutCardsManager.java | 129 | ||||
-rw-r--r-- | src/com/android/dialer/list/SwipeHelper.java | 470 | ||||
-rw-r--r-- | src/com/android/dialer/list/SwipeableShortcutCard.java | 238 |
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 |