Loading services/core/java/com/android/server/DeviceIdleController.java +80 −15 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ import android.util.SparseBooleanArray; import android.util.TimeUtils; import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IBatteryStats; import com.android.internal.os.AtomicFile; import com.android.internal.os.BackgroundThread; Loading Loading @@ -1754,6 +1755,27 @@ public class DeviceIdleController extends SystemService } } void removePowerSaveTempWhitelistAppChecked(String packageName, int userId) throws RemoteException { getContext().enforceCallingPermission( Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST, "No permission to change device idle whitelist"); final int callingUid = Binder.getCallingUid(); userId = ActivityManager.getService().handleIncomingUser( Binder.getCallingPid(), callingUid, userId, /*allowAll=*/ false, /*requireFull=*/ false, "removePowerSaveTempWhitelistApp", null); final long token = Binder.clearCallingIdentity(); try { removePowerSaveTempWhitelistAppInternal(packageName, userId); } finally { Binder.restoreCallingIdentity(token); } } /** * Adds an app to the temporary whitelist and resets the endTime for granting the * app an exemption to access network and acquire wakelocks. Loading Loading @@ -1819,6 +1841,32 @@ public class DeviceIdleController extends SystemService } } /** * Removes an app from the temporary whitelist and notifies the observers. */ private void removePowerSaveTempWhitelistAppInternal(String packageName, int userId) { try { final int uid = getContext().getPackageManager().getPackageUidAsUser( packageName, userId); final int appId = UserHandle.getAppId(uid); removePowerSaveTempWhitelistAppDirectInternal(appId); } catch (NameNotFoundException e) { } } private void removePowerSaveTempWhitelistAppDirectInternal(int appId) { synchronized (this) { final int idx = mTempWhitelistAppIdEndTimes.indexOfKey(appId); if (idx < 0) { // Nothing else to do return; } final String reason = mTempWhitelistAppIdEndTimes.valueAt(idx).second; mTempWhitelistAppIdEndTimes.removeAt(idx); onAppRemovedFromTempWhitelistLocked(appId, reason); } } private void postTempActiveTimeoutMessage(int uid, long delay) { if (DEBUG) { Slog.d(TAG, "postTempActiveTimeoutMessage: uid=" + uid + ", delay=" + delay); Loading @@ -1840,18 +1888,7 @@ public class DeviceIdleController extends SystemService } if (timeNow >= entry.first.value) { mTempWhitelistAppIdEndTimes.delete(uid); if (DEBUG) { Slog.d(TAG, "Removing UID " + uid + " from temp whitelist"); } updateTempWhitelistAppIdsLocked(uid, false); mHandler.obtainMessage(MSG_REPORT_TEMP_APP_WHITELIST_CHANGED, uid, 0) .sendToTarget(); reportTempWhitelistChangedLocked(); try { mBatteryStats.noteEvent(BatteryStats.HistoryItem.EVENT_TEMP_WHITELIST_FINISH, entry.second, uid); } catch (RemoteException e) { } onAppRemovedFromTempWhitelistLocked(uid, entry.second); } else { // Need more time if (DEBUG) { Loading @@ -1862,6 +1899,22 @@ public class DeviceIdleController extends SystemService } } @GuardedBy("this") private void onAppRemovedFromTempWhitelistLocked(int appId, String reason) { if (DEBUG) { Slog.d(TAG, "Removing appId " + appId + " from temp whitelist"); } updateTempWhitelistAppIdsLocked(appId, false); mHandler.obtainMessage(MSG_REPORT_TEMP_APP_WHITELIST_CHANGED, appId, 0) .sendToTarget(); reportTempWhitelistChangedLocked(); try { mBatteryStats.noteEvent(BatteryStats.HistoryItem.EVENT_TEMP_WHITELIST_FINISH, reason, appId); } catch (RemoteException e) { } } public void exitIdleInternal(String reason) { synchronized (this) { becomeActiveLocked(reason, Binder.getCallingUid()); Loading Loading @@ -2699,9 +2752,11 @@ public class DeviceIdleController extends SystemService + "changes made using this won't be persisted across boots"); pw.println(" tempwhitelist"); pw.println(" Print packages that are temporarily whitelisted."); pw.println(" tempwhitelist [-u USER] [-d DURATION] [package ..]"); pw.println(" Temporarily place packages in whitelist for DURATION milliseconds."); pw.println(" tempwhitelist [-u USER] [-d DURATION] [-r] [package]"); pw.println(" Temporarily place package in whitelist for DURATION milliseconds."); pw.println(" If no DURATION is specified, 10 seconds is used"); pw.println(" If [-r] option is used, then the package is removed from temp whitelist " + "and any [-d] is ignored"); } class Shell extends ShellCommand { Loading Loading @@ -2985,6 +3040,7 @@ public class DeviceIdleController extends SystemService } } else if ("tempwhitelist".equals(cmd)) { long duration = 10000; boolean removePkg = false; String opt; while ((opt=shell.getNextOption()) != null) { if ("-u".equals(opt)) { Loading @@ -3001,16 +3057,25 @@ public class DeviceIdleController extends SystemService return -1; } duration = Long.parseLong(opt); } else if ("-r".equals(opt)) { removePkg = true; } } String arg = shell.getNextArg(); if (arg != null) { try { if (removePkg) { removePowerSaveTempWhitelistAppChecked(arg, shell.userId); } else { addPowerSaveTempWhitelistAppChecked(arg, duration, shell.userId, "shell"); } } catch (Exception e) { pw.println("Failed: " + e); return -1; } } else if (removePkg) { pw.println("[-r] requires a package name"); return -1; } else { dumpTempWhitelistSchedule(pw, false); } Loading Loading
services/core/java/com/android/server/DeviceIdleController.java +80 −15 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ import android.util.SparseBooleanArray; import android.util.TimeUtils; import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IBatteryStats; import com.android.internal.os.AtomicFile; import com.android.internal.os.BackgroundThread; Loading Loading @@ -1754,6 +1755,27 @@ public class DeviceIdleController extends SystemService } } void removePowerSaveTempWhitelistAppChecked(String packageName, int userId) throws RemoteException { getContext().enforceCallingPermission( Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST, "No permission to change device idle whitelist"); final int callingUid = Binder.getCallingUid(); userId = ActivityManager.getService().handleIncomingUser( Binder.getCallingPid(), callingUid, userId, /*allowAll=*/ false, /*requireFull=*/ false, "removePowerSaveTempWhitelistApp", null); final long token = Binder.clearCallingIdentity(); try { removePowerSaveTempWhitelistAppInternal(packageName, userId); } finally { Binder.restoreCallingIdentity(token); } } /** * Adds an app to the temporary whitelist and resets the endTime for granting the * app an exemption to access network and acquire wakelocks. Loading Loading @@ -1819,6 +1841,32 @@ public class DeviceIdleController extends SystemService } } /** * Removes an app from the temporary whitelist and notifies the observers. */ private void removePowerSaveTempWhitelistAppInternal(String packageName, int userId) { try { final int uid = getContext().getPackageManager().getPackageUidAsUser( packageName, userId); final int appId = UserHandle.getAppId(uid); removePowerSaveTempWhitelistAppDirectInternal(appId); } catch (NameNotFoundException e) { } } private void removePowerSaveTempWhitelistAppDirectInternal(int appId) { synchronized (this) { final int idx = mTempWhitelistAppIdEndTimes.indexOfKey(appId); if (idx < 0) { // Nothing else to do return; } final String reason = mTempWhitelistAppIdEndTimes.valueAt(idx).second; mTempWhitelistAppIdEndTimes.removeAt(idx); onAppRemovedFromTempWhitelistLocked(appId, reason); } } private void postTempActiveTimeoutMessage(int uid, long delay) { if (DEBUG) { Slog.d(TAG, "postTempActiveTimeoutMessage: uid=" + uid + ", delay=" + delay); Loading @@ -1840,18 +1888,7 @@ public class DeviceIdleController extends SystemService } if (timeNow >= entry.first.value) { mTempWhitelistAppIdEndTimes.delete(uid); if (DEBUG) { Slog.d(TAG, "Removing UID " + uid + " from temp whitelist"); } updateTempWhitelistAppIdsLocked(uid, false); mHandler.obtainMessage(MSG_REPORT_TEMP_APP_WHITELIST_CHANGED, uid, 0) .sendToTarget(); reportTempWhitelistChangedLocked(); try { mBatteryStats.noteEvent(BatteryStats.HistoryItem.EVENT_TEMP_WHITELIST_FINISH, entry.second, uid); } catch (RemoteException e) { } onAppRemovedFromTempWhitelistLocked(uid, entry.second); } else { // Need more time if (DEBUG) { Loading @@ -1862,6 +1899,22 @@ public class DeviceIdleController extends SystemService } } @GuardedBy("this") private void onAppRemovedFromTempWhitelistLocked(int appId, String reason) { if (DEBUG) { Slog.d(TAG, "Removing appId " + appId + " from temp whitelist"); } updateTempWhitelistAppIdsLocked(appId, false); mHandler.obtainMessage(MSG_REPORT_TEMP_APP_WHITELIST_CHANGED, appId, 0) .sendToTarget(); reportTempWhitelistChangedLocked(); try { mBatteryStats.noteEvent(BatteryStats.HistoryItem.EVENT_TEMP_WHITELIST_FINISH, reason, appId); } catch (RemoteException e) { } } public void exitIdleInternal(String reason) { synchronized (this) { becomeActiveLocked(reason, Binder.getCallingUid()); Loading Loading @@ -2699,9 +2752,11 @@ public class DeviceIdleController extends SystemService + "changes made using this won't be persisted across boots"); pw.println(" tempwhitelist"); pw.println(" Print packages that are temporarily whitelisted."); pw.println(" tempwhitelist [-u USER] [-d DURATION] [package ..]"); pw.println(" Temporarily place packages in whitelist for DURATION milliseconds."); pw.println(" tempwhitelist [-u USER] [-d DURATION] [-r] [package]"); pw.println(" Temporarily place package in whitelist for DURATION milliseconds."); pw.println(" If no DURATION is specified, 10 seconds is used"); pw.println(" If [-r] option is used, then the package is removed from temp whitelist " + "and any [-d] is ignored"); } class Shell extends ShellCommand { Loading Loading @@ -2985,6 +3040,7 @@ public class DeviceIdleController extends SystemService } } else if ("tempwhitelist".equals(cmd)) { long duration = 10000; boolean removePkg = false; String opt; while ((opt=shell.getNextOption()) != null) { if ("-u".equals(opt)) { Loading @@ -3001,16 +3057,25 @@ public class DeviceIdleController extends SystemService return -1; } duration = Long.parseLong(opt); } else if ("-r".equals(opt)) { removePkg = true; } } String arg = shell.getNextArg(); if (arg != null) { try { if (removePkg) { removePowerSaveTempWhitelistAppChecked(arg, shell.userId); } else { addPowerSaveTempWhitelistAppChecked(arg, duration, shell.userId, "shell"); } } catch (Exception e) { pw.println("Failed: " + e); return -1; } } else if (removePkg) { pw.println("[-r] requires a package name"); return -1; } else { dumpTempWhitelistSchedule(pw, false); } Loading