Merge "Exempt companion apps from auto revoke" into rvc-dev am: 4b3418bfed
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11855569 Change-Id: Ib238f8eda4fe8489540bedc4542fc011ae8eb63b
This commit is contained in:
@@ -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.checkArgument;
|
||||||
import static com.android.internal.util.Preconditions.checkNotNull;
|
import static com.android.internal.util.Preconditions.checkNotNull;
|
||||||
import static com.android.internal.util.Preconditions.checkState;
|
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 com.android.internal.util.function.pooled.PooledLambda.obtainRunnable;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||||
|
|
||||||
import android.annotation.CheckResult;
|
import android.annotation.CheckResult;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.app.AppOpsManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.companion.Association;
|
import android.companion.Association;
|
||||||
import android.companion.AssociationRequest;
|
import android.companion.AssociationRequest;
|
||||||
@@ -36,6 +40,7 @@ import android.companion.IFindDeviceCallback;
|
|||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.FeatureInfo;
|
import android.content.pm.FeatureInfo;
|
||||||
import android.content.pm.PackageInfo;
|
import android.content.pm.PackageInfo;
|
||||||
import android.content.pm.PackageItemInfo;
|
import android.content.pm.PackageItemInfo;
|
||||||
@@ -55,6 +60,7 @@ import android.os.ServiceManager;
|
|||||||
import android.os.ShellCallback;
|
import android.os.ShellCallback;
|
||||||
import android.os.ShellCommand;
|
import android.os.ShellCommand;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
|
import android.os.UserManagerInternal;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.provider.SettingsStringUtil.ComponentNameSet;
|
import android.provider.SettingsStringUtil.ComponentNameSet;
|
||||||
import android.text.BidiFormatter;
|
import android.text.BidiFormatter;
|
||||||
@@ -71,6 +77,7 @@ import com.android.internal.infra.AndroidFuture;
|
|||||||
import com.android.internal.infra.PerUser;
|
import com.android.internal.infra.PerUser;
|
||||||
import com.android.internal.infra.ServiceConnector;
|
import com.android.internal.infra.ServiceConnector;
|
||||||
import com.android.internal.notification.NotificationAccessConfirmationActivityContract;
|
import com.android.internal.notification.NotificationAccessConfirmationActivityContract;
|
||||||
|
import com.android.internal.os.BackgroundThread;
|
||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
import com.android.internal.util.CollectionUtils;
|
import com.android.internal.util.CollectionUtils;
|
||||||
import com.android.internal.util.function.pooled.PooledLambda;
|
import com.android.internal.util.function.pooled.PooledLambda;
|
||||||
@@ -112,6 +119,9 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
|
|||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
private static final String LOG_TAG = "CompanionDeviceManagerService";
|
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_ASSOCIATIONS = "associations";
|
||||||
private static final String XML_TAG_ASSOCIATION = "association";
|
private static final String XML_TAG_ASSOCIATION = "association";
|
||||||
private static final String XML_ATTR_PACKAGE = "package";
|
private static final String XML_ATTR_PACKAGE = "package";
|
||||||
@@ -150,7 +160,6 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
registerPackageMonitor();
|
registerPackageMonitor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,6 +204,36 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
|
|||||||
if (atmInternal != null) {
|
if (atmInternal != null) {
|
||||||
atmInternal.setCompanionAppPackages(userHandle, companionAppPackages);
|
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
|
@Override
|
||||||
@@ -469,6 +508,21 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
|
|||||||
packageInfo.applicationInfo.uid,
|
packageInfo.applicationInfo.uid,
|
||||||
NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND);
|
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) {
|
private static <T> boolean containsEither(T[] array, T a, T b) {
|
||||||
|
|||||||
Reference in New Issue
Block a user