From a805a2dfbbc386fb581aa55a9b68e525f27d7da8 Mon Sep 17 00:00:00 2001 From: Shan Huang Date: Tue, 15 Feb 2022 21:58:38 +0000 Subject: [PATCH] Put wired charging ripple back. It was removed as a collateral damage of dead code cleanup (ag/15312956).. Also made callback registeration more explicit. Bug: 215568460 Test: atest frameworks/base/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt Test: adb shell cmd statusbar charging-ripple Test: Plugging and unplugging phone Change-Id: I2953c0f294b68b3c65515642f45e2b29d44449d1 --- .../statusbar/charging/ChargingRippleView.kt | 8 +++++--- .../charging/WiredChargingRippleController.kt | 16 +++++++++------- .../systemui/statusbar/phone/StatusBar.java | 5 ++++- .../phone/dagger/StatusBarPhoneModule.java | 7 +++++-- .../WiredChargingRippleControllerTest.kt | 1 + .../systemui/statusbar/phone/StatusBarTest.java | 5 ++++- 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt index d01fc93ee84c0..10e90fee14698 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt @@ -55,7 +55,6 @@ class ChargingRippleView(context: Context?, attrs: AttributeSet?) : View(context rippleShader.progress = 0f rippleShader.sparkleStrength = RIPPLE_SPARKLE_STRENGTH ripplePaint.shader = rippleShader - visibility = View.GONE } override fun onConfigurationChanged(newConfig: Configuration?) { @@ -86,12 +85,10 @@ class ChargingRippleView(context: Context?, attrs: AttributeSet?) : View(context animator.addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { rippleInProgress = false - visibility = View.GONE onAnimationEnd?.run() } }) animator.start() - visibility = View.VISIBLE rippleInProgress = true } @@ -100,6 +97,11 @@ class ChargingRippleView(context: Context?, attrs: AttributeSet?) : View(context } override fun onDraw(canvas: Canvas?) { + if (canvas == null || !canvas.isHardwareAccelerated) { + // Drawing with the ripple shader requires hardware acceleration, so skip + // if it's unsupported. + return + } // To reduce overdraw, we mask the effect to a circle whose radius is big enough to cover // the active effect area. Values here should be kept in sync with the // animation implementation in the ripple shader. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt index 842be5bce52cd..48717e29d06a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt @@ -28,15 +28,15 @@ import com.android.internal.annotations.VisibleForTesting import com.android.internal.logging.UiEvent import com.android.internal.logging.UiEventLogger import com.android.settingslib.Utils +import com.android.systemui.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags +import com.android.systemui.flags.Flags import com.android.systemui.statusbar.commandline.Command import com.android.systemui.statusbar.commandline.CommandRegistry import com.android.systemui.statusbar.policy.BatteryController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.leak.RotationUtils -import com.android.systemui.R -import com.android.systemui.flags.Flags import com.android.systemui.util.time.SystemClock import java.io.PrintWriter import javax.inject.Inject @@ -53,8 +53,8 @@ private const val BASE_DEBOUNCE_TIME = 2000 @SysUISingleton class WiredChargingRippleController @Inject constructor( commandRegistry: CommandRegistry, - batteryController: BatteryController, - configurationController: ConfigurationController, + private val batteryController: BatteryController, + private val configurationController: ConfigurationController, featureFlags: FeatureFlags, private val context: Context, private val windowManager: WindowManager, @@ -88,6 +88,11 @@ class WiredChargingRippleController @Inject constructor( init { pluggedIn = batteryController.isPluggedIn + commandRegistry.registerCommand("charging-ripple") { ChargingRippleCommand() } + updateRippleColor() + } + + fun registerCallbacks() { val batteryStateChangeCallback = object : BatteryController.BatteryStateChangeCallback { override fun onBatteryLevelChanged( level: Int, @@ -123,9 +128,6 @@ class WiredChargingRippleController @Inject constructor( } } configurationController.addCallback(configurationChangedListener) - - commandRegistry.registerCommand("charging-ripple") { ChargingRippleCommand() } - updateRippleColor() } // Lazily debounce ripple to avoid triggering ripple constantly (e.g. from flaky chargers). diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index f13334e55555e..8e4feb83e72da 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -203,6 +203,7 @@ import com.android.systemui.statusbar.PowerButtonReveal; import com.android.systemui.statusbar.PulseExpansionHandler; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.charging.WiredChargingRippleController; import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.core.StatusBarInitializer; import com.android.systemui.statusbar.notification.DynamicPrivacyController; @@ -786,7 +787,8 @@ public class StatusBar extends CoreStartable implements NotifPipelineFlags notifPipelineFlags, InteractionJankMonitor jankMonitor, DeviceStateManager deviceStateManager, - DreamOverlayStateController dreamOverlayStateController) { + DreamOverlayStateController dreamOverlayStateController, + WiredChargingRippleController wiredChargingRippleController) { super(context); mNotificationsController = notificationsController; mFragmentService = fragmentService; @@ -912,6 +914,7 @@ public class StatusBar extends CoreStartable implements deviceStateManager.registerCallback(mMainExecutor, new FoldStateListener(mContext, this::onFoldedStateChanged)); + wiredChargingRippleController.registerCallbacks(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java index 83bdd1b7884c6..c6b5b1d33198f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java @@ -64,6 +64,7 @@ import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationViewHierarchyManager; import com.android.systemui.statusbar.PulseExpansionHandler; import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.charging.WiredChargingRippleController; import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotifPipelineFlags; @@ -233,7 +234,8 @@ public interface StatusBarPhoneModule { NotifPipelineFlags notifPipelineFlags, InteractionJankMonitor jankMonitor, DeviceStateManager deviceStateManager, - DreamOverlayStateController dreamOverlayStateController) { + DreamOverlayStateController dreamOverlayStateController, + WiredChargingRippleController wiredChargingRippleController) { return new StatusBar( context, notificationsController, @@ -330,7 +332,8 @@ public interface StatusBarPhoneModule { notifPipelineFlags, jankMonitor, deviceStateManager, - dreamOverlayStateController + dreamOverlayStateController, + wiredChargingRippleController ); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt index ecc2a1bebc3d9..b4cae38d8b6e9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt @@ -63,6 +63,7 @@ class WiredChargingRippleControllerTest : SysuiTestCase() { commandRegistry, batteryController, configurationController, featureFlags, context, windowManager, systemClock, uiEventLogger) controller.rippleView = rippleView // Replace the real ripple view with a mock instance + controller.registerCallbacks() } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index a7809c2e9c758..c7db9e43166b0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -116,6 +116,7 @@ import com.android.systemui.statusbar.OperatorNameViewController; import com.android.systemui.statusbar.PulseExpansionHandler; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarStateControllerImpl; +import com.android.systemui.statusbar.charging.WiredChargingRippleController; import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotifPipelineFlags; @@ -288,6 +289,7 @@ public class StatusBarTest extends SysuiTestCase { @Mock private InteractionJankMonitor mJankMonitor; @Mock private DeviceStateManager mDeviceStateManager; @Mock private DreamOverlayStateController mDreamOverlayStateController; + @Mock private WiredChargingRippleController mWiredChargingRippleController; private ShadeController mShadeController; private final FakeSystemClock mFakeSystemClock = new FakeSystemClock(); private FakeExecutor mMainExecutor = new FakeExecutor(mFakeSystemClock); @@ -479,7 +481,8 @@ public class StatusBarTest extends SysuiTestCase { mNotifPipelineFlags, mJankMonitor, mDeviceStateManager, - mDreamOverlayStateController); + mDreamOverlayStateController, + mWiredChargingRippleController); when(mKeyguardViewMediator.registerStatusBar( any(StatusBar.class), any(NotificationPanelViewController.class),