Merge changes from topic "b257302229-flag-restart" into tm-qpr-dev

* changes:
  Send a SysUI Started broadcast.
  Revert "Revert "Ensure SystemUI gets restarted lazily.""
This commit is contained in:
Dave Mankoff
2022-12-07 20:48:26 +00:00
committed by Android (Google) Code Review
10 changed files with 91 additions and 43 deletions

View File

@@ -38,6 +38,7 @@ class FlagManager constructor(
const val ACTION_SET_FLAG = "com.android.systemui.action.SET_FLAG" const val ACTION_SET_FLAG = "com.android.systemui.action.SET_FLAG"
const val ACTION_GET_FLAGS = "com.android.systemui.action.GET_FLAGS" const val ACTION_GET_FLAGS = "com.android.systemui.action.GET_FLAGS"
const val FLAGS_PERMISSION = "com.android.systemui.permission.FLAGS" const val FLAGS_PERMISSION = "com.android.systemui.permission.FLAGS"
const val ACTION_SYSUI_STARTED = "com.android.systemui.STARTED"
const val EXTRA_ID = "id" const val EXTRA_ID = "id"
const val EXTRA_VALUE = "value" const val EXTRA_VALUE = "value"
const val EXTRA_FLAGS = "flags" const val EXTRA_FLAGS = "flags"

View File

@@ -86,7 +86,7 @@ public class FeatureFlagsDebug implements FeatureFlags {
new ServerFlagReader.ChangeListener() { new ServerFlagReader.ChangeListener() {
@Override @Override
public void onChange() { public void onChange() {
mRestarter.restart(); mRestarter.restartSystemUI();
} }
}; };
@@ -326,9 +326,7 @@ public class FeatureFlagsDebug implements FeatureFlags {
Log.i(TAG, "SystemUI Restart Suppressed"); Log.i(TAG, "SystemUI Restart Suppressed");
return; return;
} }
Log.i(TAG, "Restarting SystemUI"); mRestarter.restartSystemUI();
// SysUI starts back when up exited. Is there a better way to do this?
System.exit(0);
} }
private void restartAndroid(boolean requestSuppress) { private void restartAndroid(boolean requestSuppress) {
@@ -336,7 +334,7 @@ public class FeatureFlagsDebug implements FeatureFlags {
Log.i(TAG, "Android Restart Suppressed"); Log.i(TAG, "Android Restart Suppressed");
return; return;
} }
mRestarter.restart(); mRestarter.restartAndroid();
} }
void setBooleanFlagInternal(Flag<?> flag, boolean value) { void setBooleanFlagInternal(Flag<?> flag, boolean value) {

View File

@@ -28,6 +28,8 @@ constructor(
private val systemExitRestarter: SystemExitRestarter, private val systemExitRestarter: SystemExitRestarter,
) : Restarter { ) : Restarter {
private var androidRestartRequested = false
val observer = val observer =
object : WakefulnessLifecycle.Observer { object : WakefulnessLifecycle.Observer {
override fun onFinishedGoingToSleep() { override fun onFinishedGoingToSleep() {
@@ -36,8 +38,18 @@ constructor(
} }
} }
override fun restart() { override fun restartSystemUI() {
Log.d(FeatureFlagsDebug.TAG, "Restart requested. Restarting on next screen off.") Log.d(FeatureFlagsDebug.TAG, "SystemUI Restart requested. Restarting on next screen off.")
scheduleRestart()
}
override fun restartAndroid() {
Log.d(FeatureFlagsDebug.TAG, "Android Restart requested. Restarting on next screen off.")
androidRestartRequested = true
scheduleRestart()
}
fun scheduleRestart() {
if (wakefulnessLifecycle.wakefulness == WakefulnessLifecycle.WAKEFULNESS_ASLEEP) { if (wakefulnessLifecycle.wakefulness == WakefulnessLifecycle.WAKEFULNESS_ASLEEP) {
restartNow() restartNow()
} else { } else {
@@ -46,6 +58,10 @@ constructor(
} }
private fun restartNow() { private fun restartNow() {
systemExitRestarter.restart() if (androidRestartRequested) {
systemExitRestarter.restartAndroid()
} else {
systemExitRestarter.restartSystemUI()
}
} }
} }

View File

@@ -16,7 +16,9 @@
package com.android.systemui.flags package com.android.systemui.flags
import android.content.Intent
import com.android.systemui.CoreStartable import com.android.systemui.CoreStartable
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 dagger.Binds import dagger.Binds
@@ -31,7 +33,8 @@ constructor(
dumpManager: DumpManager, dumpManager: DumpManager,
private val commandRegistry: CommandRegistry, private val commandRegistry: CommandRegistry,
private val flagCommand: FlagCommand, private val flagCommand: FlagCommand,
private val featureFlags: FeatureFlagsDebug private val featureFlags: FeatureFlagsDebug,
private val broadcastSender: BroadcastSender
) : CoreStartable { ) : CoreStartable {
init { init {
@@ -43,6 +46,8 @@ constructor(
override fun start() { override fun start() {
featureFlags.init() featureFlags.init()
commandRegistry.registerCommand(FlagCommand.FLAG_COMMAND) { flagCommand } commandRegistry.registerCommand(FlagCommand.FLAG_COMMAND) { flagCommand }
val intent = Intent(FlagManager.ACTION_SYSUI_STARTED)
broadcastSender.sendBroadcast(intent)
} }
} }

View File

@@ -61,7 +61,7 @@ public class FeatureFlagsRelease implements FeatureFlags {
new ServerFlagReader.ChangeListener() { new ServerFlagReader.ChangeListener() {
@Override @Override
public void onChange() { public void onChange() {
mRestarter.restart(); mRestarter.restartSystemUI();
} }
}; };

View File

@@ -34,35 +34,48 @@ constructor(
@Background private val bgExecutor: DelayableExecutor, @Background private val bgExecutor: DelayableExecutor,
private val systemExitRestarter: SystemExitRestarter private val systemExitRestarter: SystemExitRestarter
) : Restarter { ) : Restarter {
var shouldRestart = false var listenersAdded = false
var pendingRestart: Runnable? = null var pendingRestart: Runnable? = null
var androidRestartRequested = false
val observer = val observer =
object : WakefulnessLifecycle.Observer { object : WakefulnessLifecycle.Observer {
override fun onFinishedGoingToSleep() { override fun onFinishedGoingToSleep() {
maybeScheduleRestart() scheduleRestart()
} }
} }
val batteryCallback = val batteryCallback =
object : BatteryController.BatteryStateChangeCallback { object : BatteryController.BatteryStateChangeCallback {
override fun onBatteryLevelChanged(level: Int, pluggedIn: Boolean, charging: Boolean) { override fun onBatteryLevelChanged(level: Int, pluggedIn: Boolean, charging: Boolean) {
maybeScheduleRestart() scheduleRestart()
} }
} }
override fun restart() { override fun restartSystemUI() {
Log.d(FeatureFlagsDebug.TAG, "Restart requested. Restarting when plugged in and idle.") Log.d(
if (!shouldRestart) { FeatureFlagsDebug.TAG,
// Don't bother scheduling twice. "SystemUI Restart requested. Restarting when plugged in and idle."
shouldRestart = true )
scheduleRestart()
}
override fun restartAndroid() {
Log.d(
FeatureFlagsDebug.TAG,
"Android Restart requested. Restarting when plugged in and idle."
)
androidRestartRequested = true
scheduleRestart()
}
private fun scheduleRestart() {
// Don't bother adding listeners twice.
if (!listenersAdded) {
listenersAdded = true
wakefulnessLifecycle.addObserver(observer) wakefulnessLifecycle.addObserver(observer)
batteryController.addCallback(batteryCallback) batteryController.addCallback(batteryCallback)
maybeScheduleRestart()
} }
}
private fun maybeScheduleRestart() {
if ( if (
wakefulnessLifecycle.wakefulness == WAKEFULNESS_ASLEEP && batteryController.isPluggedIn wakefulnessLifecycle.wakefulness == WAKEFULNESS_ASLEEP && batteryController.isPluggedIn
) { ) {
@@ -77,6 +90,10 @@ constructor(
private fun restartNow() { private fun restartNow() {
Log.d(FeatureFlagsRelease.TAG, "Restarting due to systemui flag change") Log.d(FeatureFlagsRelease.TAG, "Restarting due to systemui flag change")
systemExitRestarter.restart() if (androidRestartRequested) {
systemExitRestarter.restartAndroid()
} else {
systemExitRestarter.restartSystemUI()
}
} }
} }

View File

@@ -16,5 +16,7 @@
package com.android.systemui.flags package com.android.systemui.flags
interface Restarter { interface Restarter {
fun restart() fun restartSystemUI()
fun restartAndroid()
} }

View File

@@ -16,10 +16,19 @@
package com.android.systemui.flags package com.android.systemui.flags
import com.android.internal.statusbar.IStatusBarService
import javax.inject.Inject import javax.inject.Inject
class SystemExitRestarter @Inject constructor() : Restarter { class SystemExitRestarter
override fun restart() { @Inject
constructor(
private val barService: IStatusBarService,
) : Restarter {
override fun restartAndroid() {
barService.restart()
}
override fun restartSystemUI() {
System.exit(0) System.exit(0)
} }
} }

View File

@@ -48,22 +48,22 @@ class FeatureFlagsDebugRestarterTest : SysuiTestCase() {
@Test @Test
fun testRestart_ImmediateWhenAsleep() { fun testRestart_ImmediateWhenAsleep() {
whenever(wakefulnessLifecycle.wakefulness).thenReturn(WAKEFULNESS_ASLEEP) whenever(wakefulnessLifecycle.wakefulness).thenReturn(WAKEFULNESS_ASLEEP)
restarter.restart() restarter.restartSystemUI()
verify(systemExitRestarter).restart() verify(systemExitRestarter).restartSystemUI()
} }
@Test @Test
fun testRestart_WaitsForSceenOff() { fun testRestart_WaitsForSceenOff() {
whenever(wakefulnessLifecycle.wakefulness).thenReturn(WAKEFULNESS_AWAKE) whenever(wakefulnessLifecycle.wakefulness).thenReturn(WAKEFULNESS_AWAKE)
restarter.restart() restarter.restartSystemUI()
verify(systemExitRestarter, never()).restart() verify(systemExitRestarter, never()).restartSystemUI()
val captor = ArgumentCaptor.forClass(WakefulnessLifecycle.Observer::class.java) val captor = ArgumentCaptor.forClass(WakefulnessLifecycle.Observer::class.java)
verify(wakefulnessLifecycle).addObserver(captor.capture()) verify(wakefulnessLifecycle).addObserver(captor.capture())
captor.value.onFinishedGoingToSleep() captor.value.onFinishedGoingToSleep()
verify(systemExitRestarter).restart() verify(systemExitRestarter).restartSystemUI()
} }
} }

View File

@@ -63,7 +63,7 @@ class FeatureFlagsReleaseRestarterTest : SysuiTestCase() {
whenever(batteryController.isPluggedIn).thenReturn(true) whenever(batteryController.isPluggedIn).thenReturn(true)
assertThat(executor.numPending()).isEqualTo(0) assertThat(executor.numPending()).isEqualTo(0)
restarter.restart() restarter.restartSystemUI()
assertThat(executor.numPending()).isEqualTo(1) assertThat(executor.numPending()).isEqualTo(1)
} }
@@ -72,11 +72,11 @@ class FeatureFlagsReleaseRestarterTest : SysuiTestCase() {
whenever(wakefulnessLifecycle.wakefulness).thenReturn(WAKEFULNESS_ASLEEP) whenever(wakefulnessLifecycle.wakefulness).thenReturn(WAKEFULNESS_ASLEEP)
whenever(batteryController.isPluggedIn).thenReturn(true) whenever(batteryController.isPluggedIn).thenReturn(true)
restarter.restart() restarter.restartSystemUI()
verify(systemExitRestarter, never()).restart() verify(systemExitRestarter, never()).restartSystemUI()
executor.advanceClockToLast() executor.advanceClockToLast()
executor.runAllReady() executor.runAllReady()
verify(systemExitRestarter).restart() verify(systemExitRestarter).restartSystemUI()
} }
@Test @Test
@@ -85,7 +85,7 @@ class FeatureFlagsReleaseRestarterTest : SysuiTestCase() {
whenever(batteryController.isPluggedIn).thenReturn(true) whenever(batteryController.isPluggedIn).thenReturn(true)
assertThat(executor.numPending()).isEqualTo(0) assertThat(executor.numPending()).isEqualTo(0)
restarter.restart() restarter.restartSystemUI()
assertThat(executor.numPending()).isEqualTo(0) assertThat(executor.numPending()).isEqualTo(0)
} }
@@ -95,7 +95,7 @@ class FeatureFlagsReleaseRestarterTest : SysuiTestCase() {
whenever(batteryController.isPluggedIn).thenReturn(false) whenever(batteryController.isPluggedIn).thenReturn(false)
assertThat(executor.numPending()).isEqualTo(0) assertThat(executor.numPending()).isEqualTo(0)
restarter.restart() restarter.restartSystemUI()
assertThat(executor.numPending()).isEqualTo(0) assertThat(executor.numPending()).isEqualTo(0)
} }
@@ -105,8 +105,8 @@ class FeatureFlagsReleaseRestarterTest : SysuiTestCase() {
whenever(batteryController.isPluggedIn).thenReturn(true) whenever(batteryController.isPluggedIn).thenReturn(true)
assertThat(executor.numPending()).isEqualTo(0) assertThat(executor.numPending()).isEqualTo(0)
restarter.restart() restarter.restartSystemUI()
restarter.restart() restarter.restartSystemUI()
assertThat(executor.numPending()).isEqualTo(1) assertThat(executor.numPending()).isEqualTo(1)
} }
@@ -115,7 +115,7 @@ class FeatureFlagsReleaseRestarterTest : SysuiTestCase() {
whenever(wakefulnessLifecycle.wakefulness).thenReturn(WAKEFULNESS_AWAKE) whenever(wakefulnessLifecycle.wakefulness).thenReturn(WAKEFULNESS_AWAKE)
whenever(batteryController.isPluggedIn).thenReturn(true) whenever(batteryController.isPluggedIn).thenReturn(true)
assertThat(executor.numPending()).isEqualTo(0) assertThat(executor.numPending()).isEqualTo(0)
restarter.restart() restarter.restartSystemUI()
val captor = ArgumentCaptor.forClass(WakefulnessLifecycle.Observer::class.java) val captor = ArgumentCaptor.forClass(WakefulnessLifecycle.Observer::class.java)
verify(wakefulnessLifecycle).addObserver(captor.capture()) verify(wakefulnessLifecycle).addObserver(captor.capture())
@@ -131,7 +131,7 @@ class FeatureFlagsReleaseRestarterTest : SysuiTestCase() {
whenever(wakefulnessLifecycle.wakefulness).thenReturn(WAKEFULNESS_ASLEEP) whenever(wakefulnessLifecycle.wakefulness).thenReturn(WAKEFULNESS_ASLEEP)
whenever(batteryController.isPluggedIn).thenReturn(false) whenever(batteryController.isPluggedIn).thenReturn(false)
assertThat(executor.numPending()).isEqualTo(0) assertThat(executor.numPending()).isEqualTo(0)
restarter.restart() restarter.restartSystemUI()
val captor = val captor =
ArgumentCaptor.forClass(BatteryController.BatteryStateChangeCallback::class.java) ArgumentCaptor.forClass(BatteryController.BatteryStateChangeCallback::class.java)