Merge "Tapping clock on QS launches clock app" into udc-dev am: f0cc67d79d

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22530764

Change-Id: I6171a1db80e946122e6fd3543185e4963603f1a3
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Evan Laird
2023-04-13 13:47:54 +00:00
committed by Automerger Merge Worker
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.Animator
import android.animation.AnimatorListenerAdapter import android.animation.AnimatorListenerAdapter
import android.annotation.IdRes import android.annotation.IdRes
import android.app.PendingIntent
import android.app.StatusBarManager import android.app.StatusBarManager
import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.os.Trace import android.os.Trace
import android.os.Trace.TRACE_TAG_APP import android.os.Trace.TRACE_TAG_APP
import android.provider.AlarmClock
import android.util.Pair import android.util.Pair
import android.view.DisplayCutout import android.view.DisplayCutout
import android.view.View 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.DemoMode
import com.android.systemui.demomode.DemoModeController import com.android.systemui.demomode.DemoModeController
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.ChipVisibilityListener
import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.qs.HeaderPrivacyIconsController
import com.android.systemui.shade.ShadeHeaderController.Companion.HEADER_TRANSITION_ID 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.phone.dagger.StatusBarViewModule.SHADE_HEADER
import com.android.systemui.statusbar.policy.Clock import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.ConfigurationController 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.VariableDateView
import com.android.systemui.statusbar.policy.VariableDateViewController import com.android.systemui.statusbar.policy.VariableDateViewController
import com.android.systemui.util.ViewController import com.android.systemui.util.ViewController
@@ -91,6 +96,8 @@ constructor(
private val combinedShadeHeadersConstraintManager: CombinedShadeHeadersConstraintManager, private val combinedShadeHeadersConstraintManager: CombinedShadeHeadersConstraintManager,
private val demoModeController: DemoModeController, private val demoModeController: DemoModeController,
private val qsBatteryModeController: QsBatteryModeController, private val qsBatteryModeController: QsBatteryModeController,
private val nextAlarmController: NextAlarmController,
private val activityStarter: ActivityStarter,
) : ViewController<View>(header), Dumpable { ) : ViewController<View>(header), Dumpable {
companion object { companion object {
@@ -103,6 +110,8 @@ constructor(
@VisibleForTesting @VisibleForTesting
internal val LARGE_SCREEN_HEADER_CONSTRAINT = R.id.large_screen_header_constraint 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() = private fun Int.stateToString() =
when (this) { when (this) {
QQS_HEADER_CONSTRAINT -> "QQS Header" QQS_HEADER_CONSTRAINT -> "QQS Header"
@@ -125,6 +134,7 @@ constructor(
private var roundedCorners = 0 private var roundedCorners = 0
private var cutout: DisplayCutout? = null private var cutout: DisplayCutout? = null
private var lastInsets: WindowInsets? = null private var lastInsets: WindowInsets? = null
private var nextAlarmIntent: PendingIntent? = null
private var qsDisabled = false private var qsDisabled = false
private var visible = false private var visible = false
@@ -252,6 +262,11 @@ constructor(
} }
} }
private val nextAlarmCallback =
NextAlarmController.NextAlarmChangeCallback { nextAlarm ->
nextAlarmIntent = nextAlarm?.showIntent
}
override fun onInit() { override fun onInit() {
variableDateViewControllerFactory.create(date as VariableDateView).init() variableDateViewControllerFactory.create(date as VariableDateView).init()
batteryMeterViewController.init() batteryMeterViewController.init()
@@ -286,19 +301,23 @@ constructor(
mShadeCarrierGroup.setPaddingRelative((v.width * v.scaleX).toInt(), 0, 0, 0) mShadeCarrierGroup.setPaddingRelative((v.width * v.scaleX).toInt(), 0, 0, 0)
} }
clock.setOnClickListener { launchClockActivity() }
dumpManager.registerDumpable(this) dumpManager.registerDumpable(this)
configurationController.addCallback(configurationControllerListener) configurationController.addCallback(configurationControllerListener)
demoModeController.addCallback(demoModeReceiver) demoModeController.addCallback(demoModeReceiver)
statusBarIconController.addIconGroup(iconManager) statusBarIconController.addIconGroup(iconManager)
nextAlarmController.addCallback(nextAlarmCallback)
} }
override fun onViewDetached() { override fun onViewDetached() {
clock.setOnClickListener(null)
privacyIconsController.chipVisibilityListener = null privacyIconsController.chipVisibilityListener = null
dumpManager.unregisterDumpable(this::class.java.simpleName) dumpManager.unregisterDumpable(this::class.java.simpleName)
configurationController.removeCallback(configurationControllerListener) configurationController.removeCallback(configurationControllerListener)
demoModeController.removeCallback(demoModeReceiver) demoModeController.removeCallback(demoModeReceiver)
statusBarIconController.removeIconGroup(iconManager) statusBarIconController.removeIconGroup(iconManager)
nextAlarmController.removeCallback(nextAlarmCallback)
} }
fun disable(state1: Int, state2: Int, animate: Boolean) { fun disable(state1: Int, state2: Int, animate: Boolean) {
@@ -318,6 +337,15 @@ constructor(
.start() .start()
} }
@VisibleForTesting
internal fun launchClockActivity() {
if (nextAlarmIntent != null) {
activityStarter.postStartActivityDismissingKeyguard(nextAlarmIntent)
} else {
activityStarter.postStartActivityDismissingKeyguard(DEFAULT_CLOCK_INTENT, 0 /*delay */)
}
}
private fun loadConstraints() { private fun loadConstraints() {
// Use resources.getXml instead of passing the resource id due to bug b/205018300 // Use resources.getXml instead of passing the resource id due to bug b/205018300
header header

View File

@@ -16,6 +16,8 @@
package com.android.systemui.shade package com.android.systemui.shade
import android.animation.Animator import android.animation.Animator
import android.app.AlarmManager
import android.app.PendingIntent
import android.app.StatusBarManager import android.app.StatusBarManager
import android.content.Context import android.content.Context
import android.content.res.Resources 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.DemoMode
import com.android.systemui.demomode.DemoModeController import com.android.systemui.demomode.DemoModeController
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.ChipVisibilityListener
import com.android.systemui.qs.HeaderPrivacyIconsController 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.LARGE_SCREEN_HEADER_CONSTRAINT
import com.android.systemui.shade.ShadeHeaderController.Companion.QQS_HEADER_CONSTRAINT import com.android.systemui.shade.ShadeHeaderController.Companion.QQS_HEADER_CONSTRAINT
import com.android.systemui.shade.ShadeHeaderController.Companion.QS_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.phone.StatusIconContainer
import com.android.systemui.statusbar.policy.Clock import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.FakeConfigurationController 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.VariableDateView
import com.android.systemui.statusbar.policy.VariableDateViewController import com.android.systemui.statusbar.policy.VariableDateViewController
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
@@ -114,6 +119,8 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
@Mock private lateinit var demoModeController: DemoModeController @Mock private lateinit var demoModeController: DemoModeController
@Mock private lateinit var qsBatteryModeController: QsBatteryModeController @Mock private lateinit var qsBatteryModeController: QsBatteryModeController
@Mock private lateinit var nextAlarmController: NextAlarmController
@Mock private lateinit var activityStarter: ActivityStarter
@JvmField @Rule val mockitoRule = MockitoJUnit.rule() @JvmField @Rule val mockitoRule = MockitoJUnit.rule()
var viewVisibility = View.GONE var viewVisibility = View.GONE
@@ -181,6 +188,8 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
combinedShadeHeadersConstraintManager, combinedShadeHeadersConstraintManager,
demoModeController, demoModeController,
qsBatteryModeController, qsBatteryModeController,
nextAlarmController,
activityStarter,
) )
whenever(view.isAttachedToWindow).thenReturn(true) whenever(view.isAttachedToWindow).thenReturn(true)
shadeHeaderController.init() shadeHeaderController.init()
@@ -828,6 +837,28 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
verify(carrierGroup).setPaddingRelative(514, 0, 0, 0) 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( private fun View.executeLayoutChange(
left: Int, left: Int,
top: Int, top: Int,