Merge "Allow shell to remove pkgs from powersave-temp-whitelist."

This commit is contained in:
Sudheer Shanka
2017-12-04 18:30:30 +00:00
committed by Android (Google) Code Review

View File

@@ -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;
@@ -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.
@@ -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);
@@ -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) {
@@ -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());
@@ -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 {
@@ -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)) {
@@ -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 {
addPowerSaveTempWhitelistAppChecked(arg, duration, shell.userId, "shell");
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);
}