From 85babff4a30d1baf8841749b706bd31dcaa1a73a Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Tue, 11 Jan 2011 14:26:03 -0800 Subject: [PATCH] Fix 3253629: Tweaks to recent apps This updates the animation and fixes a few bugs with showing and hiding recents as well as tweaks from UX in animation timing, effects and the background protector. Change-Id: I1c57e566408c7b732a0c902e27125951d0277322 --- .../recents_bg_protect_tile.png | Bin 21287 -> 7955 bytes .../layout-xlarge/status_bar_recent_panel.xml | 46 ++-- .../statusbar/tablet/NotificationPanel.java | 11 +- .../statusbar/tablet/RecentAppsPanel.java | 200 ++++++++++++++---- .../statusbar/tablet/TabletStatusBar.java | 80 +++---- 5 files changed, 227 insertions(+), 110 deletions(-) diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/recents_bg_protect_tile.png b/packages/SystemUI/res/drawable-xlarge-mdpi/recents_bg_protect_tile.png index 66a54f020155543f6bb2bd0aeaba3a24b662f674..55d38d8cf527718bd001b699dca173f1bf7f4794 100644 GIT binary patch literal 7955 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 KMNUMnLSTZ@p=GB4 diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml index cc044a1be370a..a1216aa86029c 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml @@ -20,32 +20,36 @@ + android:layout_width="wrap_content"> - - - + android:layout_height="match_parent" + android:layout_alignParentBottom="true" + android:paddingBottom="48dip" + android:clipToPadding="false"> - + android:orientation="horizontal" + android:layout_marginBottom="-28dip" + android:layout_gravity="bottom" + android:background="@drawable/recents_blue_glow"> - + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java index ffbc0e33b0ccd..a2f6e3abdf993 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java @@ -194,10 +194,11 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, AnimatorSet mContentAnim; // should group this into a multi-property animation - final int OPEN_DURATION = 250; + final int OPEN_DURATION = 136; + final int CLOSE_DURATION = 250; // the panel will start to appear this many px from the end - final int HYPERSPACE_OFFRAMP = 120; + final int HYPERSPACE_OFFRAMP = 30; Choreographer() { } @@ -223,13 +224,13 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, end = y + HYPERSPACE_OFFRAMP; } Animator posAnim = ObjectAnimator.ofFloat(mContentParent, "translationY", start, end); - posAnim.setInterpolator(appearing + posAnim.setInterpolator(appearing ? new android.view.animation.DecelerateInterpolator(2.0f) : new android.view.animation.AccelerateInterpolator(2.0f)); Animator glowAnim = ObjectAnimator.ofFloat(mGlow, "alpha", mGlow.getAlpha(), appearing ? 1.0f : 0.0f); - glowAnim.setInterpolator(appearing + glowAnim.setInterpolator(appearing ? new android.view.animation.AccelerateInterpolator(1.0f) : new android.view.animation.DecelerateInterpolator(1.0f)); @@ -241,7 +242,7 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, .with(bgAnim) .with(posAnim) ; - mContentAnim.setDuration(OPEN_DURATION); + mContentAnim.setDuration(appearing ? OPEN_DURATION : CLOSE_DURATION); mContentAnim.addListener(this); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java index 53c30fe73426d..bab8ed359ac49 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java @@ -43,32 +43,33 @@ import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; +import android.util.Slog; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.RelativeLayout; import android.widget.TextView; import com.android.systemui.R; -public class RecentAppsPanel extends LinearLayout implements StatusBarPanel, OnClickListener { +public class RecentAppsPanel extends RelativeLayout implements StatusBarPanel, OnClickListener { private static final int GLOW_PADDING = 15; private static final String TAG = "RecentAppsPanel"; private static final boolean DEBUG = TabletStatusBar.DEBUG; private static final int DISPLAY_TASKS_PORTRAIT = 7; // Limited by max binder transaction size private static final int DISPLAY_TASKS_LANDSCAPE = 5; // number of recent tasks to display private static final int MAX_TASKS = DISPLAY_TASKS_PORTRAIT + 1; // allow extra for non-apps - private static final int STAGGER_ANIMATION_DELAY = 30; - private static final long ALPHA_ANIMATION_DURATION = 120; private TabletStatusBar mBar; - private LinearLayout mRecentsContainer; - private View mRecentsGlowView; private ArrayList mActivityDescriptions; private int mIconDpi; - private AnimatorSet mAnimationSet; - private View mBackgroundProtector; + private View mRecentsScrim; + private View mRecentsGlowView; + private LinearLayout mRecentsContainer; private Bitmap mGlowBitmap; + private boolean mShowing; + private Choreographer mChoreo; static class ActivityDescription { int id; @@ -104,6 +105,145 @@ public class RecentAppsPanel extends LinearLayout implements StatusBarPanel, OnC return x >= l && x < r && y >= t && y < b; } + public void show(boolean show, boolean animate) { + if (animate) { + if (mShowing != show) { + mShowing = show; + if (show) { + setVisibility(View.VISIBLE); + } + mChoreo.startAnimation(show); + } + } else { + mShowing = show; + setVisibility(show ? View.VISIBLE : View.GONE); + mChoreo.jumpTo(show); + } + } + + /** + * We need to be aligned at the bottom. LinearLayout can't do this, so instead, + * let LinearLayout do all the hard work, and then shift everything down to the bottom. + */ + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + mChoreo.setPanelHeight(mRecentsContainer.getHeight()); + } + + /** + * Whether the panel is showing, or, if it's animating, whether it will be + * when the animation is done. + */ + public boolean isShowing() { + return mShowing; + } + + private static 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 = 250; + + boolean mVisible; + int mPanelHeight; + View mRootView; + View mScrimView; + View mContentView; + AnimatorSet mContentAnim; + + // the panel will start to appear this many px from the end + final int HYPERSPACE_OFFRAMP = 200; + + public Choreographer(View root, View scrim, View content) { + mRootView = root; + mScrimView = scrim; + mContentView = content; + } + + void createAnimation(boolean appearing) { + float start, end; + + if (DEBUG) Log.e(TAG, "createAnimation()", new Exception()); + + // 0: on-screen + // height: off-screen + float y = mContentView.getTranslationY(); + if (appearing) { + // we want to go from near-the-top to the top, unless we're half-open in the right + // general vicinity + start = (y < HYPERSPACE_OFFRAMP) ? y : HYPERSPACE_OFFRAMP; + end = 0; + } else { + start = y; + end = y + HYPERSPACE_OFFRAMP; + } + + Animator posAnim = ObjectAnimator.ofFloat(mContentView, "translationY", + start, end); + posAnim.setInterpolator(appearing + ? new android.view.animation.DecelerateInterpolator(2.5f) + : new android.view.animation.AccelerateInterpolator(2.5f)); + + Animator glowAnim = ObjectAnimator.ofFloat(mContentView, "alpha", + mContentView.getAlpha(), appearing ? 1.0f : 0.0f); + glowAnim.setInterpolator(appearing + ? new android.view.animation.AccelerateInterpolator(1.0f) + : new android.view.animation.DecelerateInterpolator(1.0f)); + + Animator bgAnim = ObjectAnimator.ofInt(mScrimView.getBackground(), + "alpha", appearing ? 0 : 255, appearing ? 255 : 0); + + mContentAnim = new AnimatorSet(); + mContentAnim + .play(bgAnim) + .with(glowAnim) + .with(posAnim); + mContentAnim.setDuration(appearing ? OPEN_DURATION : CLOSE_DURATION); + mContentAnim.addListener(this); + } + + void startAnimation(boolean appearing) { + if (DEBUG) Slog.d(TAG, "startAnimation(appearing=" + appearing + ")"); + + createAnimation(appearing); + + mContentView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + mContentAnim.start(); + + mVisible = appearing; + } + + void jumpTo(boolean appearing) { + mContentView.setTranslationY(appearing ? 0 : mPanelHeight); + } + + public void setPanelHeight(int h) { + if (DEBUG) Slog.d(TAG, "panelHeight=" + h); + mPanelHeight = h; + } + + public void onAnimationCancel(Animator animation) { + if (DEBUG) Slog.d(TAG, "onAnimationCancel"); + // force this to zero so we close the window + mVisible = false; + } + + public void onAnimationEnd(Animator animation) { + if (DEBUG) Slog.d(TAG, "onAnimationEnd"); + if (!mVisible) { + mRootView.setVisibility(View.GONE); + } + mContentView.setLayerType(View.LAYER_TYPE_NONE, null); + mContentAnim = null; + } + + public void onAnimationRepeat(Animator animation) { + } + + public void onAnimationStart(Animator animation) { + } + } + public void setBar(TabletStatusBar bar) { mBar = bar; } @@ -128,12 +268,12 @@ public class RecentAppsPanel extends LinearLayout implements StatusBarPanel, OnC super.onFinishInflate(); mRecentsContainer = (LinearLayout) findViewById(R.id.recents_container); mRecentsGlowView = findViewById(R.id.recents_glow); - mBackgroundProtector = (View) findViewById(R.id.recents_bg_protect); + mRecentsScrim = (View) findViewById(R.id.recents_bg_protect); + mChoreo = new Choreographer(this, mRecentsScrim, mRecentsGlowView); // In order to save space, we make the background texture repeat in the Y direction - View view = findViewById(R.id.recents_bg_protect); - if (view != null && view.getBackground() instanceof BitmapDrawable) { - ((BitmapDrawable) view.getBackground()).setTileModeY(TileMode.REPEAT); + if (mRecentsScrim != null && mRecentsScrim.getBackground() instanceof BitmapDrawable) { + ((BitmapDrawable) mRecentsScrim.getBackground()).setTileModeY(TileMode.REPEAT); } } @@ -255,7 +395,10 @@ public class RecentAppsPanel extends LinearLayout implements StatusBarPanel, OnC if (mActivityDescriptions.size() > 0) { updateUiElements(getResources().getConfiguration(), true); } else { - mBar.animateCollapse(); + // Immediately hide this panel + mShowing = false; + setVisibility(View.GONE); + // mBar.animateCollapse(); } } @@ -284,13 +427,10 @@ public class RecentAppsPanel extends LinearLayout implements StatusBarPanel, OnC private void updateUiElements(Configuration config, boolean animate) { mRecentsContainer.removeAllViews(); - final float initialAlpha = 0.0f; final int first = 0; final boolean isPortrait = config.orientation == Configuration.ORIENTATION_PORTRAIT; final int taskCount = isPortrait ? DISPLAY_TASKS_PORTRAIT : DISPLAY_TASKS_LANDSCAPE; final int last = Math.min(mActivityDescriptions.size(), taskCount) - 1; - ArrayList anims = new ArrayList(last+1); - DecelerateInterpolator interp = new DecelerateInterpolator(); for (int i = last; i >= first; i--) { ActivityDescription activityDescription = mActivityDescriptions.get(i); View view = View.inflate(mContext, R.layout.status_bar_recent_item, null); @@ -306,40 +446,11 @@ public class RecentAppsPanel extends LinearLayout implements StatusBarPanel, OnC view.setOnClickListener(this); view.setTag(activityDescription); mRecentsContainer.addView(view); - - if (animate) { - view.setAlpha(initialAlpha); - ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", initialAlpha, 1.0f); - anim.setDuration(ALPHA_ANIMATION_DURATION); - anim.setStartDelay((last-i) * STAGGER_ANIMATION_DELAY); - anim.setInterpolator(interp); - anims.add(anim); - } } int views = mRecentsContainer.getChildCount(); mRecentsContainer.setVisibility(views > 0 ? View.VISIBLE : View.GONE); mRecentsGlowView.setVisibility(views > 0 ? View.VISIBLE : View.GONE); - - if (animate && views > 0) { - ObjectAnimator anim = ObjectAnimator.ofFloat(mRecentsGlowView, "alpha", - initialAlpha, 1.0f); - anim.setDuration((last-first) * STAGGER_ANIMATION_DELAY); - anim.setInterpolator(interp); - anims.add(anim); - - anim = ObjectAnimator.ofFloat(mBackgroundProtector, "alpha", - initialAlpha, 1.0f); - anim.setDuration(last * STAGGER_ANIMATION_DELAY); - anim.setInterpolator(interp); - anims.add(anim); - } - - if (anims.size() > 0) { - mAnimationSet = new AnimatorSet(); - mAnimationSet.playTogether(anims); - mAnimationSet.start(); - } } public void onClick(View v) { @@ -356,6 +467,7 @@ public class RecentAppsPanel extends LinearLayout implements StatusBarPanel, OnC if (DEBUG) Log.v(TAG, "Starting activity " + intent); getContext().startActivity(intent); } + setVisibility(View.GONE); mBar.animateCollapse(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java index f858f61b1b9cd..92ab8a94585ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -93,9 +93,6 @@ public class TabletStatusBar extends StatusBar implements // Fitts' Law assistance for LatinIME; TODO: replace with a more general approach private static final boolean FAKE_SPACE_BAR = true; - private static final int MAX_IMAGE_LEVEL = 10000; - private static final boolean USE_2D_RECENTS = true; - public static final int LIGHTS_ON_DELAY = 5000; // The height of the bar, as definied by the build. It may be taller if we're plugged @@ -212,16 +209,16 @@ public class TabletStatusBar extends StatusBar implements mNotificationPeekWindow.setOnTouchListener( new TouchOutsideListener(MSG_CLOSE_NOTIFICATION_PEEK, mNotificationPeekWindow)); mNotificationPeekScrubRight = new LayoutTransition(); - mNotificationPeekScrubRight.setAnimator(LayoutTransition.APPEARING, + mNotificationPeekScrubRight.setAnimator(LayoutTransition.APPEARING, ObjectAnimator.ofInt(null, "left", -512, 0)); - mNotificationPeekScrubRight.setAnimator(LayoutTransition.DISAPPEARING, + mNotificationPeekScrubRight.setAnimator(LayoutTransition.DISAPPEARING, ObjectAnimator.ofInt(null, "left", -512, 0)); mNotificationPeekScrubRight.setDuration(500); mNotificationPeekScrubLeft = new LayoutTransition(); - mNotificationPeekScrubLeft.setAnimator(LayoutTransition.APPEARING, + mNotificationPeekScrubLeft.setAnimator(LayoutTransition.APPEARING, ObjectAnimator.ofInt(null, "left", 512, 0)); - mNotificationPeekScrubLeft.setAnimator(LayoutTransition.DISAPPEARING, + mNotificationPeekScrubLeft.setAnimator(LayoutTransition.DISAPPEARING, ObjectAnimator.ofInt(null, "left", 512, 0)); mNotificationPeekScrubLeft.setDuration(500); @@ -241,30 +238,28 @@ public class TabletStatusBar extends StatusBar implements WindowManagerImpl.getDefault().addView(mNotificationPeekWindow, lp); // Recents Panel - if (USE_2D_RECENTS) { - mRecentsPanel = (RecentAppsPanel) View.inflate(context, - R.layout.status_bar_recent_panel, null); - mRecentsPanel.setVisibility(View.GONE); - mRecentsPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_RECENTS_PANEL, - mRecentsPanel)); - mStatusBarView.setIgnoreChildren(2, mRecentButton, mRecentsPanel); + mRecentsPanel = (RecentAppsPanel) View.inflate(context, + R.layout.status_bar_recent_panel, null); + mRecentsPanel.setVisibility(View.GONE); + mRecentsPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_RECENTS_PANEL, + mRecentsPanel)); + mStatusBarView.setIgnoreChildren(2, mRecentButton, mRecentsPanel); - lp = new WindowManager.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH - | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, - PixelFormat.TRANSLUCENT); - lp.gravity = Gravity.BOTTOM | Gravity.LEFT; - lp.setTitle("RecentsPanel"); - lp.windowAnimations = R.style.Animation_RecentPanel; + lp = new WindowManager.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM + | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH + | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, + PixelFormat.TRANSLUCENT); + lp.gravity = Gravity.BOTTOM | Gravity.LEFT; + lp.setTitle("RecentsPanel"); + lp.windowAnimations = R.style.Animation_RecentPanel; - WindowManagerImpl.getDefault().addView(mRecentsPanel, lp); - mRecentsPanel.setBar(this); - } + WindowManagerImpl.getDefault().addView(mRecentsPanel, lp); + mRecentsPanel.setBar(this); } @Override @@ -298,7 +293,7 @@ public class TabletStatusBar extends StatusBar implements protected View makeStatusBarView() { final Context context = mContext; - + mWindowManager = IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); @@ -462,15 +457,15 @@ public class TabletStatusBar extends StatusBar implements //Slog.d(TAG, "loading peek: " + peekIndex); NotificationData.Entry entry = mNotns.get(N-1-peekIndex); NotificationData.Entry copy = new NotificationData.Entry( - entry.key, - entry.notification, + entry.key, + entry.notification, entry.icon); inflateViews(copy, mNotificationPeekRow); entry.icon.setBackgroundColor(0x20FFFFFF); // mNotificationPeekRow.setLayoutTransition( -// peekIndex < mNotificationPeekIndex +// peekIndex < mNotificationPeekIndex // ? mNotificationPeekScrubLeft // : mNotificationPeekScrubRight); @@ -516,11 +511,16 @@ public class TabletStatusBar extends StatusBar implements break; case MSG_OPEN_RECENTS_PANEL: if (DEBUG) Slog.d(TAG, "opening recents panel"); - if (mRecentsPanel != null) mRecentsPanel.setVisibility(View.VISIBLE); + if (mRecentsPanel != null) { + mRecentsPanel.setVisibility(View.VISIBLE); + mRecentsPanel.show(true, true); + } break; case MSG_CLOSE_RECENTS_PANEL: if (DEBUG) Slog.d(TAG, "closing recents panel"); - if (mRecentsPanel != null) mRecentsPanel.setVisibility(View.GONE); + if (mRecentsPanel != null && mRecentsPanel.isShowing()) { + mRecentsPanel.show(false, true); + } break; case MSG_SHOW_CHROME: if (DEBUG) Slog.d(TAG, "hiding shadows (lights on)"); @@ -631,7 +631,7 @@ public class TabletStatusBar extends StatusBar implements handleNotificationError(key, notification, "Couldn't update icon: " + ic); return; } - + if (key == mNotificationPeekKey) { // must update the peek window Message peekMsg = mHandler.obtainMessage(MSG_OPEN_NOTIFICATION_PEEK); @@ -820,7 +820,7 @@ public class TabletStatusBar extends StatusBar implements return false; } } - + private void setAreThereNotifications() { final boolean hasClearable = mNotns.hasClearableItems(); } @@ -1265,11 +1265,11 @@ public class TabletStatusBar extends StatusBar implements mElementTransition.setDuration(LayoutTransition.DISAPPEARING, 400); mShadowTransition = new LayoutTransition(); - mShadowTransition.setAnimator(LayoutTransition.APPEARING, + mShadowTransition.setAnimator(LayoutTransition.APPEARING, ObjectAnimator.ofFloat(null, "alpha", 0f, 1f)); mShadowTransition.setDuration(LayoutTransition.APPEARING, 200); mShadowTransition.setStartDelay(LayoutTransition.APPEARING, 100); - mShadowTransition.setAnimator(LayoutTransition.DISAPPEARING, + mShadowTransition.setAnimator(LayoutTransition.DISAPPEARING, ObjectAnimator.ofFloat(null, "alpha", 1f, 0f)); mShadowTransition.setDuration(LayoutTransition.DISAPPEARING, 100); @@ -1310,7 +1310,7 @@ public class TabletStatusBar extends StatusBar implements case MotionEvent.ACTION_UP: mHandler.removeMessages(MSG_RESTORE_SHADOWS); if (mShowShadows) { - mHandler.sendEmptyMessageDelayed(MSG_RESTORE_SHADOWS, + mHandler.sendEmptyMessageDelayed(MSG_RESTORE_SHADOWS, v == mNotificationShadow ? 5000 : 500); } last = true;