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

Commit 8dd8237f authored by Daniel Perez's avatar Daniel Perez Committed by Android (Google) Code Review
Browse files

Merge changes Ie717f5b5,I37882dde,I09c62595 into main

* changes:
  Add Backup & Restore Metrics for Wifi settings.
  Add Backup & Restore Metrics for Network Policies settings.
  Add Backup & Restore Metrics for Sim settings.
parents d1c1c260 a7e83246
Loading
Loading
Loading
Loading
+94 −5
Original line number Diff line number Diff line
@@ -214,6 +214,17 @@ public class SettingsBackupAgent extends BackupAgentHelper {
        "failed_to_restore_softap_config";
    private static final String ERROR_FAILED_TO_RESTORE_WIFI_CONFIG =
        "failed_to_restore_wifi_config";
    private static final String ERROR_FAILED_TO_RESTORE_SIM_SPECIFIC_SETTINGS =
        "failed_to_restore_sim_specific_settings";
    private static final String ERROR_FAILED_TO_CONVERT_NETWORK_POLICIES =
        "failed_to_convert_network_policies";
    private static final String ERROR_UNKNOWN_BACKUP_SERIALIZATION_VERSION =
        "unknown_backup_serialization_version";
    private static final String INTERRUPTED_EXCEPTION = "interrupted_exception";
    private static final String ERROR_FAILED_TO_RETRIEVE_WIFI_SETTINGS_BACKUP_DATA =
        "failed_to_retrieve_wifi_settings_backup_data";
    private static final String ERROR_FAILED_TO_RESTORE_WIFI_SETTINGS_BACKUP_DATA =
        "failed_to_restore_wifi_settings_backup_data";


    // Name of the temporary file we use during full backup/restore.  This is
@@ -1436,6 +1447,7 @@ public class SettingsBackupAgent extends BackupAgentHelper {
            try {
                out.writeInt(NETWORK_POLICIES_BACKUP_VERSION);
                out.writeInt(policies.length);
                int numberOfPoliciesBackedUp = 0;
                for (NetworkPolicy policy : policies) {
                    // We purposefully only backup policies that the user has
                    // defined; any inferred policies might include
@@ -1445,13 +1457,25 @@ public class SettingsBackupAgent extends BackupAgentHelper {
                        out.writeByte(BackupUtils.NOT_NULL);
                        out.writeInt(marshaledPolicy.length);
                        out.write(marshaledPolicy);
                        if (areAgentMetricsEnabled) {
                            numberOfPoliciesBackedUp++;
                        }
                    } else {
                        out.writeByte(BackupUtils.NULL);
                    }
                }
                if (areAgentMetricsEnabled) {
                    numberOfSettingsPerKey.put(KEY_NETWORK_POLICIES, numberOfPoliciesBackedUp);
                }
            } catch (IOException ioe) {
                Log.e(TAG, "Failed to convert NetworkPolicies to byte array " + ioe.getMessage());
                baos.reset();
                if (areAgentMetricsEnabled) {
                    mBackupRestoreEventLogger.logItemsBackupFailed(
                        KEY_NETWORK_POLICIES,
                        policies.length,
                        ERROR_FAILED_TO_CONVERT_NETWORK_POLICIES);
                }
            }
        }
        return baos.toByteArray();
@@ -1502,6 +1526,12 @@ public class SettingsBackupAgent extends BackupAgentHelper {
            try {
                int version = in.readInt();
                if (version < 1 || version > NETWORK_POLICIES_BACKUP_VERSION) {
                    if (areAgentMetricsEnabled) {
                        mBackupRestoreEventLogger.logItemsRestoreFailed(
                            KEY_NETWORK_POLICIES,
                            /* count= */ 1,
                            ERROR_UNKNOWN_BACKUP_SERIALIZATION_VERSION);
                    }
                    throw new BackupUtils.BadVersionException(
                            "Unknown Backup Serialization Version");
                }
@@ -1518,10 +1548,20 @@ public class SettingsBackupAgent extends BackupAgentHelper {
                }
                // Only set the policies if there was no error in the restore operation
                networkPolicyManager.setNetworkPolicies(policies);
                if (areAgentMetricsEnabled) {
                    mBackupRestoreEventLogger
                        .logItemsRestored(KEY_NETWORK_POLICIES, policies.length);
                }
            } catch (NullPointerException | IOException | BackupUtils.BadVersionException
                    | DateTimeException e) {
                // NPE can be thrown when trying to instantiate a NetworkPolicy
                Log.e(TAG, "Failed to convert byte array to NetworkPolicies " + e.getMessage());
                if (areAgentMetricsEnabled) {
                    mBackupRestoreEventLogger.logItemsRestoreFailed(
                        KEY_NETWORK_POLICIES,
                        /* count= */ 1,
                        ERROR_FAILED_TO_CONVERT_NETWORK_POLICIES);
                }
            }
        }
    }
@@ -1592,7 +1632,8 @@ public class SettingsBackupAgent extends BackupAgentHelper {
        return true;
    }

    private byte[] getSimSpecificSettingsData() {
    @VisibleForTesting
    byte[] getSimSpecificSettingsData() {
        byte[] simSpecificData = new byte[0];
        PackageManager packageManager = getBaseContext().getPackageManager();
        if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
@@ -1600,19 +1641,38 @@ public class SettingsBackupAgent extends BackupAgentHelper {
            simSpecificData = subManager.getAllSimSpecificSettingsForBackup();
            Log.i(TAG, "sim specific data of length + " + simSpecificData.length
                + " successfully retrieved");
            if (areAgentMetricsEnabled) {
                // We're unable to determine how many settings this includes, so we'll just log 1.
                numberOfSettingsPerKey.put(KEY_SIM_SPECIFIC_SETTINGS_2, 1);
            }
        }

        return simSpecificData;
    }

    private void restoreSimSpecificSettings(byte[] data) {
    @VisibleForTesting
    void restoreSimSpecificSettings(byte[] data) {
        PackageManager packageManager = getBaseContext().getPackageManager();
        boolean hasTelephony = packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
        if (hasTelephony) {
            SubscriptionManager subManager = SubscriptionManager.from(getBaseContext());
            if (areAgentMetricsEnabled) {
                try {
                    subManager.restoreAllSimSpecificSettingsFromBackup(data);
                    mBackupRestoreEventLogger
                        .logItemsRestored(KEY_SIM_SPECIFIC_SETTINGS_2, /* count= */ 1);
                } catch (Exception e) {
                    mBackupRestoreEventLogger
                        .logItemsRestoreFailed(
                            KEY_SIM_SPECIFIC_SETTINGS_2,
                            /* count= */ 1,
                            ERROR_FAILED_TO_RESTORE_SIM_SPECIFIC_SETTINGS);
                }
            } else {
                subManager.restoreAllSimSpecificSettingsFromBackup(data);
            }
        }
    }

    private static final class Mutable<E> {
        public volatile E value;
@@ -1637,21 +1697,50 @@ public class SettingsBackupAgent extends BackupAgentHelper {
                    });
            // cts requires B&R with 10 seconds
            if (latch.await(10, TimeUnit.SECONDS) && backupWifiData.value != null) {
                if (areAgentMetricsEnabled) {
                    numberOfSettingsPerKey.put(KEY_WIFI_SETTINGS_BACKUP_DATA, 1);
                }
                return backupWifiData.value;
            }
        } catch (InterruptedException ie) {
            Log.e(TAG, "fail to retrieveWifiBackupData, " + ie);
            if (areAgentMetricsEnabled) {
                mBackupRestoreEventLogger.logItemsBackupFailed(
                    KEY_WIFI_SETTINGS_BACKUP_DATA,
                    /* count= */ 1,
                    INTERRUPTED_EXCEPTION);
            }
        }
        Log.e(TAG, "fail to retrieveWifiBackupData");
        if (areAgentMetricsEnabled) {
            mBackupRestoreEventLogger.logItemsBackupFailed(
                KEY_WIFI_SETTINGS_BACKUP_DATA,
                /* count= */ 1,
                ERROR_FAILED_TO_RETRIEVE_WIFI_SETTINGS_BACKUP_DATA);
        }
        return new byte[0];
    }

    private void restoreWifiData(byte[] data) {
    @VisibleForTesting
    void restoreWifiData(byte[] data) {
        if (DEBUG_BACKUP) {
            Log.v(TAG, "Applying restored all wifi data");
        }
        if (areAgentMetricsEnabled) {
            try {
                mWifiManager.restoreWifiBackupData(data);
                mBackupRestoreEventLogger.logItemsRestored(
                    KEY_WIFI_SETTINGS_BACKUP_DATA, /* count= */ 1);
            } catch (Exception e) {
                mBackupRestoreEventLogger.logItemsRestoreFailed(
                    KEY_WIFI_SETTINGS_BACKUP_DATA,
                    /* count= */ 1,
                    ERROR_FAILED_TO_RESTORE_WIFI_SETTINGS_BACKUP_DATA);
            }
        } else {
            mWifiManager.restoreWifiBackupData(data);
        }
    }

    private void updateWindowManagerIfNeeded(Integer previousDensity) {
        int newDensity;
+115 −3
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.providers.settings;

import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_WIFI_NEW_CONFIG;
import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_SOFTAP_CONFIG;
import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_SIM_SPECIFIC_SETTINGS_2;
import static com.android.providers.settings.SettingsBackupRestoreKeys.KEY_WIFI_SETTINGS_BACKUP_DATA;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
@@ -59,6 +61,7 @@ import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.provider.settings.validators.SettingsValidators;
import android.provider.settings.validators.Validator;
import android.telephony.SubscriptionManager;
import android.test.mock.MockContentProvider;
import android.test.mock.MockContentResolver;

@@ -136,6 +139,7 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest {
    @Mock private BackupDataInput mBackupDataInput;
    @Mock private BackupDataOutput mBackupDataOutput;
    @Mock private static WifiManager mWifiManager;
    @Mock private static SubscriptionManager mSubscriptionManager;

    private TestFriendlySettingsBackupAgent mAgentUnderTest;
    private Context mContext;
@@ -906,6 +910,110 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest {
        assertNull(getLoggingResultForDatatype(KEY_WIFI_NEW_CONFIG, mAgentUnderTest));
    }

    @Test
    @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS)
    public void
        getSimSpecificSettingsData_agentMetricsAreEnabled_numberOfSettingsInKeyAreRecorded() {
        mAgentUnderTest.onCreate(
            UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.BACKUP);
        when(mSubscriptionManager.getAllSimSpecificSettingsForBackup()).thenReturn(new byte[0]);

        mAgentUnderTest.getSimSpecificSettingsData();

        assertEquals(mAgentUnderTest.getNumberOfSettingsPerKey(KEY_SIM_SPECIFIC_SETTINGS_2), 1);
    }

    @Test
    @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS)
    public void
        restoreSimSpecificSettings_agentMetricsAreEnabled_restoreIsSuccessful_successMetricsAreLogged() {
        mAgentUnderTest.onCreate(
            UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE);
        doNothing().when(mSubscriptionManager).restoreAllSimSpecificSettingsFromBackup(any());

        mAgentUnderTest.restoreSimSpecificSettings(new byte[0]);

        DataTypeResult loggingResult =
            getLoggingResultForDatatype(KEY_SIM_SPECIFIC_SETTINGS_2, mAgentUnderTest);
        assertNotNull(loggingResult);
        assertEquals(loggingResult.getSuccessCount(), 1);
    }

    @Test
    @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS)
    public void
        restoreSimSpecificSettings_agentMetricsAreEnabled_restoreIsNotSuccessful_failureMetricsAreLogged() {
        mAgentUnderTest.onCreate(
            UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE);
        doThrow(new RuntimeException())
            .when(mSubscriptionManager)
            .restoreAllSimSpecificSettingsFromBackup(any());

        mAgentUnderTest.restoreSimSpecificSettings(new byte[0]);

        DataTypeResult loggingResult =
            getLoggingResultForDatatype(KEY_SIM_SPECIFIC_SETTINGS_2, mAgentUnderTest);
        assertNotNull(loggingResult);
        assertEquals(loggingResult.getFailCount(), 1);
    }

    @Test
    @DisableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS)
    public void
        restoreSimSpecificSettings_agentMetricsAreNotEnabled_metricsAreNotLogged() {
        mAgentUnderTest.onCreate(
            UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE);
        doNothing().when(mSubscriptionManager).restoreAllSimSpecificSettingsFromBackup(any());

        mAgentUnderTest.restoreSimSpecificSettings(new byte[0]);

        assertNull(getLoggingResultForDatatype(KEY_SIM_SPECIFIC_SETTINGS_2, mAgentUnderTest));
    }

    @Test
    @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS)
    public void
        restoreWifiData_agentMetricsAreEnabled_restoreIsSuccessful_successMetricsAreLogged() {
        mAgentUnderTest.onCreate(
            UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE);
        doNothing().when(mWifiManager).restoreWifiBackupData(any());

        mAgentUnderTest.restoreWifiData(new byte[0]);

        DataTypeResult loggingResult =
            getLoggingResultForDatatype(KEY_WIFI_SETTINGS_BACKUP_DATA, mAgentUnderTest);
        assertNotNull(loggingResult);
        assertEquals(loggingResult.getSuccessCount(), 1);
    }

    @Test
    @EnableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS)
    public void
        restoreWifiData_agentMetricsAreEnabled_restoreIsNotSuccessful_failureMetricsAreLogged() {
        mAgentUnderTest.onCreate(
            UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE);
        doThrow(new RuntimeException()).when(mWifiManager).restoreWifiBackupData(any());

        mAgentUnderTest.restoreWifiData(new byte[0]);

        DataTypeResult loggingResult =
            getLoggingResultForDatatype(KEY_WIFI_SETTINGS_BACKUP_DATA, mAgentUnderTest);
        assertNotNull(loggingResult);
        assertEquals(loggingResult.getFailCount(), 1);
    }

    @Test
    @DisableFlags(com.android.server.backup.Flags.FLAG_ENABLE_METRICS_SETTINGS_BACKUP_AGENTS)
    public void restoreWifiData_agentMetricsAreDisabled_metricsAreNotLogged() {
        mAgentUnderTest.onCreate(
            UserHandle.SYSTEM, BackupDestination.CLOUD, OperationType.RESTORE);
        doNothing().when(mWifiManager).restoreWifiBackupData(any());

        mAgentUnderTest.restoreWifiData(new byte[0]);

        assertNull(getLoggingResultForDatatype(KEY_WIFI_SETTINGS_BACKUP_DATA, mAgentUnderTest));
    }

    private byte[] generateBackupData(Map<String, String> keyValueData) {
        int totalBytes = 0;
        for (String key : keyValueData.keySet()) {
@@ -1106,12 +1214,16 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest {

        @Override
        public Object getSystemService(String name) {
            if (name.equals(Context.WIFI_SERVICE)) {
            switch (name) {
                case Context.WIFI_SERVICE:
                    return mWifiManager;
            }
                case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
                    return mSubscriptionManager;
                default:
                    return super.getSystemService(name);
            }
        }
    }

    /** ContentProvider which returns a set of known test values. */
    private static class DeviceSpecificInfoMockContentProvider extends MockContentProvider {