Loading core/api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +43 −15 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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[] = { Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -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(); Loading Loading @@ -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 { Loading telephony/java/android/telephony/SubscriptionManager.java +106 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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> Loading Loading @@ -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> Loading Loading @@ -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); } } Loading
core/api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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);
packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +43 −15 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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[] = { Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -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(); Loading Loading @@ -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 { Loading
telephony/java/android/telephony/SubscriptionManager.java +106 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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> Loading Loading @@ -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> Loading Loading @@ -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); } }