Loading packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt +28 −0 Original line number Diff line number Diff line Loading @@ -19,11 +19,14 @@ package com.android.systemui.shade import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.annotation.IdRes import android.app.PendingIntent import android.app.StatusBarManager import android.content.Intent import android.content.res.Configuration import android.os.Bundle import android.os.Trace import android.os.Trace.TRACE_TAG_APP import android.provider.AlarmClock import android.util.Pair import android.view.DisplayCutout import android.view.View Loading @@ -41,6 +44,7 @@ import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.demomode.DemoMode import com.android.systemui.demomode.DemoModeController import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.shade.ShadeHeaderController.Companion.HEADER_TRANSITION_ID Loading @@ -58,6 +62,7 @@ import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.Cent import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SHADE_HEADER import com.android.systemui.statusbar.policy.Clock import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.NextAlarmController import com.android.systemui.statusbar.policy.VariableDateView import com.android.systemui.statusbar.policy.VariableDateViewController import com.android.systemui.util.ViewController Loading Loading @@ -91,6 +96,8 @@ constructor( private val combinedShadeHeadersConstraintManager: CombinedShadeHeadersConstraintManager, private val demoModeController: DemoModeController, private val qsBatteryModeController: QsBatteryModeController, private val nextAlarmController: NextAlarmController, private val activityStarter: ActivityStarter, ) : ViewController<View>(header), Dumpable { companion object { Loading @@ -103,6 +110,8 @@ constructor( @VisibleForTesting internal val LARGE_SCREEN_HEADER_CONSTRAINT = R.id.large_screen_header_constraint @VisibleForTesting internal val DEFAULT_CLOCK_INTENT = Intent(AlarmClock.ACTION_SHOW_ALARMS) private fun Int.stateToString() = when (this) { QQS_HEADER_CONSTRAINT -> "QQS Header" Loading @@ -125,6 +134,7 @@ constructor( private var roundedCorners = 0 private var cutout: DisplayCutout? = null private var lastInsets: WindowInsets? = null private var nextAlarmIntent: PendingIntent? = null private var qsDisabled = false private var visible = false Loading Loading @@ -252,6 +262,11 @@ constructor( } } private val nextAlarmCallback = NextAlarmController.NextAlarmChangeCallback { nextAlarm -> nextAlarmIntent = nextAlarm?.showIntent } override fun onInit() { variableDateViewControllerFactory.create(date as VariableDateView).init() batteryMeterViewController.init() Loading Loading @@ -286,19 +301,23 @@ constructor( mShadeCarrierGroup.setPaddingRelative((v.width * v.scaleX).toInt(), 0, 0, 0) } clock.setOnClickListener { launchClockActivity() } dumpManager.registerDumpable(this) configurationController.addCallback(configurationControllerListener) demoModeController.addCallback(demoModeReceiver) statusBarIconController.addIconGroup(iconManager) nextAlarmController.addCallback(nextAlarmCallback) } override fun onViewDetached() { clock.setOnClickListener(null) privacyIconsController.chipVisibilityListener = null dumpManager.unregisterDumpable(this::class.java.simpleName) configurationController.removeCallback(configurationControllerListener) demoModeController.removeCallback(demoModeReceiver) statusBarIconController.removeIconGroup(iconManager) nextAlarmController.removeCallback(nextAlarmCallback) } fun disable(state1: Int, state2: Int, animate: Boolean) { Loading @@ -318,6 +337,15 @@ constructor( .start() } @VisibleForTesting internal fun launchClockActivity() { if (nextAlarmIntent != null) { activityStarter.postStartActivityDismissingKeyguard(nextAlarmIntent) } else { activityStarter.postStartActivityDismissingKeyguard(DEFAULT_CLOCK_INTENT, 0 /*delay */) } } private fun loadConstraints() { // Use resources.getXml instead of passing the resource id due to bug b/205018300 header Loading packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt +31 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.shade import android.animation.Animator import android.app.AlarmManager import android.app.PendingIntent import android.app.StatusBarManager import android.content.Context import android.content.res.Resources Loading @@ -40,8 +42,10 @@ import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.demomode.DemoMode import com.android.systemui.demomode.DemoModeController import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.shade.ShadeHeaderController.Companion.DEFAULT_CLOCK_INTENT import com.android.systemui.shade.ShadeHeaderController.Companion.LARGE_SCREEN_HEADER_CONSTRAINT import com.android.systemui.shade.ShadeHeaderController.Companion.QQS_HEADER_CONSTRAINT import com.android.systemui.shade.ShadeHeaderController.Companion.QS_HEADER_CONSTRAINT Loading @@ -52,6 +56,7 @@ import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.policy.Clock import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.NextAlarmController import com.android.systemui.statusbar.policy.VariableDateView import com.android.systemui.statusbar.policy.VariableDateViewController import com.android.systemui.util.mockito.any Loading Loading @@ -114,6 +119,8 @@ class ShadeHeaderControllerTest : SysuiTestCase() { @Mock private lateinit var demoModeController: DemoModeController @Mock private lateinit var qsBatteryModeController: QsBatteryModeController @Mock private lateinit var nextAlarmController: NextAlarmController @Mock private lateinit var activityStarter: ActivityStarter @JvmField @Rule val mockitoRule = MockitoJUnit.rule() var viewVisibility = View.GONE Loading Loading @@ -181,6 +188,8 @@ class ShadeHeaderControllerTest : SysuiTestCase() { combinedShadeHeadersConstraintManager, demoModeController, qsBatteryModeController, nextAlarmController, activityStarter, ) whenever(view.isAttachedToWindow).thenReturn(true) shadeHeaderController.init() Loading Loading @@ -828,6 +837,28 @@ class ShadeHeaderControllerTest : SysuiTestCase() { verify(carrierGroup).setPaddingRelative(514, 0, 0, 0) } @Test fun launchClock_launchesDefaultIntentWhenNoAlarmSet() { shadeHeaderController.launchClockActivity() verify(activityStarter).postStartActivityDismissingKeyguard(DEFAULT_CLOCK_INTENT, 0) } @Test fun launchClock_launchesNextAlarmWhenExists() { val pendingIntent = mock<PendingIntent>() val aci = AlarmManager.AlarmClockInfo(12345, pendingIntent) val captor = ArgumentCaptor.forClass(NextAlarmController.NextAlarmChangeCallback::class.java) verify(nextAlarmController).addCallback(capture(captor)) captor.value.onNextAlarmChanged(aci) shadeHeaderController.launchClockActivity() verify(activityStarter).postStartActivityDismissingKeyguard(pendingIntent) } private fun View.executeLayoutChange( left: Int, top: Int, Loading Loading
packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt +28 −0 Original line number Diff line number Diff line Loading @@ -19,11 +19,14 @@ package com.android.systemui.shade import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.annotation.IdRes import android.app.PendingIntent import android.app.StatusBarManager import android.content.Intent import android.content.res.Configuration import android.os.Bundle import android.os.Trace import android.os.Trace.TRACE_TAG_APP import android.provider.AlarmClock import android.util.Pair import android.view.DisplayCutout import android.view.View Loading @@ -41,6 +44,7 @@ import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.demomode.DemoMode import com.android.systemui.demomode.DemoModeController import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.shade.ShadeHeaderController.Companion.HEADER_TRANSITION_ID Loading @@ -58,6 +62,7 @@ import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.Cent import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SHADE_HEADER import com.android.systemui.statusbar.policy.Clock import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.NextAlarmController import com.android.systemui.statusbar.policy.VariableDateView import com.android.systemui.statusbar.policy.VariableDateViewController import com.android.systemui.util.ViewController Loading Loading @@ -91,6 +96,8 @@ constructor( private val combinedShadeHeadersConstraintManager: CombinedShadeHeadersConstraintManager, private val demoModeController: DemoModeController, private val qsBatteryModeController: QsBatteryModeController, private val nextAlarmController: NextAlarmController, private val activityStarter: ActivityStarter, ) : ViewController<View>(header), Dumpable { companion object { Loading @@ -103,6 +110,8 @@ constructor( @VisibleForTesting internal val LARGE_SCREEN_HEADER_CONSTRAINT = R.id.large_screen_header_constraint @VisibleForTesting internal val DEFAULT_CLOCK_INTENT = Intent(AlarmClock.ACTION_SHOW_ALARMS) private fun Int.stateToString() = when (this) { QQS_HEADER_CONSTRAINT -> "QQS Header" Loading @@ -125,6 +134,7 @@ constructor( private var roundedCorners = 0 private var cutout: DisplayCutout? = null private var lastInsets: WindowInsets? = null private var nextAlarmIntent: PendingIntent? = null private var qsDisabled = false private var visible = false Loading Loading @@ -252,6 +262,11 @@ constructor( } } private val nextAlarmCallback = NextAlarmController.NextAlarmChangeCallback { nextAlarm -> nextAlarmIntent = nextAlarm?.showIntent } override fun onInit() { variableDateViewControllerFactory.create(date as VariableDateView).init() batteryMeterViewController.init() Loading Loading @@ -286,19 +301,23 @@ constructor( mShadeCarrierGroup.setPaddingRelative((v.width * v.scaleX).toInt(), 0, 0, 0) } clock.setOnClickListener { launchClockActivity() } dumpManager.registerDumpable(this) configurationController.addCallback(configurationControllerListener) demoModeController.addCallback(demoModeReceiver) statusBarIconController.addIconGroup(iconManager) nextAlarmController.addCallback(nextAlarmCallback) } override fun onViewDetached() { clock.setOnClickListener(null) privacyIconsController.chipVisibilityListener = null dumpManager.unregisterDumpable(this::class.java.simpleName) configurationController.removeCallback(configurationControllerListener) demoModeController.removeCallback(demoModeReceiver) statusBarIconController.removeIconGroup(iconManager) nextAlarmController.removeCallback(nextAlarmCallback) } fun disable(state1: Int, state2: Int, animate: Boolean) { Loading @@ -318,6 +337,15 @@ constructor( .start() } @VisibleForTesting internal fun launchClockActivity() { if (nextAlarmIntent != null) { activityStarter.postStartActivityDismissingKeyguard(nextAlarmIntent) } else { activityStarter.postStartActivityDismissingKeyguard(DEFAULT_CLOCK_INTENT, 0 /*delay */) } } private fun loadConstraints() { // Use resources.getXml instead of passing the resource id due to bug b/205018300 header Loading
packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt +31 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.shade import android.animation.Animator import android.app.AlarmManager import android.app.PendingIntent import android.app.StatusBarManager import android.content.Context import android.content.res.Resources Loading @@ -40,8 +42,10 @@ import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.demomode.DemoMode import com.android.systemui.demomode.DemoModeController import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.shade.ShadeHeaderController.Companion.DEFAULT_CLOCK_INTENT import com.android.systemui.shade.ShadeHeaderController.Companion.LARGE_SCREEN_HEADER_CONSTRAINT import com.android.systemui.shade.ShadeHeaderController.Companion.QQS_HEADER_CONSTRAINT import com.android.systemui.shade.ShadeHeaderController.Companion.QS_HEADER_CONSTRAINT Loading @@ -52,6 +56,7 @@ import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.policy.Clock import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.NextAlarmController import com.android.systemui.statusbar.policy.VariableDateView import com.android.systemui.statusbar.policy.VariableDateViewController import com.android.systemui.util.mockito.any Loading Loading @@ -114,6 +119,8 @@ class ShadeHeaderControllerTest : SysuiTestCase() { @Mock private lateinit var demoModeController: DemoModeController @Mock private lateinit var qsBatteryModeController: QsBatteryModeController @Mock private lateinit var nextAlarmController: NextAlarmController @Mock private lateinit var activityStarter: ActivityStarter @JvmField @Rule val mockitoRule = MockitoJUnit.rule() var viewVisibility = View.GONE Loading Loading @@ -181,6 +188,8 @@ class ShadeHeaderControllerTest : SysuiTestCase() { combinedShadeHeadersConstraintManager, demoModeController, qsBatteryModeController, nextAlarmController, activityStarter, ) whenever(view.isAttachedToWindow).thenReturn(true) shadeHeaderController.init() Loading Loading @@ -828,6 +837,28 @@ class ShadeHeaderControllerTest : SysuiTestCase() { verify(carrierGroup).setPaddingRelative(514, 0, 0, 0) } @Test fun launchClock_launchesDefaultIntentWhenNoAlarmSet() { shadeHeaderController.launchClockActivity() verify(activityStarter).postStartActivityDismissingKeyguard(DEFAULT_CLOCK_INTENT, 0) } @Test fun launchClock_launchesNextAlarmWhenExists() { val pendingIntent = mock<PendingIntent>() val aci = AlarmManager.AlarmClockInfo(12345, pendingIntent) val captor = ArgumentCaptor.forClass(NextAlarmController.NextAlarmChangeCallback::class.java) verify(nextAlarmController).addCallback(capture(captor)) captor.value.onNextAlarmChanged(aci) shadeHeaderController.launchClockActivity() verify(activityStarter).postStartActivityDismissingKeyguard(pendingIntent) } private fun View.executeLayoutChange( left: Int, top: Int, Loading