diff options
Diffstat (limited to 'services/java')
5 files changed, 127 insertions, 54 deletions
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java index 0045f4a..40758d3 100644 --- a/services/java/com/android/server/BatteryService.java +++ b/services/java/com/android/server/BatteryService.java @@ -127,6 +127,8 @@ public final class BatteryService extends Binder { private long mDischargeStartTime; private int mDischargeStartLevel; + private boolean mUpdatesStopped; + private Led mLed; private boolean mSentLowBatteryBroadcast = false; @@ -231,7 +233,7 @@ public final class BatteryService extends Binder { Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN); intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(intent); + mContext.startActivityAsUser(intent, UserHandle.CURRENT); } } @@ -244,16 +246,18 @@ public final class BatteryService extends Binder { Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN); intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(intent); + mContext.startActivityAsUser(intent, UserHandle.CURRENT); } } private void updateLocked() { - // Update the values of mAcOnline, et. all. - native_update(); + if (!mUpdatesStopped) { + // Update the values of mAcOnline, et. all. + native_update(); - // Process the new values. - processValuesLocked(); + // Process the new values. + processValuesLocked(); + } } private void processValuesLocked() { @@ -543,6 +547,9 @@ public final class BatteryService extends Binder { synchronized (mLock) { if (args == null || args.length == 0 || "-a".equals(args[0])) { pw.println("Current Battery Service state:"); + if (mUpdatesStopped) { + pw.println(" (UPDATES STOPPED -- use 'reset' to restart)"); + } pw.println(" AC powered: " + mAcOnline); pw.println(" USB powered: " + mUsbOnline); pw.println(" Wireless powered: " + mWirelessOnline); @@ -554,35 +561,41 @@ public final class BatteryService extends Binder { pw.println(" voltage:" + mBatteryVoltage); pw.println(" temperature: " + mBatteryTemperature); pw.println(" technology: " + mBatteryTechnology); - } else if (false) { - // DO NOT SUBMIT WITH THIS TURNED ON - if (args.length == 3 && "set".equals(args[0])) { - String key = args[1]; - String value = args[2]; - try { - boolean update = true; - if ("ac".equals(key)) { - mAcOnline = Integer.parseInt(value) != 0; - } else if ("usb".equals(key)) { - mUsbOnline = Integer.parseInt(value) != 0; - } else if ("wireless".equals(key)) { - mWirelessOnline = Integer.parseInt(value) != 0; - } else if ("status".equals(key)) { - mBatteryStatus = Integer.parseInt(value); - } else if ("level".equals(key)) { - mBatteryLevel = Integer.parseInt(value); - } else if ("invalid".equals(key)) { - mInvalidCharger = Integer.parseInt(value); - } else { - update = false; - } - if (update) { - processValuesLocked(); - } - } catch (NumberFormatException ex) { - pw.println("Bad value: " + value); + } else if (args.length == 3 && "set".equals(args[0])) { + String key = args[1]; + String value = args[2]; + try { + boolean update = true; + if ("ac".equals(key)) { + mAcOnline = Integer.parseInt(value) != 0; + } else if ("usb".equals(key)) { + mUsbOnline = Integer.parseInt(value) != 0; + } else if ("wireless".equals(key)) { + mWirelessOnline = Integer.parseInt(value) != 0; + } else if ("status".equals(key)) { + mBatteryStatus = Integer.parseInt(value); + } else if ("level".equals(key)) { + mBatteryLevel = Integer.parseInt(value); + } else if ("invalid".equals(key)) { + mInvalidCharger = Integer.parseInt(value); + } else { + pw.println("Unknown set option: " + key); + update = false; } + if (update) { + mUpdatesStopped = true; + processValuesLocked(); + } + } catch (NumberFormatException ex) { + pw.println("Bad value: " + value); } + } else if (args.length == 1 && "reset".equals(args[0])) { + mUpdatesStopped = false; + updateLocked(); + } else { + pw.println("Dump current battery state, or:"); + pw.println(" set ac|usb|wireless|status|level|invalid <value>"); + pw.println(" reset"); } } } diff --git a/services/java/com/android/server/ShutdownActivity.java b/services/java/com/android/server/ShutdownActivity.java index a4341b7..be65141 100644 --- a/services/java/com/android/server/ShutdownActivity.java +++ b/services/java/com/android/server/ShutdownActivity.java @@ -17,9 +17,13 @@ package com.android.server; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; +import android.os.IPowerManager; +import android.os.RemoteException; +import android.os.ServiceManager; import android.util.Slog; import com.android.server.power.ShutdownThread; @@ -39,15 +43,27 @@ public class ShutdownActivity extends Activity { mConfirm = intent.getBooleanExtra(Intent.EXTRA_KEY_CONFIRM, false); Slog.i(TAG, "onCreate(): confirm=" + mConfirm); - Handler h = new Handler(); - h.post(new Runnable() { + Thread thr = new Thread("ShutdownActivity") { + @Override public void run() { - if (mReboot) { - ShutdownThread.reboot(ShutdownActivity.this, null, mConfirm); - } else { - ShutdownThread.shutdown(ShutdownActivity.this, mConfirm); + IPowerManager pm = IPowerManager.Stub.asInterface( + ServiceManager.getService(Context.POWER_SERVICE)); + try { + if (mReboot) { + pm.reboot(mConfirm, null, false); + } else { + pm.shutdown(mConfirm, false); + } + } catch (RemoteException e) { } } - }); + }; + thr.start(); + finish(); + // Wait for us to tell the power manager to shutdown. + try { + thr.join(); + } catch (InterruptedException e) { + } } } diff --git a/services/java/com/android/server/Watchdog.java b/services/java/com/android/server/Watchdog.java index 1342250..8bbf923 100644 --- a/services/java/com/android/server/Watchdog.java +++ b/services/java/com/android/server/Watchdog.java @@ -305,7 +305,7 @@ public class Watchdog extends Thread { void rebootSystem(String reason) { Slog.i(TAG, "Rebooting system because: " + reason); PowerManagerService pms = (PowerManagerService) ServiceManager.getService("power"); - pms.reboot(reason); + pms.reboot(false, reason, false); } /** diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java index d23e571..5e9e223 100644 --- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -2134,9 +2134,30 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private int mActiveWindowId; private boolean canDispatchAccessibilityEvent(AccessibilityEvent event) { - // Send window changed event only for the retrieval allowing window. - return (event.getEventType() != AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED - || event.getWindowId() == mActiveWindowId); + final int eventType = event.getEventType(); + switch (eventType) { + // All events that are for changes in a global window + // state should *always* be dispatched. + case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: + case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: + // All events generated by the user touching the + // screen should *always* be dispatched. + case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START: + case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END: + case AccessibilityEvent.TYPE_GESTURE_DETECTION_START: + case AccessibilityEvent.TYPE_GESTURE_DETECTION_END: + case AccessibilityEvent.TYPE_TOUCH_INTERACTION_START: + case AccessibilityEvent.TYPE_TOUCH_INTERACTION_END: + // These will change the active window, so dispatch. + case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER: + case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT: { + return true; + } + // All events for changes in window content should be + // dispatched *only* if this window is the active one. + default: + return event.getWindowId() == mActiveWindowId; + } } public void updateEventSourceLocked(AccessibilityEvent event) { diff --git a/services/java/com/android/server/power/PowerManagerService.java b/services/java/com/android/server/power/PowerManagerService.java index c91fa3c..9a01022 100644 --- a/services/java/com/android/server/power/PowerManagerService.java +++ b/services/java/com/android/server/power/PowerManagerService.java @@ -1602,22 +1602,39 @@ public final class PowerManagerService extends IPowerManager.Stub } /** - * Reboot the device immediately, passing 'reason' (may be null) + * Reboot the device, passing 'reason' (may be null) * to the underlying __reboot system call. Should not return. */ @Override // Binder call - public void reboot(String reason) { + public void reboot(boolean confirm, String reason, boolean wait) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); final long ident = Binder.clearCallingIdentity(); try { - rebootInternal(reason); + rebootInternal(false, confirm, reason, wait); } finally { Binder.restoreCallingIdentity(ident); } } - private void rebootInternal(final String reason) { + /** + * Shutdown the devic, passing 'reason' (may be null) + * to the underlying __reboot system call. Should not return. + */ + @Override // Binder call + public void shutdown(boolean confirm, boolean wait) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); + + final long ident = Binder.clearCallingIdentity(); + try { + rebootInternal(true, confirm, null, wait); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + private void rebootInternal(final boolean shutdown, final boolean confirm, + final String reason, boolean wait) { if (mHandler == null || !mSystemReady) { throw new IllegalStateException("Too early to call reboot()"); } @@ -1625,7 +1642,11 @@ public final class PowerManagerService extends IPowerManager.Stub Runnable runnable = new Runnable() { public void run() { synchronized (this) { - ShutdownThread.reboot(mContext, reason, false); + if (shutdown) { + ShutdownThread.shutdown(mContext, confirm); + } else { + ShutdownThread.reboot(mContext, reason, confirm); + } } } }; @@ -1636,11 +1657,13 @@ public final class PowerManagerService extends IPowerManager.Stub mHandler.sendMessage(msg); // PowerManager.reboot() is documented not to return so just wait for the inevitable. - synchronized (runnable) { - while (true) { - try { - runnable.wait(); - } catch (InterruptedException e) { + if (wait) { + synchronized (runnable) { + while (true) { + try { + runnable.wait(); + } catch (InterruptedException e) { + } } } } |
