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

Commit cd4e4279 authored by Mattias Larsson's avatar Mattias Larsson Committed by Johan Redestig
Browse files

Hold partial wakelock during shutdown to avoid entering sleep

The ShutdownThread can get suspended while in progress if the
device enters sleep by the user pressing the power-key, or if it is
started (in sleep) from the BatteryService upon a dead battery
notification. If the device is woken up before the battery is
drained, the ShutdownThread will resume and finally complete
the shutdown, but if not the phone will stay in sleep until the
battery level is so low that the power is ruthlessly cut.

Change-Id: If64429fd0c98a9136141942be6c337b5c79cf4f1
parent 7d9c73fb
Loading
Loading
Loading
Loading
+24 −7
Original line number Original line Diff line number Diff line
@@ -67,7 +67,8 @@ public final class ShutdownThread extends Thread {
    private boolean mActionDone;
    private boolean mActionDone;
    private Context mContext;
    private Context mContext;
    private PowerManager mPowerManager;
    private PowerManager mPowerManager;
    private PowerManager.WakeLock mWakeLock;
    private PowerManager.WakeLock mCpuWakeLock;
    private PowerManager.WakeLock mScreenWakeLock;
    private Handler mHandler;
    private Handler mHandler;
    
    
    private ShutdownThread() {
    private ShutdownThread() {
@@ -155,20 +156,36 @@ public final class ShutdownThread extends Thread {


        pd.show();
        pd.show();


        // start the thread that initiates shutdown
        sInstance.mContext = context;
        sInstance.mContext = context;
        sInstance.mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        sInstance.mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        sInstance.mWakeLock = null;

        // make sure we never fall asleep again
        sInstance.mCpuWakeLock = null;
        try {
            sInstance.mCpuWakeLock = sInstance.mPowerManager.newWakeLock(
                    PowerManager.PARTIAL_WAKE_LOCK, TAG + "-cpu");
            sInstance.mCpuWakeLock.setReferenceCounted(false);
            sInstance.mCpuWakeLock.acquire();
        } catch (SecurityException e) {
            Log.w(TAG, "No permission to acquire wake lock", e);
            sInstance.mCpuWakeLock = null;
        }

        // also make sure the screen stays on for better user experience
        sInstance.mScreenWakeLock = null;
        if (sInstance.mPowerManager.isScreenOn()) {
        if (sInstance.mPowerManager.isScreenOn()) {
            try {
            try {
                sInstance.mWakeLock = sInstance.mPowerManager.newWakeLock(
                sInstance.mScreenWakeLock = sInstance.mPowerManager.newWakeLock(
                        PowerManager.FULL_WAKE_LOCK, "Shutdown");
                        PowerManager.FULL_WAKE_LOCK, TAG + "-screen");
                sInstance.mWakeLock.acquire();
                sInstance.mScreenWakeLock.setReferenceCounted(false);
                sInstance.mScreenWakeLock.acquire();
            } catch (SecurityException e) {
            } catch (SecurityException e) {
                Log.w(TAG, "No permission to acquire wake lock", e);
                Log.w(TAG, "No permission to acquire wake lock", e);
                sInstance.mWakeLock = null;
                sInstance.mScreenWakeLock = null;
            }
            }
        }
        }

        // start the thread that initiates shutdown
        sInstance.mHandler = new Handler() {
        sInstance.mHandler = new Handler() {
        };
        };
        sInstance.start();
        sInstance.start();