Loading packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt +5 −3 Original line number Diff line number Diff line Loading @@ -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?) { Loading Loading @@ -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 } Loading @@ -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. Loading packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt +9 −7 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, Loading Loading @@ -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, Loading Loading @@ -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). Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +4 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -912,6 +914,7 @@ public class StatusBar extends CoreStartable implements deviceStateManager.registerCallback(mMainExecutor, new FoldStateListener(mContext, this::onFoldedStateChanged)); wiredChargingRippleController.registerCallbacks(); } @Override Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +5 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -233,7 +234,8 @@ public interface StatusBarPhoneModule { NotifPipelineFlags notifPipelineFlags, InteractionJankMonitor jankMonitor, DeviceStateManager deviceStateManager, DreamOverlayStateController dreamOverlayStateController) { DreamOverlayStateController dreamOverlayStateController, WiredChargingRippleController wiredChargingRippleController) { return new StatusBar( context, notificationsController, Loading Loading @@ -330,7 +332,8 @@ public interface StatusBarPhoneModule { notifPipelineFlags, jankMonitor, deviceStateManager, dreamOverlayStateController dreamOverlayStateController, wiredChargingRippleController ); } } packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt +5 −3 Original line number Diff line number Diff line Loading @@ -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?) { Loading Loading @@ -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 } Loading @@ -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. Loading
packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt +9 −7 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, Loading Loading @@ -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, Loading Loading @@ -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). Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +4 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -912,6 +914,7 @@ public class StatusBar extends CoreStartable implements deviceStateManager.registerCallback(mMainExecutor, new FoldStateListener(mContext, this::onFoldedStateChanged)); wiredChargingRippleController.registerCallbacks(); } @Override Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +5 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -233,7 +234,8 @@ public interface StatusBarPhoneModule { NotifPipelineFlags notifPipelineFlags, InteractionJankMonitor jankMonitor, DeviceStateManager deviceStateManager, DreamOverlayStateController dreamOverlayStateController) { DreamOverlayStateController dreamOverlayStateController, WiredChargingRippleController wiredChargingRippleController) { return new StatusBar( context, notificationsController, Loading Loading @@ -330,7 +332,8 @@ public interface StatusBarPhoneModule { notifPipelineFlags, jankMonitor, deviceStateManager, dreamOverlayStateController dreamOverlayStateController, wiredChargingRippleController ); } }
packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading