diff options
author | Eugene Susla <eugenesusla@google.com> | 2017-06-23 17:25:24 -0700 |
---|---|---|
committer | Eugene Susla <eugenesusla@google.com> | 2017-12-05 10:46:59 -0800 |
commit | 2f5ee71ec851b1149b4e10ec211ad520cd73776e (patch) | |
tree | 3ecf658e14233141e3bb739070dc454e50d79502 /services/companion | |
parent | e4cf6bf4745754615b19d95a90d809889c5e4b43 (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.java | 61 |
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) { |