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

Commit e0d2a511 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Ensure SystemUI gets restarted lazily.

A prior change broke restarting Android by replacing it
with restarting SystemUI. Meanwhile, restarting SystemUI
remained unchanged - restarting immediately.

Bug: 257302229
Test: manual via the flag app.
Change-Id: I4674cfd7c136b15a41ee36caea5b853e801d52fe
parent aea66f75
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ public class FeatureFlagsDebug implements FeatureFlags {
            new ServerFlagReader.ChangeListener() {
                @Override
                public void onChange() {
                    mRestarter.restart();
                    mRestarter.restartSystemUI();
                }
            };

@@ -326,9 +326,7 @@ public class FeatureFlagsDebug implements FeatureFlags {
            Log.i(TAG, "SystemUI Restart Suppressed");
            return;
        }
        Log.i(TAG, "Restarting SystemUI");
        // SysUI starts back when up exited. Is there a better way to do this?
        System.exit(0);
        mRestarter.restartSystemUI();
    }

    private void restartAndroid(boolean requestSuppress) {
@@ -336,7 +334,7 @@ public class FeatureFlagsDebug implements FeatureFlags {
            Log.i(TAG, "Android Restart Suppressed");
            return;
        }
        mRestarter.restart();
        mRestarter.restartAndroid();
    }

    void setBooleanFlagInternal(Flag<?> flag, boolean value) {
+19 −3
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ constructor(
    private val systemExitRestarter: SystemExitRestarter,
) : Restarter {

    private var androidRestartRequested = false

    val observer =
        object : WakefulnessLifecycle.Observer {
            override fun onFinishedGoingToSleep() {
@@ -36,8 +38,18 @@ constructor(
            }
        }

    override fun restart() {
        Log.d(FeatureFlagsDebug.TAG, "Restart requested. Restarting on next screen off.")
    override fun restartSystemUI() {
        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) {
            restartNow()
        } else {
@@ -46,6 +58,10 @@ constructor(
    }

    private fun restartNow() {
        systemExitRestarter.restart()
        if (androidRestartRequested) {
            systemExitRestarter.restartAndroid()
        } else {
            systemExitRestarter.restartSystemUI()
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ public class FeatureFlagsRelease implements FeatureFlags {
            new ServerFlagReader.ChangeListener() {
                @Override
                public void onChange() {
                    mRestarter.restart();
                    mRestarter.restartSystemUI();
                }
            };

+30 −13
Original line number Diff line number Diff line
@@ -34,35 +34,48 @@ constructor(
    @Background private val bgExecutor: DelayableExecutor,
    private val systemExitRestarter: SystemExitRestarter
) : Restarter {
    var shouldRestart = false
    var listenersAdded = false
    var pendingRestart: Runnable? = null
    var androidRestartRequested = false

    val observer =
        object : WakefulnessLifecycle.Observer {
            override fun onFinishedGoingToSleep() {
                maybeScheduleRestart()
                scheduleRestart()
            }
        }

    val batteryCallback =
        object : BatteryController.BatteryStateChangeCallback {
            override fun onBatteryLevelChanged(level: Int, pluggedIn: Boolean, charging: Boolean) {
                maybeScheduleRestart()
                scheduleRestart()
            }
        }

    override fun restart() {
        Log.d(FeatureFlagsDebug.TAG, "Restart requested. Restarting when plugged in and idle.")
        if (!shouldRestart) {
            // Don't bother scheduling twice.
            shouldRestart = true
            wakefulnessLifecycle.addObserver(observer)
            batteryController.addCallback(batteryCallback)
            maybeScheduleRestart()
    override fun restartSystemUI() {
        Log.d(
            FeatureFlagsDebug.TAG,
            "SystemUI Restart requested. Restarting when plugged in and idle."
        )
        scheduleRestart()
    }

    override fun restartAndroid() {
        Log.d(
            FeatureFlagsDebug.TAG,
            "Android Restart requested. Restarting when plugged in and idle."
        )
        androidRestartRequested = true
        scheduleRestart()
    }

    private fun maybeScheduleRestart() {
    private fun scheduleRestart() {
        // Don't bother adding listeners twice.
        if (!listenersAdded) {
            listenersAdded = true
            wakefulnessLifecycle.addObserver(observer)
            batteryController.addCallback(batteryCallback)
        }
        if (
            wakefulnessLifecycle.wakefulness == WAKEFULNESS_ASLEEP && batteryController.isPluggedIn
        ) {
@@ -77,6 +90,10 @@ constructor(

    private fun restartNow() {
        Log.d(FeatureFlagsRelease.TAG, "Restarting due to systemui flag change")
        systemExitRestarter.restart()
        if (androidRestartRequested) {
            systemExitRestarter.restartAndroid()
        } else {
            systemExitRestarter.restartSystemUI()
        }
    }
}
+4 −2
Original line number Diff line number Diff line
@@ -16,5 +16,7 @@
package com.android.systemui.flags

interface Restarter {
    fun restart()
    fun restartSystemUI()

    fun restartAndroid()
}
Loading