Tapping clock on QS launches clock app

This change mimics the behavior in the alarm tile. Tapping on the clock
either:

- Launches the alarms tab of the Clock app using the ACTION_SHOW_ALARMS
  intent. OR
- Launches the intent of the last alarm that was sent to us via
  NextAlarmController

Test: manual
Test: ShadeHeaderControllerTest
Fixes: 259438579
Change-Id: I81e97a25f2a64c2f4cfc548b3bb7f2088a449d0e
This commit is contained in:
Evan Laird
2023-04-07 16:31:39 -04:00
parent 857b09eb82
commit ef3ef71cc9
2 changed files with 59 additions and 0 deletions

View File

@@ -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

View File

@@ -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,