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

Commit 258abf98 authored by Jack Nudelman's avatar Jack Nudelman Committed by Android (Google) Code Review
Browse files

Merge "Call TelephonyProvider apis for backup/restore per-sim settings." into sc-dev

parents 5c3c5ea2 e2ea428d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -11704,6 +11704,7 @@ package android.telephony {
    method public boolean canManageSubscription(@NonNull android.telephony.SubscriptionInfo, @NonNull String);
    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int[] getActiveSubscriptionIdList();
    method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.SubscriptionInfo getActiveSubscriptionInfoForIcc(@NonNull String);
    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public byte[] getAllSimSpecificSettingsForBackup();
    method public java.util.List<android.telephony.SubscriptionInfo> getAvailableSubscriptionInfoList();
    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int[] getCompleteActiveSubscriptionIdList();
    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEnabledSubscriptionId(int);
@@ -11711,6 +11712,7 @@ package android.telephony {
    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSubscriptionEnabled(int);
    method public void requestEmbeddedSubscriptionInfoListRefresh();
    method public void requestEmbeddedSubscriptionInfoListRefresh(int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void restoreAllSimSpecificSettingsFromBackup(@NonNull byte[]);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultDataSubId(int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultSmsSubId(int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int);
+43 −15
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.provider.settings.validators.GlobalSettingsValidators;
import android.provider.settings.validators.SecureSettingsValidators;
import android.provider.settings.validators.SystemSettingsValidators;
import android.provider.settings.validators.Validator;
import android.telephony.SubscriptionManager;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.BackupUtils;
@@ -95,10 +96,11 @@ public class SettingsBackupAgent extends BackupAgentHelper {
    private static final String KEY_NETWORK_POLICIES = "network_policies";
    private static final String KEY_WIFI_NEW_CONFIG = "wifi_new_config";
    private static final String KEY_DEVICE_SPECIFIC_CONFIG = "device_specific_config";
    private static final String KEY_SIM_SPECIFIC_SETTINGS = "sim_specific_settings";

    // Versioning of the state file.  Increment this version
    // number any time the set of state items is altered.
    private static final int STATE_VERSION = 8;
    private static final int STATE_VERSION = 9;

    // Versioning of the Network Policies backup payload.
    private static final int NETWORK_POLICIES_BACKUP_VERSION = 1;
@@ -117,8 +119,9 @@ public class SettingsBackupAgent extends BackupAgentHelper {
    private static final int STATE_NETWORK_POLICIES      = 8;
    private static final int STATE_WIFI_NEW_CONFIG       = 9;
    private static final int STATE_DEVICE_CONFIG         = 10;
    private static final int STATE_SIM_SPECIFIC_SETTINGS = 11;

    private static final int STATE_SIZE             = 11; // The current number of state items
    private static final int STATE_SIZE                  = 12; // The current number of state items

    // Number of entries in the checksum array at various version numbers
    private static final int STATE_SIZES[] = {
@@ -130,7 +133,8 @@ public class SettingsBackupAgent extends BackupAgentHelper {
            8,              // version 5 added STATE_SOFTAP_CONFIG
            9,              // version 6 added STATE_NETWORK_POLICIES
            10,             // version 7 added STATE_WIFI_NEW_CONFIG
            STATE_SIZE      // version 8 added STATE_DEVICE_CONFIG
            11,             // version 8 added STATE_DEVICE_CONFIG
            STATE_SIZE      // version 9 added STATE_SIM_SPECIFIC_SETTINGS
    };

    private static final int FULL_BACKUP_ADDED_GLOBAL = 2;  // added the "global" entry
@@ -218,6 +222,7 @@ public class SettingsBackupAgent extends BackupAgentHelper {
        byte[] netPoliciesData = getNetworkPolicies();
        byte[] wifiFullConfigData = getNewWifiConfigData();
        byte[] deviceSpecificInformation = getDeviceSpecificConfiguration();
        byte[] simSpecificSettingsData = getSimSpecificSettingsData();

        long[] stateChecksums = readOldChecksums(oldState);

@@ -246,6 +251,9 @@ public class SettingsBackupAgent extends BackupAgentHelper {
        stateChecksums[STATE_DEVICE_CONFIG] =
                writeIfChanged(stateChecksums[STATE_DEVICE_CONFIG], KEY_DEVICE_SPECIFIC_CONFIG,
                        deviceSpecificInformation, data);
        stateChecksums[STATE_SIM_SPECIFIC_SETTINGS] =
                writeIfChanged(stateChecksums[STATE_SIM_SPECIFIC_SETTINGS],
                        KEY_SIM_SPECIFIC_SETTINGS, simSpecificSettingsData, data);

        writeNewChecksums(stateChecksums, newState);
    }
@@ -386,6 +394,12 @@ public class SettingsBackupAgent extends BackupAgentHelper {
                            preservedSettings);
                    break;

                case KEY_SIM_SPECIFIC_SETTINGS:
                    byte[] restoredSimSpecificSettings = new byte[size];
                    data.readEntityData(restoredSimSpecificSettings, 0, size);
                    restoreSimSpecificSettings(restoredSimSpecificSettings);
                    break;

                default :
                    data.skipEntityData();

@@ -1189,6 +1203,20 @@ public class SettingsBackupAgent extends BackupAgentHelper {
        return true;
    }

    private byte[] getSimSpecificSettingsData() {
        SubscriptionManager subManager = SubscriptionManager.from(getBaseContext());
        byte[] simSpecificData = subManager.getAllSimSpecificSettingsForBackup();
        Log.i(TAG, "sim specific data of length + " + simSpecificData.length
                + " successfully retrieved");

        return simSpecificData;
    }

    private void restoreSimSpecificSettings(byte[] data) {
        SubscriptionManager subManager = SubscriptionManager.from(getBaseContext());
        subManager.restoreAllSimSpecificSettingsFromBackup(data);
    }

    private void updateWindowManagerIfNeeded(Integer previousDensity) {
        int newDensity;
        try {
+106 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import android.net.NetworkPolicyManager;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.ParcelUuid;
@@ -150,6 +151,22 @@ public class SubscriptionManager {
    public static final String CACHE_KEY_SLOT_INDEX_PROPERTY =
            "cache_key.telephony.get_slot_index";

    /** @hide */
    public static final String GET_SIM_SPECIFIC_SETTINGS_METHOD_NAME = "getSimSpecificSettings";

    /** @hide */
    public static final String RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME =
            "restoreSimSpecificSettings";

    /**
     * Key to the backup & restore data byte array in the Bundle that is returned by {@link
     * #getAllSimSpecificSettingsForBackup()} or to be pass in to {@link
     * #restoreAllSimSpecificSettings()}.
     *
     * @hide
     */
    public static final String KEY_SIM_SPECIFIC_SETTINGS_DATA = "KEY_SIM_SPECIFIC_SETTINGS_DATA";

    private static final int MAX_CACHE_SIZE = 4;

    private static class VoidPropertyInvalidatedCache<T>
@@ -372,6 +389,28 @@ public class SubscriptionManager {
    public static final Uri WFC_ROAMING_ENABLED_CONTENT_URI = Uri.withAppendedPath(
            CONTENT_URI, "wfc_roaming_enabled");


    /**
     * A content {@link uri} used to call the appropriate backup or restore method for sim-specific
     * settings
     * <p>
     * See {@link #GET_SIM_SPECIFIC_SETTINGS_METHOD_NAME} and {@link
     * #RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME} for information on what method to call.
     * @hide
     */
    @NonNull
    public static final Uri SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI = Uri.withAppendedPath(
            CONTENT_URI, "backup_and_restore");

    /**
     * A content {@link uri} used to notify contentobservers listening to siminfo restore during
     * SuW.
     * @hide
     */
    @NonNull
    public static final Uri SIM_INFO_SUW_RESTORE_CONTENT_URI = Uri.withAppendedPath(
            SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI, "suw_restore");

    /**
     * A content {@link Uri} used to receive updates on cross sim enabled user setting.
     * <p>
@@ -3455,4 +3494,71 @@ public class SubscriptionManager {
        sSlotIndexCache.clear();
        sPhoneIdCache.clear();
    }

    /**
     * Called to retrieve SIM-specific settings data to be backed up.
     *
     * @return data in byte[] to be backed up.
     *
     * @hide
     */
    @NonNull
    @SystemApi
    @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
    public byte[] getAllSimSpecificSettingsForBackup() {
        Bundle bundle =  mContext.getContentResolver().call(
                SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
                GET_SIM_SPECIFIC_SETTINGS_METHOD_NAME, null, null);
        return bundle.getByteArray(SubscriptionManager.KEY_SIM_SPECIFIC_SETTINGS_DATA);
    }

    /**
     * Called to attempt to restore the backed up sim-specific configs to device for specific sim.
     * This will try to restore the data that was stored internally when {@link
     * #restoreAllSimSpecificSettingsFromBackup(byte[] data)} was called during setup wizard.
     * End result is SimInfoDB is modified to match any backed up configs for the requested
     * inserted sim.
     *
     * <p>
     * The {@link Uri} {@link #SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI} is notified if any SimInfoDB
     * entry is updated as the result of this method call.
     *
     * @param iccId of the sim that a restore is requested for.
     *
     * @hide
     */
    @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
    public void restoreSimSpecificSettingsForIccIdFromBackup(@NonNull String iccId) {
        mContext.getContentResolver().call(
                SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
                RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
                iccId, null);
    }

    /**
     * Called during setup wizard restore flow to attempt to restore the backed up sim-specific
     * configs to device for all existing SIMs in SimInfoDB. Internally, it will store the backup
     * data in an internal file. This file will persist on device for device's lifetime and will be
     * used later on when a SIM is inserted to restore that specific SIM's settings by calling
     * {@link #restoreSimSpecificSettingsForIccIdFromBackup(String iccId)}. End result is
     * SimInfoDB is modified to match any backed up configs for the appropriate inserted SIMs.
     *
     * <p>
     * The {@link Uri} {@link #SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI} is notified if any SimInfoDB
     * entry is updated as the result of this method call.
     *
     * @param data with the sim specific configs to be backed up.
     *
     * @hide
     */
    @SystemApi
    @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
    public void restoreAllSimSpecificSettingsFromBackup(@NonNull byte[] data) {
        Bundle bundle = new Bundle();
        bundle.putByteArray(KEY_SIM_SPECIFIC_SETTINGS_DATA, data);
        mContext.getContentResolver().call(
                SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
                RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
                null, bundle);
    }
}