Backup connected apps settings

Save the preference for connected apps for backup and restore

Flag: android.app.admin.backup_connected_apps_settings
Bug: 175067666
Test: manual

Change-Id: Ic46fbd1ab82f551ecf89caf800e41d6afe48fc68
This commit is contained in:
Oli Thompson
2024-04-24 14:01:22 +00:00
parent 91f3c78102
commit 383b7960f1

View File

@@ -28,6 +28,8 @@ import static android.app.admin.DevicePolicyResources.Strings.Settings.ONLY_CONN
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
import static android.provider.Settings.ACTION_MANAGE_CROSS_PROFILE_ACCESS; import static android.provider.Settings.ACTION_MANAGE_CROSS_PROFILE_ACCESS;
import static android.provider.Settings.Global.CONNECTED_APPS_ALLOWED_PACKAGES;
import static android.provider.Settings.Global.CONNECTED_APPS_DISALLOWED_PACKAGES;
import android.Manifest; import android.Manifest;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
@@ -35,6 +37,7 @@ import android.app.ActionBar;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.app.admin.DevicePolicyEventLogger; import android.app.admin.DevicePolicyEventLogger;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.app.admin.flags.Flags;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
@@ -49,6 +52,7 @@ import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.Settings;
import android.stats.devicepolicy.DevicePolicyEnums; import android.stats.devicepolicy.DevicePolicyEnums;
import android.util.IconDrawableFactory; import android.util.IconDrawableFactory;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@@ -68,6 +72,10 @@ import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.RestrictedSwitchPreference;
import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.LayoutPreference;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
public class InteractAcrossProfilesDetails extends AppInfoBase public class InteractAcrossProfilesDetails extends AppInfoBase
implements Preference.OnPreferenceClickListener { implements Preference.OnPreferenceClickListener {
@@ -381,6 +389,7 @@ public class InteractAcrossProfilesDetails extends AppInfoBase
private void enableInteractAcrossProfiles(boolean newState) { private void enableInteractAcrossProfiles(boolean newState) {
mCrossProfileApps.setInteractAcrossProfilesAppOp( mCrossProfileApps.setInteractAcrossProfilesAppOp(
mPackageName, newState ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED); mPackageName, newState ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
setUserPreferenceForPackage(newState, mPackageName);
} }
private void handleInstallBannerClick() { private void handleInstallBannerClick() {
@@ -552,4 +561,40 @@ public class InteractAcrossProfilesDetails extends AppInfoBase
} }
return ACTION_MANAGE_CROSS_PROFILE_ACCESS.equals(intent.getAction()); return ACTION_MANAGE_CROSS_PROFILE_ACCESS.equals(intent.getAction());
} }
private void setUserPreferenceForPackage(boolean enabled, String crossProfilePackage) {
if (!Flags.backupConnectedAppsSettings()) {
return;
}
String allowedPackagesString = Settings.Global.getString(getContentResolver(),
CONNECTED_APPS_ALLOWED_PACKAGES);
String disallowedPackagesString = Settings.Global.getString(getContentResolver(),
CONNECTED_APPS_DISALLOWED_PACKAGES);
Set<String> allowedPackagesSet = getSetFromString(allowedPackagesString);
Set<String> disallowedPackagesSet = getSetFromString(disallowedPackagesString);
if (enabled) {
allowedPackagesSet.add(crossProfilePackage);
disallowedPackagesSet.remove(crossProfilePackage);
} else {
allowedPackagesSet.remove(crossProfilePackage);
disallowedPackagesSet.add(crossProfilePackage);
}
Settings.Global.putString(getContentResolver(),
CONNECTED_APPS_ALLOWED_PACKAGES,
String.join(",", allowedPackagesSet));
Settings.Global.putString(getContentResolver(),
CONNECTED_APPS_DISALLOWED_PACKAGES,
String.join(",", disallowedPackagesSet));
}
private Set<String> getSetFromString(String packages) {
return Optional.ofNullable(packages)
.map(pkg -> Set.of(pkg.split(",")))
.orElse(Collections.emptySet());
}
} }