summaryrefslogtreecommitdiff
path: root/services/companion
diff options
context:
space:
mode:
authorEugene Susla <eugenesusla@google.com>2017-06-23 17:25:24 -0700
committerEugene Susla <eugenesusla@google.com>2017-12-05 10:46:59 -0800
commit2f5ee71ec851b1149b4e10ec211ad520cd73776e (patch)
tree3ecf658e14233141e3bb739070dc454e50d79502 /services/companion
parente4cf6bf4745754615b19d95a90d809889c5e4b43 (diff)
PooledLambda
This introduces PooledLambda - a way of obtaining lambdas without the allocations overhead. See PooledLambda javadoc for a guide and PooledLambdaSample for code samples of useful usages. Test: ensure samples of PooledLambdaSample work as described. Change-Id: I46f8ad27bc1de07e19f6e39f89d2cafe4238497a
Diffstat (limited to 'services/companion')
-rw-r--r--services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java61
1 files changed, 33 insertions, 28 deletions
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index f2f01cfa19b0..d44fe4dbc450 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -21,6 +21,7 @@ import static com.android.internal.util.CollectionUtils.size;
import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.internal.util.Preconditions.checkState;
+import static com.android.internal.util.function.pooled.PooledLambda.obtainRunnable;
import android.Manifest;
import android.annotation.CheckResult;
@@ -69,6 +70,7 @@ import com.android.internal.content.PackageMonitor;
import com.android.internal.notification.NotificationAccessConfirmationActivityContract;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.CollectionUtils;
+import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.FgThread;
import com.android.server.SystemService;
@@ -440,32 +442,35 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
return;
}
- Binder.withCleanCallingIdentity(() -> {
- try {
- if (containsEither(packageInfo.requestedPermissions,
- Manifest.permission.RUN_IN_BACKGROUND,
- Manifest.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND)) {
- mIdleController.addPowerSaveWhitelistApp(packageInfo.packageName);
- } else {
- mIdleController.removePowerSaveWhitelistApp(packageInfo.packageName);
- }
- } catch (RemoteException e) {
- /* ignore - local call */
- }
+ Binder.withCleanCallingIdentity(obtainRunnable(CompanionDeviceManagerService::
+ updateSpecialAccessPermissionAsSystem, this, packageInfo).recycleOnUse());
+ }
- NetworkPolicyManager networkPolicyManager = NetworkPolicyManager.from(getContext());
+ private void updateSpecialAccessPermissionAsSystem(PackageInfo packageInfo) {
+ try {
if (containsEither(packageInfo.requestedPermissions,
- Manifest.permission.USE_DATA_IN_BACKGROUND,
- Manifest.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND)) {
- networkPolicyManager.addUidPolicy(
- packageInfo.applicationInfo.uid,
- NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND);
+ android.Manifest.permission.RUN_IN_BACKGROUND,
+ android.Manifest.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND)) {
+ mIdleController.addPowerSaveWhitelistApp(packageInfo.packageName);
} else {
- networkPolicyManager.removeUidPolicy(
- packageInfo.applicationInfo.uid,
- NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND);
+ mIdleController.removePowerSaveWhitelistApp(packageInfo.packageName);
}
- });
+ } catch (RemoteException e) {
+ /* ignore - local call */
+ }
+
+ NetworkPolicyManager networkPolicyManager = NetworkPolicyManager.from(getContext());
+ if (containsEither(packageInfo.requestedPermissions,
+ android.Manifest.permission.USE_DATA_IN_BACKGROUND,
+ android.Manifest.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND)) {
+ networkPolicyManager.addUidPolicy(
+ packageInfo.applicationInfo.uid,
+ NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND);
+ } else {
+ networkPolicyManager.removeUidPolicy(
+ packageInfo.applicationInfo.uid,
+ NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND);
+ }
}
private static <T> boolean containsEither(T[] array, T a, T b) {
@@ -474,17 +479,17 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
@Nullable
private PackageInfo getPackageInfo(String packageName, int userId) {
- return Binder.withCleanCallingIdentity(() -> {
+ return Binder.withCleanCallingIdentity(PooledLambda.obtainSupplier((context, pkg, id) -> {
try {
- return getContext().getPackageManager().getPackageInfoAsUser(
- packageName,
+ return context.getPackageManager().getPackageInfoAsUser(
+ pkg,
PackageManager.GET_PERMISSIONS | PackageManager.GET_CONFIGURATIONS,
- userId);
+ id);
} catch (PackageManager.NameNotFoundException e) {
- Slog.e(LOG_TAG, "Failed to get PackageInfo for package " + packageName, e);
+ Slog.e(LOG_TAG, "Failed to get PackageInfo for package " + pkg, e);
return null;
}
- });
+ }, getContext(), packageName, userId).recycleOnUse());
}
private void recordAssociation(String priviledgedPackage, String deviceAddress) {