diff options
Diffstat (limited to 'packages/SystemUI')
4 files changed, 135 insertions, 3 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 0b1b883..8f88e73 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar; import android.os.Handler; import android.os.IBinder; import android.os.Message; +import android.util.Pair; import com.android.internal.statusbar.IStatusBar; import com.android.internal.statusbar.StatusBarIcon; @@ -57,6 +58,9 @@ public class CommandQueue extends IStatusBar.Stub { private static final int MSG_NOTIFICATION_LIGHT_OFF = 16 << MSG_SHIFT; private static final int MSG_NOTIFICATION_LIGHT_PULSE = 17 << MSG_SHIFT; private static final int MSG_SHOW_SCREEN_PIN_REQUEST = 18 << MSG_SHIFT; + private static final int MSG_APP_TRANSITION_PENDING = 19 << MSG_SHIFT; + private static final int MSG_APP_TRANSITION_CANCELLED = 20 << MSG_SHIFT; + private static final int MSG_APP_TRANSITION_STARTING = 21 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -99,6 +103,9 @@ public class CommandQueue extends IStatusBar.Stub { public void notificationLightOff(); public void notificationLightPulse(int argb, int onMillis, int offMillis); public void showScreenPinningRequest(); + public void appTransitionPending(); + public void appTransitionCancelled(); + public void appTransitionStarting(long startTime, long duration); } public CommandQueue(Callbacks callbacks, StatusBarIconList list) { @@ -246,6 +253,28 @@ public class CommandQueue extends IStatusBar.Stub { } } + public void appTransitionPending() { + synchronized (mList) { + mHandler.removeMessages(MSG_APP_TRANSITION_PENDING); + mHandler.sendEmptyMessage(MSG_APP_TRANSITION_PENDING); + } + } + + public void appTransitionCancelled() { + synchronized (mList) { + mHandler.removeMessages(MSG_APP_TRANSITION_PENDING); + mHandler.sendEmptyMessage(MSG_APP_TRANSITION_PENDING); + } + } + + public void appTransitionStarting(long startTime, long duration) { + synchronized (mList) { + mHandler.removeMessages(MSG_APP_TRANSITION_STARTING); + mHandler.obtainMessage(MSG_APP_TRANSITION_STARTING, Pair.create(startTime, duration)) + .sendToTarget(); + } + } + private final class H extends Handler { public void handleMessage(Message msg) { final int what = msg.what & MSG_MASK; @@ -328,6 +357,16 @@ public class CommandQueue extends IStatusBar.Stub { case MSG_SHOW_SCREEN_PIN_REQUEST: mCallbacks.showScreenPinningRequest(); break; + case MSG_APP_TRANSITION_PENDING: + mCallbacks.appTransitionPending(); + break; + case MSG_APP_TRANSITION_CANCELLED: + mCallbacks.appTransitionCancelled(); + break; + case MSG_APP_TRANSITION_STARTING: + Pair<Long, Long> data = (Pair<Long, Long>) msg.obj; + mCallbacks.appTransitionStarting(data.first, data.second); + break; } } } 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 ece69d3..3740d2a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -101,7 +101,6 @@ import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityEvent; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AccelerateInterpolator; -import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import android.view.animation.PathInterpolator; @@ -115,7 +114,6 @@ import com.android.systemui.BatteryMeterView; import com.android.systemui.DemoMode; import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; -import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import com.android.systemui.doze.DozeHost; import com.android.systemui.doze.DozeLog; @@ -138,7 +136,6 @@ import com.android.systemui.statusbar.NotificationOverflowContainer; import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.SignalClusterView; import com.android.systemui.statusbar.SpeedBumpView; -import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.UnlockMethodCache.OnUnlockMethodChangedListener; import com.android.systemui.statusbar.policy.AccessibilityController; @@ -3638,6 +3635,21 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } } + @Override + public void appTransitionPending() { + mIconController.appTransitionPending(); + } + + @Override + public void appTransitionCancelled() { + mIconController.appTransitionCancelled(); + } + + @Override + public void appTransitionStarting(long startTime, long duration) { + mIconController.appTransitionStarting(startTime, duration); + } + private final class ShadeUpdates { private final ArraySet<String> mVisibleNotifications = new ArraySet<String>(); private final ArraySet<String> mNewVisibleNotifications = new ArraySet<String>(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java index 5622993..8662b04 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -16,11 +16,13 @@ package com.android.systemui.statusbar.phone; +import android.animation.ValueAnimator; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.PorterDuff; import android.os.Bundle; +import android.os.SystemClock; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; @@ -48,9 +50,12 @@ import java.util.ArrayList; */ public class StatusBarIconController { + private static final long DEFAULT_TINT_ANIMATION_DURATION = 120; + private Context mContext; private PhoneStatusBar mPhoneStatusBar; private Interpolator mLinearOutSlowIn; + private Interpolator mFastOutSlowIn; private DemoStatusIcons mDemoStatusIcons; private NotificationColorUtil mNotificationColorUtil; @@ -69,6 +74,11 @@ public class StatusBarIconController { private int mIconTint = Color.WHITE; + private boolean mTransitionPending; + private boolean mTintChangePending; + private int mPendingIconTint; + private ValueAnimator mTintAnimator; + public StatusBarIconController(Context context, View statusBar, View keyguardStatusBar, PhoneStatusBar phoneStatusBar) { mContext = context; @@ -86,6 +96,8 @@ public class StatusBarIconController { mClock = (TextView) statusBar.findViewById(R.id.clock); mLinearOutSlowIn = AnimationUtils.loadInterpolator(mContext, android.R.interpolator.linear_out_slow_in); + mFastOutSlowIn = AnimationUtils.loadInterpolator(mContext, + android.R.interpolator.fast_out_slow_in); updateResources(); } @@ -268,10 +280,45 @@ public class StatusBarIconController { } public void setIconTint(int tint) { + if (mTransitionPending) { + deferIconTintChange(tint); + } else { + animateIconTint(tint, 0 /* delay */, DEFAULT_TINT_ANIMATION_DURATION); + } + } + + private void animateIconTint(int targetTint, long delay, long duration) { + if (mTintAnimator != null) { + mTintAnimator.cancel(); + } + if (mIconTint == targetTint) { + return; + } + mTintAnimator = ValueAnimator.ofArgb(mIconTint, targetTint); + mTintAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + setIconTintInternal((Integer) animation.getAnimatedValue()); + } + }); + mTintAnimator.setDuration(duration); + mTintAnimator.setStartDelay(delay); + mTintAnimator.setInterpolator(mFastOutSlowIn); + mTintAnimator.start(); + } + private void setIconTintInternal(int tint) { mIconTint = tint; applyIconTint(); } + private void deferIconTintChange(int tint) { + if (mTintChangePending && tint == mPendingIconTint) { + return; + } + mTintChangePending = true; + mPendingIconTint = tint; + } + private void applyIconTint() { for (int i = 0; i < mStatusIcons.getChildCount(); i++) { StatusBarIconView v = (StatusBarIconView) mStatusIcons.getChildAt(i); @@ -305,4 +352,26 @@ public class StatusBarIconController { v.setTag(R.id.icon_is_grayscale, grayscale); return grayscale; } + + public void appTransitionPending() { + mTransitionPending = true; + } + + public void appTransitionCancelled() { + if (mTransitionPending && mTintChangePending) { + mTintChangePending = false; + animateIconTint(mPendingIconTint, 0 /* delay */, DEFAULT_TINT_ANIMATION_DURATION); + } + mTransitionPending = false; + } + + public void appTransitionStarting(long startTime, long duration) { + if (mTransitionPending && mTintChangePending) { + mTintChangePending = false; + animateIconTint(mPendingIconTint, + Math.max(0, startTime - SystemClock.uptimeMillis()), + duration); + } + mTransitionPending = false; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java index 6f2a392..413c891 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java @@ -170,4 +170,16 @@ public class TvStatusBar extends BaseStatusBar { @Override public void showScreenPinningRequest() { } + + @Override + public void appTransitionPending() { + } + + @Override + public void appTransitionCancelled() { + } + + @Override + public void appTransitionStarting(long startTime, long duration) { + } } |