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

Commit 7edef938 authored by Kun Liang's avatar Kun Liang Committed by Steve Kondik
Browse files

Squashed commit of QuickBoot feature from Qualcomm

QuickBoot: don't log boot events when in QuickBoot mode.

Don't need log boot events when booting from QuickBoot mode.

Change-Id: Id381530418c09ac1d650f45e7a368dbd7945aff3

QuickBoot: don't wake up screen when usb connected

Don't wake up screen in QuickBoot mode when usb connected.

Change-Id: If65936a0edbbc3b36a0768294e5c3bd7d741018a

QuickBoot: filt out alarms that for non-system users

Don't allow alarms for non-system users when under QUickBoot
mode.

Change-Id: I322d08f7236b6895462c4cd3304326c66f67ddd2

QuickBoot: restrict app's auto start under Quickboot mode

Don't let broadcast trigger apps auto start when in Quickboot mode.

Change-Id: I5d156cbea4ef18397ce4569cb74f73a446a6e49b

QuickBoot: remove alarms for killed apps

Device may be woken up by WAKEUP alarms, which have been set
by those killed apps before. Here to get the killed apps list
and remove the alarms from AlarmManagerService.

Change-Id: Ib34f5fc234b834b2fe4528229c267c8693fc76cb

SyncManager: Fix SyncManager null pointer issue under QuickBoot

BOOT_COMPLETED broadcast will cause mBootQueue null pointer issue.
Then system_server will crash. Add protection here to avoid
system_server crash.

Change-Id: I78029dfa90709455e4c2220e06b95640383655f8

QuickBoot: add execption restore mechanism

There may be some exceptions like battery unplugged When device
is put into QuickBoot mode. Then device will be in airplane
mode after next boot. We don't want such kind of things happen.
So start restore task to check if need restore before main
screen shows.

Change-Id: I3d0967c2f446fd71eca87ff085617edca549c984

QuickBoot: switch normal power off to quickboot

Handle power off button when quickboot mode enabled.

Change-Id: I6a668cbe823018b5e508633a76202d0df0381694

QuickBoot: support QuickBoot power on

Support long press power key to power on when in QuickBoot mode.

Change-Id: Id493d352bce73683b9696a2685a6c902f1195799

QuickBoot: Don't handle SHUTDOWN broadcast from QuickBoot

Don't process the ACTION_SHUTDOWN broadcast sent by QuickBoot.
It is only for apps.
Change-Id: I73d1a7b8edda0a898dd052831033806e18b37c99

QuickBoot: rename some intents and broadcasts

Modify some improper names for intents or broadcasts of QuickBoot.

Change-Id: I92357b0110643bb425199452cb03bd75248a5d83

QuickBoot: Support poweroff alarm under QuickBoot mode

Add white list in QuickBoot mode to support poweroff alarm.
    1. Allow original deskclock app and quickboot app to be launched.
    2. Don't filter out deskclock's alarms.

Change-Id: Ie4254e3da45837d3185d3daba625a42c50fd7f52

QuickBoot: enable poweroff charging under QuickBoot mode

control native charger's enable/disable under QuickBoot
mode.

Change-Id: I4f80c74b042e03bddc9f7fe419f4ed1f8b1409d5

QuickBoot: Add wakeup check under QuickBoot mode

We only want QuickBoot application to wakeup screen in QuickBoot
mode. Add wakeup check to filter out other wakeup callers.

Change-Id: Id82a0938003d2a776efda0e39a57877f41fc1ee4
parent 674bf692
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Profile;
import android.app.ProfileManager;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.ContentResolver;
@@ -295,6 +296,8 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac
        final ContentResolver cr = mContext.getContentResolver();
        mItems = new ArrayList<Action>();

        final boolean quickbootEnabled = Settings.System.getInt(
                mContext.getContentResolver(), "enable_quickboot", 0) == 1;
        // first: power off
        mItems.add(
            new SinglePressAction(
@@ -302,6 +305,12 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac
                    R.string.global_action_power_off) {

                public void onPress() {
                    // goto quickboot mode
                    if (quickbootEnabled) {
                        startQuickBoot();
                        return;
                    }

                    // shutdown by making sure radio and power are handled accordingly.
                    mWindowManagerFuncs.shutdown(true);
                }
@@ -1273,6 +1282,16 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac
                on ? 1 : 0, UserHandle.USER_CURRENT);
    }

    private void startQuickBoot() {

        Intent intent = new Intent("org.codeaurora.action.QUICKBOOT");
        intent.putExtra("mode", 0);
        try {
            mContext.startActivityAsUser(intent,UserHandle.CURRENT);
        } catch (ActivityNotFoundException e) {
        }
    }

    private static final class GlobalActionsDialog extends Dialog implements DialogInterface {
        private final Context mContext;
        private final int mWindowTouchSlop;
+87 −0
Original line number Diff line number Diff line
@@ -154,6 +154,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    static final boolean ENABLE_CAR_DOCK_HOME_CAPTURE = true;
    static final boolean ENABLE_DESK_DOCK_HOME_CAPTURE = false;

    // QuickBoot time settings
    static final int DEFAULT_LONG_PRESS_POWERON_TIME = 500;
    static final int QUICKBOOT_LAUNCH_TIMEOUT = 2000;

    static final int LONG_PRESS_POWER_NOTHING = 0;
    static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
    static final int LONG_PRESS_POWER_SHUT_OFF = 2;
@@ -236,6 +240,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
     * where the window manager is calling in with its own lock held.)
     */
    private final Object mLock = new Object();
    private final Object mQuickBootLock = new Object();

    Context mContext;
    Context mUiContext;
@@ -345,6 +350,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {

    int mCurrentUser = 0;

    int mLongPressPoweronTime = DEFAULT_LONG_PRESS_POWERON_TIME;

    // The last window we were told about in focusChanged.
    WindowState mFocusedWindow;
    IApplicationToken mFocusedApp;
@@ -542,6 +549,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    SettingsObserver mSettingsObserver;
    ShortcutManager mShortcutManager;
    PowerManager.WakeLock mBroadcastWakeLock;
    PowerManager.WakeLock mQuickBootWakeLock;
    boolean mHavePendingMediaKeyRepeatWithWakeLock;

    private int mCurrentUserId;
@@ -1200,6 +1208,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        mBroadcastWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "PhoneWindowManager.mBroadcastWakeLock");
        mQuickBootWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "PhoneWindowManager.mQuickBootWakeLock");
        mLongPressPoweronTime = SystemProperties.getInt("ro.quickboot.press_duration",
                DEFAULT_LONG_PRESS_POWERON_TIME);
        mEnableShiftMenuBugReports = "1".equals(SystemProperties.get("ro.debuggable"));
        mLidOpenRotation = readRotation(
                com.android.internal.R.integer.config_lidOpenRotation);
@@ -4486,6 +4498,58 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
    }

    private final Runnable mQuickBootPowerLongPress = new Runnable() {

        public void run() {

            Intent intent = new Intent("org.codeaurora.action.QUICKBOOT");
            intent.putExtra("mode", 1);
            try {
                mContext.startActivityAsUser(intent,UserHandle.CURRENT);
            } catch (ActivityNotFoundException e) {
                e.printStackTrace();
                releaseQuickBootWakeLock();
                return;
            }

            BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

                public void onReceive(Context context, Intent intent) {

                    synchronized (mQuickBootLock) {
                        mQuickBootLock.notifyAll();
                    }
                }
            };

            IntentFilter filter = new IntentFilter("org.codeaurora.quickboot.poweron_start");
            mContext.registerReceiver(broadcastReceiver,filter,
                    "android.permission.DEVICE_POWER",null);

            synchronized (mQuickBootLock) {
                try {
                    mQuickBootLock.wait(QUICKBOOT_LAUNCH_TIMEOUT);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            releaseQuickBootWakeLock();
        }
    };

    private void acquireQuickBootWakeLock() {
        if (!mQuickBootWakeLock.isHeld())  {
            mQuickBootWakeLock.acquire();
        }
    }

    private void releaseQuickBootWakeLock() {
        if (mQuickBootWakeLock.isHeld()) {
            mQuickBootWakeLock.release();
        }
    }

    /** {@inheritDoc} */
    @Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {
@@ -4499,6 +4563,21 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        int keyCode = event.getKeyCode();
        int scanCode = event.getScanCode();

        if (SystemProperties.getInt("sys.quickboot.enable", 0) == 1) {

            if (keyCode == KeyEvent.KEYCODE_POWER && !isScreenOn) {
                if(down){
                    acquireQuickBootWakeLock();
                    mHandler.postDelayed(mQuickBootPowerLongPress, mLongPressPoweronTime);
                } else {
                    releaseQuickBootWakeLock();
                    mHandler.removeCallbacks(mQuickBootPowerLongPress);
                }
            }
            // ignore this event
            return 0;
        }

        final boolean isInjected = (policyFlags & WindowManagerPolicy.FLAG_INJECTED) != 0;

        // If screen is off then we treat the case where the keyguard is open but hidden
@@ -5063,6 +5142,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
    }

    private void disableQbCharger() {
        if (SystemProperties.getInt("sys.quickboot.enable", 0) == 1) {
            SystemProperties.set("sys.qbcharger.enable", "false");
        }
    }

    @Override
    public void screenTurnedOff(int why) {
        EventLog.writeEvent(70000, 0);
@@ -5087,6 +5172,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            here.fillInStackTrace();
            Slog.i(TAG, "Screen turning on...", here);
        }
        // To disable native charger when under QuickBoot mode
        disableQbCharger();

        synchronized (mLock) {
            // since the screen turned on, assume we don't enable play-pause again
+49 −2
Original line number Diff line number Diff line
/*
 * Copyright (C) 2006 The Android Open Source Project
 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -118,6 +118,7 @@ class AlarmManagerService extends IAlarmManager.Stub {
    private final AlarmHandler mHandler = new AlarmHandler();
    private ClockReceiver mClockReceiver;
    private UninstallReceiver mUninstallReceiver;
    private QuickBootReceiver mQuickBootReceiver;
    private final ResultReceiver mResultReceiver = new ResultReceiver();
    private final PendingIntent mTimeTickSender;
    private final PendingIntent mDateChangeSender;
@@ -527,6 +528,7 @@ class AlarmManagerService extends IAlarmManager.Stub {
        mClockReceiver.scheduleTimeTickEvent();
        mClockReceiver.scheduleDateChangedEvent();
        mUninstallReceiver = new UninstallReceiver();
        mQuickBootReceiver = new QuickBootReceiver();
        
        if (mDescriptor != -1) {
            mWaitThread.start();
@@ -1302,6 +1304,22 @@ class AlarmManagerService extends IAlarmManager.Stub {
        }
    }

    private void filtQuickBootAlarms(ArrayList<Alarm> triggerList) {

        ArrayList<String> whiteList = new ArrayList();
        whiteList.add("android");
        whiteList.add("com.android.deskclock");

        for (int i = triggerList.size() - 1; i >= 0; i--) {
            Alarm alarm = triggerList.get(i);

            if (!whiteList.contains(alarm.operation.getTargetPackage())) {
                triggerList.remove(i);
                Slog.v(TAG, "ignore -> " + alarm.operation.getTargetPackage());
            }
        }
    }

    private class AlarmThread extends Thread
    {
        public AlarmThread()
@@ -1357,6 +1375,10 @@ class AlarmManagerService extends IAlarmManager.Stub {
                    triggerAlarmsLocked(triggerList, nowELAPSED, nowRTC);
                    rescheduleKernelAlarmsLocked();

                    if (SystemProperties.getInt("sys.quickboot.enable", 0) == 1) {
                        filtQuickBootAlarms(triggerList);
                    }

                    // now deliver the alarm intents
                    for (int i=0; i<triggerList.size(); i++) {
                        Alarm alarm = triggerList.get(i);
@@ -1478,6 +1500,31 @@ class AlarmManagerService extends IAlarmManager.Stub {
        }
    }

    private class QuickBootReceiver extends BroadcastReceiver {

        public QuickBootReceiver() {
            IntentFilter filter = new IntentFilter();
            filter.addAction("org.codeaurora.quickboot.appkilled");
            mContext.registerReceiver(this, filter,
                    "android.permission.DEVICE_POWER", null);
        }

        @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                String pkgList[] = null;
                if ("org.codeaurora.quickboot.appkilled".equals(action)) {
                    pkgList = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);
                    if (pkgList != null && (pkgList.length > 0)) {
                        for (String pkg : pkgList) {
                            removeLocked(pkg);
                            mBroadcastStats.remove(pkg);
                        }
                    }
                }
            }
    }

    class ClockReceiver extends BroadcastReceiver {
        public ClockReceiver() {
            IntentFilter filter = new IntentFilter();
+4 −0
Original line number Diff line number Diff line
@@ -62,6 +62,10 @@ public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent) {

        boolean fromQuickBoot = intent.getBooleanExtra("from_quickboot", false);
        if (fromQuickBoot) return;

        // Log boot events in the background to avoid blocking the main thread with I/O
        new Thread() {
            @Override
+16 −1
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.util.EventLog;
import android.util.Log;
@@ -134,6 +135,7 @@ public final class BroadcastQueue {
     */
    int mPendingBroadcastRecvIndex;

    static ArrayList<String> quickbootWhiteList = null;
    static final int BROADCAST_INTENT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG;
    static final int BROADCAST_TIMEOUT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG + 1;

@@ -919,7 +921,10 @@ public final class BroadcastQueue {
            if (DEBUG_BROADCAST)  Slog.v(TAG,
                    "Need to start app ["
                    + mQueueName + "] " + targetProcess + " for broadcast " + r);
            if ((r.curApp=mService.startProcessLocked(targetProcess,
            if ((SystemProperties.getInt("sys.quickboot.enable", 0) == 1 &&
                        SystemProperties.getInt("sys.quickboot.poweron", 0) == 0 &&
                       !getWhiteList().contains(info.activityInfo.applicationInfo.packageName))
                || (r.curApp=mService.startProcessLocked(targetProcess,
                    info.activityInfo.applicationInfo, true,
                    r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,
                    "broadcast", r.curComponent,
@@ -944,6 +949,16 @@ public final class BroadcastQueue {
        }
    }

    private ArrayList<String> getWhiteList() {
        if (quickbootWhiteList == null) {
            quickbootWhiteList = new ArrayList();
            // allow legacy alarm app to be launched
            quickbootWhiteList.add("com.android.deskclock");
            quickbootWhiteList.add("com.qapp.quickboot");
        }
        return quickbootWhiteList;
    }

    final void setBroadcastTimeoutLocked(long timeoutTime) {
        if (! mPendingBroadcastTimeoutMessage) {
            Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this);
Loading