Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 383b7960 authored by Oli Thompson's avatar Oli Thompson
Browse files

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
parent 91f3c781
Loading
Loading
Loading
Loading
+45 −0
Original line number Diff line number Diff line
@@ -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<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());
    }
}