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: I77d7982fbb93ff459c5c63c9cc36af39a4a47938 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user