SettingsBackupTest.java revision 09d4ff8960cd3d45988b0c3ff0835d281f0e16b5
1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.provider;
18
19import static com.google.android.collect.Sets.newHashSet;
20import static org.hamcrest.MatcherAssert.assertThat;
21import static org.hamcrest.Matchers.empty;
22import static org.hamcrest.Matchers.is;
23import static java.lang.reflect.Modifier.isFinal;
24import static java.lang.reflect.Modifier.isPublic;
25import static java.lang.reflect.Modifier.isStatic;
26
27import android.platform.test.annotations.Presubmit;
28import android.support.test.filters.SmallTest;
29import android.support.test.runner.AndroidJUnit4;
30
31import java.lang.reflect.Field;
32import java.util.HashSet;
33import java.util.Set;
34
35import org.junit.Test;
36import org.junit.runner.RunWith;
37
38/** Tests that ensure appropriate settings are backed up. */
39@RunWith(AndroidJUnit4.class)
40@Presubmit
41@SmallTest
42public class SettingsBackupTest {
43
44    /**
45     * The following blacklists contain settings that should *not* be backed up and restored to
46     * another device.  As a general rule, anything that is not user configurable should be
47     * blacklisted (and conversely, things that *are* user configurable *should* be backed up)
48     */
49    private static final Set<String> BACKUP_BLACKLISTED_SYSTEM_SETTINGS =
50            newHashSet(
51                    Settings.System.ADVANCED_SETTINGS, // candidate for backup?
52                    Settings.System.ALARM_ALERT, // backup candidate?
53                    Settings.System.ALARM_ALERT_CACHE, // internal cache
54                    Settings.System.APPEND_FOR_LAST_AUDIBLE, // suffix deprecated since API 2
55                    Settings.System.EGG_MODE, // I am the lolrus
56                    Settings.System.END_BUTTON_BEHAVIOR, // bug?
57                    Settings.System
58                            .HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, // candidate for backup?
59                    Settings.System.LOCKSCREEN_DISABLED, // ?
60                    Settings.System.MEDIA_BUTTON_RECEIVER, // candidate for backup?
61                    Settings.System.MUTE_STREAMS_AFFECTED, //  candidate for backup?
62                    Settings.System.NOTIFICATION_LIGHT_PULSE, // candidate for backup?
63                    Settings.System.NOTIFICATION_SOUND_CACHE, // internal cache
64                    Settings.System.POINTER_LOCATION, // backup candidate?
65                    Settings.System.RINGTONE_CACHE, // internal cache
66                    Settings.System.SETUP_WIZARD_HAS_RUN, // Only used by SuW
67                    Settings.System.SHOW_GTALK_SERVICE_STATUS, // candidate for backup?
68                    Settings.System.SHOW_TOUCHES, // bug?
69                    Settings.System.SIP_ADDRESS_ONLY, // value, not a setting
70                    Settings.System.SIP_ALWAYS, // value, not a setting
71                    Settings.System.SYSTEM_LOCALES, // bug?
72                    Settings.System.USER_ROTATION, // backup candidate?
73                    Settings.System.VIBRATE_IN_SILENT, // deprecated?
74                    Settings.System.VIBRATE_ON, // candidate for backup?
75                    Settings.System.VOLUME_ALARM, // deprecated since API 2?
76                    Settings.System.VOLUME_BLUETOOTH_SCO, // deprecated since API 2?
77                    Settings.System.VOLUME_MASTER, // candidate for backup?
78                    Settings.System.VOLUME_MUSIC, // deprecated since API 2?
79                    Settings.System.VOLUME_NOTIFICATION, // deprecated since API 2?
80                    Settings.System.VOLUME_RING, // deprecated since API 2?
81                    Settings.System.VOLUME_SYSTEM, // deprecated since API 2?
82                    Settings.System.VOLUME_VOICE, // deprecated since API 2?
83                    Settings.System.WHEN_TO_MAKE_WIFI_CALLS, // bug?
84                    Settings.System.WINDOW_ORIENTATION_LISTENER_LOG // used for debugging only
85                    );
86
87    private static final Set<String> BACKUP_BLACKLISTED_GLOBAL_SETTINGS =
88            newHashSet(
89                    Settings.Global.ACTIVITY_MANAGER_CONSTANTS,
90                    Settings.Global.ADB_ENABLED,
91                    Settings.Global.ADD_USERS_WHEN_LOCKED,
92                    Settings.Global.AIRPLANE_MODE_ON,
93                    Settings.Global.AIRPLANE_MODE_RADIOS,
94                    Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
95                    Settings.Global.ALARM_MANAGER_CONSTANTS,
96                    Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED,
97                    Settings.Global.ALWAYS_FINISH_ACTIVITIES,
98                    Settings.Global.ANIMATOR_DURATION_SCALE,
99                    Settings.Global.APN_DB_UPDATE_CONTENT_URL,
100                    Settings.Global.APN_DB_UPDATE_METADATA_URL,
101                    Settings.Global.APP_IDLE_CONSTANTS,
102                    Settings.Global.ASSISTED_GPS_ENABLED,
103                    Settings.Global.AUDIO_SAFE_VOLUME_STATE,
104                    Settings.Global.BATTERY_DISCHARGE_DURATION_THRESHOLD,
105                    Settings.Global.BATTERY_DISCHARGE_THRESHOLD,
106                    Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE,
107                    Settings.Global.BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX,
108                    Settings.Global.BLUETOOTH_A2DP_SRC_PRIORITY_PREFIX,
109                    Settings.Global.BLUETOOTH_DISABLED_PROFILES,
110                    Settings.Global.BLUETOOTH_HEADSET_PRIORITY_PREFIX,
111                    Settings.Global.BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX,
112                    Settings.Global.BLUETOOTH_INTEROPERABILITY_LIST,
113                    Settings.Global.BLUETOOTH_MAP_CLIENT_PRIORITY_PREFIX,
114                    Settings.Global.BLUETOOTH_MAP_PRIORITY_PREFIX,
115                    Settings.Global.BLUETOOTH_ON, // Candidate for backup?
116                    Settings.Global.BLUETOOTH_PAN_PRIORITY_PREFIX,
117                    Settings.Global.BLUETOOTH_PBAP_CLIENT_PRIORITY_PREFIX,
118                    Settings.Global.BLUETOOTH_SAP_PRIORITY_PREFIX,
119                    Settings.Global.BOOT_COUNT,
120                    Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL,
121                    Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
122                    Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
123                    Settings.Global.CAPTIVE_PORTAL_MODE,
124                    Settings.Global.CAPTIVE_PORTAL_SERVER,
125                    Settings.Global.CAPTIVE_PORTAL_USE_HTTPS,
126                    Settings.Global.CAPTIVE_PORTAL_USER_AGENT,
127                    Settings.Global.CAR_DOCK_SOUND,
128                    Settings.Global.CARRIER_APP_WHITELIST,
129                    Settings.Global.CAR_UNDOCK_SOUND,
130                    Settings.Global.CDMA_CELL_BROADCAST_SMS,
131                    Settings.Global.CDMA_ROAMING_MODE,
132                    Settings.Global.CDMA_SUBSCRIPTION_MODE,
133                    Settings.Global.CELL_ON,
134                    Settings.Global.CERT_PIN_UPDATE_CONTENT_URL,
135                    Settings.Global.CERT_PIN_UPDATE_METADATA_URL,
136                    Settings.Global.COMPATIBILITY_MODE,
137                    Settings.Global.CONNECTIVITY_CHANGE_DELAY,
138                    Settings.Global.CONNECTIVITY_METRICS_BUFFER_SIZE,
139                    Settings.Global.CONNECTIVITY_SAMPLING_INTERVAL_IN_SECONDS,
140                    Settings.Global.CONTACT_METADATA_SYNC_ENABLED,
141                    Settings.Global.CONTACTS_DATABASE_WAL_ENABLED,
142                    Settings.Global.DATA_ACTIVITY_TIMEOUT_MOBILE,
143                    Settings.Global.DATA_ACTIVITY_TIMEOUT_WIFI,
144                    Settings.Global.DATABASE_CREATION_BUILDID,
145                    Settings.Global.DATABASE_DOWNGRADE_REASON,
146                    Settings.Global.DATA_ROAMING,
147                    Settings.Global.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS,
148                    Settings.Global.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS,
149                    Settings.Global.DEBUG_APP,
150                    Settings.Global.DEBUG_VIEW_ATTRIBUTES,
151                    Settings.Global.DEFAULT_DNS_SERVER,
152                    Settings.Global.DEFAULT_INSTALL_LOCATION,
153                    Settings.Global.DESK_DOCK_SOUND,
154                    Settings.Global.DESK_UNDOCK_SOUND,
155                    Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT,
156                    Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES,
157                    Settings.Global.DEVELOPMENT_FORCE_RTL,
158                    Settings.Global.DEVELOPMENT_SETTINGS_ENABLED,
159                    Settings.Global.DEVICE_DEMO_MODE,
160                    Settings.Global.DEVICE_IDLE_CONSTANTS,
161                    Settings.Global.DEVICE_IDLE_CONSTANTS_WATCH,
162                    Settings.Global.BATTERY_SAVER_CONSTANTS,
163                    Settings.Global.DEVICE_NAME,
164                    Settings.Global.DEVICE_PROVISIONED,
165                    Settings.Global.DEVICE_PROVISIONING_MOBILE_DATA_ENABLED,
166                    Settings.Global.DISK_FREE_CHANGE_REPORTING_THRESHOLD,
167                    Settings.Global.DISPLAY_SCALING_FORCE,
168                    Settings.Global.DISPLAY_SIZE_FORCED,
169                    Settings.Global.DNS_RESOLVER_MAX_SAMPLES,
170                    Settings.Global.DNS_RESOLVER_MIN_SAMPLES,
171                    Settings.Global.DNS_RESOLVER_SAMPLE_VALIDITY_SECONDS,
172                    Settings.Global.DNS_RESOLVER_SUCCESS_THRESHOLD_PERCENT,
173                    Settings.Global.DOCK_SOUNDS_ENABLED_WHEN_ACCESSIBILITY,
174                    Settings.Global.DOWNLOAD_MAX_BYTES_OVER_MOBILE,
175                    Settings.Global.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE,
176                    Settings.Global.DROPBOX_AGE_SECONDS,
177                    Settings.Global.DROPBOX_MAX_FILES,
178                    Settings.Global.DROPBOX_QUOTA_KB,
179                    Settings.Global.DROPBOX_QUOTA_PERCENT,
180                    Settings.Global.DROPBOX_RESERVE_PERCENT,
181                    Settings.Global.DROPBOX_TAG_PREFIX,
182                    Settings.Global.EMERGENCY_AFFORDANCE_NEEDED,
183                    Settings.Global.ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED,
184                    Settings.Global.ENABLE_CACHE_QUOTA_CALCULATION,
185                    Settings.Global.ENABLE_CELLULAR_ON_BOOT,
186                    Settings.Global.ENABLE_DISKSTATS_LOGGING,
187                    Settings.Global.ENABLE_EPHEMERAL_FEATURE,
188                    Settings.Global.ENHANCED_4G_MODE_ENABLED,
189                    Settings.Global.EPHEMERAL_COOKIE_MAX_SIZE_BYTES,
190                    Settings.Global.ERROR_LOGCAT_PREFIX,
191                    Settings.Global.FANCY_IME_ANIMATIONS,
192                    Settings.Global.FORCE_ALLOW_ON_EXTERNAL,
193                    Settings.Global.FSTRIM_MANDATORY_INTERVAL,
194                    Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST,
195                    Settings.Global.GLOBAL_HTTP_PROXY_HOST,
196                    Settings.Global.GLOBAL_HTTP_PROXY_PAC,
197                    Settings.Global.GLOBAL_HTTP_PROXY_PORT,
198                    Settings.Global.GPRS_REGISTER_CHECK_PERIOD_MS,
199                    Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
200                    Settings.Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED,
201                    Settings.Global.HDMI_CONTROL_ENABLED,
202                    Settings.Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED,
203                    Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED,
204                    Settings.Global.HTTP_PROXY,
205                    Settings.Global.INET_CONDITION_DEBOUNCE_DOWN_DELAY,
206                    Settings.Global.INET_CONDITION_DEBOUNCE_UP_DELAY,
207                    Settings.Global.INTENT_FIREWALL_UPDATE_CONTENT_URL,
208                    Settings.Global.INTENT_FIREWALL_UPDATE_METADATA_URL,
209                    Settings.Global.JOB_SCHEDULER_CONSTANTS,
210                    Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS,
211                    Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST,
212                    Settings.Global.LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED,
213                    Settings.Global.LOCK_SOUND,
214                    Settings.Global.LOW_BATTERY_SOUND,
215                    Settings.Global.LOW_BATTERY_SOUND_TIMEOUT,
216                    Settings.Global.LOW_POWER_MODE,
217                    Settings.Global.LTE_SERVICE_FORCED,
218                    Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE,
219                    Settings.Global.MDC_INITIAL_MAX_RETRY,
220                    Settings.Global.MHL_INPUT_SWITCHING_ENABLED,
221                    Settings.Global.MHL_POWER_CHARGE_ENABLED,
222                    Settings.Global.MOBILE_DATA, // Candidate for backup?
223                    Settings.Global.MOBILE_DATA_ALWAYS_ON,
224                    Settings.Global.MODE_RINGER,
225                    Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION,
226                    Settings.Global.MULTI_SIM_SMS_PROMPT,
227                    Settings.Global.MULTI_SIM_SMS_SUBSCRIPTION,
228                    Settings.Global.MULTI_SIM_VOICE_CALL_SUBSCRIPTION,
229                    Settings.Global.MULTI_SIM_VOICE_PROMPT,
230                    Settings.Global.NETSTATS_DEV_BUCKET_DURATION,
231                    Settings.Global.NETSTATS_DEV_DELETE_AGE,
232                    Settings.Global.NETSTATS_DEV_PERSIST_BYTES,
233                    Settings.Global.NETSTATS_DEV_ROTATE_AGE,
234                    Settings.Global.NETSTATS_ENABLED,
235                    Settings.Global.NETSTATS_GLOBAL_ALERT_BYTES,
236                    Settings.Global.NETSTATS_POLL_INTERVAL,
237                    Settings.Global.NETSTATS_SAMPLE_ENABLED,
238                    Settings.Global.NETSTATS_TIME_CACHE_MAX_AGE,
239                    Settings.Global.NETSTATS_UID_BUCKET_DURATION,
240                    Settings.Global.NETSTATS_UID_DELETE_AGE,
241                    Settings.Global.NETSTATS_UID_PERSIST_BYTES,
242                    Settings.Global.NETSTATS_UID_ROTATE_AGE,
243                    Settings.Global.NETSTATS_UID_TAG_BUCKET_DURATION,
244                    Settings.Global.NETSTATS_UID_TAG_DELETE_AGE,
245                    Settings.Global.NETSTATS_UID_TAG_PERSIST_BYTES,
246                    Settings.Global.NETSTATS_UID_TAG_ROTATE_AGE,
247                    Settings.Global.NETWORK_AVOID_BAD_WIFI,
248                    Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE,
249                    Settings.Global.NETWORK_PREFERENCE,
250                    Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE,
251                    Settings.Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS,
252                    Settings.Global.NETWORK_SCORER_APP,
253                    Settings.Global.NETWORK_SCORING_PROVISIONED,
254                    Settings.Global.NETWORK_SCORING_UI_ENABLED,
255                    Settings.Global.NETWORK_SWITCH_NOTIFICATION_DAILY_LIMIT,
256                    Settings.Global.NETWORK_SWITCH_NOTIFICATION_RATE_LIMIT_MILLIS,
257                    Settings.Global.NEW_CONTACT_AGGREGATOR,
258                    Settings.Global.NITZ_UPDATE_DIFF,
259                    Settings.Global.NITZ_UPDATE_SPACING,
260                    Settings.Global.NSD_ON,
261                    Settings.Global.NTP_SERVER,
262                    Settings.Global.NTP_TIMEOUT,
263                    Settings.Global.OTA_DISABLE_AUTOMATIC_UPDATE,
264                    Settings.Global.OVERLAY_DISPLAY_DEVICES,
265                    Settings.Global.PAC_CHANGE_DELAY,
266                    Settings.Global.PACKAGE_VERIFIER_DEFAULT_RESPONSE,
267                    Settings.Global.PACKAGE_VERIFIER_ENABLE,
268                    Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB,
269                    Settings.Global.PACKAGE_VERIFIER_SETTING_VISIBLE,
270                    Settings.Global.PACKAGE_VERIFIER_TIMEOUT,
271                    Settings.Global.PDP_WATCHDOG_ERROR_POLL_COUNT,
272                    Settings.Global.PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS,
273                    Settings.Global.PDP_WATCHDOG_LONG_POLL_INTERVAL_MS,
274                    Settings.Global.PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT,
275                    Settings.Global.PDP_WATCHDOG_POLL_INTERVAL_MS,
276                    Settings.Global.PDP_WATCHDOG_TRIGGER_PACKET_COUNT,
277                    Settings.Global.POLICY_CONTROL,
278                    Settings.Global.POWER_MANAGER_CONSTANTS,
279                    Settings.Global.PREFERRED_NETWORK_MODE,
280                    Settings.Global.PROVISIONING_APN_ALARM_DELAY_IN_MS,
281                    Settings.Global.RADIO_BLUETOOTH,
282                    Settings.Global.RADIO_CELL,
283                    Settings.Global.RADIO_NFC,
284                    Settings.Global.RADIO_WIFI,
285                    Settings.Global.RADIO_WIMAX,
286                    Settings.Global.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS,
287                    Settings.Global.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT,
288                    Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT,
289                    Settings.Global.RETAIL_DEMO_MODE_CONSTANTS,
290                    Settings.Global.SAFE_BOOT_DISALLOWED,
291                    Settings.Global.SAMPLING_PROFILER_MS,
292                    Settings.Global.SELINUX_STATUS,
293                    Settings.Global.SELINUX_UPDATE_CONTENT_URL,
294                    Settings.Global.SELINUX_UPDATE_METADATA_URL,
295                    Settings.Global.SEND_ACTION_APP_ERROR,
296                    Settings.Global.SET_GLOBAL_HTTP_PROXY,
297                    Settings.Global.SET_INSTALL_LOCATION,
298                    Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL,
299                    Settings.Global.SETUP_PREPAID_DETECTION_REDIR_HOST,
300                    Settings.Global.SETUP_PREPAID_DETECTION_TARGET_URL,
301                    Settings.Global.SHORTCUT_MANAGER_CONSTANTS,
302                    Settings.Global.SHOW_TEMPERATURE_WARNING,
303                    Settings.Global.SMS_OUTGOING_CHECK_INTERVAL_MS,
304                    Settings.Global.SMS_OUTGOING_CHECK_MAX_COUNT,
305                    Settings.Global.SMS_SHORT_CODE_CONFIRMATION,
306                    Settings.Global.SMS_SHORT_CODE_RULE,
307                    Settings.Global.SMS_SHORT_CODES_UPDATE_CONTENT_URL,
308                    Settings.Global.SMS_SHORT_CODES_UPDATE_METADATA_URL,
309                    Settings.Global.STORAGE_BENCHMARK_INTERVAL,
310                    Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS,
311                    Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL,
312                    Settings.Global.SYS_STORAGE_CACHE_MAX_BYTES,
313                    Settings.Global.SYS_STORAGE_CACHE_PERCENTAGE,
314                    Settings.Global.SYS_STORAGE_FULL_THRESHOLD_BYTES,
315                    Settings.Global.SYS_STORAGE_THRESHOLD_MAX_BYTES,
316                    Settings.Global.SYS_STORAGE_THRESHOLD_PERCENTAGE,
317                    Settings.Global.TCP_DEFAULT_INIT_RWND,
318                    Settings.Global.TETHER_DUN_APN,
319                    Settings.Global.TETHER_DUN_REQUIRED,
320                    Settings.Global.TETHER_SUPPORTED,
321                    Settings.Global.THEATER_MODE_ON,
322                    Settings.Global.TRANSITION_ANIMATION_SCALE,
323                    Settings.Global.TRUSTED_SOUND,
324                    Settings.Global.TZINFO_UPDATE_CONTENT_URL,
325                    Settings.Global.TZINFO_UPDATE_METADATA_URL,
326                    Settings.Global.UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS,
327                    Settings.Global.UNLOCK_SOUND,
328                    Settings.Global.USE_GOOGLE_MAIL,
329                    Settings.Global.VT_IMS_ENABLED,
330                    Settings.Global.WAIT_FOR_DEBUGGER,
331                    Settings.Global.NETWORK_ACCESS_TIMEOUT_MS,
332                    Settings.Global.WARNING_TEMPERATURE,
333                    Settings.Global.WEBVIEW_DATA_REDUCTION_PROXY_KEY,
334                    Settings.Global.WEBVIEW_FALLBACK_LOGIC_ENABLED,
335                    Settings.Global.WEBVIEW_MULTIPROCESS,
336                    Settings.Global.WEBVIEW_PROVIDER,
337                    Settings.Global.WFC_IMS_ENABLED,
338                    Settings.Global.WFC_IMS_MODE,
339                    Settings.Global.WFC_IMS_ROAMING_ENABLED,
340                    Settings.Global.WFC_IMS_ROAMING_MODE,
341                    Settings.Global.WIFI_BADGING_THRESHOLDS,
342                    Settings.Global.WIFI_BOUNCE_DELAY_OVERRIDE_MS,
343                    Settings.Global.WIFI_COUNTRY_CODE,
344                    Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN,
345                    Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON,
346                    Settings.Global.WIFI_DISPLAY_ON,
347                    Settings.Global.WIFI_DISPLAY_WPS_CONFIG,
348                    Settings.Global.WIFI_ENHANCED_AUTO_JOIN,
349                    Settings.Global.WIFI_EPHEMERAL_OUT_OF_RANGE_TIMEOUT_MS,
350                    Settings.Global.WIFI_FRAMEWORK_SCAN_INTERVAL_MS,
351                    Settings.Global.WIFI_FREQUENCY_BAND,
352                    Settings.Global.WIFI_IDLE_MS,
353                    Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT,
354                    Settings.Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS,
355                    Settings.Global.WIFI_NETWORK_SHOW_RSSI,
356                    Settings.Global.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
357                    Settings.Global.WIFI_NUM_OPEN_NETWORKS_KEPT,
358                    Settings.Global.WIFI_ON,
359                    Settings.Global.WIFI_P2P_DEVICE_NAME,
360                    Settings.Global.WIFI_REENABLE_DELAY_MS,
361                    Settings.Global.WIFI_SAVED_STATE,
362                    Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE,
363                    Settings.Global.WIFI_SCAN_INTERVAL_WHEN_P2P_CONNECTED_MS,
364                    Settings.Global.WIFI_SLEEP_POLICY,
365                    Settings.Global.WIFI_SUPPLICANT_SCAN_INTERVAL_MS,
366                    Settings.Global.WIFI_SUSPEND_OPTIMIZATIONS_ENABLED,
367                    Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED,
368                    Settings.Global.WIFI_WATCHDOG_ON,
369                    Settings.Global.WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON,
370                    Settings.Global.WINDOW_ANIMATION_SCALE,
371                    Settings.Global.WIRELESS_CHARGING_STARTED_SOUND,
372                    Settings.Global.WTF_IS_FATAL,
373                    Settings.Global.ZEN_MODE,
374                    Settings.Global.ZEN_MODE_CONFIG_ETAG,
375                    Settings.Global.ZEN_MODE_RINGER_LEVEL);
376
377    private static final Set<String> BACKUP_BLACKLISTED_SECURE_SETTINGS =
378             newHashSet(
379                 Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE,
380                 Settings.Secure.ALLOWED_GEOLOCATION_ORIGINS,
381                 Settings.Secure.ALWAYS_ON_VPN_APP,
382                 Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN,
383                 Settings.Secure.ANDROID_ID,
384                 Settings.Secure.ANR_SHOW_BACKGROUND,
385                 Settings.Secure.ASSISTANT,
386                 Settings.Secure.ASSIST_DISCLOSURE_ENABLED,
387                 Settings.Secure.ASSIST_SCREENSHOT_ENABLED,
388                 Settings.Secure.ASSIST_STRUCTURE_ENABLED,
389                 Settings.Secure.AUTOFILL_SERVICE,
390                 Settings.Secure.AUTOMATIC_STORAGE_MANAGER_BYTES_CLEARED,
391                 Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
392                 Settings.Secure.AUTOMATIC_STORAGE_MANAGER_LAST_RUN,
393                 Settings.Secure.BACKUP_AUTO_RESTORE,
394                 Settings.Secure.BACKUP_ENABLED,
395                 Settings.Secure.BACKUP_PROVISIONED,
396                 Settings.Secure.BACKUP_TRANSPORT,
397                 Settings.Secure.BLUETOOTH_HCI_LOG,
398                 Settings.Secure.CARRIER_APPS_HANDLED,
399                 Settings.Secure.CMAS_ADDITIONAL_BROADCAST_PKG,
400                 Settings.Secure.COMPLETED_CATEGORY_PREFIX,
401                 Settings.Secure.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS,
402                 Settings.Secure.DEFAULT_INPUT_METHOD,
403                 Settings.Secure.DEMO_USER_SETUP_COMPLETE,
404                 Settings.Secure.DEVICE_PAIRED,
405                 Settings.Secure.DIALER_DEFAULT_APPLICATION,
406                 Settings.Secure.DISABLED_PRINT_SERVICES,
407                 Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS,
408                 Settings.Secure.DISPLAY_DENSITY_FORCED,
409                 Settings.Secure.DOZE_ALWAYS_ON,
410                 Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION,
411                 Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT,
412                 Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES,
413                 Settings.Secure.ENABLED_PRINT_SERVICES,
414                 Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS,
415                 Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR,
416                 Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY,
417                 Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY,
418                 Settings.Secure.INSTALL_NON_MARKET_APPS,
419                 Settings.Secure.LAST_SETUP_SHOWN,
420                 Settings.Secure.LOCATION_MODE,
421                 Settings.Secure.LOCATION_PREVIOUS_MODE,
422                 Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, // Candidate?
423                 Settings.Secure.LOCK_SCREEN_ALLOW_REMOTE_INPUT, // Candidate?
424                 Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT,
425                 Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, // Candidate?
426                 Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
427                 Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH,
428                 Settings.Secure.MULTI_PRESS_TIMEOUT,
429                 Settings.Secure.NFC_PAYMENT_FOREGROUND,
430                 Settings.Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME,
431                 Settings.Secure.PACKAGE_VERIFIER_STATE,
432                 Settings.Secure.PACKAGE_VERIFIER_USER_CONSENT,
433                 Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE,
434                 Settings.Secure.PAYMENT_SERVICE_SEARCH_URI,
435                 Settings.Secure.PRINT_SERVICE_SEARCH_URI,
436                 Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, // Candidate?
437                 Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, // Candidate?
438                 Settings.Secure.SCREENSAVER_COMPONENTS,
439                 Settings.Secure.SCREENSAVER_DEFAULT_COMPONENT, // Candidate?
440                 Settings.Secure.SCREENSAVER_ENABLED, // Candidate?
441                 Settings.Secure.SEARCH_GLOBAL_SEARCH_ACTIVITY,
442                 Settings.Secure.SEARCH_MAX_RESULTS_PER_SOURCE,
443                 Settings.Secure.SEARCH_MAX_RESULTS_TO_DISPLAY,
444                 Settings.Secure.SEARCH_MAX_SHORTCUTS_RETURNED,
445                 Settings.Secure.SEARCH_MAX_SOURCE_EVENT_AGE_MILLIS,
446                 Settings.Secure.SEARCH_MAX_STAT_AGE_MILLIS,
447                 Settings.Secure.SEARCH_MIN_CLICKS_FOR_SOURCE_RANKING,
448                 Settings.Secure.SEARCH_MIN_IMPRESSIONS_FOR_SOURCE_RANKING,
449                 Settings.Secure.SEARCH_NUM_PROMOTED_SOURCES,
450                 Settings.Secure.SEARCH_PER_SOURCE_CONCURRENT_QUERY_LIMIT,
451                 Settings.Secure.SEARCH_PREFILL_MILLIS,
452                 Settings.Secure.SEARCH_PROMOTED_SOURCE_DEADLINE_MILLIS,
453                 Settings.Secure.SEARCH_QUERY_THREAD_CORE_POOL_SIZE,
454                 Settings.Secure.SEARCH_QUERY_THREAD_MAX_POOL_SIZE,
455                 Settings.Secure.SEARCH_SHORTCUT_REFRESH_CORE_POOL_SIZE,
456                 Settings.Secure.SEARCH_SHORTCUT_REFRESH_MAX_POOL_SIZE,
457                 Settings.Secure.SEARCH_SOURCE_TIMEOUT_MILLIS,
458                 Settings.Secure.SEARCH_THREAD_KEEPALIVE_SECONDS,
459                 Settings.Secure.SEARCH_WEB_RESULTS_OVERRIDE_LIMIT,
460                 Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE,
461                 Settings.Secure.SETTINGS_CLASSNAME,
462                 Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING, // candidate?
463                 Settings.Secure.SKIP_FIRST_USE_HINTS, // candidate?
464                 Settings.Secure.SMS_DEFAULT_APPLICATION,
465                 Settings.Secure.TRUST_AGENTS_INITIALIZED,
466                 Settings.Secure.TV_INPUT_CUSTOM_LABELS,
467                 Settings.Secure.TV_INPUT_HIDDEN_INPUTS,
468                 Settings.Secure.UI_NIGHT_MODE, // candidate?
469                 Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED,
470                 Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS,
471                 Settings.Secure.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED,
472                 Settings.Secure.USER_SETUP_COMPLETE,
473                 Settings.Secure.VOICE_INTERACTION_SERVICE,
474                 Settings.Secure.VOICE_RECOGNITION_SERVICE,
475                 Settings.Secure.INSTANT_APPS_ENABLED);
476
477    @Test
478    public void systemSettingsBackedUpOrBlacklisted() {
479        checkSettingsBackedUpOrBlacklisted(
480                getCandidateSettings(Settings.System.class),
481                newHashSet(Settings.System.SETTINGS_TO_BACKUP),
482                BACKUP_BLACKLISTED_SYSTEM_SETTINGS);
483    }
484
485    @Test
486    public void globalSettingsBackedUpOrBlacklisted() {
487        checkSettingsBackedUpOrBlacklisted(
488            getCandidateSettings(Settings.Global.class),
489            newHashSet(Settings.Global.SETTINGS_TO_BACKUP),
490            BACKUP_BLACKLISTED_GLOBAL_SETTINGS);
491    }
492
493    @Test
494    public void secureSettingsBackedUpOrBlacklisted() {
495        checkSettingsBackedUpOrBlacklisted(
496                getCandidateSettings(Settings.Secure.class),
497                newHashSet(Settings.Secure.SETTINGS_TO_BACKUP),
498            BACKUP_BLACKLISTED_SECURE_SETTINGS);
499    }
500
501    private static void checkSettingsBackedUpOrBlacklisted(
502            Set<String> settings, Set<String> settingsToBackup, Set<String> blacklist) {
503        Set<String> settingsNotBackedUp = difference(settings, settingsToBackup);
504        Set<String> settingsNotBackedUpOrBlacklisted = difference(settingsNotBackedUp, blacklist);
505        assertThat(
506                "Settings not backed up or blacklisted",
507                settingsNotBackedUpOrBlacklisted,
508                is(empty()));
509
510        assertThat(
511            "blacklisted settings backed up",
512            intersect(settingsToBackup, blacklist),
513            is(empty()));
514    }
515
516    private static Set<String> getCandidateSettings(Class<? extends Settings.NameValueTable> clazz) {
517        HashSet<String> result = new HashSet<String>();
518        for (Field field : clazz.getDeclaredFields()) {
519            if (looksLikeValidSetting(field)) {
520                try {
521                    result.add((String) field.get(null));
522                } catch (IllegalAccessException e) {
523                    // Impossible for public fields
524                    throw new RuntimeException(e);
525                }
526            }
527        }
528        return result;
529    }
530
531    private static boolean looksLikeValidSetting(Field field) {
532        int modifiers = field.getModifiers();
533        return isPublic(modifiers)
534                && isStatic(modifiers)
535                && isFinal(modifiers)
536                && field.getType() == String.class
537                && field.getAnnotation(Deprecated.class) == null;
538    }
539
540    private static <T> Set<T> difference(Set<T> s1, Set<T> s2) {
541        HashSet<T> result = new HashSet<T>(s1);
542        result.removeAll(s2);
543        return result;
544    }
545
546    private static <T> Set<T> intersect(Set<T> s1, Set<T> s2) {
547        HashSet<T> result = new HashSet<T>(s1);
548        result.retainAll(s2);
549        return result;
550    }
551
552}
553