diff options
Diffstat (limited to 'packages')
22 files changed, 239 insertions, 165 deletions
diff --git a/packages/SystemUI/res/drawable-hdpi/navbar_search_bg_scrim.9.png b/packages/SystemUI/res/drawable-hdpi/navbar_search_bg_scrim.9.png Binary files differdeleted file mode 100644 index 4c163a2..0000000 --- a/packages/SystemUI/res/drawable-hdpi/navbar_search_bg_scrim.9.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/navbar_search_bg_scrim.9.png b/packages/SystemUI/res/drawable-mdpi/navbar_search_bg_scrim.9.png Binary files differdeleted file mode 100644 index 21c5abd..0000000 --- a/packages/SystemUI/res/drawable-mdpi/navbar_search_bg_scrim.9.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/navbar_search_bg_scrim.9.png b/packages/SystemUI/res/drawable-xhdpi/navbar_search_bg_scrim.9.png Binary files differdeleted file mode 100644 index 7874c63..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/navbar_search_bg_scrim.9.png +++ /dev/null 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-land/status_bar_search_panel.xml b/packages/SystemUI/res/layout-land/status_bar_search_panel.xml index ae81167..e6c0087 100644 --- a/packages/SystemUI/res/layout-land/status_bar_search_panel.xml +++ b/packages/SystemUI/res/layout-land/status_bar_search_panel.xml @@ -38,25 +38,29 @@ android:layout_height="match_parent" android:layout_alignParentRight="true"> - <com.android.internal.widget.multiwaveview.MultiWaveView - android:id="@+id/multi_wave_view" + <com.android.internal.widget.multiwaveview.GlowPadView + android:id="@+id/glow_pad_view" android:orientation="vertical" android:layout_width="@dimen/navbar_search_panel_height" android:layout_height="match_parent" android:layout_alignParentBottom="true" - android:background="@drawable/navbar_search_bg_scrim" android:gravity="left" prvandroid:targetDrawables="@array/navbar_search_targets" prvandroid:targetDescriptions="@array/navbar_search_target_descriptions" prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" prvandroid:handleDrawable="@drawable/navbar_search_handle" - prvandroid:waveDrawable="@drawable/navbar_search_outerring" + prvandroid:outerRingDrawable="@drawable/navbar_search_outerring" + prvandroid:outerRadius="@dimen/navbar_search_outerring_radius" + prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius" prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:hitRadius="@dimen/navbar_search_hit_radius" prvandroid:feedbackCount="0" prvandroid:vibrationDuration="@integer/config_vibration_duration" - prvandroid:alwaysTrackFinger="true"/> + prvandroid:alwaysTrackFinger="true" + prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius" + prvandroid:pointDrawable="@*android:drawable/ic_lockscreen_glowdot" + /> </RelativeLayout> 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-port/status_bar_search_panel.xml b/packages/SystemUI/res/layout-port/status_bar_search_panel.xml index 785d5dd..3828136 100644 --- a/packages/SystemUI/res/layout-port/status_bar_search_panel.xml +++ b/packages/SystemUI/res/layout-port/status_bar_search_panel.xml @@ -38,25 +38,29 @@ android:layout_height="wrap_content" android:layout_alignParentBottom="true"> - <com.android.internal.widget.multiwaveview.MultiWaveView - android:id="@+id/multi_wave_view" + <com.android.internal.widget.multiwaveview.GlowPadView + android:id="@+id/glow_pad_view" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="@dimen/navbar_search_panel_height" android:layout_alignParentBottom="true" - android:background="@drawable/navbar_search_bg_scrim" android:gravity="top" prvandroid:targetDrawables="@array/navbar_search_targets" prvandroid:targetDescriptions="@array/navbar_search_target_descriptions" prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" prvandroid:handleDrawable="@drawable/navbar_search_handle" - prvandroid:waveDrawable="@drawable/navbar_search_outerring" + prvandroid:outerRingDrawable="@drawable/navbar_search_outerring" + prvandroid:outerRadius="@dimen/navbar_search_outerring_radius" + prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius" prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:hitRadius="@dimen/navbar_search_hit_radius" prvandroid:feedbackCount="0" prvandroid:vibrationDuration="@integer/config_vibration_duration" - prvandroid:alwaysTrackFinger="true"/> + prvandroid:alwaysTrackFinger="true" + prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius" + prvandroid:pointDrawable="@*android:drawable/ic_lockscreen_glowdot" + /> </RelativeLayout> diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml index 74a15f2..c17f858 100644 --- a/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml +++ b/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml @@ -25,23 +25,26 @@ android:layout_height="match_parent" android:layout_width="match_parent"> - <com.android.internal.widget.multiwaveview.MultiWaveView - android:id="@+id/multi_wave_view" + <com.android.internal.widget.multiwaveview.GlowPadView + android:id="@+id/glow_pad_view" android:layout_width="wrap_content" android:layout_height="@dimen/navbar_search_panel_height" android:layout_gravity="center_horizontal|bottom" android:gravity="center_horizontal|top" - android:background="@drawable/navbar_search_bg_scrim" prvandroid:targetDrawables="@array/navbar_search_targets" prvandroid:targetDescriptions="@array/navbar_search_target_descriptions" prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" prvandroid:handleDrawable="@drawable/navbar_search_handle" - prvandroid:waveDrawable="@drawable/navbar_search_outerring" + prvandroid:outerRingDrawable="@drawable/navbar_search_outerring" + prvandroid:outerRadius="@dimen/navbar_search_outerring_radius" + prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius" prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:hitRadius="@dimen/navbar_search_hit_radius" prvandroid:feedbackCount="0" prvandroid:vibrationDuration="@integer/config_vibration_duration" - prvandroid:alwaysTrackFinger="true"/> + prvandroid:alwaysTrackFinger="true" + prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius" + prvandroid:pointDrawable="@*android:drawable/ic_lockscreen_glowdot"/> </com.android.systemui.SearchPanelView> diff --git a/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml b/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml index 2a97307..100f81d 100644 --- a/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml +++ b/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml @@ -25,24 +25,27 @@ android:layout_height="match_parent" android:layout_width="match_parent"> - <com.android.internal.widget.multiwaveview.MultiWaveView - android:id="@+id/multi_wave_view" + <com.android.internal.widget.multiwaveview.GlowPadView + android:id="@+id/glow_pad_view" android:layout_width="wrap_content" android:layout_height="@dimen/navbar_search_panel_height" android:layout_gravity="left|bottom" android:gravity="top|right" android:layout_marginLeft="-150dip" - android:background="@drawable/navbar_search_bg_scrim" prvandroid:targetDrawables="@array/navbar_search_targets" prvandroid:targetDescriptions="@array/navbar_search_target_descriptions" prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" prvandroid:handleDrawable="@drawable/navbar_search_handle" - prvandroid:waveDrawable="@drawable/navbar_search_outerring" + prvandroid:outerRingDrawable="@drawable/navbar_search_outerring" + prvandroid:outerRadius="@dimen/navbar_search_outerring_radius" + prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius" prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:hitRadius="@dimen/navbar_search_hit_radius" prvandroid:feedbackCount="0" prvandroid:vibrationDuration="@integer/config_vibration_duration" - prvandroid:alwaysTrackFinger="true"/> + prvandroid:alwaysTrackFinger="true" + prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius" + prvandroid:pointDrawable="@*android:drawable/ic_lockscreen_glowdot"/> </com.android.systemui.SearchPanelView> 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/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index 1bf59b0..2b5248f 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -30,6 +30,9 @@ <!-- Diameter of outer shape drawable shown in navbar search--> <dimen name="navbar_search_outerring_diameter">430dip</dimen> + <!-- Diameter of outer shape drawable shown in navbar search. Should be 1/2 of above value. --> + <dimen name="navbar_search_outerring_radius">215dip</dimen> + <!-- Height of search panel including navigation bar height --> <dimen name="navbar_search_panel_height">280dip</dimen> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 3ed63ed..c88ae2a 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -87,6 +87,8 @@ <dimen name="fling_collapse_min_velocity">200dp</dimen> <!-- Cap on contribution of x dimension of gesture to overall velocity --> <dimen name="fling_gesture_max_x_velocity">200dp</dimen> + <!-- Cap on overall resulting fling speed (s^-1) --> + <dimen name="fling_gesture_max_output_velocity">3000dp</dimen> <!-- Minimum fraction of the display a gesture must travel, at any velocity, to qualify as a collapse request --> @@ -117,6 +119,9 @@ <!-- Diameter of outer shape drawable shown in navbar search--> <dimen name="navbar_search_outerring_diameter">340dp</dimen> + <!-- Diameter of outer shape drawable shown in navbar search. Should be 1/2 of above value --> + <dimen name="navbar_search_outerring_radius">170dp</dimen> + <!-- Threshold for swipe-up gesture to activate search dialog --> <dimen name="navbar_search_up_threshhold">40dip</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java index 8b8a814..923bcba 100644 --- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java @@ -35,8 +35,8 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnPreDrawListener; import android.widget.FrameLayout; -import com.android.internal.widget.multiwaveview.MultiWaveView; -import com.android.internal.widget.multiwaveview.MultiWaveView.OnTriggerListener; +import com.android.internal.widget.multiwaveview.GlowPadView; +import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener; import com.android.systemui.R; import com.android.systemui.recent.StatusBarTouchProxy; import com.android.systemui.statusbar.BaseStatusBar; @@ -58,7 +58,7 @@ public class SearchPanelView extends FrameLayout implements private boolean mShowing; private View mSearchTargetsContainer; - private MultiWaveView mMultiWaveView; + private GlowPadView mGlowPadView; public SearchPanelView(Context context, AttributeSet attrs) { this(context, attrs, 0); @@ -125,7 +125,7 @@ public class SearchPanelView extends FrameLayout implements } } - class MultiWaveTriggerListener implements MultiWaveView.OnTriggerListener { + class GlowPadTriggerListener implements GlowPadView.OnTriggerListener { boolean mWaitingForLaunch; public void onGrabbed(View v, int handle) { @@ -141,7 +141,7 @@ public class SearchPanelView extends FrameLayout implements } public void onTrigger(View v, final int target) { - final int resId = mMultiWaveView.getResourceIdForTarget(target); + final int resId = mGlowPadView.getResourceIdForTarget(target); switch (resId) { case com.android.internal.R.drawable.ic_lockscreen_search: mWaitingForLaunch = true; @@ -154,13 +154,13 @@ public class SearchPanelView extends FrameLayout implements public void onFinishFinalAnimation() { } } - final MultiWaveTriggerListener mMultiWaveViewListener = new MultiWaveTriggerListener(); + final GlowPadTriggerListener mGlowPadViewListener = new GlowPadTriggerListener(); @Override public void onAnimationStarted() { postDelayed(new Runnable() { public void run() { - mMultiWaveViewListener.mWaitingForLaunch = false; + mGlowPadViewListener.mWaitingForLaunch = false; mBar.hideSearchPanel(); } }, SEARCH_PANEL_HOLD_DURATION); @@ -173,13 +173,13 @@ public class SearchPanelView extends FrameLayout implements mSearchTargetsContainer = findViewById(R.id.search_panel_container); mStatusBarTouchProxy = (StatusBarTouchProxy) findViewById(R.id.status_bar_touch_proxy); // TODO: fetch views - mMultiWaveView = (MultiWaveView) findViewById(R.id.multi_wave_view); - mMultiWaveView.setOnTriggerListener(mMultiWaveViewListener); + mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view); + mGlowPadView.setOnTriggerListener(mGlowPadViewListener); SearchManager searchManager = getSearchManager(); if (searchManager != null) { ComponentName component = searchManager.getGlobalSearchActivity(); if (component != null) { - if (!mMultiWaveView.replaceTargetDrawablesIfPresent(component, + if (!mGlowPadView.replaceTargetDrawablesIfPresent(component, ASSIST_ICON_METADATA_NAME, com.android.internal.R.drawable.ic_lockscreen_search)) { Slog.w(TAG, "Couldn't grab icon from component " + component); @@ -214,7 +214,7 @@ public class SearchPanelView extends FrameLayout implements private final OnPreDrawListener mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { getViewTreeObserver().removeOnPreDrawListener(this); - mMultiWaveView.resumeAnimations(); + mGlowPadView.resumeAnimations(); return false; } }; @@ -240,7 +240,8 @@ public class SearchPanelView extends FrameLayout implements setVisibility(View.VISIBLE); // Don't start the animation until we've created the layer, which is done // right before we are drawn - mMultiWaveView.suspendAnimations(); + mGlowPadView.suspendAnimations(); + mGlowPadView.ping(); getViewTreeObserver().addOnPreDrawListener(mPreDrawListener); vibrate(); } @@ -299,7 +300,7 @@ public class SearchPanelView extends FrameLayout implements public void setStatusBarView(final View statusBarView) { if (mStatusBarTouchProxy != null) { mStatusBarTouchProxy.setStatusBar(statusBarView); -// mMultiWaveView.setOnTouchListener(new OnTouchListener() { +// mGlowPadView.setOnTouchListener(new OnTouchListener() { // public boolean onTouch(View v, MotionEvent event) { // return statusBarView.onTouchEvent(event); // } 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: diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CarrierLabel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CarrierLabel.java index d8441f2..491fad1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CarrierLabel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CarrierLabel.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.provider.Telephony; +import android.text.TextUtils; import android.util.AttributeSet; import android.util.Slog; import android.view.View; @@ -91,24 +92,20 @@ public class CarrierLabel extends TextView { Slog.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn + " spn=" + spn + " showPlmn=" + showPlmn + " plmn=" + plmn); } - StringBuilder str = new StringBuilder(); - boolean something = false; - if (showPlmn && plmn != null) { - str.append(plmn); - something = true; - } - if (showSpn && spn != null) { - if (something) { - str.append('\n'); - } - str.append(spn); - something = true; - } - if (something) { - setText(str.toString()); + final String str; + // match logic in KeyguardStatusViewManager + final boolean plmnValid = showPlmn && !TextUtils.isEmpty(plmn); + final boolean spnValid = showSpn && !TextUtils.isEmpty(spn); + if (plmnValid && spnValid) { + str = plmn + "|" + spn; + } else if (plmnValid) { + str = plmn; + } else if (spnValid) { + str = spn; } else { - setText(com.android.internal.R.string.lockscreen_carrier_default); + str = ""; } + setText(str); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 87e95da..56de506 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -134,6 +134,9 @@ public class PhoneStatusBar extends BaseStatusBar { private float mExpandAccelPx; // classic value: 2000px/s/s private float mCollapseAccelPx; // classic value: 2000px/s/s (will be negated to collapse "up") + private float mFlingGestureMaxOutputVelocityPx; // how fast can it really go? (should be a little + // faster than mSelfCollapseVelocityPx) + PhoneStatusBarPolicy mIconPolicy; // These are no longer handled by the policy, because we need custom strategies for them @@ -165,6 +168,7 @@ public class PhoneStatusBar extends BaseStatusBar { ScrollView mScrollView; View mExpandedContents; int mNotificationPanelMarginBottomPx, mNotificationPanelMarginLeftPx; + final Rect mNotificationPanelBackgroundPadding = new Rect(); int mNotificationPanelGravity; int mNotificationPanelMinHeight; @@ -267,6 +271,13 @@ public class PhoneStatusBar extends BaseStatusBar { } }; + private final Runnable mPerformSelfExpandFling = new Runnable() { + @Override + public void run() { + performFling(0, mSelfExpandVelocityPx, true); + } + }; + private final Runnable mPerformFling = new Runnable() { @Override public void run() { @@ -392,12 +403,13 @@ public class PhoneStatusBar extends BaseStatusBar { mTickerView = mStatusBarView.findViewById(R.id.ticker); mPile = (NotificationRowLayout)mStatusBarWindow.findViewById(R.id.latestItems); + mPile.setLayoutTransitionsEnabled(false); mPile.setLongPressListener(getNotificationLongClicker()); if (SHOW_CARRIER_LABEL) { mPile.setOnSizeChangedListener(new OnSizeChangedListener() { @Override public void onSizeChanged(View view, int w, int h, int oldw, int oldh) { - updateCarrierLabelVisibility(); + updateCarrierLabelVisibility(false); } }); } @@ -443,12 +455,14 @@ public class PhoneStatusBar extends BaseStatusBar { mNetworkController.addSignalCluster(signalCluster); signalCluster.setNetworkController(mNetworkController); - - // for wifi-only devices, we show SSID; otherwise, we show PLMN - if (mNetworkController.hasMobileDataFeature()) { - mNetworkController.addMobileLabelView(mCarrierLabel); - } else { - mNetworkController.addWifiLabelView(mCarrierLabel); + + if (SHOW_CARRIER_LABEL) { + // for wifi-only devices, we show SSID; otherwise, we show PLMN + if (mNetworkController.hasMobileDataFeature()) { + mNetworkController.addMobileLabelView(mCarrierLabel); + } else { + mNetworkController.addWifiLabelView(mCarrierLabel); + } } // final ImageView wimaxRSSI = @@ -889,7 +903,7 @@ public class PhoneStatusBar extends BaseStatusBar { } } - protected void updateCarrierLabelVisibility() { + protected void updateCarrierLabelVisibility(boolean force) { if (!SHOW_CARRIER_LABEL) return; // The idea here is to only show the carrier label when there is enough room to see it, // i.e. when there aren't enough notifications to fill the panel. @@ -901,7 +915,7 @@ public class PhoneStatusBar extends BaseStatusBar { final boolean makeVisible = mPile.getHeight() < (mScrollView.getHeight() - mCarrierLabelHeight); - if (mCarrierLabelVisible != makeVisible) { + if (force || mCarrierLabelVisible != makeVisible) { mCarrierLabelVisible = makeVisible; if (DEBUG) { Slog.d(TAG, "making carrier label " + (makeVisible?"visible":"invisible")); @@ -986,7 +1000,7 @@ public class PhoneStatusBar extends BaseStatusBar { .start(); } - updateCarrierLabelVisibility(); + updateCarrierLabelVisibility(false); } public void showClock(boolean show) { @@ -1159,9 +1173,10 @@ public class PhoneStatusBar extends BaseStatusBar { } mExpandedVisible = true; + mPile.setLayoutTransitionsEnabled(true); makeSlippery(mNavigationBarView, true); - updateCarrierLabelVisibility(); + updateCarrierLabelVisibility(true); updateExpandedViewPos(EXPANDED_LEAVE_ALONE); @@ -1206,7 +1221,7 @@ public class PhoneStatusBar extends BaseStatusBar { } prepareTracking(0, true); - performFling(0, mSelfExpandVelocityPx, true); + mHandler.post(mPerformSelfExpandFling); } public void animateCollapse() { @@ -1279,6 +1294,7 @@ public class PhoneStatusBar extends BaseStatusBar { return; } mExpandedVisible = false; + mPile.setLayoutTransitionsEnabled(false); visibilityChanged(false); makeSlippery(mNavigationBarView, false); @@ -1521,12 +1537,15 @@ public class PhoneStatusBar extends BaseStatusBar { mViewDelta = statusBarSize - y; } else { mCloseView.getLocationOnScreen(mAbsPos); - mViewDelta = mAbsPos[1] + statusBarSize + getCloseViewHeight() - y; // XXX: not closeViewHeight, but paddingBottom from the 9patch + mViewDelta = mAbsPos[1] + + getCloseViewHeight() // XXX: not closeViewHeight, but paddingBottom from the 9patch + + mNotificationPanelBackgroundPadding.top + + mNotificationPanelBackgroundPadding.bottom + - y; } if ((!mExpanded && y < hitSize) || // @@ add taps outside the panel if it's not full-screen (mExpanded && y > (getExpandedViewMaxHeight()-hitSize))) { - // We drop events at the edge of the screen to make the windowshade come // down by accident less, especially when pushing open a device with a keyboard // that rotates (like g1 and droid) @@ -1562,6 +1581,9 @@ public class PhoneStatusBar extends BaseStatusBar { } float vel = (float)Math.hypot(yVel, xVel); + if (vel > mFlingGestureMaxOutputVelocityPx) { + vel = mFlingGestureMaxOutputVelocityPx; + } if (negative) { vel = -vel; } @@ -1943,9 +1965,7 @@ public class PhoneStatusBar extends BaseStatusBar { | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, PixelFormat.TRANSLUCENT); - if (ActivityManager.isHighEndGfx(mDisplay)) { - lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; - } + lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; lp.gravity = getStatusBarGravity(); lp.setTitle("StatusBar"); @@ -2041,7 +2061,7 @@ public class PhoneStatusBar extends BaseStatusBar { mStatusBarWindow.setBackgroundColor(color); } - updateCarrierLabelVisibility(); + updateCarrierLabelVisibility(false); } void updateDisplaySize() { @@ -2268,6 +2288,8 @@ public class PhoneStatusBar extends BaseStatusBar { mFlingGestureMaxXVelocityPx = res.getDimension(R.dimen.fling_gesture_max_x_velocity); + mFlingGestureMaxOutputVelocityPx = res.getDimension(R.dimen.fling_gesture_max_output_velocity); + mNotificationPanelMarginBottomPx = (int) res.getDimension(R.dimen.notification_panel_margin_bottom); mNotificationPanelMarginLeftPx @@ -2276,10 +2298,12 @@ public class PhoneStatusBar extends BaseStatusBar { if (mNotificationPanelGravity <= 0) { mNotificationPanelGravity = Gravity.CENTER_VERTICAL | Gravity.TOP; } + getNinePatchPadding(res.getDrawable(R.drawable.notification_panel_bg), mNotificationPanelBackgroundPadding); final int notificationPanelDecorationHeight = res.getDimensionPixelSize(R.dimen.notification_panel_padding_top) + res.getDimensionPixelSize(R.dimen.notification_panel_header_height) - + getNinePatchPadding(res.getDrawable(R.drawable.notification_panel_bg)).bottom; + + mNotificationPanelBackgroundPadding.top + + mNotificationPanelBackgroundPadding.bottom; mNotificationPanelMinHeight = notificationPanelDecorationHeight + res.getDimensionPixelSize(R.dimen.close_handle_underlap); @@ -2289,13 +2313,11 @@ public class PhoneStatusBar extends BaseStatusBar { if (false) Slog.v(TAG, "updateResources"); } - private static Rect getNinePatchPadding(Drawable d) { - Rect padding = new Rect(); + private static void getNinePatchPadding(Drawable d, Rect outPadding) { if (d instanceof NinePatchDrawable) { NinePatchDrawable ninePatch = (NinePatchDrawable) d; - ninePatch.getPadding(padding); + ninePatch.getPadding(outPadding); } - return padding; } // diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java index 42db8cf..61e5ab6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java @@ -68,6 +68,8 @@ public class NotificationRowLayout // animation is done boolean mRemoveViews = true; + private LayoutTransition mRealLayoutTransition; + public NotificationRowLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -75,7 +77,8 @@ public class NotificationRowLayout public NotificationRowLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - setLayoutTransition(new LayoutTransition()); + mRealLayoutTransition = new LayoutTransition(); + setLayoutTransitionsEnabled(true); setOrientation(LinearLayout.VERTICAL); @@ -121,9 +124,9 @@ public class NotificationRowLayout private void logLayoutTransition() { Log.v(TAG, "layout " + - (getLayoutTransition().isChangingLayout() ? "is " : "is not ") + + (mRealLayoutTransition.isChangingLayout() ? "is " : "is not ") + "in transition and animations " + - (getLayoutTransition().isRunning() ? "are " : "are not ") + + (mRealLayoutTransition.isRunning() ? "are " : "are not ") + "running."); } @@ -225,6 +228,18 @@ public class NotificationRowLayout mRemoveViews = removeViews; } + // Suppress layout transitions for a little while. + public void setLayoutTransitionsEnabled(boolean b) { + if (b) { + setLayoutTransition(mRealLayoutTransition); + } else { + if (mRealLayoutTransition.isRunning()) { + mRealLayoutTransition.cancel(); + } + setLayoutTransition(null); + } + } + public void dismissRowAnimated(View child) { dismissRowAnimated(child, 0); } 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 71657f5..d8166f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java @@ -104,8 +104,6 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, mClearButton.setOnClickListener(mClearButtonListener); mShowing = false; - - setContentFrameVisible(mNotificationCount > 0, false); } @Override @@ -129,10 +127,6 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, } public void show(boolean show, boolean animate) { - if (show && !mShowing) { - setContentFrameVisible(mSettingsView != null || mNotificationCount > 0, false); - } - if (animate) { if (mShowing != show) { mShowing = show; @@ -226,53 +220,10 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, } public void setNotificationCount(int n) { -// Slog.d(TAG, "notificationCount=" + n); - if (!mShowing) { - // just do it, already - setContentFrameVisible(n > 0, false); - } else if (mSettingsView == null) { - // we're looking at the notifications; time to maybe make some changes - if ((mNotificationCount > 0) != (n > 0)) { - setContentFrameVisible(n > 0, true); - } - } mNotificationCount = n; } public void setContentFrameVisible(final boolean showing, boolean animate) { - if (!animate) { - mContentFrame.setVisibility(showing ? View.VISIBLE : View.GONE); - mContentFrame.setAlpha(1f); - // the translation will be patched up when the window is slid into place - return; - } - - if (showing) { - mContentFrame.setVisibility(View.VISIBLE); - } - AnimatorSet set = new AnimatorSet(); - set.play(ObjectAnimator.ofFloat( - mContentFrame, "alpha", - showing ? 0f : 1f, - showing ? 1f : 0f)) - .with(ObjectAnimator.ofFloat( - mContentParent, "translationY", - showing ? mContentFrameMissingTranslation : 0f, - showing ? 0f : mContentFrameMissingTranslation)) - ; - - set.setDuration(200); - set.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator _a) { - if (!showing) { - mContentFrame.setVisibility(View.GONE); - mContentFrame.setAlpha(1f); - } - updateClearButton(); - } - }); - set.start(); } public void swapPanels() { @@ -292,11 +243,6 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, public void onAnimationEnd(Animator _a) { toHide.setVisibility(View.GONE); if (toShow != null) { - if (mNotificationCount == 0) { - // show the frame for settings, hide for notifications - setContentFrameVisible(toShow == mSettingsView, true); - } - toShow.setVisibility(View.VISIBLE); if (toShow == mSettingsView || mNotificationCount > 0) { ObjectAnimator.ofFloat(toShow, "alpha", 0f, 1f) 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 8df9b85..9b46af8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -404,6 +404,7 @@ public class TabletStatusBar extends BaseStatusBar implements mRecentsPanel.updateValuesFromResources(); mShowSearchHoldoff = mContext.getResources().getInteger( R.integer.config_show_search_delay); + updateSearchPanel(); } protected void loadDimens() { |
