Loading services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +55 −1 Original line number Diff line number Diff line Loading @@ -22,10 +22,14 @@ import static com.android.internal.util.FunctionalUtils.uncheckExceptions; 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.obtainMessage; import static com.android.internal.util.function.pooled.PooledLambda.obtainRunnable; import static java.util.concurrent.TimeUnit.MINUTES; import android.annotation.CheckResult; import android.annotation.Nullable; import android.app.AppOpsManager; import android.app.PendingIntent; import android.companion.Association; import android.companion.AssociationRequest; Loading @@ -36,6 +40,7 @@ import android.companion.IFindDeviceCallback; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.FeatureInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageItemInfo; Loading @@ -55,6 +60,7 @@ import android.os.ServiceManager; import android.os.ShellCallback; import android.os.ShellCommand; import android.os.UserHandle; import android.os.UserManagerInternal; import android.provider.Settings; import android.provider.SettingsStringUtil.ComponentNameSet; import android.text.BidiFormatter; Loading @@ -71,6 +77,7 @@ import com.android.internal.infra.AndroidFuture; import com.android.internal.infra.PerUser; import com.android.internal.infra.ServiceConnector; import com.android.internal.notification.NotificationAccessConfirmationActivityContract; import com.android.internal.os.BackgroundThread; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; import com.android.internal.util.function.pooled.PooledLambda; Loading Loading @@ -112,6 +119,9 @@ public class CompanionDeviceManagerService extends SystemService implements Bind private static final boolean DEBUG = false; private static final String LOG_TAG = "CompanionDeviceManagerService"; private static final String PREF_FILE_NAME = "companion_device_preferences.xml"; private static final String PREF_KEY_AUTO_REVOKE_GRANTS_DONE = "auto_revoke_grants_done"; private static final String XML_TAG_ASSOCIATIONS = "associations"; private static final String XML_TAG_ASSOCIATION = "association"; private static final String XML_ATTR_PACKAGE = "package"; Loading Loading @@ -150,7 +160,6 @@ public class CompanionDeviceManagerService extends SystemService implements Bind } }; registerPackageMonitor(); } Loading Loading @@ -195,6 +204,36 @@ public class CompanionDeviceManagerService extends SystemService implements Bind if (atmInternal != null) { atmInternal.setCompanionAppPackages(userHandle, companionAppPackages); } BackgroundThread.getHandler().sendMessageDelayed( obtainMessage(CompanionDeviceManagerService::maybeGrantAutoRevokeExemptions, this), MINUTES.toMillis(10)); } void maybeGrantAutoRevokeExemptions() { PackageManager pm = getContext().getPackageManager(); for (int userId : LocalServices.getService(UserManagerInternal.class).getUserIds()) { SharedPreferences pref = getContext().getSharedPreferences( new File(Environment.getUserSystemDirectory(userId), PREF_FILE_NAME), Context.MODE_PRIVATE); if (pref.getBoolean(PREF_KEY_AUTO_REVOKE_GRANTS_DONE, false)) { continue; } try { Set<Association> associations = readAllAssociations(userId); for (Association a : associations) { try { int uid = pm.getPackageUidAsUser(a.companionAppPackage, userId); exemptFromAutoRevoke(a.companionAppPackage, uid); } catch (PackageManager.NameNotFoundException e) { Log.w(LOG_TAG, "Unknown companion package: " + a.companionAppPackage, e); } } } finally { pref.edit().putBoolean(PREF_KEY_AUTO_REVOKE_GRANTS_DONE, true).apply(); } } } @Override Loading Loading @@ -469,6 +508,21 @@ public class CompanionDeviceManagerService extends SystemService implements Bind packageInfo.applicationInfo.uid, NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND); } exemptFromAutoRevoke(packageInfo.packageName, packageInfo.applicationInfo.uid); } private void exemptFromAutoRevoke(String packageName, int uid) { try { mAppOpsManager.setMode( AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, uid, packageName, AppOpsManager.MODE_IGNORED); } catch (RemoteException e) { Log.w(LOG_TAG, "Error while granting auto revoke exemption for " + packageName, e); } } private static <T> boolean containsEither(T[] array, T a, T b) { Loading Loading
services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +55 −1 Original line number Diff line number Diff line Loading @@ -22,10 +22,14 @@ import static com.android.internal.util.FunctionalUtils.uncheckExceptions; 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.obtainMessage; import static com.android.internal.util.function.pooled.PooledLambda.obtainRunnable; import static java.util.concurrent.TimeUnit.MINUTES; import android.annotation.CheckResult; import android.annotation.Nullable; import android.app.AppOpsManager; import android.app.PendingIntent; import android.companion.Association; import android.companion.AssociationRequest; Loading @@ -36,6 +40,7 @@ import android.companion.IFindDeviceCallback; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.FeatureInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageItemInfo; Loading @@ -55,6 +60,7 @@ import android.os.ServiceManager; import android.os.ShellCallback; import android.os.ShellCommand; import android.os.UserHandle; import android.os.UserManagerInternal; import android.provider.Settings; import android.provider.SettingsStringUtil.ComponentNameSet; import android.text.BidiFormatter; Loading @@ -71,6 +77,7 @@ import com.android.internal.infra.AndroidFuture; import com.android.internal.infra.PerUser; import com.android.internal.infra.ServiceConnector; import com.android.internal.notification.NotificationAccessConfirmationActivityContract; import com.android.internal.os.BackgroundThread; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; import com.android.internal.util.function.pooled.PooledLambda; Loading Loading @@ -112,6 +119,9 @@ public class CompanionDeviceManagerService extends SystemService implements Bind private static final boolean DEBUG = false; private static final String LOG_TAG = "CompanionDeviceManagerService"; private static final String PREF_FILE_NAME = "companion_device_preferences.xml"; private static final String PREF_KEY_AUTO_REVOKE_GRANTS_DONE = "auto_revoke_grants_done"; private static final String XML_TAG_ASSOCIATIONS = "associations"; private static final String XML_TAG_ASSOCIATION = "association"; private static final String XML_ATTR_PACKAGE = "package"; Loading Loading @@ -150,7 +160,6 @@ public class CompanionDeviceManagerService extends SystemService implements Bind } }; registerPackageMonitor(); } Loading Loading @@ -195,6 +204,36 @@ public class CompanionDeviceManagerService extends SystemService implements Bind if (atmInternal != null) { atmInternal.setCompanionAppPackages(userHandle, companionAppPackages); } BackgroundThread.getHandler().sendMessageDelayed( obtainMessage(CompanionDeviceManagerService::maybeGrantAutoRevokeExemptions, this), MINUTES.toMillis(10)); } void maybeGrantAutoRevokeExemptions() { PackageManager pm = getContext().getPackageManager(); for (int userId : LocalServices.getService(UserManagerInternal.class).getUserIds()) { SharedPreferences pref = getContext().getSharedPreferences( new File(Environment.getUserSystemDirectory(userId), PREF_FILE_NAME), Context.MODE_PRIVATE); if (pref.getBoolean(PREF_KEY_AUTO_REVOKE_GRANTS_DONE, false)) { continue; } try { Set<Association> associations = readAllAssociations(userId); for (Association a : associations) { try { int uid = pm.getPackageUidAsUser(a.companionAppPackage, userId); exemptFromAutoRevoke(a.companionAppPackage, uid); } catch (PackageManager.NameNotFoundException e) { Log.w(LOG_TAG, "Unknown companion package: " + a.companionAppPackage, e); } } } finally { pref.edit().putBoolean(PREF_KEY_AUTO_REVOKE_GRANTS_DONE, true).apply(); } } } @Override Loading Loading @@ -469,6 +508,21 @@ public class CompanionDeviceManagerService extends SystemService implements Bind packageInfo.applicationInfo.uid, NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND); } exemptFromAutoRevoke(packageInfo.packageName, packageInfo.applicationInfo.uid); } private void exemptFromAutoRevoke(String packageName, int uid) { try { mAppOpsManager.setMode( AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, uid, packageName, AppOpsManager.MODE_IGNORED); } catch (RemoteException e) { Log.w(LOG_TAG, "Error while granting auto revoke exemption for " + packageName, e); } } private static <T> boolean containsEither(T[] array, T a, T b) { Loading