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

Commit f0cc67d7 authored by Evan Laird's avatar Evan Laird Committed by Android (Google) Code Review
Browse files

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

parents 7a03e3ea ef3ef71c
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,