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

Commit 1e10d29b authored by Sandeep Siddhartha's avatar Sandeep Siddhartha
Browse files

Don't restore device specific preferences

There are two categories of preferences:
1. That are part of the default shared preference
   They were all getting backed up and restored.
   Added a blacklist to not restore some of these.
   e.g. current account

2. That are in a non-default shared preference file.
   These are not getting backed up currently, but added a specific
   local preference file for all such preferences.

Bug: 17288591
Change-Id: I2f748be971a2337543e5014434aa39313fd1e1d8
parent 6e565332
Loading
Loading
Loading
Loading
+29 −2
Original line number Diff line number Diff line
@@ -17,15 +17,42 @@
package com.android.inputmethod.latin;

import android.app.backup.BackupAgentHelper;
import android.app.backup.BackupDataInput;
import android.app.backup.SharedPreferencesBackupHelper;
import android.content.SharedPreferences;
import android.os.ParcelFileDescriptor;

import com.android.inputmethod.latin.settings.LocalSettingsConstants;

import java.io.IOException;

/**
 * Backs up the Latin IME shared preferences.
 * Backup/restore agent for LatinIME.
 * Currently it backs up the default shared preferences.
 */
public final class BackupAgent extends BackupAgentHelper {
    private static final String PREF_SUFFIX = "_preferences";

    @Override
    public void onCreate() {
        addHelper("shared_pref", new SharedPreferencesBackupHelper(this,
                getPackageName() + "_preferences"));
                getPackageName() + PREF_SUFFIX));
    }

    @Override
    public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
            throws IOException {
        // Let the restore operation go through
        super.onRestore(data, appVersionCode, newState);

        // Remove the preferences that we don't want restored.
        final SharedPreferences.Editor prefEditor = getSharedPreferences(
                getPackageName() + PREF_SUFFIX, MODE_PRIVATE).edit();
        final String[] prefsToRemove = LocalSettingsConstants.PREFS_TO_SKIP_RESTORING;
        for (final String key : prefsToRemove) {
            prefEditor.remove(key);
        }
        // Flush the changes to disk.
        prefEditor.commit();
    }
}
+28 −19
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ import android.text.TextUtils;
import android.util.Log;

import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.settings.Settings;
import com.android.inputmethod.latin.settings.LocalSettingsConstants;

/**
 * {@link BroadcastReceiver} for {@link AccountManager#LOGIN_ACCOUNTS_CHANGED_ACTION}.
@@ -41,25 +41,14 @@ public class AccountsChangedReceiver extends BroadcastReceiver {
            return;
        }

        // Ideally the account preference could live in a different preferences file
        // that wasn't being backed up and restored, however the preference fragments
        // currently only deal with the default shared preferences which is why
        // separating this out into a different file is not trivial currently.
        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        final String currentAccount = prefs.getString(Settings.PREF_ACCOUNT_NAME, null);
        if (currentAccount != null) {
            final String[] accounts = getAccountsForLogin(context);
            boolean accountFound = false;
            for (String account : accounts) {
                if (TextUtils.equals(currentAccount, account)) {
                    accountFound = true;
                    break;
                }
            }
            // The current account was not found in the list of accounts, remove it.
            if (!accountFound) {
                Log.i(TAG, "The current account was removed from the system: " + currentAccount);
                prefs.edit()
                        .remove(Settings.PREF_ACCOUNT_NAME)
                        .apply();
            }
        }
        final String currentAccount = prefs.getString(
                LocalSettingsConstants.PREF_ACCOUNT_NAME, null);
        removeUnknownAccountFromPreference(prefs, getAccountsForLogin(context), currentAccount);
    }

    /**
@@ -69,4 +58,24 @@ public class AccountsChangedReceiver extends BroadcastReceiver {
    protected String[] getAccountsForLogin(Context context) {
        return LoginAccountUtils.getAccountsForLogin(context);
    }

    /**
     * Removes the currentAccount from preferences if it's not found
     * in the list of current accounts.
     */
    private static void removeUnknownAccountFromPreference(final SharedPreferences prefs,
            final String[] accounts, final String currentAccount) {
        if (currentAccount == null) {
            return;
        }
        for (final String account : accounts) {
            if (TextUtils.equals(currentAccount, account)) {
                return;
            }
        }
        Log.i(TAG, "The current account was removed from the system: " + currentAccount);
        prefs.edit()
                .remove(LocalSettingsConstants.PREF_ACCOUNT_NAME)
                .apply();
    }
}
+3 −3
Original line number Diff line number Diff line
@@ -167,7 +167,7 @@ public final class AccountsSettingsFragment extends SubScreenFragment {

    @Nullable
    private String getCurrentlySelectedAccount() {
        return getSharedPreferences().getString(Settings.PREF_ACCOUNT_NAME, null);
        return getSharedPreferences().getString(LocalSettingsConstants.PREF_ACCOUNT_NAME, null);
    }

    /**
@@ -219,7 +219,7 @@ public final class AccountsSettingsFragment extends SubScreenFragment {
            final Object selectedItem = lv.getItemAtPosition(lv.getCheckedItemPosition());
            getSharedPreferences()
                    .edit()
                    .putString(Settings.PREF_ACCOUNT_NAME, (String) selectedItem)
                    .putString(LocalSettingsConstants.PREF_ACCOUNT_NAME, (String) selectedItem)
                    .apply();
        }
    }
@@ -233,7 +233,7 @@ public final class AccountsSettingsFragment extends SubScreenFragment {
        public void onClick(DialogInterface dialog, int which) {
            getSharedPreferences()
                    .edit()
                    .remove(Settings.PREF_ACCOUNT_NAME)
                    .remove(LocalSettingsConstants.PREF_ACCOUNT_NAME)
                    .apply();
        }
    }
+41 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.inputmethod.latin.settings;

/**
 * Collection of device specific preference constants.
 */
public class LocalSettingsConstants {
    // Preference file for storing preferences that are tied to a device
    // and are not backed up.
    public static final String PREFS_FILE = "local_prefs";

    // Preference key for the current account.
    // Do not restore.
    public static final String PREF_ACCOUNT_NAME = "pref_account_name";

    // List of preference keys to skip from being restored by backup agent.
    // These preferences are tied to a device and hence should not be restored.
    // e.g. account name.
    // Ideally they could have been kept in a separate file that wasn't backed up
    // however the preference UI currently only deals with the default
    // shared preferences which makes it non-trivial to move these out to
    // a different shared preferences file.
    public static final String[] PREFS_TO_SKIP_RESTORING = new String[] {
        PREF_ACCOUNT_NAME
    };
}
+0 −2
Original line number Diff line number Diff line
@@ -106,8 +106,6 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
    public static final String PREF_KEY_IS_INTERNAL = "pref_key_is_internal";

    public static final String PREF_ENABLE_METRICS_LOGGING = "pref_enable_metrics_logging";
    public static final String PREF_ACCOUNT_NAME = "pref_account_name";

    // This preference key is deprecated. Use {@link #PREF_SHOW_LANGUAGE_SWITCH_KEY} instead.
    // This is being used only for the backward compatibility.
    private static final String PREF_SUPPRESS_LANGUAGE_SWITCH_KEY =
Loading