summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kweku Adams <kwekua@google.com> 2020-11-10 22:02:43 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-11-10 22:02:43 +0000
commitcd61fb20697ee32ad25b60d712ace644e63a010b (patch)
tree1fbb8a131b25cf72be12cf3143aeadd96bde43bd
parentf06eafb1352c9e4b42d11249d61283a25315dd05 (diff)
parentff6fcd7bcd8205e133acc97c1358bb140f942c58 (diff)
Merge "Check app querying permissions."
-rw-r--r--apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java85
-rw-r--r--core/java/com/android/internal/util/ArrayUtils.java6
2 files changed, 64 insertions, 27 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
index 81f22fe36ea1..9835e18d0bfd 100644
--- a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
+++ b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
@@ -27,6 +27,7 @@ import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PackageManagerInternal;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@@ -76,6 +77,7 @@ import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IBatteryStats;
+import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.XmlUtils;
@@ -273,6 +275,7 @@ public class DeviceIdleController extends SystemService
private ActivityManagerInternal mLocalActivityManager;
private ActivityTaskManagerInternal mLocalActivityTaskManager;
private DeviceIdleInternal mLocalService;
+ private PackageManagerInternal mPackageManagerInternal;
private PowerManagerInternal mLocalPowerManager;
private PowerManager mPowerManager;
private INetworkPolicyManager mNetworkPolicyManager;
@@ -1736,27 +1739,33 @@ public class DeviceIdleController extends SystemService
}
public String[] getRemovedSystemPowerWhitelistApps() {
- return getRemovedSystemPowerWhitelistAppsInternal();
+ return getRemovedSystemPowerWhitelistAppsInternal(
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
}
@Override public String[] getSystemPowerWhitelistExceptIdle() {
- return getSystemPowerWhitelistExceptIdleInternal();
+ return getSystemPowerWhitelistExceptIdleInternal(
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
}
@Override public String[] getSystemPowerWhitelist() {
- return getSystemPowerWhitelistInternal();
+ return getSystemPowerWhitelistInternal(
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
}
@Override public String[] getUserPowerWhitelist() {
- return getUserPowerWhitelistInternal();
+ return getUserPowerWhitelistInternal(
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
}
@Override public String[] getFullPowerWhitelistExceptIdle() {
- return getFullPowerWhitelistExceptIdleInternal();
+ return getFullPowerWhitelistExceptIdleInternal(
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
}
@Override public String[] getFullPowerWhitelist() {
- return getFullPowerWhitelistInternal();
+ return getFullPowerWhitelistInternal(
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
}
@Override public int[] getAppIdWhitelistExceptIdle() {
@@ -1776,10 +1785,18 @@ public class DeviceIdleController extends SystemService
}
@Override public boolean isPowerSaveWhitelistExceptIdleApp(String name) {
+ if (mPackageManagerInternal
+ .filterAppAccess(name, Binder.getCallingUid(), UserHandle.getCallingUserId())) {
+ return false;
+ }
return isPowerSaveWhitelistExceptIdleAppInternal(name);
}
@Override public boolean isPowerSaveWhitelistApp(String name) {
+ if (mPackageManagerInternal
+ .filterAppAccess(name, Binder.getCallingUid(), UserHandle.getCallingUserId())) {
+ return false;
+ }
return isPowerSaveWhitelistAppInternal(name);
}
@@ -2159,6 +2176,7 @@ public class DeviceIdleController extends SystemService
mBatteryStats = BatteryStatsService.getService();
mLocalActivityManager = getLocalService(ActivityManagerInternal.class);
mLocalActivityTaskManager = getLocalService(ActivityTaskManagerInternal.class);
+ mPackageManagerInternal = getLocalService(PackageManagerInternal.class);
mLocalPowerManager = getLocalService(PowerManagerInternal.class);
mPowerManager = mInjector.getPowerManager();
mActiveIdleWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
@@ -2466,54 +2484,68 @@ public class DeviceIdleController extends SystemService
}
}
- public String[] getSystemPowerWhitelistExceptIdleInternal() {
+ private String[] getSystemPowerWhitelistExceptIdleInternal(final int callingUid,
+ final int callingUserId) {
+ final String[] apps;
synchronized (this) {
int size = mPowerSaveWhitelistAppsExceptIdle.size();
- String[] apps = new String[size];
+ apps = new String[size];
for (int i = 0; i < size; i++) {
apps[i] = mPowerSaveWhitelistAppsExceptIdle.keyAt(i);
}
- return apps;
}
+ return ArrayUtils.filter(apps, String[]::new,
+ (pkg) -> !mPackageManagerInternal.filterAppAccess(pkg, callingUid, callingUserId));
}
- public String[] getSystemPowerWhitelistInternal() {
+ private String[] getSystemPowerWhitelistInternal(final int callingUid,
+ final int callingUserId) {
+ final String[] apps;
synchronized (this) {
int size = mPowerSaveWhitelistApps.size();
- String[] apps = new String[size];
+ apps = new String[size];
for (int i = 0; i < size; i++) {
apps[i] = mPowerSaveWhitelistApps.keyAt(i);
}
- return apps;
}
+ return ArrayUtils.filter(apps, String[]::new,
+ (pkg) -> !mPackageManagerInternal.filterAppAccess(pkg, callingUid, callingUserId));
}
- public String[] getRemovedSystemPowerWhitelistAppsInternal() {
+ private String[] getRemovedSystemPowerWhitelistAppsInternal(final int callingUid,
+ final int callingUserId) {
+ final String[] apps;
synchronized (this) {
int size = mRemovedFromSystemWhitelistApps.size();
- final String[] apps = new String[size];
+ apps = new String[size];
for (int i = 0; i < size; i++) {
apps[i] = mRemovedFromSystemWhitelistApps.keyAt(i);
}
- return apps;
}
+ return ArrayUtils.filter(apps, String[]::new,
+ (pkg) -> !mPackageManagerInternal.filterAppAccess(pkg, callingUid, callingUserId));
}
- public String[] getUserPowerWhitelistInternal() {
+ private String[] getUserPowerWhitelistInternal(final int callingUid, final int callingUserId) {
+ final String[] apps;
synchronized (this) {
int size = mPowerSaveWhitelistUserApps.size();
- String[] apps = new String[size];
+ apps = new String[size];
for (int i = 0; i < mPowerSaveWhitelistUserApps.size(); i++) {
apps[i] = mPowerSaveWhitelistUserApps.keyAt(i);
}
- return apps;
}
+ return ArrayUtils.filter(apps, String[]::new,
+ (pkg) -> !mPackageManagerInternal.filterAppAccess(pkg, callingUid, callingUserId));
}
- public String[] getFullPowerWhitelistExceptIdleInternal() {
+ private String[] getFullPowerWhitelistExceptIdleInternal(final int callingUid,
+ final int callingUserId) {
+ final String[] apps;
synchronized (this) {
- int size = mPowerSaveWhitelistAppsExceptIdle.size() + mPowerSaveWhitelistUserApps.size();
- String[] apps = new String[size];
+ int size =
+ mPowerSaveWhitelistAppsExceptIdle.size() + mPowerSaveWhitelistUserApps.size();
+ apps = new String[size];
int cur = 0;
for (int i = 0; i < mPowerSaveWhitelistAppsExceptIdle.size(); i++) {
apps[cur] = mPowerSaveWhitelistAppsExceptIdle.keyAt(i);
@@ -2523,14 +2555,16 @@ public class DeviceIdleController extends SystemService
apps[cur] = mPowerSaveWhitelistUserApps.keyAt(i);
cur++;
}
- return apps;
}
+ return ArrayUtils.filter(apps, String[]::new,
+ (pkg) -> !mPackageManagerInternal.filterAppAccess(pkg, callingUid, callingUserId));
}
- public String[] getFullPowerWhitelistInternal() {
+ private String[] getFullPowerWhitelistInternal(final int callingUid, final int callingUserId) {
+ final String[] apps;
synchronized (this) {
int size = mPowerSaveWhitelistApps.size() + mPowerSaveWhitelistUserApps.size();
- String[] apps = new String[size];
+ apps = new String[size];
int cur = 0;
for (int i = 0; i < mPowerSaveWhitelistApps.size(); i++) {
apps[cur] = mPowerSaveWhitelistApps.keyAt(i);
@@ -2540,8 +2574,9 @@ public class DeviceIdleController extends SystemService
apps[cur] = mPowerSaveWhitelistUserApps.keyAt(i);
cur++;
}
- return apps;
}
+ return ArrayUtils.filter(apps, String[]::new,
+ (pkg) -> !mPackageManagerInternal.filterAppAccess(pkg, callingUid, callingUserId));
}
public boolean isPowerSaveWhitelistExceptIdleAppInternal(String packageName) {
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index 5571a58a8999..e067f5fbdf45 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -776,8 +776,10 @@ public class ArrayUtils {
int matchesCount = 0;
int size = size(items);
+ final boolean[] tests = new boolean[size];
for (int i = 0; i < size; i++) {
- if (predicate.test(items[i])) {
+ tests[i] = predicate.test(items[i]);
+ if (tests[i]) {
matchesCount++;
}
}
@@ -790,7 +792,7 @@ public class ArrayUtils {
}
int outIdx = 0;
for (int i = 0; i < size; i++) {
- if (predicate.test(items[i])) {
+ if (tests[i]) {
result[outIdx++] = items[i];
}
}