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