Delay power broadcasts until system is booted.

When the system isn't booted yet, enqueue any early broadcasts to be
sent after the system is ready.

Bug: 27449137
Change-Id: I5a93be3a2cf4d038149b54e0510b040fd69d3579
This commit is contained in:
Jeff Sharkey
2016-03-02 13:07:56 -07:00
parent dbff9ca4a5
commit 3dee8d6787

View File

@@ -60,6 +60,7 @@ import android.view.WindowManagerPolicy;
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
import com.android.server.EventLogTags;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
@@ -254,6 +255,9 @@ public final class PowerManagerService extends SystemService
// True if boot completed occurred. We keep the screen on until this happens.
private boolean mBootCompleted;
// Runnables that should be triggered on boot completed
private Runnable[] mBootCompletedRunnables;
// True if auto-suspend mode is enabled.
// Refer to autosuspend.h.
private boolean mHalAutoSuspendModeEnabled;
@@ -525,6 +529,14 @@ public final class PowerManagerService extends SystemService
userActivityNoUpdateLocked(
now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
updatePowerStateLocked();
if (!ArrayUtils.isEmpty(mBootCompletedRunnables)) {
Slog.d(TAG, "Posting " + mBootCompletedRunnables.length + " delayed runnables");
for (Runnable r : mBootCompletedRunnables) {
BackgroundThread.getHandler().post(r);
}
}
mBootCompletedRunnables = null;
}
}
}
@@ -750,6 +762,16 @@ public final class PowerManagerService extends SystemService
mDirty |= DIRTY_SETTINGS;
}
private void postAfterBootCompleted(Runnable r) {
if (mBootCompleted) {
BackgroundThread.getHandler().post(r);
} else {
Slog.d(TAG, "Delaying runnable until system is booted");
mBootCompletedRunnables = ArrayUtils.appendElement(Runnable.class,
mBootCompletedRunnables, r);
}
}
void updateLowPowerModeLocked() {
if (mIsPowered && mLowPowerModeSetting) {
if (DEBUG_SPEW) {
@@ -767,7 +789,7 @@ public final class PowerManagerService extends SystemService
if (mLowPowerModeEnabled != lowPowerModeEnabled) {
mLowPowerModeEnabled = lowPowerModeEnabled;
powerHintInternal(POWER_HINT_LOW_POWER, lowPowerModeEnabled ? 1 : 0);
BackgroundThread.getHandler().post(new Runnable() {
postAfterBootCompleted(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING)