From 383b7960f13f0c7ddf9bb5d53d4b3ca54dfb43ef Mon Sep 17 00:00:00 2001 From: Oli Thompson Date: Wed, 24 Apr 2024 14:01:22 +0000 Subject: [PATCH] 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 --- .../InteractAcrossProfilesDetails.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java index 81e84393d41..d40a075b058 100644 --- a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java +++ b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java @@ -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_UNAWARE; 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.annotation.UserIdInt; @@ -35,6 +37,7 @@ import android.app.ActionBar; import android.app.AppOpsManager; import android.app.admin.DevicePolicyEventLogger; import android.app.admin.DevicePolicyManager; +import android.app.admin.flags.Flags; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; @@ -49,6 +52,7 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; +import android.provider.Settings; import android.stats.devicepolicy.DevicePolicyEnums; import android.util.IconDrawableFactory; import android.view.LayoutInflater; @@ -68,6 +72,10 @@ import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.widget.LayoutPreference; +import java.util.Collections; +import java.util.Optional; +import java.util.Set; + public class InteractAcrossProfilesDetails extends AppInfoBase implements Preference.OnPreferenceClickListener { @@ -381,6 +389,7 @@ public class InteractAcrossProfilesDetails extends AppInfoBase private void enableInteractAcrossProfiles(boolean newState) { mCrossProfileApps.setInteractAcrossProfilesAppOp( mPackageName, newState ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED); + setUserPreferenceForPackage(newState, mPackageName); } private void handleInstallBannerClick() { @@ -552,4 +561,40 @@ public class InteractAcrossProfilesDetails extends AppInfoBase } 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 allowedPackagesSet = getSetFromString(allowedPackagesString); + Set 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 getSetFromString(String packages) { + return Optional.ofNullable(packages) + .map(pkg -> Set.of(pkg.split(","))) + .orElse(Collections.emptySet()); + } }