Merge "Restore AOD after SysUI Restart." into tm-qpr-dev
This commit is contained in:
@@ -22,6 +22,7 @@ import com.android.systemui.broadcast.BroadcastSender
|
|||||||
import com.android.systemui.dump.DumpManager
|
import com.android.systemui.dump.DumpManager
|
||||||
import com.android.systemui.statusbar.commandline.CommandRegistry
|
import com.android.systemui.statusbar.commandline.CommandRegistry
|
||||||
import com.android.systemui.util.InitializationChecker
|
import com.android.systemui.util.InitializationChecker
|
||||||
|
import com.android.systemui.util.concurrency.DelayableExecutor
|
||||||
import dagger.Binds
|
import dagger.Binds
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.multibindings.ClassKey
|
import dagger.multibindings.ClassKey
|
||||||
@@ -36,7 +37,9 @@ constructor(
|
|||||||
private val flagCommand: FlagCommand,
|
private val flagCommand: FlagCommand,
|
||||||
private val featureFlags: FeatureFlagsDebug,
|
private val featureFlags: FeatureFlagsDebug,
|
||||||
private val broadcastSender: BroadcastSender,
|
private val broadcastSender: BroadcastSender,
|
||||||
private val initializationChecker: InitializationChecker
|
private val initializationChecker: InitializationChecker,
|
||||||
|
private val restartDozeListener: RestartDozeListener,
|
||||||
|
private val delayableExecutor: DelayableExecutor
|
||||||
) : CoreStartable {
|
) : CoreStartable {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
@@ -52,6 +55,9 @@ constructor(
|
|||||||
// protected broadcast should only be sent for the main process
|
// protected broadcast should only be sent for the main process
|
||||||
val intent = Intent(FlagManager.ACTION_SYSUI_STARTED)
|
val intent = Intent(FlagManager.ACTION_SYSUI_STARTED)
|
||||||
broadcastSender.sendBroadcast(intent)
|
broadcastSender.sendBroadcast(intent)
|
||||||
|
|
||||||
|
restartDozeListener.init()
|
||||||
|
delayableExecutor.executeDelayed({ restartDozeListener.maybeRestartSleep() }, 1000)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ package com.android.systemui.flags
|
|||||||
|
|
||||||
import com.android.systemui.CoreStartable
|
import com.android.systemui.CoreStartable
|
||||||
import com.android.systemui.dump.DumpManager
|
import com.android.systemui.dump.DumpManager
|
||||||
|
import com.android.systemui.util.InitializationChecker
|
||||||
|
import com.android.systemui.util.concurrency.DelayableExecutor
|
||||||
import dagger.Binds
|
import dagger.Binds
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.multibindings.ClassKey
|
import dagger.multibindings.ClassKey
|
||||||
@@ -26,7 +28,13 @@ import javax.inject.Inject
|
|||||||
|
|
||||||
class FeatureFlagsReleaseStartable
|
class FeatureFlagsReleaseStartable
|
||||||
@Inject
|
@Inject
|
||||||
constructor(dumpManager: DumpManager, featureFlags: FeatureFlags) : CoreStartable {
|
constructor(
|
||||||
|
dumpManager: DumpManager,
|
||||||
|
featureFlags: FeatureFlags,
|
||||||
|
private val initializationChecker: InitializationChecker,
|
||||||
|
private val restartDozeListener: RestartDozeListener,
|
||||||
|
private val delayableExecutor: DelayableExecutor
|
||||||
|
) : CoreStartable {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
dumpManager.registerCriticalDumpable(FeatureFlagsRelease.TAG) { pw, args ->
|
dumpManager.registerCriticalDumpable(FeatureFlagsRelease.TAG) { pw, args ->
|
||||||
@@ -35,7 +43,10 @@ constructor(dumpManager: DumpManager, featureFlags: FeatureFlags) : CoreStartabl
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun start() {
|
override fun start() {
|
||||||
// no-op
|
if (initializationChecker.initializeComponents()) {
|
||||||
|
restartDozeListener.init()
|
||||||
|
delayableExecutor.executeDelayed({ restartDozeListener.maybeRestartSleep() }, 1000)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.systemui.flags
|
||||||
|
|
||||||
|
import android.os.PowerManager
|
||||||
|
import android.util.Log
|
||||||
|
import com.android.internal.annotations.VisibleForTesting
|
||||||
|
import com.android.systemui.dagger.SysUISingleton
|
||||||
|
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
||||||
|
import com.android.systemui.util.settings.SecureSettings
|
||||||
|
import com.android.systemui.util.time.SystemClock
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@SysUISingleton
|
||||||
|
class RestartDozeListener
|
||||||
|
@Inject
|
||||||
|
constructor(
|
||||||
|
private val settings: SecureSettings,
|
||||||
|
private val statusBarStateController: StatusBarStateController,
|
||||||
|
private val powerManager: PowerManager,
|
||||||
|
private val systemClock: SystemClock,
|
||||||
|
) {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@VisibleForTesting val RESTART_NAP_KEY = "restart_nap_after_start"
|
||||||
|
}
|
||||||
|
|
||||||
|
private var inited = false
|
||||||
|
|
||||||
|
val listener =
|
||||||
|
object : StatusBarStateController.StateListener {
|
||||||
|
override fun onDreamingChanged(isDreaming: Boolean) {
|
||||||
|
settings.putBool(RESTART_NAP_KEY, isDreaming)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun init() {
|
||||||
|
if (inited) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
inited = true
|
||||||
|
|
||||||
|
statusBarStateController.addCallback(listener)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun destroy() {
|
||||||
|
statusBarStateController.removeCallback(listener)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun maybeRestartSleep() {
|
||||||
|
if (settings.getBool(RESTART_NAP_KEY, false)) {
|
||||||
|
Log.d("RestartDozeListener", "Restarting sleep state")
|
||||||
|
powerManager.wakeUp(systemClock.uptimeMillis())
|
||||||
|
powerManager.goToSleep(systemClock.uptimeMillis())
|
||||||
|
settings.putBool(RESTART_NAP_KEY, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -62,11 +62,10 @@ class ServerFlagReaderImpl @Inject constructor(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for ((listener, flags) in listeners) {
|
for ((listener, flags) in listeners) {
|
||||||
propLoop@ for (propName in properties.keyset) {
|
propLoop@ for (propName in properties.keyset) {
|
||||||
for (flag in flags) {
|
for (flag in flags) {
|
||||||
if (propName == getServerOverrideName(flag.id) || propName == flag.name) {
|
if (propName == flag.name) {
|
||||||
listener.onChange(flag)
|
listener.onChange(flag)
|
||||||
break@propLoop
|
break@propLoop
|
||||||
}
|
}
|
||||||
@@ -103,10 +102,6 @@ class ServerFlagReaderImpl @Inject constructor(
|
|||||||
}
|
}
|
||||||
listeners.add(Pair(listener, flags))
|
listeners.add(Pair(listener, flags))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getServerOverrideName(flagId: Int): String {
|
|
||||||
return "flag_override_$flagId"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.systemui.flags
|
||||||
|
|
||||||
|
import android.os.PowerManager
|
||||||
|
import android.test.suitebuilder.annotation.SmallTest
|
||||||
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
||||||
|
import com.android.systemui.util.settings.FakeSettings
|
||||||
|
import com.android.systemui.util.time.FakeSystemClock
|
||||||
|
import com.google.common.truth.Truth.assertThat
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.mockito.ArgumentCaptor
|
||||||
|
import org.mockito.Mock
|
||||||
|
import org.mockito.Mockito.anyLong
|
||||||
|
import org.mockito.Mockito.never
|
||||||
|
import org.mockito.Mockito.verify
|
||||||
|
import org.mockito.MockitoAnnotations
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
|
class RestartDozeListenerTest : SysuiTestCase() {
|
||||||
|
|
||||||
|
lateinit var restartDozeListener: RestartDozeListener
|
||||||
|
|
||||||
|
val settings = FakeSettings()
|
||||||
|
@Mock lateinit var statusBarStateController: StatusBarStateController
|
||||||
|
@Mock lateinit var powerManager: PowerManager
|
||||||
|
val clock = FakeSystemClock()
|
||||||
|
lateinit var listener: StatusBarStateController.StateListener
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setup() {
|
||||||
|
MockitoAnnotations.initMocks(this)
|
||||||
|
restartDozeListener =
|
||||||
|
RestartDozeListener(settings, statusBarStateController, powerManager, clock)
|
||||||
|
|
||||||
|
val captor = ArgumentCaptor.forClass(StatusBarStateController.StateListener::class.java)
|
||||||
|
restartDozeListener.init()
|
||||||
|
verify(statusBarStateController).addCallback(captor.capture())
|
||||||
|
listener = captor.value
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testStoreDreamState_onDreamingStarted() {
|
||||||
|
listener.onDreamingChanged(true)
|
||||||
|
assertThat(settings.getBool(RestartDozeListener.RESTART_NAP_KEY)).isTrue()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testStoreDreamState_onDreamingStopped() {
|
||||||
|
listener.onDreamingChanged(false)
|
||||||
|
assertThat(settings.getBool(RestartDozeListener.RESTART_NAP_KEY)).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testRestoreDreamState_dreamingShouldStart() {
|
||||||
|
settings.putBool(RestartDozeListener.RESTART_NAP_KEY, true)
|
||||||
|
restartDozeListener.maybeRestartSleep()
|
||||||
|
verify(powerManager).wakeUp(clock.uptimeMillis())
|
||||||
|
verify(powerManager).goToSleep(clock.uptimeMillis())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testRestoreDreamState_dreamingShouldNot() {
|
||||||
|
settings.putBool(RestartDozeListener.RESTART_NAP_KEY, false)
|
||||||
|
restartDozeListener.maybeRestartSleep()
|
||||||
|
verify(powerManager, never()).wakeUp(anyLong())
|
||||||
|
verify(powerManager, never()).goToSleep(anyLong())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -50,10 +50,10 @@ class ServerFlagReaderImplTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testChange_alertsListener() {
|
fun testChange_alertsListener() {
|
||||||
val flag = ReleasedFlag(1, "1", "test")
|
val flag = ReleasedFlag(1, "flag_1", "test")
|
||||||
serverFlagReader.listenForChanges(listOf(flag), changeListener)
|
serverFlagReader.listenForChanges(listOf(flag), changeListener)
|
||||||
|
|
||||||
deviceConfig.setProperty(NAMESPACE, "flag_override_1", "1", false)
|
deviceConfig.setProperty(NAMESPACE, "flag_1", "1", false)
|
||||||
executor.runAllReady()
|
executor.runAllReady()
|
||||||
|
|
||||||
verify(changeListener).onChange(flag)
|
verify(changeListener).onChange(flag)
|
||||||
|
|||||||
Reference in New Issue
Block a user