diff options
author | Michael Jurka <mikejurka@google.com> | 2012-06-05 17:22:24 -0700 |
---|---|---|
committer | Michael Jurka <mikejurka@google.com> | 2012-06-11 15:23:20 -0700 |
commit | c016aaaa42f2d7f758bb6d973f035285e3d3dd87 (patch) | |
tree | 8bbd966908fb3dc70c6747e7c5fc73a88e8f1acf /packages/SystemUI | |
parent | a7e3a1e0e7d308e7e78a1992038a34485d04ab29 (diff) | |
download | frameworks_base-c016aaaa42f2d7f758bb6d973f035285e3d3dd87.zip frameworks_base-c016aaaa42f2d7f758bb6d973f035285e3d3dd87.tar.gz frameworks_base-c016aaaa42f2d7f758bb6d973f035285e3d3dd87.tar.bz2 |
Tweak recents out animation a bit more
Bug: 6490204
-Fading to black in the recents layer
-Tweaking duration and interpolators
-Removing some unnecessary debug exceptions (Bug: 6642072)
Change-Id: Iba18fade7f874078111fc1d79a81830ee07617d4
Diffstat (limited to 'packages/SystemUI')
7 files changed, 106 insertions, 36 deletions
diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml index 8a21117..00e3e27 100644 --- a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml @@ -26,7 +26,11 @@ android:layout_width="match_parent" systemui:recentItemLayout="@layout/status_bar_recent_item" > - + <View + android:id="@+id/recents_transition_background" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:visibility="invisible" /> <FrameLayout android:id="@+id/recents_bg_protect" android:background="@drawable/status_bar_recents_background" diff --git a/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml index 1d29c5a..a7e5db1 100644 --- a/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml @@ -26,7 +26,11 @@ android:layout_width="match_parent" systemui:recentItemLayout="@layout/status_bar_recent_item" > - + <View + android:id="@+id/recents_transition_background" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:visibility="invisible" /> <FrameLayout android:id="@+id/recents_bg_protect" android:background="@drawable/status_bar_recents_background" diff --git a/packages/SystemUI/res/layout/system_bar_recent_panel.xml b/packages/SystemUI/res/layout/system_bar_recent_panel.xml index d5745c8..127551d 100644 --- a/packages/SystemUI/res/layout/system_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout/system_bar_recent_panel.xml @@ -28,7 +28,11 @@ android:clipChildren="false" systemui:recentItemLayout="@layout/system_bar_recent_item" > - + <View + android:id="@+id/recents_transition_background" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:visibility="invisible" /> <FrameLayout android:id="@+id/recents_bg_protect" android:background="@drawable/recents_bg_protect_tile" @@ -38,7 +42,6 @@ android:layout_marginBottom="@*android:dimen/system_bar_height" android:clipToPadding="false" android:clipChildren="false"> - <ImageView android:id="@+id/recents_transition_placeholder_icon" android:layout_width="wrap_content" diff --git a/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java b/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java index ccdf038..296b640 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java +++ b/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java @@ -20,15 +20,19 @@ import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.AnimatorSet.Builder; import android.animation.ObjectAnimator; +import android.content.res.Resources; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.Slog; import android.view.View; import android.view.ViewRootImpl; +import com.android.systemui.R; + /* package */ class Choreographer implements Animator.AnimatorListener { // should group this into a multi-property animation private static final int OPEN_DURATION = 136; - private static final int CLOSE_DURATION = 130; + private static final int CLOSE_DURATION = 230; private static final int SCRIM_DURATION = 400; private static final String TAG = RecentsPanelView.TAG; private static final boolean DEBUG = RecentsPanelView.DEBUG; @@ -81,7 +85,7 @@ import android.view.ViewRootImpl; mContentView.getAlpha(), appearing ? 1.0f : 0.0f); fadeAnim.setInterpolator(appearing ? new android.view.animation.AccelerateInterpolator(1.0f) - : new android.view.animation.DecelerateInterpolator(1.0f)); + : new android.view.animation.AccelerateInterpolator(2.5f)); fadeAnim.setDuration(appearing ? OPEN_DURATION : CLOSE_DURATION); Animator noRecentAppsFadeAnim = null; @@ -110,6 +114,20 @@ import android.view.ViewRootImpl; bgAnim.setDuration(appearing ? SCRIM_DURATION : CLOSE_DURATION); builder.with(bgAnim); } + } else { + final Resources res = mRootView.getResources(); + boolean isTablet = res.getBoolean(R.bool.config_recents_interface_for_tablets); + if (!isTablet) { + View recentsTransitionBackground = + mRootView.findViewById(R.id.recents_transition_background); + recentsTransitionBackground.setVisibility(View.VISIBLE); + Drawable bgDrawable = new ColorDrawable(0xFF000000); + recentsTransitionBackground.setBackground(bgDrawable); + Animator bgAnim = ObjectAnimator.ofInt(bgDrawable, "alpha", 0, 255); + bgAnim.setDuration(CLOSE_DURATION); + bgAnim.setInterpolator(new android.view.animation.AccelerateInterpolator(1f)); + builder.with(bgAnim); + } } mContentAnim.addListener(this); if (mListener != null) { @@ -139,6 +157,10 @@ import android.view.ViewRootImpl; if (mScrimView.getBackground() != null) { mScrimView.getBackground().setAlpha(appearing ? 255 : 0); } + View recentsTransitionBackground = + mRootView.findViewById(R.id.recents_transition_background); + recentsTransitionBackground.setVisibility(View.INVISIBLE); + mRootView.requestLayout(); } public void setPanelHeight(int h) { diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java index 34cd397..bec9aa2 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java @@ -34,11 +34,13 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.RemoteException; +import android.os.ServiceManager; import android.provider.Settings; import android.util.AttributeSet; import android.util.Log; import android.view.Display; import android.view.KeyEvent; +import android.view.IWindowManager; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.MotionEvent; @@ -86,7 +88,8 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener OnRecentsPanelVisibilityChangedListener mVisibilityChangedListener; ImageView mPlaceholderThumbnail; - boolean mHideWindowAfterPlaceholderThumbnailIsHidden; + View mTransitionBg; + boolean mHideRecentsAfterThumbnailScaleUpStarted; private RecentTasksLoader mRecentTasksLoader; private ArrayList<TaskDescription> mRecentTaskDescriptions; @@ -97,6 +100,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener private boolean mFitThumbnailToXY; private int mRecentItemLayoutId; private boolean mFirstScreenful = true; + private boolean mHighEndGfx; public static interface OnRecentsPanelVisibilityChangedListener { public void onRecentsPanelVisibilityChanged(boolean visible); @@ -248,7 +252,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && !event.isCanceled()) { - show(false, true); + show(false, false); return true; } return super.onKeyUp(keyCode, event); @@ -305,10 +309,6 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener ArrayList<TaskDescription> recentTaskDescriptions, boolean firstScreenful) { sendCloseSystemWindows(mContext, BaseStatusBar.SYSTEM_DIALOG_REASON_RECENT_APPS); - // For now, disable animations. We may want to re-enable in the future - if (show) { - animate = false; - } if (show) { // Need to update list of recent apps before we set visibility so this view's // content description is updated before it gets focus for TalkBack mode @@ -318,6 +318,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener // quit early boolean noApps = !mFirstScreenful && (mRecentTaskDescriptions.size() == 0); if (mRecentsNoApps != null) { + mRecentsNoApps.setAlpha(1f); mRecentsNoApps.setVisibility(noApps ? View.VISIBLE : View.INVISIBLE); } else { if (noApps) { @@ -339,7 +340,6 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener mRecentTasksDirty = true; mWaitingToShow = false; mReadyToShow = false; - mRecentsNoApps.setVisibility(View.INVISIBLE); } if (animate) { if (mShowing != show) { @@ -488,7 +488,8 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener if (mRecentsScrim != null) { Display d = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)) .getDefaultDisplay(); - if (!ActivityManager.isHighEndGfx(d)) { + mHighEndGfx = ActivityManager.isHighEndGfx(d); + if (!mHighEndGfx) { mRecentsScrim.setBackground(null); } else if (mRecentsScrim.getBackground() instanceof BitmapDrawable) { // In order to save space, we make the background texture repeat in the Y direction @@ -704,22 +705,57 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener setContentDescription(recentAppsAccessibilityDescription); } + + boolean mThumbnailScaleUpStarted; public void handleOnClick(View view) { ViewHolder holder = (ViewHolder)view.getTag(); TaskDescription ad = holder.taskDescription; final Context context = view.getContext(); final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - holder.thumbnailViewImage.setDrawingCacheEnabled(true); - Bitmap bm = holder.thumbnailViewImage.getDrawingCache(); - mPlaceholderThumbnail = (ImageView) findViewById(R.id.recents_transition_placeholder_icon); + Bitmap bm = holder.thumbnailViewImageBitmap; + boolean usingDrawingCache; + if (bm.getWidth() == holder.thumbnailViewImage.getWidth() && + bm.getHeight() == holder.thumbnailViewImage.getHeight()) { + usingDrawingCache = false; + } else { + holder.thumbnailViewImage.setDrawingCacheEnabled(true); + bm = holder.thumbnailViewImage.getDrawingCache(); + usingDrawingCache = true; + } + + if (mPlaceholderThumbnail == null) { + mPlaceholderThumbnail = + (ImageView) findViewById(R.id.recents_transition_placeholder_icon); + } + if (mTransitionBg == null) { + mTransitionBg = (View) findViewById(R.id.recents_transition_background); + + IWindowManager wm = IWindowManager.Stub.asInterface( + ServiceManager.getService(Context.WINDOW_SERVICE)); + try { + if (!wm.hasSystemNavBar()) { + FrameLayout.LayoutParams lp = + (FrameLayout.LayoutParams) mTransitionBg.getLayoutParams(); + int statusBarHeight = getResources(). + getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height); + lp.setMargins(0, statusBarHeight, 0, 0); + mTransitionBg.setLayoutParams(lp); + } + } catch (RemoteException e) { + Log.w(TAG, "Failing checking whether status bar is visible", e); + } + } final ImageView placeholderThumbnail = mPlaceholderThumbnail; - mHideWindowAfterPlaceholderThumbnailIsHidden = false; + mHideRecentsAfterThumbnailScaleUpStarted = false; placeholderThumbnail.setVisibility(VISIBLE); - Bitmap b2 = bm.copy(bm.getConfig(), true); - placeholderThumbnail.setImageBitmap(b2); - + if (!usingDrawingCache) { + placeholderThumbnail.setImageBitmap(bm); + } else { + Bitmap b2 = bm.copy(bm.getConfig(), true); + placeholderThumbnail.setImageBitmap(b2); + } Rect r = new Rect(); holder.thumbnailViewImage.getGlobalVisibleRect(r); @@ -728,13 +764,16 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener show(false, true); + mThumbnailScaleUpStarted = false; ActivityOptions opts = ActivityOptions.makeDelayedThumbnailScaleUpAnimation( holder.thumbnailViewImage, bm, 0, 0, new ActivityOptions.OnAnimationStartedListener() { @Override public void onAnimationStarted() { - mPlaceholderThumbnail = null; - placeholderThumbnail.setVisibility(INVISIBLE); - if (mHideWindowAfterPlaceholderThumbnailIsHidden) { + mThumbnailScaleUpStarted = true; + if (!mHighEndGfx) { + mPlaceholderThumbnail.setVisibility(INVISIBLE); + } + if (mHideRecentsAfterThumbnailScaleUpStarted) { hideWindow(); } } @@ -751,15 +790,19 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener if (DEBUG) Log.v(TAG, "Starting activity " + intent); context.startActivity(intent, opts.toBundle()); } - holder.thumbnailViewImage.setDrawingCacheEnabled(false); + if (!usingDrawingCache) { + holder.thumbnailViewImage.setDrawingCacheEnabled(false); + } } public void hideWindow() { - if (mPlaceholderThumbnail != null) { - mHideWindowAfterPlaceholderThumbnailIsHidden = true; + if (!mThumbnailScaleUpStarted) { + mHideRecentsAfterThumbnailScaleUpStarted = true; } else { setVisibility(GONE); - mHideWindowAfterPlaceholderThumbnailIsHidden = false; + mTransitionBg.setVisibility(INVISIBLE); + mPlaceholderThumbnail.setVisibility(INVISIBLE); + mHideRecentsAfterThumbnailScaleUpStarted = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java index d387515..e802985 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java @@ -76,9 +76,6 @@ public class RecentsVerticalScrollView extends ScrollView } private void addToRecycledViews(View v) { - if (mRecycledViews.contains(v)) { - throw new RuntimeException("Child was already recycled"); - } if (mRecycledViews.size() < mNumItemsInOneScreenful) { mRecycledViews.add(v); } @@ -105,9 +102,6 @@ public class RecentsVerticalScrollView extends ScrollView old = recycledViews.next(); recycledViews.remove(); old.setVisibility(VISIBLE); - if (old.getParent() != null) { - throw new RuntimeException("Recycled child has parent (i: " + i + ", recycled i: " + mRecycledViews.size()); - } } final View view = mAdapter.getView(i, old, mLinearLayout); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index cf2690b..750c6dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -440,13 +440,13 @@ public abstract class BaseStatusBar extends SystemUI implements case MSG_OPEN_RECENTS_PANEL: if (DEBUG) Slog.d(TAG, "opening recents panel"); if (mRecentsPanel != null) { - mRecentsPanel.show(true, true); + mRecentsPanel.show(true, false); } break; case MSG_CLOSE_RECENTS_PANEL: if (DEBUG) Slog.d(TAG, "closing recents panel"); if (mRecentsPanel != null && mRecentsPanel.isShowing()) { - mRecentsPanel.show(false, true); + mRecentsPanel.show(false, false); } break; case MSG_PRELOAD_RECENT_APPS: |