Loading policy/src/com/android/internal/policy/impl/GlobalActions.java +19 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import com.android.internal.R; import android.app.ActivityManagerNative; import android.app.AlertDialog; import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; Loading Loading @@ -235,6 +236,8 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac mItems = new ArrayList<Action>(); final boolean quickbootEnabled = Settings.System.getInt( mContext.getContentResolver(), "enable_quickboot", 0) == 1; // first: power off mItems.add( new SinglePressAction( Loading @@ -242,6 +245,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); } Loading Loading @@ -933,6 +942,16 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } } private void startQuickBoot() { Intent intent = new Intent("qualcomm.intent.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; Loading policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +79 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,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; Loading Loading @@ -203,6 +207,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(); private boolean mButtonLightEnabled; Loading Loading @@ -305,6 +310,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { int mPointerLocationMode = 0; // guarded by mLock int mLongPressPoweronTime = DEFAULT_LONG_PRESS_POWERON_TIME; // The last window we were told about in focusChanged. WindowState mFocusedWindow; IApplicationToken mFocusedApp; Loading Loading @@ -469,6 +476,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { SettingsObserver mSettingsObserver; ShortcutManager mShortcutManager; PowerManager.WakeLock mBroadcastWakeLock; PowerManager.WakeLock mQuickBootWakeLock; boolean mHavePendingMediaKeyRepeatWithWakeLock; private int mCurrentUserId; Loading Loading @@ -925,6 +933,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); Loading Loading @@ -3872,6 +3884,58 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } private final Runnable mQuickBootPowerLongPress = new Runnable() { public void run() { Intent intent = new Intent("qualcomm.intent.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("qualcomm.intent.QUICKBOOT.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) { Loading @@ -3884,6 +3948,21 @@ public class PhoneWindowManager implements WindowManagerPolicy { final boolean canceled = event.isCanceled(); final int keyCode = event.getKeyCode(); 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 Loading services/java/com/android/server/AlarmManagerService.java +45 −1 Original line number Diff line number Diff line Loading @@ -117,6 +117,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; Loading Loading @@ -521,6 +522,7 @@ class AlarmManagerService extends IAlarmManager.Stub { mClockReceiver.scheduleTimeTickEvent(); mClockReceiver.scheduleDateChangedEvent(); mUninstallReceiver = new UninstallReceiver(); mQuickBootReceiver = new QuickBootReceiver(); if (mDescriptor != -1) { mWaitThread.start(); Loading Loading @@ -1260,6 +1262,19 @@ class AlarmManagerService extends IAlarmManager.Stub { } } private void filtQuickBootAlarms(ArrayList<Alarm> triggerList) { for (int i = triggerList.size() - 1; i >= 0; i--) { Alarm alarm = triggerList.get(i); // bypass system alarms if (!"android".equals(alarm.operation.getTargetPackage())) { triggerList.remove(i); Slog.v(TAG, "ignore -> " + alarm.operation.getTargetPackage()); } } } private class AlarmThread extends Thread { public AlarmThread() Loading Loading @@ -1315,6 +1330,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); Loading Loading @@ -1432,6 +1451,31 @@ class AlarmManagerService extends IAlarmManager.Stub { } } private class QuickBootReceiver extends BroadcastReceiver { public QuickBootReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction("intent.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 ("intent.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(); Loading services/java/com/android/server/am/BroadcastQueue.java +4 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -906,7 +907,9 @@ 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) || (r.curApp=mService.startProcessLocked(targetProcess, info.activityInfo.applicationInfo, true, r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND, "broadcast", r.curComponent, Loading services/java/com/android/server/power/PowerManagerService.java +4 −0 Original line number Diff line number Diff line Loading @@ -1297,6 +1297,10 @@ public final class PowerManagerService extends IPowerManager.Stub return false; } if (SystemProperties.getInt("sys.quickboot.enable", 0) == 1) { return false; } // Don't wake when undocked from wireless charger. // See WirelessChargerDetector for justification. if (wasPowered && !mIsPowered Loading Loading
policy/src/com/android/internal/policy/impl/GlobalActions.java +19 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import com.android.internal.R; import android.app.ActivityManagerNative; import android.app.AlertDialog; import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; Loading Loading @@ -235,6 +236,8 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac mItems = new ArrayList<Action>(); final boolean quickbootEnabled = Settings.System.getInt( mContext.getContentResolver(), "enable_quickboot", 0) == 1; // first: power off mItems.add( new SinglePressAction( Loading @@ -242,6 +245,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); } Loading Loading @@ -933,6 +942,16 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } } private void startQuickBoot() { Intent intent = new Intent("qualcomm.intent.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; Loading
policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +79 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,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; Loading Loading @@ -203,6 +207,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(); private boolean mButtonLightEnabled; Loading Loading @@ -305,6 +310,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { int mPointerLocationMode = 0; // guarded by mLock int mLongPressPoweronTime = DEFAULT_LONG_PRESS_POWERON_TIME; // The last window we were told about in focusChanged. WindowState mFocusedWindow; IApplicationToken mFocusedApp; Loading Loading @@ -469,6 +476,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { SettingsObserver mSettingsObserver; ShortcutManager mShortcutManager; PowerManager.WakeLock mBroadcastWakeLock; PowerManager.WakeLock mQuickBootWakeLock; boolean mHavePendingMediaKeyRepeatWithWakeLock; private int mCurrentUserId; Loading Loading @@ -925,6 +933,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); Loading Loading @@ -3872,6 +3884,58 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } private final Runnable mQuickBootPowerLongPress = new Runnable() { public void run() { Intent intent = new Intent("qualcomm.intent.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("qualcomm.intent.QUICKBOOT.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) { Loading @@ -3884,6 +3948,21 @@ public class PhoneWindowManager implements WindowManagerPolicy { final boolean canceled = event.isCanceled(); final int keyCode = event.getKeyCode(); 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 Loading
services/java/com/android/server/AlarmManagerService.java +45 −1 Original line number Diff line number Diff line Loading @@ -117,6 +117,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; Loading Loading @@ -521,6 +522,7 @@ class AlarmManagerService extends IAlarmManager.Stub { mClockReceiver.scheduleTimeTickEvent(); mClockReceiver.scheduleDateChangedEvent(); mUninstallReceiver = new UninstallReceiver(); mQuickBootReceiver = new QuickBootReceiver(); if (mDescriptor != -1) { mWaitThread.start(); Loading Loading @@ -1260,6 +1262,19 @@ class AlarmManagerService extends IAlarmManager.Stub { } } private void filtQuickBootAlarms(ArrayList<Alarm> triggerList) { for (int i = triggerList.size() - 1; i >= 0; i--) { Alarm alarm = triggerList.get(i); // bypass system alarms if (!"android".equals(alarm.operation.getTargetPackage())) { triggerList.remove(i); Slog.v(TAG, "ignore -> " + alarm.operation.getTargetPackage()); } } } private class AlarmThread extends Thread { public AlarmThread() Loading Loading @@ -1315,6 +1330,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); Loading Loading @@ -1432,6 +1451,31 @@ class AlarmManagerService extends IAlarmManager.Stub { } } private class QuickBootReceiver extends BroadcastReceiver { public QuickBootReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction("intent.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 ("intent.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(); Loading
services/java/com/android/server/am/BroadcastQueue.java +4 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -906,7 +907,9 @@ 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) || (r.curApp=mService.startProcessLocked(targetProcess, info.activityInfo.applicationInfo, true, r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND, "broadcast", r.curComponent, Loading
services/java/com/android/server/power/PowerManagerService.java +4 −0 Original line number Diff line number Diff line Loading @@ -1297,6 +1297,10 @@ public final class PowerManagerService extends IPowerManager.Stub return false; } if (SystemProperties.getInt("sys.quickboot.enable", 0) == 1) { return false; } // Don't wake when undocked from wireless charger. // See WirelessChargerDetector for justification. if (wasPowered && !mIsPowered Loading