Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef3ef71c authored by Evan Laird's avatar Evan Laird
Browse files

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
parent 857b09eb
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -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
+31 −0
Original line number Diff line number Diff line
@@ -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,