From 4fa3a9d4cf454cfc00c4d3ee79ee6ac8864a2fed Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Tue, 12 Jun 2018 16:42:11 -0700 Subject: [PATCH] Quick scrub has gradient follow user drag Removed the track drawable and draws a gradient translated to the position of the drag of the user as the track's background. Test: quickscrub Change-Id: Iee893e5f96f4954c77307c5ff9b762a04bd7de9a Fixes: 109882517 --- .../res/drawable-hdpi/qs_scrubber_track.9.png | Bin 365 -> 0 bytes .../res/drawable-mdpi/qs_scrubber_track.9.png | Bin 223 -> 0 bytes .../drawable-xhdpi/qs_scrubber_track.9.png | Bin 386 -> 0 bytes .../drawable-xxhdpi/qs_scrubber_track.9.png | Bin 685 -> 0 bytes .../drawable-xxxhdpi/qs_scrubber_track.9.png | Bin 747 -> 0 bytes packages/SystemUI/res/values/colors.xml | 6 +- .../statusbar/phone/QuickStepController.java | 62 ++++++++++++------ 7 files changed, 47 insertions(+), 21 deletions(-) delete mode 100644 packages/SystemUI/res/drawable-hdpi/qs_scrubber_track.9.png delete mode 100644 packages/SystemUI/res/drawable-mdpi/qs_scrubber_track.9.png delete mode 100644 packages/SystemUI/res/drawable-xhdpi/qs_scrubber_track.9.png delete mode 100644 packages/SystemUI/res/drawable-xxhdpi/qs_scrubber_track.9.png delete mode 100644 packages/SystemUI/res/drawable-xxxhdpi/qs_scrubber_track.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/qs_scrubber_track.9.png b/packages/SystemUI/res/drawable-hdpi/qs_scrubber_track.9.png deleted file mode 100644 index 0899d3515f1b9eaaf2eecc3e26e78d9945cc4226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 365 zcmV-z0h0cSP)~W-5(K`7U%45}jmO8bU(irScI}Ix8e95nCO( zn|n698SKnVHOYPQ%ek5JjOhGWjOf2;;?T@`fl*)um;;6)@B&-_N5G?`&lcF4kXhq> z0@wm(fu27m_yVqgUEo$yn79oZ1NMNC&bMtOo`6kB_f5#m`hWvqIVIw;b6{Q4d*f)DIj2^BJK_U`^6nYemL^ePB2x_6%%Dx@oIOT+Gn5 z?UY^H0qzoA^C`@10GNz*nF0pmS=hDf*nkH~AHTKV|2Zjdm5AvFjtXW2tvjMf00000 LNkvXXu0mjfaX^-w diff --git a/packages/SystemUI/res/drawable-mdpi/qs_scrubber_track.9.png b/packages/SystemUI/res/drawable-mdpi/qs_scrubber_track.9.png deleted file mode 100644 index 22664496db762448707e0642a4f07a94c24d61ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp@K+MCz1|)ZGH@^v_mU+53hG+y&y|kO_kb^+$!~a(V zYvgA~bZq-&)HQXwlYqRN_t9eyq*;UIBhRq4&Nw~A`1jj4=hm&@pPqSjYW<{b?gzL$ z8WkrnOBPJ}qGMjrnzO#~@ceU%d#7$;wmb2SXNOrsM3je>dkMRmY=D|3?}=^P3NIVD zJUw0X6E3i~hM6baVzgE1eLR}&~D~N)xEYyuzdlxrGP!}2{5L~zwy@+o-L`0#aa5}Wf1e!@( zFq`SBul}y?>JsT@k*iX|hB}#94Oj=3if=jsz5(~Z9ng{VS(403;byi1904(KnAj)a zP||Im!(X_WjRPmZZpya%e9nObNngeP0r(lPR{{HJ?0hX)k$hyuG#gALQ-o|R6pO*ahSV@KWh2(U zQcArNLfFh;I6BjPUbj2sK%b=d69i2R zVrFZBbHECqy_wZh-Wdj-0mmghY>*=z#LT<}M}e-Ki#H1E14=%l1?~c?E2>6V<_WM((z^iS zdNBY@uNcHNW{af$0Mg@vQ!zwX?xdvd05S-4OcKa|qzwV21}vH+keZ~$4q|5Jy~=x+ z6y+b5)E+=afVQF;bHUb%ctz!gc3NR5Ywd zQda<31M~xK0jhlbY;KY?7?=1vz`80afTxkf*8+%}A9kxs$Y81#kVvv zx>ebLmyr#4mGmQC9e3;3D{9Xk;MzE26c#r#_pAGXX(a)T0#_yNOSOtI5Leg>z^)Qx z-~DPIa46F}$BfdkXryRmVJ=38^HU;e=78mDdkJtqo7Xh`0^azhB;9YYtI|hK|1#W= z7aKWa=VmIf0GJ;Q;XZ(O0&@~O`~p0R266YJAAt{&{$%vGUXkSA3#~jC&E(QQgXhu% T^up|x00000NkvXXu0mjf8nrkb diff --git a/packages/SystemUI/res/drawable-xxxhdpi/qs_scrubber_track.9.png b/packages/SystemUI/res/drawable-xxxhdpi/qs_scrubber_track.9.png deleted file mode 100644 index 06e120239eb2990fb500fbfa13cb5504ffbe0291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 747 zcmVC{5&}6jQ#!#zrf+p(d=)U8fJMW$M&b`mfJnvI)@8+I!e)rt-eEp9IKP=@^Aw!gMW@a;i zWyxptWG&SHNB1#1P^01Dn|d;2^NKAY?7G zUqB~tT++`Re)9pF*(%^1Fe``CB9D9kwoAHQ$9QmHGn)#W1lAX!C}49H*dys{hHW-* z0_%0Qpg`a5B?&CkOnN0)U z0OLbN3gpK(7tiwNH1KI)XP_XV-E>OY*9UB7V}KsOYdFT?^Qu+S?|+9MGxL*{ue&ji zc1hh8;KRV7m}&ilDCtxM_!h7_a^M@1)>eRD0&^n=ej%x?0{jJNjvTm0QnLe_ne_rq zkpuTiYHCPePjN$)gabbZ+9EHBev_`@mNnm}k42v0ej7(4Y|Zl}J*%w4V*wX8W=ERk z_dtu^@%oe>Gdlw8j}-W*qyy>m@O0pHqz8D+XW>03?U1bQP-eYGA<_6?G*RRLrQDHnmXh%wUOmn3aT1qaQk*ImdNMBL6TXs-mi0PkrG$MBwq zgWjp*JRfjUB8}5BsDA5!O__U1Z(}GOrTiJL^{JA!*K%M{()!A3d%a6qUcuU4>1N#eeeeee - #61000000 - #33FFFFFF + #1F000000 + #33FFFFFF + #38000000 + #59FFFFFF #fff44336 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java index 5194bea2fd870..1da8e81a0218d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java @@ -27,16 +27,16 @@ import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; -import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.RadialGradient; import android.graphics.Rect; -import android.graphics.drawable.Drawable; +import android.graphics.Shader; import android.os.Handler; import android.os.RemoteException; import android.util.FloatProperty; @@ -55,7 +55,6 @@ import com.android.systemui.plugins.statusbar.phone.NavGesture.GestureHelper; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.utilities.Utilities; import com.android.systemui.shared.system.NavigationBarCompat; -import com.android.internal.graphics.ColorUtils; /** * Class to detect gestures on the navigation bar and implement quick scrub. @@ -66,6 +65,7 @@ public class QuickStepController implements GestureHelper { private static final int ANIM_IN_DURATION_MS = 150; private static final int ANIM_OUT_DURATION_MS = 134; private static final float TRACK_SCALE = 0.95f; + private static final float GRADIENT_WIDTH = .75f; private NavigationBarView mNavigationBarView; @@ -79,23 +79,22 @@ public class QuickStepController implements GestureHelper { private boolean mIsRTL; private float mTrackAlpha; private float mTrackScale = TRACK_SCALE; - private int mLightTrackColor; - private int mDarkTrackColor; private float mDarkIntensity; + private RadialGradient mHighlight; + private float mHighlightCenter; private AnimatorSet mTrackAnimator; private ButtonDispatcher mHitTarget; private View mCurrentNavigationBarView; private final Handler mHandler = new Handler(); private final Rect mTrackRect = new Rect(); - private final Drawable mTrackDrawable; private final OverviewProxyService mOverviewEventSender; private final int mTrackThickness; private final int mTrackEndPadding; private final Context mContext; private final Matrix mTransformGlobalMatrix = new Matrix(); private final Matrix mTransformLocalMatrix = new Matrix(); - private final ArgbEvaluator mTrackColorEvaluator = new ArgbEvaluator(); + private final Paint mTrackPaint = new Paint(); private final FloatProperty mTrackAlphaProperty = new FloatProperty("TrackAlpha") { @@ -156,7 +155,8 @@ public class QuickStepController implements GestureHelper { mOverviewEventSender = Dependency.get(OverviewProxyService.class); mTrackThickness = res.getDimensionPixelSize(R.dimen.nav_quick_scrub_track_thickness); mTrackEndPadding = res.getDimensionPixelSize(R.dimen.nav_quick_scrub_track_edge_padding); - mTrackDrawable = context.getDrawable(R.drawable.qs_scrubber_track).mutate(); + mTrackPaint.setAntiAlias(true); + mTrackPaint.setDither(true); } public void setComponents(NavigationBarView navigationBarView) { @@ -290,6 +290,8 @@ public class QuickStepController implements GestureHelper { } catch (RemoteException e) { Log.e(TAG, "Failed to send progress of quick scrub.", e); } + mHighlightCenter = x; + mNavigationBarView.invalidate(); } break; } @@ -313,18 +315,18 @@ public class QuickStepController implements GestureHelper { if (!mNavigationBarView.isQuickScrubEnabled()) { return; } - int color = (int) mTrackColorEvaluator.evaluate(mDarkIntensity, mLightTrackColor, - mDarkTrackColor); - int colorAlpha = ColorUtils.setAlphaComponent(color, - (int) (Color.alpha(color) * mTrackAlpha)); - mTrackDrawable.setTint(colorAlpha); + mTrackPaint.setAlpha(Math.round(255f * mTrackAlpha)); // Scale the track, but apply the inverse scale from the nav bar + final float radius = mTrackRect.height() / 2; canvas.save(); + float translate = Utilities.clamp(mHighlightCenter, mTrackRect.left, mTrackRect.right); + canvas.translate(translate, 0); canvas.scale(mTrackScale / mNavigationBarView.getScaleX(), 1f / mNavigationBarView.getScaleY(), mTrackRect.centerX(), mTrackRect.centerY()); - mTrackDrawable.draw(canvas); + canvas.drawRoundRect(mTrackRect.left - translate, mTrackRect.top, + mTrackRect.right - translate, mTrackRect.bottom, radius, radius, mTrackPaint); canvas.restore(); } @@ -349,12 +351,20 @@ public class QuickStepController implements GestureHelper { x2 = x1 + width - 2 * mTrackEndPadding; } mTrackRect.set(x1, y1, x2, y2); - mTrackDrawable.setBounds(mTrackRect); + updateHighlight(); } @Override public void onDarkIntensityChange(float intensity) { + final float oldIntensity = mDarkIntensity; mDarkIntensity = intensity; + + // When in quick scrub, invalidate gradient if changing intensity from black to white and + // vice-versa + if (mNavigationBarView.isQuickScrubEnabled() + && Math.round(intensity) != Math.round(oldIntensity)) { + updateHighlight(); + } mNavigationBarView.invalidate(); } @@ -411,10 +421,8 @@ public class QuickStepController implements GestureHelper { private void startQuickScrub() { if (!mQuickScrubActive) { + updateHighlight(); mQuickScrubActive = true; - mLightTrackColor = mContext.getColor(R.color.quick_step_track_background_light); - mDarkTrackColor = mContext.getColor(R.color.quick_step_track_background_dark); - ObjectAnimator trackAnimator = ObjectAnimator.ofPropertyValuesHolder(this, PropertyValuesHolder.ofFloat(mTrackAlphaProperty, 1f), PropertyValuesHolder.ofFloat(mTrackScaleProperty, 1f)); @@ -489,6 +497,22 @@ public class QuickStepController implements GestureHelper { mQuickScrubActive = false; mAllowGestureDetection = false; mCurrentNavigationBarView = null; + updateHighlight(); + } + + private void updateHighlight() { + int colorBase, colorGrad; + if (mDarkIntensity > 0.5f) { + colorBase = mContext.getColor(R.color.quick_step_track_background_background_dark); + colorGrad = mContext.getColor(R.color.quick_step_track_background_foreground_dark); + } else { + colorBase = mContext.getColor(R.color.quick_step_track_background_background_light); + colorGrad = mContext.getColor(R.color.quick_step_track_background_foreground_light); + } + mHighlight = new RadialGradient(0, mTrackRect.height() / 2, + mTrackRect.width() * GRADIENT_WIDTH, colorGrad, colorBase, + Shader.TileMode.CLAMP); + mTrackPaint.setShader(mHighlight); } private boolean proxyMotionEvents(MotionEvent event) {