summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt28
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt31
2 files changed, 59 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
index b4653bef766d..f0815e93dccd 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
@@ -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
@@ -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
@@ -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
@@ -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 {
@@ -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"
@@ -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
@@ -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()
@@ -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) {
@@ -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
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
index b043e97f1054..76f7401adbb2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
@@ -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
@@ -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
@@ -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
@@ -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
@@ -181,6 +188,8 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
combinedShadeHeadersConstraintManager,
demoModeController,
qsBatteryModeController,
+ nextAlarmController,
+ activityStarter,
)
whenever(view.isAttachedToWindow).thenReturn(true)
shadeHeaderController.init()
@@ -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,