12307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger/*
22307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * Copyright (C) 2014 The Android Open Source Project
32307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger *
42307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * Licensed under the Apache License, Version 2.0 (the "License");
52307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * you may not use this file except in compliance with the License.
62307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * You may obtain a copy of the License at
72307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger *
82307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger *      http://www.apache.org/licenses/LICENSE-2.0
92307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger *
102307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * Unless required by applicable law or agreed to in writing, software
112307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * distributed under the License is distributed on an "AS IS" BASIS,
122307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * See the License for the specific language governing permissions and
142307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * limitations under the License.
152307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger */
162307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
172307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerpackage com.android.camera.settings;
182307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
192307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerimport android.content.Context;
202307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerimport android.content.SharedPreferences;
212307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
222307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerimport com.android.camera.app.AppController;
232307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerimport com.android.camera.app.ModuleManagerImpl;
242307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerimport com.android.camera.debug.Log;
2524aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberlingimport com.android.camera.util.ApiHelper;
262272f8a6bfc8adca8ada7a215bef038d45256085Senpo Huimport com.android.camera.util.Size;
272307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerimport com.android.camera2.R;
282307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerimport com.android.ex.camera2.portability.CameraAgentFactory;
292307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerimport com.android.ex.camera2.portability.CameraDeviceInfo;
302307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
312307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerimport java.util.List;
322307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerimport java.util.Map;
332307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
342307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger/**
352307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * Defines the general upgrade path for the app. Modules may define specific
362307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * upgrade logic, but upgrading for preferences across modules, CameraActivity
372307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger * or application-wide can be added here.
382307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger */
392307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newbergerpublic class AppUpgrader extends SettingsUpgrader {
402307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private static final Log.Tag TAG = new Log.Tag("AppUpgrader");
412307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
422307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private static final String OLD_CAMERA_PREFERENCES_PREFIX = "_preferences_";
432307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private static final String OLD_MODULE_PREFERENCES_PREFIX = "_preferences_module_";
442307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private static final String OLD_GLOBAL_PREFERENCES_FILENAME = "_preferences_camera";
456293c579bce8356f10cda31637917537a4501437Alan Newberger    private static final String OLD_KEY_UPGRADE_VERSION = "pref_strict_upgrade_version";
462307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
472307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
482307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * With this version everyone was forced to choose their location settings
492307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * again.
502307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
512307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private static final int FORCE_LOCATION_CHOICE_VERSION = 2;
522307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
532307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
542307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * With this version, the camera size setting changed from a "small",
552307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * "medium" and "default" to strings representing the actual resolutions,
562307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * i.e. "1080x1776".
572307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
582307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private static final int CAMERA_SIZE_SETTING_UPGRADE_VERSION = 3;
592307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
602307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
612307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * With this version, the names of the files storing camera specific and
622307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * module specific settings changed.
635381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger     * <p>
645381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger     * NOTE: changed this from 4 to 6 to re-run on latest Glacier upgrade.
655381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger     * Initial upgraders to Glacier will run conversion once as of the change.
665381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger     * When re-run for early dogfooders, values will get overwritten but will
675381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger     * all work.
682307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
695381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger    private static final int CAMERA_MODULE_SETTINGS_FILES_RENAMED_VERSION = 6;
702307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
712307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
722307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * With this version, timelapse mode was removed and mode indices need to be
732307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * resequenced.
742307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
752307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private static final int CAMERA_SETTINGS_SELECTED_MODULE_INDEX = 5;
762307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
772307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
786293c579bce8356f10cda31637917537a4501437Alan Newberger     * With this version internal storage is changed to use only Strings, and
796293c579bce8356f10cda31637917537a4501437Alan Newberger     * a type conversion process should execute.
806293c579bce8356f10cda31637917537a4501437Alan Newberger     */
816293c579bce8356f10cda31637917537a4501437Alan Newberger    private static final int CAMERA_SETTINGS_STRINGS_UPGRADE = 5;
826293c579bce8356f10cda31637917537a4501437Alan Newberger
836293c579bce8356f10cda31637917537a4501437Alan Newberger    /**
8424aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     * With this version we needed to convert the artificial 16:9 high
8524aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     * resolution size on the N5 since we stored it with a swapped width/height.
8624aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     */
8724aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling    public static final int NEEDS_N5_16by9_RESOLUTION_SWAP = 7;
8824aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling    /**
892307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * Increment this value whenever new AOSP UpgradeSteps need to be executed.
902307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
9124aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling    public static final int APP_UPGRADE_VERSION = 7;
922307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
932307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private final AppController mAppController;
942307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
952307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    public AppUpgrader(final AppController appController) {
962307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        super(Keys.KEY_UPGRADE_VERSION, APP_UPGRADE_VERSION);
972307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        mAppController = appController;
982307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    }
992307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
1002307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    @Override
1012307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    protected int getLastVersion(SettingsManager settingsManager) {
1026293c579bce8356f10cda31637917537a4501437Alan Newberger        // Prior upgrade versions were stored in the default preferences as int
1036293c579bce8356f10cda31637917537a4501437Alan Newberger        // and String. We create a new version location for migration to String.
1046293c579bce8356f10cda31637917537a4501437Alan Newberger        // If we don't have a version persisted in the new location, check for
1056293c579bce8356f10cda31637917537a4501437Alan Newberger        // the prior value from the old location. We expect the old value to be
1066293c579bce8356f10cda31637917537a4501437Alan Newberger        // processed during {@link #upgradeTypesToStrings}.
1076293c579bce8356f10cda31637917537a4501437Alan Newberger        SharedPreferences defaultPreferences = settingsManager.getDefaultPreferences();
1086293c579bce8356f10cda31637917537a4501437Alan Newberger        if (defaultPreferences.contains(OLD_KEY_UPGRADE_VERSION)) {
1096293c579bce8356f10cda31637917537a4501437Alan Newberger            Map<String, ?> allPrefs = defaultPreferences.getAll();
1106293c579bce8356f10cda31637917537a4501437Alan Newberger            Object oldVersion = allPrefs.get(OLD_KEY_UPGRADE_VERSION);
1116293c579bce8356f10cda31637917537a4501437Alan Newberger            defaultPreferences.edit().remove(OLD_KEY_UPGRADE_VERSION).apply();
1126293c579bce8356f10cda31637917537a4501437Alan Newberger            if (oldVersion instanceof Integer) {
1136293c579bce8356f10cda31637917537a4501437Alan Newberger                return (Integer) oldVersion;
1146293c579bce8356f10cda31637917537a4501437Alan Newberger            } else if (oldVersion instanceof String) {
1156293c579bce8356f10cda31637917537a4501437Alan Newberger                return SettingsManager.convertToInt((String) oldVersion);
1166293c579bce8356f10cda31637917537a4501437Alan Newberger            }
1172307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
1186293c579bce8356f10cda31637917537a4501437Alan Newberger        return super.getLastVersion(settingsManager);
1192307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    }
1202307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
1212307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    @Override
1222307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    public void upgrade(SettingsManager settingsManager, int lastVersion, int currentVersion) {
1232307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        Context context = mAppController.getAndroidContext();
1242307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
1256293c579bce8356f10cda31637917537a4501437Alan Newberger        // Do strings upgrade first before 'earlier' upgrades, since they assume
1266293c579bce8356f10cda31637917537a4501437Alan Newberger        // valid storage of values.
1276293c579bce8356f10cda31637917537a4501437Alan Newberger        if (lastVersion < CAMERA_SETTINGS_STRINGS_UPGRADE) {
1286293c579bce8356f10cda31637917537a4501437Alan Newberger            upgradeTypesToStrings(settingsManager);
1296293c579bce8356f10cda31637917537a4501437Alan Newberger        }
1306293c579bce8356f10cda31637917537a4501437Alan Newberger
1312307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (lastVersion < FORCE_LOCATION_CHOICE_VERSION) {
1322307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            forceLocationChoice(settingsManager);
1332307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
1342307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
1352307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (lastVersion < CAMERA_SIZE_SETTING_UPGRADE_VERSION) {
1362307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            CameraDeviceInfo infos = CameraAgentFactory
13744ce4b26614f85518d548a6750c7a08908ae3596Sol Boucher                    .getAndroidCameraAgent(context, CameraAgentFactory.CameraApi.API_1)
13844ce4b26614f85518d548a6750c7a08908ae3596Sol Boucher                    .getCameraDeviceInfo();
1392307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            upgradeCameraSizeSetting(settingsManager, context, infos,
1402307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    SettingsUtil.CAMERA_FACING_FRONT);
1412307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            upgradeCameraSizeSetting(settingsManager, context, infos,
1422307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    SettingsUtil.CAMERA_FACING_BACK);
143a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            // We changed size handling and aspect ratio placement, put user
144a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            // back into Camera mode this time to ensure they see the ratio
145a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            // chooser if applicable.
146a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            settingsManager.remove(SettingsManager.SCOPE_GLOBAL,
147a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger                    Keys.KEY_STARTUP_MODULE_INDEX);
1482307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
1492307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
1502307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (lastVersion < CAMERA_MODULE_SETTINGS_FILES_RENAMED_VERSION) {
1512307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            upgradeCameraSettingsFiles(settingsManager, context);
1522307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            upgradeModuleSettingsFiles(settingsManager, context,
1532307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    mAppController);
1542307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
1552307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
1562307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (lastVersion < CAMERA_SETTINGS_SELECTED_MODULE_INDEX) {
1572307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            upgradeSelectedModeIndex(settingsManager, context);
1582307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
15924aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling
16024aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling        if (lastVersion < NEEDS_N5_16by9_RESOLUTION_SWAP) {
16124aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling            updateN516by9ResolutionIfNeeded(settingsManager);
16224aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling        }
1632307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    }
1642307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
1652307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
1662307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * Converts settings that were stored in SharedPreferences as non-Strings,
1672307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * to Strings. This is necessary due to a SettingsManager API refactoring.
1682307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * Should only be executed if we detected a change in
1692307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * Keys.KEY_UPGRADE_VERSION type from int to string; rerunning this on
1702307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * string values will result in ClassCastExceptions when trying to retrieve
1712307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * an int or boolean as a String.
1722307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
1732307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private void upgradeTypesToStrings(SettingsManager settingsManager) {
1742307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        SharedPreferences defaultPreferences = settingsManager.getDefaultPreferences();
1752307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        SharedPreferences oldGlobalPreferences =
1762307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                settingsManager.openPreferences(OLD_GLOBAL_PREFERENCES_FILENAME);
1772307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
1782307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // Location: boolean -> String, from default.
1792307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (defaultPreferences.contains(Keys.KEY_RECORD_LOCATION)) {
1802307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            boolean location = removeBoolean(defaultPreferences, Keys.KEY_RECORD_LOCATION);
1812307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_RECORD_LOCATION, location);
1822307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
1832307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
1842307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // User selected aspect ratio: boolean -> String, from default.
1852307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (defaultPreferences.contains(Keys.KEY_USER_SELECTED_ASPECT_RATIO)) {
1862307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            boolean userSelectedAspectRatio = removeBoolean(defaultPreferences,
1872307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_USER_SELECTED_ASPECT_RATIO);
1882307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_USER_SELECTED_ASPECT_RATIO,
1892307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    userSelectedAspectRatio);
1902307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
1912307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
1922307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // Manual exposure compensation: boolean -> String, from default.
1932307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (defaultPreferences.contains(Keys.KEY_EXPOSURE_COMPENSATION_ENABLED)) {
1942307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            boolean manualExposureCompensationEnabled = removeBoolean(defaultPreferences,
1952307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_EXPOSURE_COMPENSATION_ENABLED);
1962307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            settingsManager.set(SettingsManager.SCOPE_GLOBAL,
1972307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_EXPOSURE_COMPENSATION_ENABLED, manualExposureCompensationEnabled);
1982307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
1992307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
2002307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // Hint: boolean -> String, from default.
2012307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (defaultPreferences.contains(Keys.KEY_CAMERA_FIRST_USE_HINT_SHOWN)) {
2022307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            boolean hint = removeBoolean(defaultPreferences, Keys.KEY_CAMERA_FIRST_USE_HINT_SHOWN);
2032307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_CAMERA_FIRST_USE_HINT_SHOWN,
2042307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    hint);
2052307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
2062307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
2072307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // Startup module index: Integer -> String, from default.
2082307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (defaultPreferences.contains(Keys.KEY_STARTUP_MODULE_INDEX)) {
2092307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            int startupModuleIndex = removeInteger(defaultPreferences,
2102307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_STARTUP_MODULE_INDEX);
2112307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_STARTUP_MODULE_INDEX,
2122307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    startupModuleIndex);
2132307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
2142307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
2152307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // Last camera used module index: Integer -> String, from default.
2162307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (defaultPreferences.contains(Keys.KEY_CAMERA_MODULE_LAST_USED)) {
2172307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            int lastCameraUsedModuleIndex = removeInteger(defaultPreferences,
2182307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_CAMERA_MODULE_LAST_USED);
2192307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_CAMERA_MODULE_LAST_USED,
2202307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    lastCameraUsedModuleIndex);
2212307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
2222307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
2232307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // Flash supported back camera setting: boolean -> String, from old
2242307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // global.
2252307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (oldGlobalPreferences.contains(Keys.KEY_FLASH_SUPPORTED_BACK_CAMERA)) {
2262307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            boolean flashSupportedBackCamera = removeBoolean(oldGlobalPreferences,
2272307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_FLASH_SUPPORTED_BACK_CAMERA);
2282307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            if (flashSupportedBackCamera) {
2292307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                settingsManager.set(SettingsManager.SCOPE_GLOBAL,
2302307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                        Keys.KEY_FLASH_SUPPORTED_BACK_CAMERA, flashSupportedBackCamera);
2312307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            }
2322307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
2332307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
2342307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // Should show refocus viewer cling: boolean -> String, from default.
2352307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (defaultPreferences.contains(Keys.KEY_SHOULD_SHOW_REFOCUS_VIEWER_CLING)) {
2362307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            boolean shouldShowRefocusViewer = removeBoolean(defaultPreferences,
2372307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_SHOULD_SHOW_REFOCUS_VIEWER_CLING);
2382307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            settingsManager.set(SettingsManager.SCOPE_GLOBAL,
2392307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_SHOULD_SHOW_REFOCUS_VIEWER_CLING, shouldShowRefocusViewer);
2402307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
2412307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
2422307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // Should show settings button cling: boolean -> String, from default.
2432307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (defaultPreferences.contains(Keys.KEY_SHOULD_SHOW_SETTINGS_BUTTON_CLING)) {
2442307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            boolean shouldShowSettingsButtonCling = removeBoolean(defaultPreferences,
2452307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_SHOULD_SHOW_SETTINGS_BUTTON_CLING);
2462307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            settingsManager.set(SettingsManager.SCOPE_GLOBAL,
2472307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_SHOULD_SHOW_SETTINGS_BUTTON_CLING, shouldShowSettingsButtonCling);
2482307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
249a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger
250a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        // HDR plus on setting: String on/off -> String, from old global.
251a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        if (oldGlobalPreferences.contains(Keys.KEY_CAMERA_HDR_PLUS)) {
252a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            String hdrPlus = removeString(oldGlobalPreferences, Keys.KEY_CAMERA_HDR_PLUS);
253a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            if (OLD_SETTINGS_VALUE_ON.equals(hdrPlus)) {
254a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger                settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_CAMERA_HDR_PLUS, true);
255a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            }
256a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        }
257a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger
258a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        // HDR on setting: String on/off -> String, from old global.
259a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        if (oldGlobalPreferences.contains(Keys.KEY_CAMERA_HDR)) {
260a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            String hdrPlus = removeString(oldGlobalPreferences, Keys.KEY_CAMERA_HDR);
261a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            if (OLD_SETTINGS_VALUE_ON.equals(hdrPlus)) {
262a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger                settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_CAMERA_HDR, true);
263a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            }
264a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        }
265a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger
266a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        // Grid on setting: String on/off -> String, from old global.
267a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        if (oldGlobalPreferences.contains(Keys.KEY_CAMERA_GRID_LINES)) {
268a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            String hdrPlus = removeString(oldGlobalPreferences, Keys.KEY_CAMERA_GRID_LINES);
269a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            if (OLD_SETTINGS_VALUE_ON.equals(hdrPlus)) {
270a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger                settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_CAMERA_GRID_LINES,
271a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger                        true);
272a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            }
273a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        }
2742307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    }
2752307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
2762307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
2772307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * Part of the AOSP upgrade path, forces the user to choose their location
2782307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * again if it was originally set to false.
2792307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
2802307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private void forceLocationChoice(SettingsManager settingsManager) {
281a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        SharedPreferences oldGlobalPreferences =
282a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger                settingsManager.openPreferences(OLD_GLOBAL_PREFERENCES_FILENAME);
283a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger       // Show the location dialog on upgrade if
2842307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // (a) the user has never set this option (status quo).
2852307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        // (b) the user opt'ed out previously.
2862307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (settingsManager.isSet(SettingsManager.SCOPE_GLOBAL,
2872307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                Keys.KEY_RECORD_LOCATION)) {
2882307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            // Location is set in the source file defined for this setting.
2892307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            // Remove the setting if the value is false to launch the dialog.
2902307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            if (!settingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
2912307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    Keys.KEY_RECORD_LOCATION)) {
2922307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                settingsManager.remove(SettingsManager.SCOPE_GLOBAL, Keys.KEY_RECORD_LOCATION);
2932307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            }
294a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger        } else if (oldGlobalPreferences.contains(Keys.KEY_RECORD_LOCATION)) {
295a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            // Location is not set, check to see if we're upgrading from
296a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            // a different source file.
297a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            String location = removeString(oldGlobalPreferences, Keys.KEY_RECORD_LOCATION);
298a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            if (OLD_SETTINGS_VALUE_ON.equals(location)) {
299a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger                    settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_RECORD_LOCATION,
300a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger                            true);
301a830b1aefc9d5f29b512817ac96c68e38a38a13bAlan Newberger            }
3022307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
3032307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    }
3042307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
3052307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
3062307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * Part of the AOSP upgrade path, sets front and back picture sizes.
3072307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
3082307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private void upgradeCameraSizeSetting(SettingsManager settingsManager,
3092307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            Context context, CameraDeviceInfo infos,
3102307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            SettingsUtil.CameraDeviceSelector facing) {
3112307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        String key;
3122307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (facing == SettingsUtil.CAMERA_FACING_FRONT) {
3132307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            key = Keys.KEY_PICTURE_SIZE_FRONT;
3142307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        } else if (facing == SettingsUtil.CAMERA_FACING_BACK) {
3152307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            key = Keys.KEY_PICTURE_SIZE_BACK;
3162307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        } else {
3172307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            Log.w(TAG, "Ignoring attempt to upgrade size of unhandled camera facing direction");
3182307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            return;
3192307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
3202307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
3212040b56b1e0a93b38a558fa56e4b49970bd4b248Alan Newberger        // infos might be null if the underlying camera device is broken. In
3222040b56b1e0a93b38a558fa56e4b49970bd4b248Alan Newberger        // that case, just delete the old settings and force the user to
3232040b56b1e0a93b38a558fa56e4b49970bd4b248Alan Newberger        // reselect, it's the least evil solution given we want to only upgrade
3242040b56b1e0a93b38a558fa56e4b49970bd4b248Alan Newberger        // settings once.
3252040b56b1e0a93b38a558fa56e4b49970bd4b248Alan Newberger        if (infos == null) {
3262040b56b1e0a93b38a558fa56e4b49970bd4b248Alan Newberger            settingsManager.remove(SettingsManager.SCOPE_GLOBAL, key);
3272040b56b1e0a93b38a558fa56e4b49970bd4b248Alan Newberger            return;
3282040b56b1e0a93b38a558fa56e4b49970bd4b248Alan Newberger        }
3292040b56b1e0a93b38a558fa56e4b49970bd4b248Alan Newberger
3302307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        String pictureSize = settingsManager.getString(SettingsManager.SCOPE_GLOBAL, key);
3312307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        int camera = SettingsUtil.getCameraId(infos, facing);
3322307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (camera != -1) {
3332307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            List<Size> supported = CameraPictureSizesCacher.getSizesForCamera(camera, context);
3342307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            if (supported != null) {
3352307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                Size size = SettingsUtil.getPhotoSize(pictureSize, supported, camera);
3362307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                settingsManager.set(SettingsManager.SCOPE_GLOBAL, key,
3372272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu                        SettingsUtil.sizeToSettingString(size));
3382307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            }
3392307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
3402307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    }
3412307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
3422307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
3432307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * Part of the AOSP upgrade path, copies all of the keys and values in a
3442307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * SharedPreferences file to another SharedPreferences file, as Strings.
34590672aa08379e598426c12b529a86afd4b61011eAlan Newberger     * Settings that are not a known supported format (int/boolean/String)
34690672aa08379e598426c12b529a86afd4b61011eAlan Newberger     * are dropped with warning.
3475381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger     *
3485381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger     * This will normally be run only once but was used both for upgrade version
3495381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger     * 4 and 6 -- in 6 we repair issues with previous runs of the upgrader. So
3505381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger     * we make sure to remove entries from destination if the source isn't valid
3515381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger     * like a null or unsupported type.
3522307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
3532307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private void copyPreferences(SharedPreferences oldPrefs,
3542307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            SharedPreferences newPrefs) {
3552307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        Map<String, ?> entries = oldPrefs.getAll();
3562307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        for (Map.Entry<String, ?> entry : entries.entrySet()) {
3572307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            String key = entry.getKey();
358d560aabf7baef81a14e78341af81994efc1d4f17Alan Newberger            Object value = entry.getValue();
35990672aa08379e598426c12b529a86afd4b61011eAlan Newberger            if (value == null) {
3605381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger                Log.w(TAG, "skipped upgrade and removing entry for null key " + key);
3615381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger                newPrefs.edit().remove(key).apply();
36290672aa08379e598426c12b529a86afd4b61011eAlan Newberger            } else if (value instanceof Boolean) {
36390672aa08379e598426c12b529a86afd4b61011eAlan Newberger                String boolValue = SettingsManager.convert((Boolean) value);
36490672aa08379e598426c12b529a86afd4b61011eAlan Newberger                newPrefs.edit().putString(key, boolValue).apply();
36590672aa08379e598426c12b529a86afd4b61011eAlan Newberger            } else if (value instanceof Integer) {
36690672aa08379e598426c12b529a86afd4b61011eAlan Newberger                String intValue = SettingsManager.convert((Integer) value);
36790672aa08379e598426c12b529a86afd4b61011eAlan Newberger                newPrefs.edit().putString(key, intValue).apply();
36890672aa08379e598426c12b529a86afd4b61011eAlan Newberger            } else if (value instanceof Long){
36990672aa08379e598426c12b529a86afd4b61011eAlan Newberger                // New SettingsManager only supports int values. Attempt to
37090672aa08379e598426c12b529a86afd4b61011eAlan Newberger                // recover any longs which happen to be present if they are
37190672aa08379e598426c12b529a86afd4b61011eAlan Newberger                // within int range.
37290672aa08379e598426c12b529a86afd4b61011eAlan Newberger                long longValue = (Long) value;
37390672aa08379e598426c12b529a86afd4b61011eAlan Newberger                if (longValue <= Integer.MAX_VALUE && longValue >= Integer.MIN_VALUE) {
37490672aa08379e598426c12b529a86afd4b61011eAlan Newberger                    String intValue = SettingsManager.convert((int) longValue);
37590672aa08379e598426c12b529a86afd4b61011eAlan Newberger                    newPrefs.edit().putString(key, intValue).apply();
37690672aa08379e598426c12b529a86afd4b61011eAlan Newberger                } else {
37790672aa08379e598426c12b529a86afd4b61011eAlan Newberger                    Log.w(TAG, "skipped upgrade for out of bounds long key " +
37890672aa08379e598426c12b529a86afd4b61011eAlan Newberger                            key + " : " + longValue);
37990672aa08379e598426c12b529a86afd4b61011eAlan Newberger                }
38090672aa08379e598426c12b529a86afd4b61011eAlan Newberger            } else if (value instanceof String){
38190672aa08379e598426c12b529a86afd4b61011eAlan Newberger                newPrefs.edit().putString(key, (String) value).apply();
38290672aa08379e598426c12b529a86afd4b61011eAlan Newberger            } else {
3835381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger                Log.w(TAG,"skipped upgrade and removing entry for unrecognized "
3845381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger                        + "key type " + key + " : " + value.getClass());
3855381549fe58cd3c5a28dc18e2416c37d3c2d300bAlan Newberger                newPrefs.edit().remove(key).apply();
386d560aabf7baef81a14e78341af81994efc1d4f17Alan Newberger            }
3872307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
3882307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    }
3892307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
3902307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
3912307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * Part of the AOSP upgrade path, copies all of the key and values in the
3922307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * old camera SharedPreferences files to new files.
3932307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
3942307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private void upgradeCameraSettingsFiles(SettingsManager settingsManager,
3952307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            Context context) {
3962307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        String[] cameraIds =
3972307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                context.getResources().getStringArray(R.array.camera_id_entryvalues);
3982307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
3992307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        for (int i = 0; i < cameraIds.length; i++) {
4002307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            SharedPreferences oldCameraPreferences =
4012307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    settingsManager.openPreferences(
4022307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                            OLD_CAMERA_PREFERENCES_PREFIX + cameraIds[i]);
4032307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            SharedPreferences newCameraPreferences =
40400562dd0a8451eda80815b3d8fdcb8075e4b9db6Senpo Hu                    settingsManager.openPreferences(
40500562dd0a8451eda80815b3d8fdcb8075e4b9db6Senpo Hu                            SettingsManager.getCameraSettingScope(cameraIds[i]));
4062307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
4072307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            copyPreferences(oldCameraPreferences, newCameraPreferences);
4082307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
4092307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    }
4102307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
4112307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private void upgradeModuleSettingsFiles(SettingsManager settingsManager,
4122307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            Context context, AppController app) {
4132307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        int[] moduleIds = context.getResources().getIntArray(R.array.camera_modes);
4142307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
4152307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        for (int i = 0; i < moduleIds.length; i++) {
4162307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            String moduleId = Integer.toString(moduleIds[i]);
4172307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            SharedPreferences oldModulePreferences =
4182307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    settingsManager.openPreferences(
4192307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                            OLD_MODULE_PREFERENCES_PREFIX + moduleId);
4202307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
4218d0178ea8ea318e52dd8bd3ed5f3c8e697383304Alan Newberger            if (oldModulePreferences != null && oldModulePreferences.getAll().size() > 0) {
4228d0178ea8ea318e52dd8bd3ed5f3c8e697383304Alan Newberger                ModuleManagerImpl.ModuleAgent agent =
4238d0178ea8ea318e52dd8bd3ed5f3c8e697383304Alan Newberger                        app.getModuleManager().getModuleAgent(moduleIds[i]);
424f2399a5148ec6f101e9e0b3f137d33b443b79b8cAlan Newberger                if (agent != null) {
425f2399a5148ec6f101e9e0b3f137d33b443b79b8cAlan Newberger                    SharedPreferences newModulePreferences = settingsManager.openPreferences(
42600562dd0a8451eda80815b3d8fdcb8075e4b9db6Senpo Hu                            SettingsManager.getModuleSettingScope(agent.getScopeNamespace()));
4272307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
428f2399a5148ec6f101e9e0b3f137d33b443b79b8cAlan Newberger                    copyPreferences(oldModulePreferences, newModulePreferences);
429f2399a5148ec6f101e9e0b3f137d33b443b79b8cAlan Newberger                }
4308d0178ea8ea318e52dd8bd3ed5f3c8e697383304Alan Newberger            }
4312307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
4322307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    }
4332307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
4342307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    /**
4352307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * The R.integer.camera_mode_* indices were cleaned up, resulting in
4362307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * removals and renaming of certain values. In particular camera_mode_gcam
4372307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * is now 5, not 6. We modify any persisted user settings that may refer to
4382307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     * the old value.
4392307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger     */
4402307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    private void upgradeSelectedModeIndex(SettingsManager settingsManager, Context context) {
4412307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        int oldGcamIndex = 6; // from hardcoded previous mode index resource
4422307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        int gcamIndex = context.getResources().getInteger(R.integer.camera_mode_gcam);
4432307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
4442307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        int lastUsedCameraIndex = settingsManager.getInteger(SettingsManager.SCOPE_GLOBAL,
4452307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                Keys.KEY_CAMERA_MODULE_LAST_USED);
4462307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (lastUsedCameraIndex == oldGcamIndex) {
4472307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_CAMERA_MODULE_LAST_USED,
4482307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    gcamIndex);
4492307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
4502307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger
4512307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        int startupModuleIndex = settingsManager.getInteger(SettingsManager.SCOPE_GLOBAL,
4522307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                Keys.KEY_STARTUP_MODULE_INDEX);
4532307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        if (startupModuleIndex == oldGcamIndex) {
4542307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger            settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_STARTUP_MODULE_INDEX,
4552307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger                    gcamIndex);
4562307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger        }
4572307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger    }
45824aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling
45924aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling    /**
46024aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     * A targeted fix for b/19693226.
46124aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     * <p>
46224aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     * Since the N5 doesn't natively support a high resolution 16:9 size we need
46324aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     * to artificially add it and then crop the result from the high-resolution
46424aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     * 4:3 size. In version 2.4 we unfortunately swapped the dimensions of
46524aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     * ResolutionUtil#NEXUS_5_LARGE_16_BY_9_SIZE, which now causes a few issues
46624aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     * in 2.5. If we detect this case, we will swap the dimensions here to make
46724aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     * sure they are the right way around going forward.
46824aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling     */
46924aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling    private void updateN516by9ResolutionIfNeeded(SettingsManager settingsManager) {
47024aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling        if (!ApiHelper.IS_NEXUS_5) {
47124aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling            return;
47224aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling        }
47324aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling
47424aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling        String pictureSize = settingsManager.getString(SettingsManager.SCOPE_GLOBAL,
47524aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling                Keys.KEY_PICTURE_SIZE_BACK);
4765aaf7c89b7debfd38e5f27f721176a7cda47f8ebAlan Newberger        if ("1836x3264".equals(pictureSize)) {
47724aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling            Log.i(TAG, "Swapped dimensions on N5 16:9 resolution.");
47824aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling            settingsManager.set(SettingsManager.SCOPE_GLOBAL, Keys.KEY_PICTURE_SIZE_BACK,
47924aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling                    "3264x1836");
48024aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling        }
48124aceb0bee1f1fa99ea8d7c4e22457f08ca4e2faSascha Haeberling    }
4822307b60abdf0af8639d71ba53cf10fdaf8dfe7e7Alan Newberger}
483