barbarossa-ab barbarossa-ab - 1 month ago 5
Android Question

change default preference on upgrade

In my app, I have the following code that tells me if a feature is enabled by default :

public boolean getFeatureEnabled()
return mPrefs.getBoolean("FEATURE_ENABLED", DEFAULT_ENABLED);

This preference is overwritten only when the user changes the setting from UI. So by default it draws its value from
which is a class variable somewhere.

In the current version,
but on the next version of my app will be

The problem is that after the update, with the above code the old users who did not change the default setting from UI will have their feature disable - and I want to avoid this.

Any advices on how to handle this ?


As I understand, you have a feature that was enabled by default but this default was never written to SharedPreferences unless explicitly changed by the user. Now you want the feature to be disabled by default but without affecting the behavior for users that already have it enabled.

I can think of 3 options:

Option 1 If you are already saving the last version, you could check that in your migration logic:

private void migratePreferences(Context context) {

    SharedPreferences prefs = context.getSharedPreferences("your_preference_file", MODE_PRIVATE);

    int lastKnownVersionCode = (prefs.getInt("LAST_INSTALLED_VERSION", BuildConfig.VERSION_CODE);
    prefs.edit().putInt("LAST_INSTALLED_VERSION", BuildConfig.VERSION_CODE).apply();

    //this is the old featureEnabled check
    boolean oldPreferenceValue = prefs.getBoolean("FEATURE_ENABLED", true);

    boolean newPreferenceValue;
    if (prefs.contains("FEATURE_ENABLED")) {
        //the feature was modified by the user so respect their preference
        newPreferenceValue = prefs.getBoolean("FEATURE_ENABLED", false);
    } else if (lastKnownVersionCode == BUGGY_VERSION_WITH_FEATURE_ENABLED_BY_DEFAULT) {
        //the user is updating from the buggy version.
        // this check could include a range of versions if you've released several buggy versions.
        // this is also where option 2 would be inserted
        newPreferenceValue = oldPreferenceValue;
    } else {
        //the new default that will apply to fresh installs
        newPreferenceValue = false;

    //save the preference
    prefs.edit().putBoolean("FEATURE_ENABLED", newPreferenceValue).apply();

This, however depends on your already having a call to this method somewhere in your app startup code.

Option 2 In case you don't, there is still hope. You can check if this is your first install using the answers given in this StackOverflow answer

Option 3 You can release an intermediate version of your app that behaves as it does now but saves the unsaved default setting in SharedPreferences. This will keep the feature AS IS for your eager users but you will have to wait until a significant portion of users updates before releasing the desired behavior.