Merge "Use proper string formatting for the "Active device" string"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c526d6f..1740b2b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -109,7 +109,7 @@
<!-- Settings -->
<activity android:name="Settings"
- android:taskAffinity="com.android.settings"
+ android:taskAffinity="com.android.settings.root"
android:label="@string/settings_label_launcher"
android:launchMode="singleTask">
<intent-filter android:priority="1">
@@ -122,7 +122,7 @@
<!-- Alias for launcher activity only, as this belongs to each profile. -->
<activity-alias android:name="Settings"
- android:taskAffinity="com.android.settings"
+ android:taskAffinity="com.android.settings.root"
android:label="@string/settings_label_launcher"
android:launchMode="singleTask"
android:targetActivity="Settings">
@@ -143,8 +143,7 @@
<activity android:name=".SubSettings"
android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings">
- </activity>
+ android:parentActivityName="Settings" />
<activity android:name=".shortcut.CreateShortcut"
android:label="@string/settings_shortcut">
@@ -155,11 +154,12 @@
</activity>
<!-- Wireless Controls -->
- <activity android:name=".Settings$NetworkDashboardActivity"
- android:taskAffinity="com.android.settings"
+ <activity
+ android:name=".Settings$NetworkDashboardActivity"
android:label="@string/network_dashboard_title"
android:icon="@drawable/ic_homepage_network"
- android:parentActivityName="Settings">
+ android:parentActivityName="Settings"
+ android:taskAffinity="com.android.settings">
<intent-filter android:priority="1">
<action android:name="android.settings.WIRELESS_SETTINGS" />
<action android:name="android.settings.AIRPLANE_MODE_SETTINGS" />
@@ -181,15 +181,20 @@
android:value="true" />
</activity>
- <activity android:name=".Settings$ConnectedDeviceDashboardActivity"
- android:taskAffinity="com.android.settings"
+ <activity
+ android:name=".Settings$ConnectedDeviceDashboardActivity"
android:label="@string/connected_devices_dashboard_title"
android:icon="@drawable/ic_homepage_connected_device"
+ android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.NFC_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
+ <intent-filter android:priority="1">
+ <action android:name="android.settings.BLUETOOTH_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
@@ -206,12 +211,13 @@
android:value="true" />
</activity>
- <activity android:name=".Settings$ConnectedDeviceDashboardActivityOld"
- android:enabled="false"
- android:taskAffinity="com.android.settings"
- android:label="@string/connected_devices_dashboard_title"
- android:icon="@drawable/ic_homepage_connected_device"
- android:parentActivityName="Settings">
+ <activity
+ android:name=".Settings$ConnectedDeviceDashboardActivityOld"
+ android:enabled="false"
+ android:label="@string/connected_devices_dashboard_title"
+ android:icon="@drawable/ic_homepage_connected_device"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.NFC_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -253,13 +259,13 @@
</intent-filter>
</activity>
- <!-- Top-level settings -->
-
- <activity android:name="Settings$WifiSettingsActivity"
- android:taskAffinity=""
- android:label="@string/wifi_settings"
- android:icon="@drawable/ic_settings_wireless"
- android:configChanges="orientation|keyboardHidden|screenSize">
+ <activity
+ android:name="Settings$WifiSettingsActivity"
+ android:label="@string/wifi_settings"
+ android:icon="@drawable/ic_settings_wireless"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.WIFI_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -278,21 +284,10 @@
android:value="content://com.android.settings.slices/wifi" />
</activity>
- <!-- Keep compatibility with old shortcuts. -->
- <activity-alias android:name=".wifi.WifiSettings"
- android:taskAffinity="com.android.settings"
- android:label="@string/wifi_settings"
- android:icon="@drawable/ic_settings_wireless"
- android:targetActivity="Settings$WifiSettingsActivity"
- android:configChanges="orientation|keyboardHidden|screenSize"
- android:exported="true">
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.wifi.WifiSettings" />
- </activity-alias>
-
- <activity android:name=".wifi.WifiPickerActivity"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings">
+ <activity
+ android:name=".wifi.WifiPickerActivity"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.net.wifi.PICK_WIFI_NETWORK" />
<category android:name="android.intent.category.DEFAULT" />
@@ -305,12 +300,13 @@
android:value="true" />
</activity>
- <activity android:name="Settings$ConfigureWifiSettingsActivity"
- android:taskAffinity="com.android.settings"
- android:label="@string/wifi_configure_settings_preference_title"
- android:icon="@drawable/ic_settings_wireless"
- android:configChanges="orientation|keyboardHidden|screenSize"
- android:parentActivityName="Settings$WifiSettingsActivity">
+ <activity
+ android:name="Settings$ConfigureWifiSettingsActivity"
+ android:label="@string/wifi_configure_settings_preference_title"
+ android:icon="@drawable/ic_settings_wireless"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.WIFI_IP_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -326,12 +322,13 @@
android:value="true" />
</activity>
- <activity android:name="Settings$SavedAccessPointsSettingsActivity"
- android:taskAffinity="com.android.settings"
- android:label="@string/wifi_saved_access_points_label"
- android:icon="@drawable/ic_settings_wireless"
- android:configChanges="orientation|keyboardHidden|screenSize"
- android:parentActivityName="Settings$WifiSettingsActivity">
+ <activity
+ android:name="Settings$SavedAccessPointsSettingsActivity"
+ android:label="@string/wifi_saved_access_points_label"
+ android:icon="@drawable/ic_settings_wireless"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.WIFI_SAVED_NETWORK_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -346,9 +343,7 @@
android:value="true" />
</activity>
- <activity android:name=".Settings$WifiInfoActivity"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$WifiSettingsActivity">
+ <activity android:name=".Settings$WifiInfoActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
@@ -358,9 +353,7 @@
android:value="com.android.settings.wifi.WifiInfo" />
</activity>
- <activity android:name=".wifi.WifiConfigInfo"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$WifiSettingsActivity">
+ <activity android:name=".wifi.WifiConfigInfo">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
@@ -428,14 +421,13 @@
android:value="com.android.settings.ApnSettings" />
</activity>
- <activity android:name="Settings$BluetoothSettingsActivity"
- android:label="@string/bluetooth_settings_title"
- android:icon="@drawable/ic_settings_bluetooth"
- android:taskAffinity="">
- <intent-filter android:priority="1">
- <action android:name="android.settings.BLUETOOTH_SETTINGS" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
+ <activity
+ android:name="Settings$BluetoothSettingsActivity"
+ android:label="@string/bluetooth_settings_title"
+ android:icon="@drawable/ic_settings_bluetooth"
+ android:enabled="false"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
@@ -446,10 +438,19 @@
android:value="com.android.settings.bluetooth.BluetoothSettings" />
</activity>
+ <!-- Keep compatibility with old shortcuts. -->
+ <activity-alias android:name=".bluetooth.BluetoothSettings"
+ android:label="@string/bluetooth_settings_title"
+ android:targetActivity="Settings$BluetoothSettingsActivity"
+ android:exported="true"
+ android:clearTaskOnLaunch="true">
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.bluetooth.BluetoothSettings" />
+ </activity-alias>
+
<activity android:name="Settings$AssistGestureSettingsActivity"
android:label="@string/assist_gesture_title"
- android:icon="@drawable/ic_settings_gestures"
- android:taskAffinity="">
+ android:icon="@drawable/ic_settings_gestures">
<intent-filter>
<action android:name="android.settings.ASSIST_GESTURE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -458,16 +459,6 @@
android:value="com.android.settings.gestures.AssistGestureSettings" />
</activity>
- <!-- Keep compatibility with old shortcuts. -->
- <activity-alias android:name=".bluetooth.BluetoothSettings"
- android:label="@string/bluetooth_settings_title"
- android:targetActivity="Settings$BluetoothSettingsActivity"
- android:exported="true"
- android:clearTaskOnLaunch="true">
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.bluetooth.BluetoothSettings" />
- </activity-alias>
-
<activity android:name=".bluetooth.DevicePickerActivity"
android:label="@string/device_picker"
android:clearTaskOnLaunch="true">
@@ -492,10 +483,12 @@
</intent-filter>
</activity>
- <activity android:name="Settings$TetherSettingsActivity"
- android:label="@string/tether_settings_title_all"
- android:icon="@drawable/ic_settings_wireless"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$TetherSettingsActivity"
+ android:label="@string/tether_settings_title_all"
+ android:icon="@drawable/ic_settings_wireless"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
@@ -517,8 +510,8 @@
</activity-alias>
<activity android:name="Settings$WifiP2pSettingsActivity"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$WifiSettingsActivity">
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
@@ -528,11 +521,12 @@
android:value="com.android.settings.wifi.p2p.WifiP2pSettings" />
</activity>
-
- <activity android:name="Settings$VpnSettingsActivity"
- android:label="@string/vpn_settings_title"
- android:icon="@drawable/ic_settings_wireless"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$VpnSettingsActivity"
+ android:label="@string/vpn_settings_title"
+ android:icon="@drawable/ic_settings_wireless"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.VPN_SETTINGS" />
<action android:name="android.net.vpn.SETTINGS" />
@@ -550,10 +544,12 @@
android:value="true" />
</activity>
- <activity android:name="Settings$DateTimeSettingsActivity"
- android:label="@string/date_and_time"
- android:icon="@drawable/ic_settings_date_time"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$DateTimeSettingsActivity"
+ android:label="@string/date_and_time"
+ android:icon="@drawable/ic_settings_date_time"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.DATE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -575,11 +571,12 @@
android:value="true" />
</activity>
- <activity android:name="Settings$LocalePickerActivity"
- android:label="@string/language_picker_title"
- android:icon="@drawable/ic_settings_language"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$LanguageAndInputSettingsActivity">
+ <activity
+ android:name="Settings$LocalePickerActivity"
+ android:label="@string/language_picker_title"
+ android:icon="@drawable/ic_settings_language"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings$LanguageAndInputSettingsActivity">
<intent-filter android:priority="1">
<action android:name="android.settings.LOCALE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -595,11 +592,12 @@
android:value="true" />
</activity>
- <activity android:name=".Settings$LanguageAndInputSettingsActivity"
+ <activity
+ android:name=".Settings$LanguageAndInputSettingsActivity"
android:label="@string/language_settings"
android:icon="@drawable/ic_settings_language"
android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$SystemDashboardActivity">
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
@@ -628,10 +626,11 @@
android:value="true" />
</activity>
- <activity android:name="Settings$ManageAssistActivity"
- android:label="@string/assist_and_voice_input_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$ManageApplicationsActivity">
+ <activity
+ android:name="Settings$ManageAssistActivity"
+ android:label="@string/assist_and_voice_input_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.VOICE_INPUT_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -680,10 +679,11 @@
android:value="com.android.settings.language.LanguageAndInputSettings" />
</activity-alias>
- <activity android:name="Settings$SpellCheckersSettingsActivity"
- android:label="@string/spellcheckers_settings_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$LanguageAndInputSettingsActivity">
+ <activity
+ android:name="Settings$SpellCheckersSettingsActivity"
+ android:label="@string/spellcheckers_settings_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
@@ -709,10 +709,11 @@
android:value="true" />
</activity>
- <activity android:name="Settings$UserDictionarySettingsActivity"
- android:label="@string/user_dict_settings_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$LanguageAndInputSettingsActivity">
+ <activity
+ android:name="Settings$UserDictionarySettingsActivity"
+ android:label="@string/user_dict_settings_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.USER_DICTIONARY_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -751,11 +752,13 @@
android:value="com.android.settings.UserDictionarySettings" />
</activity-alias>
- <activity android:name="Settings$ZenModeSettingsActivity"
- android:label="@string/zen_mode_settings_title"
- android:icon="@drawable/ic_settings_notifications"
- android:exported="true"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$ZenModeSettingsActivity"
+ android:label="@string/zen_mode_settings_title"
+ android:icon="@drawable/ic_settings_notifications"
+ android:exported="true"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -771,11 +774,13 @@
android:value="true" />
</activity>
- <activity android:name="Settings$ZenModeBehaviorSettingsActivity"
- android:label="@string/zen_mode_behavior_settings_title"
- android:icon="@drawable/ic_settings_notifications"
- android:exported="true"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$ZenModeBehaviorSettingsActivity"
+ android:label="@string/zen_mode_behavior_settings_title"
+ android:icon="@drawable/ic_settings_notifications"
+ android:exported="true"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_PRIORITY_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -786,11 +791,13 @@
android:value="true" />
</activity>
- <activity android:name="Settings$ZenModeAutomationSettingsActivity"
- android:label="@string/zen_mode_automation_settings_title"
- android:icon="@drawable/ic_settings_notifications"
- android:exported="true"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$ZenModeAutomationSettingsActivity"
+ android:label="@string/zen_mode_automation_settings_title"
+ android:icon="@drawable/ic_settings_notifications"
+ android:exported="true"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_AUTOMATION_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -807,8 +814,7 @@
<activity android:name="Settings$WallpaperSettingsActivity"
android:label="@string/wallpaper_settings_fragment_title"
- android:icon="@drawable/ic_wallpaper"
- android:taskAffinity="">
+ android:icon="@drawable/ic_wallpaper">
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.wallpaper.WallpaperTypeSettings" />
</activity>
@@ -850,9 +856,11 @@
android:resource="@string/new_device_suggestion_summary" />
</activity>
- <activity android:name="Settings$ZenModeScheduleRuleSettingsActivity"
- android:exported="true"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$ZenModeScheduleRuleSettingsActivity"
+ android:exported="true"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_SCHEDULE_RULE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -867,9 +875,11 @@
android:value="true" />
</activity>
- <activity android:name="Settings$ZenModeEventRuleSettingsActivity"
- android:exported="true"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$ZenModeEventRuleSettingsActivity"
+ android:exported="true"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_EVENT_RULE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -884,9 +894,11 @@
android:value="true" />
</activity>
- <activity android:name="Settings$ZenModeExternalRuleSettingsActivity"
- android:exported="true"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$ZenModeExternalRuleSettingsActivity"
+ android:exported="true"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_EXTERNAL_RULE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -901,10 +913,12 @@
android:value="true" />
</activity>
- <activity android:name="Settings$DisplaySettingsActivity"
- android:label="@string/display_settings"
- android:icon="@drawable/ic_homepage_display"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$DisplaySettingsActivity"
+ android:label="@string/display_settings"
+ android:icon="@drawable/ic_homepage_display"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="com.android.settings.DISPLAY_SETTINGS" />
<action android:name="android.settings.DISPLAY_SETTINGS" />
@@ -938,11 +952,13 @@
android:value="com.android.settings.DisplaySettings" />
</activity-alias>
- <activity android:name="Settings$NightDisplaySettingsActivity"
- android:label="@string/night_display_title"
- android:enabled="@*android:bool/config_nightDisplayAvailable"
- android:icon="@drawable/ic_settings_night_display"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$NightDisplaySettingsActivity"
+ android:label="@string/night_display_title"
+ android:enabled="@*android:bool/config_nightDisplayAvailable"
+ android:icon="@drawable/ic_settings_night_display"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
@@ -958,9 +974,9 @@
android:value="true" />
</activity>
- <activity android:name="Settings$NightDisplaySuggestionActivity"
+ <activity
+ android:name="Settings$NightDisplaySuggestionActivity"
android:enabled="@*android:bool/config_nightDisplayAvailable"
- android:taskAffinity=""
android:icon="@drawable/ic_settings_night_display">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -978,11 +994,13 @@
android:value="com.android.settings.display.NightDisplaySettings" />
</activity>
- <activity android:name="Settings$DeviceInfoSettingsActivity"
- android:label="@string/device_info_settings"
- android:icon="@drawable/ic_settings_about"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings">
+ <activity
+ android:name="Settings$DeviceInfoSettingsActivity"
+ android:label="@string/device_info_settings"
+ android:icon="@drawable/ic_settings_about"
+ android:taskAffinity="com.android.settings"
+ android:enabled="false"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.DEVICE_INFO_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1005,7 +1023,6 @@
android:value="true" />
</activity>
-
<activity android:name=".Settings$MyDeviceInfoActivity"
android:label="@string/device_info_settings"
android:icon="@drawable/ic_settings_about"
@@ -1034,10 +1051,12 @@
android:value="true" />
</activity>
- <activity android:name="SettingsLicenseActivity"
- android:label="@string/settings_license_activity_title"
- android:theme="@android:style/Theme.DeviceDefault.Light.Panel"
- android:configChanges="orientation|screenSize">
+ <activity
+ android:name="SettingsLicenseActivity"
+ android:label="@string/settings_license_activity_title"
+ android:configChanges="orientation|screenSize"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.LICENSE" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1046,9 +1065,11 @@
android:value="true" />
</activity>
- <activity android:name="Settings$ManageApplicationsActivity"
- android:label="@string/applications_settings"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$ManageApplicationsActivity"
+ android:label="@string/applications_settings"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.APPLICATION_SETTINGS" />
<action android:name="android.settings.MANAGE_APPLICATIONS_SETTINGS" />
@@ -1067,10 +1088,20 @@
android:value="true" />
</activity>
- <activity android:name="Settings$ManageDomainUrlsActivity"
- android:taskAffinity="com.android.settings"
- android:label="@string/domain_urls_title"
- android:icon="@drawable/ic_settings_memory">
+ <!-- Keep compatibility with old shortcuts. -->
+ <activity-alias android:name=".applications.ManageApplications"
+ android:label="@string/applications_settings"
+ android:exported="true"
+ android:targetActivity="Settings$ManageApplicationsActivity">
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.applications.manageapplications.ManageApplications" />
+ </activity-alias>
+
+ <activity
+ android:name="Settings$ManageDomainUrlsActivity"
+ android:label="@string/domain_urls_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.settings.MANAGE_DOMAIN_URLS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1081,8 +1112,7 @@
<activity android:name="Settings$MemorySettingsActivity"
android:label="@string/memory_settings_title"
- android:icon="@drawable/ic_settings_memory"
- android:taskAffinity="">
+ android:icon="@drawable/ic_settings_memory">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.android.settings.SHORTCUT" />
@@ -1102,9 +1132,11 @@
android:value="com.android.settings.applications.ProcessStatsUi" />
</activity>
- <activity android:name="Settings$HighPowerApplicationsActivity"
- android:label="@string/high_power_apps"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$HighPowerApplicationsActivity"
+ android:label="@string/high_power_apps"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1115,9 +1147,9 @@
android:value="true" />
</activity>
- <activity android:name=".datausage.AppDataUsageActivity"
- android:taskAffinity=""
- android:noHistory="true">
+ <activity
+ android:name=".datausage.AppDataUsageActivity"
+ android:noHistory="true">
<intent-filter android:priority="1">
<action android:name="android.settings.IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1125,10 +1157,10 @@
</intent-filter>
</activity>
- <activity android:name=".fuelgauge.RequestIgnoreBatteryOptimizations"
- android:label="@string/high_power_apps"
- android:taskAffinity=""
- android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert">
+ <activity
+ android:name=".fuelgauge.RequestIgnoreBatteryOptimizations"
+ android:label="@string/high_power_apps"
+ android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert">
<intent-filter android:priority="1">
<action android:name="android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1136,15 +1168,6 @@
</intent-filter>
</activity>
- <!-- Keep compatibility with old shortcuts. -->
- <activity-alias android:name=".applications.ManageApplications"
- android:label="@string/applications_settings"
- android:exported="true"
- android:targetActivity="Settings$ManageApplicationsActivity">
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.applications.manageapplications.ManageApplications" />
- </activity-alias>
-
<!-- Provide direct entry into manage apps showing running services.
This is for compatibility with old shortcuts. -->
<activity-alias android:name=".RunningServices"
@@ -1170,10 +1193,7 @@
InstalledAppDetails. -->
<activity android:name=".applications.InstalledAppDetailsTop"
android:label="@string/application_info_label"
- android:exported="true"
- android:taskAffinity=""
- android:parentActivityName="Settings$ManageApplicationsActivity">
- </activity>
+ android:exported="true" />
<!-- Keep compatibility with old shortcuts. -->
<activity-alias android:name=".applications.InstalledAppDetails"
@@ -1205,10 +1225,11 @@
</activity>
<!-- Provide direct entry into manage apps showing storage usage of apps. -->
- <activity android:name="Settings$StorageUseActivity"
- android:label="@string/storageuse_settings_title"
- android:taskAffinity=""
- android:parentActivityName="Settings">
+ <activity
+ android:name="Settings$StorageUseActivity"
+ android:label="@string/storageuse_settings_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.intent.action.MANAGE_PACKAGE_STORAGE" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1225,9 +1246,11 @@
android:value="true" />
</activity>
- <activity android:name="Settings$NotificationStationActivity"
- android:label="@string/notification_log_title"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$NotificationStationActivity"
+ android:label="@string/notification_log_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1249,7 +1272,6 @@
<activity android:name="Settings$BackgroundCheckSummaryActivity"
android:label="@string/background_check_title"
- android:taskAffinity=""
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -1259,11 +1281,13 @@
android:value="com.android.settings.applications.BackgroundCheckSummary" />
</activity>
- <activity android:name="Settings$LocationSettingsActivity"
- android:label="@string/location_settings_title"
- android:icon="@drawable/ic_settings_location"
- android:configChanges="orientation|keyboardHidden|screenSize"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$LocationSettingsActivity"
+ android:label="@string/location_settings_title"
+ android:icon="@drawable/ic_settings_location"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.LOCATION_SOURCE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1280,12 +1304,13 @@
android:value="true" />
</activity>
- <activity android:name=".Settings$SecurityDashboardActivity"
- android:label="@string/security_settings_title"
- android:icon="@drawable/ic_homepage_security"
- android:configChanges="orientation|keyboardHidden|screenSize"
- android:taskAffinity=""
- android:parentActivityName="Settings">
+ <activity
+ android:name=".Settings$SecurityDashboardActivity"
+ android:label="@string/security_settings_title"
+ android:icon="@drawable/ic_homepage_security"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.SECURITY_SETTINGS" />
<action android:name="android.credentials.UNLOCK" />
@@ -1322,10 +1347,12 @@
</intent-filter>
</activity>
- <activity android:name="Settings$TrustedCredentialsSettingsActivity"
- android:label="@string/trusted_credentials"
- android:icon="@drawable/ic_settings_security"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$TrustedCredentialsSettingsActivity"
+ android:label="@string/trusted_credentials"
+ android:icon="@drawable/ic_settings_security"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="com.android.settings.TRUSTED_CREDENTIALS" />
<action android:name="com.android.settings.TRUSTED_CREDENTIALS_USER" />
@@ -1356,8 +1383,7 @@
<activity android:name="SetFullBackupPassword"
android:label="@string/local_backup_password_title"
- android:exported="false">
- </activity>
+ android:exported="false" />
<activity android:name="CredentialStorage"
android:theme="@style/Transparent"
@@ -1371,10 +1397,11 @@
</intent-filter>
</activity>
- <activity android:name="Settings$DeviceAdminSettingsActivity"
- android:label="@string/device_admin_settings_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName=".Settings$SecurityDashboardActivity">
+ <activity
+ android:name="Settings$DeviceAdminSettingsActivity"
+ android:label="@string/device_admin_settings_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1402,10 +1429,20 @@
</intent-filter>
</activity>
- <activity android:name="Settings$UsageAccessSettingsActivity"
- android:label="@string/usage_access_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName=".Settings$SecurityDashboardActivity">
+ <activity-alias android:name="SetProfileOwner"
+ android:label="@string/profile_owner_add_title"
+ android:targetActivity="DeviceAdminAdd">
+ <intent-filter android:priority="1000">
+ <action android:name="android.app.action.SET_PROFILE_OWNER" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity-alias>
+
+ <activity
+ android:name="Settings$UsageAccessSettingsActivity"
+ android:label="@string/usage_access_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.USAGE_ACCESS_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1418,15 +1455,6 @@
android:value="com.android.settings.applications.manageapplications.ManageApplications" />
</activity>
- <activity-alias android:name="SetProfileOwner"
- android:label="@string/profile_owner_add_title"
- android:targetActivity="DeviceAdminAdd">
- <intent-filter android:priority="1000">
- <action android:name="android.app.action.SET_PROFILE_OWNER" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity-alias>
-
<activity android:name="Settings$IccLockSettingsActivity"
android:label="@string/sim_lock_settings"
android:process="com.android.phone">
@@ -1439,11 +1467,13 @@
android:value="com.android.settings.IccLockSettings" />
</activity>
- <activity android:name="Settings$AccessibilitySettingsActivity"
- android:label="@string/accessibility_settings"
- android:icon="@drawable/ic_homepage_accessibility"
- android:configChanges="orientation|keyboardHidden|screenSize"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$AccessibilitySettingsActivity"
+ android:label="@string/accessibility_settings"
+ android:icon="@drawable/ic_homepage_accessibility"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ACCESSIBILITY_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1490,10 +1520,11 @@
android:value="true" />
</activity>
- <activity android:name="Settings$AccessibilityDaltonizerSettingsActivity"
- android:label="@string/accessibility_display_daltonizer_preference_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$AccessibilitySettingsActivity">
+ <activity
+ android:name="Settings$AccessibilityDaltonizerSettingsActivity"
+ android:label="@string/accessibility_display_daltonizer_preference_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="com.android.settings.ACCESSIBILITY_COLOR_SPACE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1508,10 +1539,11 @@
android:value="true" />
</activity>
- <activity android:name="Settings$CaptioningSettingsActivity"
- android:label="@string/accessibility_captioning_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$AccessibilitySettingsActivity">
+ <activity
+ android:name="Settings$CaptioningSettingsActivity"
+ android:label="@string/accessibility_captioning_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.CAPTIONING_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1526,10 +1558,11 @@
android:value="true" />
</activity>
- <activity android:name="Settings$TextToSpeechSettingsActivity"
- android:label="@string/tts_settings"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$LanguageAndInputSettingsActivity">
+ <activity
+ android:name="Settings$TextToSpeechSettingsActivity"
+ android:label="@string/tts_settings"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="com.android.settings.TTS_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1540,10 +1573,11 @@
android:value="true" />
</activity>
- <activity android:name="Settings$EnterprisePrivacySettingsActivity"
- android:label="@string/enterprise_privacy_settings"
- android:taskAffinity="com.android.settings"
- android:parentActivityName=".Settings$SecurityDashboardActivity">
+ <activity
+ android:name="Settings$EnterprisePrivacySettingsActivity"
+ android:label="@string/enterprise_privacy_settings"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.settings.ENTERPRISE_PRIVACY_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1552,8 +1586,6 @@
android:value="com.android.settings.enterprise.EnterprisePrivacySettings" />
</activity>
- <!-- Second and third-level settings -->
-
<!-- Lock screen settings -->
<activity android:name=".password.ConfirmDeviceCredentialActivity"
android:exported="true"
@@ -1769,11 +1801,12 @@
<activity android:name=".EncryptionInterstitial"
android:theme="@style/GlifTheme.Light" />
- <activity android:name=".Settings$StorageDashboardActivity"
- android:label="@string/storage_settings"
- android:icon="@drawable/ic_homepage_storage"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings">
+ <activity
+ android:name=".Settings$StorageDashboardActivity"
+ android:label="@string/storage_settings"
+ android:icon="@drawable/ic_homepage_storage"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.INTERNAL_STORAGE_SETTINGS" />
<action android:name="android.settings.MEMORY_CARD_SETTINGS" />
@@ -1797,18 +1830,18 @@
android:value="true" />
</activity>
- <activity android:name="Settings$PrivateVolumeSettingsActivity"
- android:label="@string/storage_settings_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$StorageDashboardActivity">
+ <activity
+ android:name="Settings$PrivateVolumeSettingsActivity"
+ android:label="@string/storage_settings_title">
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.deviceinfo.PrivateVolumeSettings" />
+ android:value="com.android.settings.deviceinfo.PrivateVolumeSettings" />
</activity>
- <activity android:name="Settings$PublicVolumeSettingsActivity"
- android:label="@string/storage_settings_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$StorageDashboardActivity">
+ <activity
+ android:name="Settings$PublicVolumeSettingsActivity"
+ android:label="@string/storage_settings_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.provider.action.DOCUMENT_ROOT_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1821,12 +1854,11 @@
android:value="com.android.settings.deviceinfo.PublicVolumeSettings" />
</activity>
- <activity android:name="Settings$PrivateVolumeForgetActivity"
- android:label="@string/storage_settings_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$StorageDashboardActivity"
- android:exported="true"
- android:permission="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">
+ <activity
+ android:name="Settings$PrivateVolumeForgetActivity"
+ android:label="@string/storage_settings_title"
+ android:exported="true"
+ android:permission="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.deviceinfo.PrivateVolumeForget" />
</activity>
@@ -1898,12 +1930,13 @@
android:value="com.android.settings.ApnEditor" />
</activity>
- <activity android:name="Settings$DevelopmentSettingsDashboardActivity"
- android:label="@string/development_settings_title"
- android:icon="@drawable/ic_settings_development"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings"
- android:enabled="false">
+ <activity
+ android:name="Settings$DevelopmentSettingsDashboardActivity"
+ android:label="@string/development_settings_title"
+ android:icon="@drawable/ic_settings_development"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings"
+ android:enabled="false">
<intent-filter android:priority="1">
<action android:name="android.settings.APPLICATION_DEVELOPMENT_SETTINGS" />
<action android:name="com.android.settings.APPLICATION_DEVELOPMENT_SETTINGS" />
@@ -1936,11 +1969,12 @@
</intent-filter>
</activity>
- <activity android:name="Settings$PrintSettingsActivity"
- android:label="@string/print_settings"
- android:icon="@drawable/ic_settings_print"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings">
+ <activity
+ android:name="Settings$PrintSettingsActivity"
+ android:label="@string/print_settings"
+ android:icon="@drawable/ic_settings_print"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ACTION_PRINT_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1977,10 +2011,7 @@
android:theme="@android:style/Theme.DeviceDefault.Light.Dialog" />
<activity android:name="Settings$WebViewAppPickerActivity"
- android:label="@string/select_webview_provider_dialog_title">
- </activity>
-
- <!-- Bluetooth stuff -->
+ android:label="@string/select_webview_provider_dialog_title" />
<activity android:name=".bluetooth.BluetoothPairingDialog"
android:excludeFromRecents="true"
@@ -2085,10 +2116,11 @@
</activity>
<!-- NFC settings -->
- <activity android:name="Settings$AndroidBeamSettingsActivity"
- android:label="@string/android_beam_settings_title"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings$ConnectedDeviceDashboardActivity">
+ <activity
+ android:name="Settings$AndroidBeamSettingsActivity"
+ android:label="@string/android_beam_settings_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.NFCSHARING_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2103,10 +2135,12 @@
android:value="true" />
</activity>
- <activity android:name="Settings$WifiDisplaySettingsActivity"
- android:label="@string/wifi_display_settings_title"
- android:icon="@drawable/ic_cast_24dp"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$WifiDisplaySettingsActivity"
+ android:label="@string/wifi_display_settings_title"
+ android:icon="@drawable/ic_cast_24dp"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.CAST_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2124,17 +2158,9 @@
android:value="com.android.settings.wfd.WifiDisplaySettings" />
</activity>
- <activity android:name="Display" android:label="@string/display_label"
- android:configChanges="fontScale"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
- </intent-filter>
- </activity>
-
- <activity android:name="RadioInfo" android:label="@string/phone_info_label"
+ <activity
+ android:name="RadioInfo"
+ android:label="@string/phone_info_label"
android:process="com.android.phone">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -2190,7 +2216,8 @@
</intent-filter>
</activity>
- <activity android:name="UsageStatsActivity" android:label="@string/usage_stats_label"
+ <activity android:name="UsageStatsActivity"
+ android:label="@string/usage_stats_label"
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
<intent-filter>
@@ -2199,10 +2226,13 @@
</intent-filter>
</activity>
- <activity android:name="Settings$PowerUsageSummaryActivity"
- android:label="@string/power_usage_summary_title"
- android:icon="@drawable/ic_homepage_battery"
- android:enabled="false">
+ <activity
+ android:name="Settings$PowerUsageSummaryActivity"
+ android:label="@string/power_usage_summary_title"
+ android:icon="@drawable/ic_homepage_battery"
+ android:enabled="false"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.intent.action.POWER_USAGE_SUMMARY" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2221,18 +2251,11 @@
android:value="com.android.settings.fuelgauge.PowerUsageSummary" />
</activity>
- <!-- Keep compatibility with old shortcuts. -->
- <activity-alias android:name=".fuelgauge.PowerUsageSummary"
- android:label="@string/power_usage_summary_title"
- android:exported="true"
- android:targetActivity="Settings$PowerUsageSummaryActivity">
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.fuelgauge.PowerUsageSummary" />
- </activity-alias>
-
<activity android:name=".Settings$PowerUsageSummaryLegacyActivity"
android:label="@string/power_usage_summary_title"
- android:icon="@drawable/ic_homepage_battery">
+ android:icon="@drawable/ic_homepage_battery"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.POWER_USAGE_SUMMARY" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2246,10 +2269,12 @@
android:value="com.android.settings.fuelgauge.PowerUsageSummaryLegacy" />
</activity>
- <activity android:name="Settings$BatterySaverSettingsActivity"
- android:label="@string/battery_saver"
- android:icon="@drawable/ic_settings_battery"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$BatterySaverSettingsActivity"
+ android:label="@string/battery_saver"
+ android:icon="@drawable/ic_settings_battery"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.BATTERY_SAVER_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2271,9 +2296,10 @@
</intent-filter>
</activity>
- <activity android:name="Settings$AccountSyncSettingsActivity"
+ <activity
+ android:name="Settings$AccountSyncSettingsActivity"
android:label="@string/account_sync_settings_title"
- android:taskAffinity=""
+ android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ACCOUNT_SYNC_SETTINGS" />
@@ -2288,9 +2314,10 @@
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
- <activity android:name="Settings$ManagedProfileSettingsActivity"
+ <activity
+ android:name="Settings$ManagedProfileSettingsActivity"
android:label="@string/managed_profile_settings_title"
- android:taskAffinity=""
+ android:taskAffinity="com.android.settings"
android:parentActivityName="Settings"
android:permission="android.permission.MANAGE_USERS">
<intent-filter android:priority="1">
@@ -2301,12 +2328,13 @@
android:value="com.android.settings.accounts.ManagedProfileSettings" />
</activity>
- <activity android:name="com.android.settings.accounts.AddAccountSettings"
+ <activity
+ android:name="com.android.settings.accounts.AddAccountSettings"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/header_add_an_account"
android:taskAffinity="com.android.settings"
- android:parentActivityName=".Settings$AccountDashboardActivity">
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ADD_ACCOUNT_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2383,33 +2411,14 @@
android:value="com.android.settings.security.CryptKeeperSettings" />
</activity>
- <activity android:name="Settings$DataPlanUsageSummaryActivity"
- android:label="@string/data_usage_summary_title"
- android:icon="@drawable/ic_settings_data_usage"
- android:taskAffinity="">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="com.android.settings.SHORTCUT" />
- </intent-filter>
- <intent-filter android:priority="10">
- <action android:name="com.android.settings.action.SETTINGS" />
- </intent-filter>
- <meta-data android:name="com.android.settings.category"
- android:value="com.android.settings.category.ia.wireless" />
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.datausage.DataPlanUsageSummary" />
- </activity>
-
- <activity android:name="Settings$DataUsageSummaryActivity"
- android:label="@string/data_usage_summary_title"
- android:icon="@drawable/ic_settings_data_usage"
- android:taskAffinity="">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="com.android.settings.SHORTCUT" />
- </intent-filter>
+ <activity
+ android:name="Settings$DataUsageSummaryActivity"
+ android:label="@string/data_usage_summary_title"
+ android:icon="@drawable/ic_settings_data_usage"
+ android:enabled="false"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
+ <!-- TODO(b/70950124): add shortcut intent-filter -->
<intent-filter android:priority="10">
<action android:name="com.android.settings.action.SETTINGS" />
</intent-filter>
@@ -2419,9 +2428,31 @@
android:value="com.android.settings.datausage.DataUsageSummary" />
</activity>
- <activity android:name="Settings$MobileDataUsageListActivity"
- android:label="@string/cellular_data_usage"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$DataUsageSummaryLegacyActivity"
+ android:label="@string/data_usage_summary_title"
+ android:icon="@drawable/ic_settings_data_usage"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="com.android.settings.SHORTCUT" />
+ </intent-filter>
+ <intent-filter android:priority="10">
+ <action android:name="com.android.settings.action.SETTINGS" />
+ </intent-filter>
+ <meta-data android:name="com.android.settings.category"
+ android:value="com.android.settings.category.ia.wireless" />
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.datausage.DataUsageSummaryLegacy" />
+ </activity>
+
+ <activity
+ android:name="Settings$MobileDataUsageListActivity"
+ android:label="@string/cellular_data_usage"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.MOBILE_DATA_USAGE" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2430,10 +2461,12 @@
android:value="com.android.settings.datausage.DataUsageList" />
</activity>
- <activity android:name="Settings$DreamSettingsActivity"
- android:label="@string/screensaver_settings_title"
- android:icon="@drawable/ic_settings_display"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$DreamSettingsActivity"
+ android:label="@string/screensaver_settings_title"
+ android:icon="@drawable/ic_settings_display"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.DREAM_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2449,10 +2482,12 @@
android:value="true" />
</activity>
- <activity android:name="Settings$UserSettingsActivity"
- android:label="@string/user_settings_title"
- android:icon="@drawable/ic_settings_multiuser"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$UserSettingsActivity"
+ android:label="@string/user_settings_title"
+ android:icon="@drawable/ic_settings_multiuser"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.USER_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2472,10 +2507,12 @@
android:value="true" />
</activity>
- <activity android:name="Settings$PaymentSettingsActivity"
- android:label="@string/nfc_payment_settings_title"
- android:icon="@drawable/ic_settings_nfc_payment"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$PaymentSettingsActivity"
+ android:label="@string/nfc_payment_settings_title"
+ android:icon="@drawable/ic_settings_nfc_payment"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.NFC_PAYMENT_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2504,7 +2541,7 @@
<activity android:name=".nfc.HowItWorks"
android:label="@string/nfc_payment_settings_title"
- android:parentActivityName="Settings$PaymentSettingsActivity">
+ android:parentActivityName="Settings$PaymentSettingsActivity"
android:excludeFromRecents="true">
</activity>
@@ -2518,9 +2555,11 @@
</intent-filter>
</activity>
- <activity android:name="Settings$NotificationAccessSettingsActivity"
- android:label="@string/manage_notification_access_title"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$NotificationAccessSettingsActivity"
+ android:label="@string/manage_notification_access_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2533,9 +2572,11 @@
android:value="com.android.settings.notification.NotificationAccessSettings" />
</activity>
- <activity android:name="Settings$VrListenersSettingsActivity"
- android:label="@string/vr_listeners_title"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$VrListenersSettingsActivity"
+ android:label="@string/vr_listeners_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.VR_LISTENER_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2548,9 +2589,11 @@
android:value="com.android.settings.applications.VrListenerSettings" />
</activity>
- <activity android:name="Settings$PictureInPictureSettingsActivity"
+ <activity
+ android:name="Settings$PictureInPictureSettingsActivity"
android:label="@string/picture_in_picture_title"
- android:taskAffinity="">
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.PICTURE_IN_PICTURE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2563,9 +2606,11 @@
android:value="com.android.settings.applications.appinfo.PictureInPictureSettings" />
</activity>
- <activity android:name="Settings$AppPictureInPictureSettingsActivity"
+ <activity
+ android:name="Settings$AppPictureInPictureSettingsActivity"
android:label="@string/picture_in_picture_title"
- android:taskAffinity="">
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.settings.PICTURE_IN_PICTURE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2575,9 +2620,11 @@
android:value="com.android.settings.applications.appinfo.PictureInPictureDetails" />
</activity>
- <activity android:name="Settings$ZenAccessSettingsActivity"
- android:label="@string/manage_zen_access_title"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$ZenAccessSettingsActivity"
+ android:label="@string/manage_zen_access_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2590,10 +2637,12 @@
android:value="com.android.settings.notification.ZenAccessSettings" />
</activity>
- <activity android:name="Settings$ConfigureNotificationSettingsActivity"
- android:label="@string/configure_notification_settings"
- android:exported="true"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$ConfigureNotificationSettingsActivity"
+ android:label="@string/configure_notification_settings"
+ android:exported="true"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.NOTIFICATION_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2615,11 +2664,13 @@
</activity>
<!-- Keep compatibility with old shortcuts. -->
- <activity android:name="Settings$SoundSettingsActivity"
- android:label="@string/sound_settings"
- android:icon="@drawable/ic_homepage_sound"
- android:taskAffinity=""
- android:exported="true">
+ <activity
+ android:name="Settings$SoundSettingsActivity"
+ android:label="@string/sound_settings"
+ android:icon="@drawable/ic_homepage_sound"
+ android:exported="true"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="com.android.settings.SOUND_SETTINGS" />
<action android:name="android.settings.SOUND_SETTINGS" />
@@ -2645,15 +2696,6 @@
android:resource="@string/sound_dashboard_summary"/>
</activity>
- <!-- Keep compatibility with old shortcuts. -->
- <activity-alias android:name="SoundSettings"
- android:label="@string/sound_settings"
- android:exported="true"
- android:targetActivity="Settings$SoundSettingsActivity">
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.notification.SoundSettings" />
- </activity-alias>
-
<!-- Show application-level notification settings (app passed in as extras) -->
<activity android:name="Settings$AppNotificationSettingsActivity"
android:exported="true">
@@ -2680,7 +2722,6 @@
android:value="com.android.settings.notification.ChannelGroupNotificationSettings" />
</activity>
-
<!-- Show channel-level notification settings (channel passed in as extras) -->
<activity android:name="Settings$ChannelNotificationSettingsActivity"
android:exported="true">
@@ -2697,10 +2738,12 @@
</activity>
<!-- Show Manual (from settings item) -->
- <activity android:name="ManualDisplayActivity"
- android:label="@string/manual"
- android:taskAffinity=""
- android:enabled="@bool/config_show_manual">
+ <activity
+ android:name="ManualDisplayActivity"
+ android:label="@string/manual"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings"
+ android:enabled="@bool/config_show_manual">
<intent-filter>
<action android:name="android.settings.SHOW_MANUAL" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2710,10 +2753,12 @@
</activity>
<!-- Show regulatory info (from settings item or dialing "*#07#") -->
- <activity android:name="RegulatoryInfoDisplayActivity"
- android:label="@string/regulatory_labels"
- android:taskAffinity=""
- android:enabled="@bool/config_show_regulatory_info">
+ <activity
+ android:name="RegulatoryInfoDisplayActivity"
+ android:label="@string/regulatory_labels"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings"
+ android:enabled="@bool/config_show_regulatory_info">
<intent-filter>
<action android:name="android.settings.SHOW_REGULATORY_INFO" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2772,10 +2817,12 @@
android:resource="@xml/file_paths" />
</provider>
- <activity android:name="Settings$SimSettingsActivity"
- android:label="@string/sim_settings_title"
- android:icon="@drawable/ic_settings_sim"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$SimSettingsActivity"
+ android:label="@string/sim_settings_title"
+ android:icon="@drawable/ic_settings_sim"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="com.android.settings.sim.SIM_SUB_INFO_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2797,11 +2844,11 @@
<activity android:name=".sim.SimPreferenceDialog"
android:theme="@*android:style/Theme.DeviceDefault.Settings.Dialog.NoActionBar"
- android:excludeFromRecents="true">
- </activity>
+ android:excludeFromRecents="true" />
- <activity android:name=".wifi.RequestToggleWiFiActivity"
- android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.Alert"
+ <activity
+ android:name=".wifi.RequestToggleWiFiActivity"
+ android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.Alert"
android:excludeFromRecents="true"
android:permission="android.permission.CHANGE_WIFI_STATE">
<intent-filter>
@@ -2811,7 +2858,8 @@
</intent-filter>
</activity>
- <activity android:name=".wifi.WifiDialogActivity"
+ <activity
+ android:name=".wifi.WifiDialogActivity"
android:label=""
android:theme="@style/Transparent"
android:excludeFromRecents="true"
@@ -2833,9 +2881,11 @@
</intent-filter>
</activity>
- <activity android:name="Settings$WifiCallingSettingsActivity"
- android:label="@string/wifi_calling_settings_title"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$WifiCallingSettingsActivity"
+ android:label="@string/wifi_calling_settings_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.settings.WIFI_CALLING_SETTINGS" />
@@ -2850,8 +2900,7 @@
<activity android:name=".wifi.WifiCallingSuggestionActivity"
android:label="@string/wifi_calling_settings_title"
- android:icon="@drawable/ic_settings_wireless"
- android:taskAffinity="">
+ android:icon="@drawable/ic_settings_wireless">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.android.settings.suggested.category.FIRST_IMPRESSION" />
@@ -2887,9 +2936,11 @@
</intent-filter>
</provider>
- <activity android:name="Settings$OverlaySettingsActivity"
- android:label="@string/draw_overlay"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$OverlaySettingsActivity"
+ android:label="@string/draw_overlay"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.action.MANAGE_OVERLAY_PERMISSION" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2898,9 +2949,11 @@
android:value="com.android.settings.applications.manageapplications.ManageApplications" />
</activity>
- <activity android:name="Settings$AppDrawOverlaySettingsActivity"
- android:label="@string/draw_overlay"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$AppDrawOverlaySettingsActivity"
+ android:label="@string/draw_overlay"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.action.MANAGE_OVERLAY_PERMISSION" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2910,9 +2963,11 @@
android:value="com.android.settings.applications.appinfo.DrawOverlayDetails" />
</activity>
- <activity android:name="Settings$WriteSettingsActivity"
- android:label="@string/write_settings_title"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$WriteSettingsActivity"
+ android:label="@string/write_settings_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.action.MANAGE_WRITE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2921,10 +2976,11 @@
android:value="com.android.settings.applications.manageapplications.ManageApplications" />
</activity>
-
- <activity android:name="Settings$AppWriteSettingsActivity"
- android:label="@string/write_settings_title"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$AppWriteSettingsActivity"
+ android:label="@string/write_settings_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.action.MANAGE_WRITE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2934,9 +2990,11 @@
android:value="com.android.settings.applications.appinfo.WriteSettingsDetails" />
</activity>
- <activity android:name="Settings$ManageExternalSourcesActivity"
- android:label="@string/install_other_apps"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$ManageExternalSourcesActivity"
+ android:label="@string/install_other_apps"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.MANAGE_UNKNOWN_APP_SOURCES" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2967,10 +3025,12 @@
</intent-filter>
</activity>
- <activity android:name="Settings$AdvancedAppsActivity"
- android:taskAffinity=""
- android:exported="true"
- android:label="@string/app_default_dashboard_title">
+ <activity
+ android:name="Settings$AdvancedAppsActivity"
+ android:exported="true"
+ android:label="@string/app_default_dashboard_title"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.MANAGE_DEFAULT_APPS_SETTINGS" />
<action android:name="android.settings.HOME_SETTINGS" />
@@ -3026,10 +3086,12 @@
android:value="true" />
</activity>
- <activity android:name="Settings$AutomaticStorageManagerSettingsActivity"
- android:exported="@bool/config_storage_manager_settings_enabled"
- android:label="@string/automatic_storage_manager_settings"
- android:taskAffinity="">
+ <activity
+ android:name="Settings$AutomaticStorageManagerSettingsActivity"
+ android:exported="@bool/config_storage_manager_settings_enabled"
+ android:label="@string/automatic_storage_manager_settings"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.STORAGE_MANAGER_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -3037,12 +3099,13 @@
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.deletionhelper.AutomaticStorageManagerSettings" />
</activity>
- <!-- Information architecture host activities -->
- <!-- Alias for battery settings in new IA. Remove and merge metadata into TargetActivity -->
- <activity android:name=".Settings$AppAndNotificationDashboardActivity"
- android:label="@string/app_and_notification_dashboard_title"
- android:icon="@drawable/ic_homepage_apps">
+ <activity
+ android:name=".Settings$AppAndNotificationDashboardActivity"
+ android:label="@string/app_and_notification_dashboard_title"
+ android:icon="@drawable/ic_homepage_apps"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="9">
<action android:name="com.android.settings.action.SETTINGS"/>
</intent-filter>
@@ -3054,9 +3117,12 @@
android:resource="@string/app_and_notification_dashboard_summary"/>
</activity>
- <activity android:name=".Settings$AccountDashboardActivity"
- android:label="@string/account_dashboard_title"
- android:icon="@drawable/ic_homepage_accounts">
+ <activity
+ android:name=".Settings$AccountDashboardActivity"
+ android:label="@string/account_dashboard_title"
+ android:icon="@drawable/ic_homepage_accounts"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="3">
<action android:name="com.android.settings.action.SETTINGS"/>
</intent-filter>
@@ -3070,9 +3136,12 @@
android:value="com.android.settings.category.ia.homepage"/>
</activity>
- <activity android:name=".Settings$SystemDashboardActivity"
- android:label="@string/header_category_system"
- android:icon="@drawable/ic_homepage_system_dashboard">
+ <activity
+ android:name=".Settings$SystemDashboardActivity"
+ android:label="@string/header_category_system"
+ android:icon="@drawable/ic_homepage_system_dashboard"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
<intent-filter android:priority="-1">
<action android:name="com.android.settings.action.SETTINGS"/>
</intent-filter>
@@ -3102,8 +3171,6 @@
android:resource="@string/support_summary"/>
</activity>
- <!-- End of information architecture host activities -->
-
<service
android:name=".SettingsDumpService"
android:exported="true"
diff --git a/res/drawable-hdpi/ic_wps_dark.png b/res/drawable-hdpi/ic_wps_dark.png
deleted file mode 100644
index 918b0cc..0000000
--- a/res/drawable-hdpi/ic_wps_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_wps_light.png b/res/drawable-hdpi/ic_wps_light.png
deleted file mode 100644
index 5ad9f3e..0000000
--- a/res/drawable-hdpi/ic_wps_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_wps_dark.png b/res/drawable-mdpi/ic_wps_dark.png
deleted file mode 100644
index 77d73a8..0000000
--- a/res/drawable-mdpi/ic_wps_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_wps_light.png b/res/drawable-mdpi/ic_wps_light.png
deleted file mode 100644
index ef560fa..0000000
--- a/res/drawable-mdpi/ic_wps_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_wps_dark.png b/res/drawable-xhdpi/ic_wps_dark.png
deleted file mode 100644
index 3ea4a3b..0000000
--- a/res/drawable-xhdpi/ic_wps_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_wps_light.png b/res/drawable-xhdpi/ic_wps_light.png
deleted file mode 100644
index f913d2c..0000000
--- a/res/drawable-xhdpi/ic_wps_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_wps_dark.png b/res/drawable-xxhdpi/ic_wps_dark.png
deleted file mode 100644
index 8b38db8..0000000
--- a/res/drawable-xxhdpi/ic_wps_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_wps_light.png b/res/drawable-xxhdpi/ic_wps_light.png
deleted file mode 100644
index 0084175..0000000
--- a/res/drawable-xxhdpi/ic_wps_light.png
+++ /dev/null
Binary files differ
diff --git a/res/layout/battery_saver_settings_button.xml b/res/layout/battery_saver_settings_button.xml
new file mode 100644
index 0000000..015d4d8
--- /dev/null
+++ b/res/layout/battery_saver_settings_button.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:gravity="bottom"
+ android:paddingStart="72dp"
+ android:paddingEnd="72dp"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <Button
+ android:id="@+id/battery_saver_on_button"
+ style="@style/ActionPrimaryButton"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:text="@string/battery_saver_button_turn_on"
+ android:paddingEnd="8dp" />
+
+ <Button
+ android:id="@+id/battery_saver_off_button"
+ style="@style/ActionSecondaryButton"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:text="@string/battery_saver_button_turn_off"
+ android:paddingEnd="8dp" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/data_plans_sync_time_preference.xml b/res/layout/data_plans_sync_time_preference.xml
deleted file mode 100644
index bb9da90..0000000
--- a/res/layout/data_plans_sync_time_preference.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2017 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at"+
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Shows the data plans sync time -->
-<TextView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="@dimen/preference_no_icon_padding_start"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:gravity="end"
- android:textColor="?android:attr/textColorSecondary"/>
diff --git a/res/layout/data_usage_summary_preference.xml b/res/layout/data_usage_summary_preference.xml
new file mode 100644
index 0000000..445e7cd
--- /dev/null
+++ b/res/layout/data_usage_summary_preference.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at"+
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/preference_no_icon_padding_start"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:orientation="vertical"
+ android:background="@drawable/selectable_card_grey"
+ android:selectable="false"
+ style="@style/EntityHeader">
+
+ <TextView
+ android:id="@+id/usage_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+ android:textColor="?android:attr/textColorSecondary"
+ android:paddingBottom="5dp"
+ android:text="@string/data_usage_title" />
+
+ <TextView
+ android:id="@android:id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="5dp"
+ android:fontFamily="@*android:string/config_headlineFontFamily"
+ android:textColor="?android:attr/colorAccent"
+ android:textAppearance="@android:style/TextAppearance.Material.Large" />
+
+ <TextView
+ android:id="@android:id/summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+ android:textColor="?android:attr/textColorSecondary"
+ android:paddingBottom="5dp" />
+
+ <com.android.settings.widget.LinearColorBar
+ android:id="@+id/color_bar"
+ android:layout_width="match_parent"
+ android:layout_height="28dp" />
+
+ <LinearLayout
+ android:id="@+id/label_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="2dp"
+ android:orientation="horizontal">
+
+ <TextView android:id="@android:id/text1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+ android:textColor="?android:attr/textColorSecondary" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1" />
+
+ <TextView android:id="@android:id/text2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+ android:textColor="?android:attr/textColorSecondary" />
+
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/cycle_left_time"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp" />
+
+ <TextView
+ android:id="@+id/carrier_and_update"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp" />
+
+ <Button
+ android:id="@+id/launch_mdp_app_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left"
+ android:text="@string/launch_mdp_app_text"
+ style="@style/ActionPrimaryButton" />
+
+ <TextView
+ android:id="@+id/data_limits"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingBottom="5dp" />
+
+</LinearLayout>
+
diff --git a/res/layout/manage_data_plans_preference.xml b/res/layout/manage_data_plans_preference.xml
deleted file mode 100644
index 0db5698..0000000
--- a/res/layout/manage_data_plans_preference.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2017 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at"+
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="@dimen/preference_no_icon_padding_start"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:paddingTop="8dp"
- android:paddingBottom="16dp">
- <Button
- android:id="@+id/manage_data_plans"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/data_plan_usage_manage_plans_button_text"
- android:textAllCaps="true"
- style="@style/ActionPrimaryButton" />
-</FrameLayout>
diff --git a/res/layout/search_feedback.xml b/res/layout/preference_widget_gear_no_bg.xml
similarity index 64%
rename from res/layout/search_feedback.xml
rename to res/layout/preference_widget_gear_no_bg.xml
index cdb0545..89d34d4 100644
--- a/res/layout/search_feedback.xml
+++ b/res/layout/preference_widget_gear_no_bg.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,10 +14,14 @@
limitations under the License.
-->
-<View
+<!-- Settings button -->
+<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/feedback_popup"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone">
-</View>
+ android:id="@+id/settings_button"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:scaleType="center"
+ android:src="@drawable/ic_settings"
+ android:contentDescription="@string/settings_button" />
+
diff --git a/res/layout/search_inline_switch_item.xml b/res/layout/search_inline_switch_item.xml
deleted file mode 100644
index 8f050a3..0000000
--- a/res/layout/search_inline_switch_item.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:background="?android:attr/selectableItemBackground"
- android:clipToPadding="false">
-
- <include layout="@layout/search_icon_view"/>
-
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="vertical">
-
- <TextView
- android:id="@android:id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceListItem"
- android:ellipsize="marquee"/>
-
- <TextView
- android:id="@android:id/summary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceListItemSecondary"/>
-
- <include layout="@layout/search_breadcrumb_view"/>
- </LinearLayout>
-
- <Switch
- android:id="@+id/switchView"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:gravity="top"
- android:paddingStart="16dp"/>
-</LinearLayout>
diff --git a/res/layout/search_intent_item.xml b/res/layout/search_intent_item.xml
deleted file mode 100644
index 6bc00ad..0000000
--- a/res/layout/search_intent_item.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:background="?android:attr/selectableItemBackground"
- android:clipToPadding="false">
-
- <include layout="@layout/search_icon_view"/>
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="vertical">
-
- <TextView
- android:id="@android:id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceListItem"
- android:ellipsize="marquee"/>
-
- <TextView
- android:id="@android:id/summary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceListItemSecondary"
- android:ellipsize="marquee"/>
-
- <include layout="@layout/search_breadcrumb_view"/>
- </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/search_panel.xml b/res/layout/search_panel.xml
deleted file mode 100644
index 10c2a00..0000000
--- a/res/layout/search_panel.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/search_panel"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <FrameLayout
- android:id="@+id/search_bar_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@color/suggestion_condition_background">
- <android.support.v7.widget.CardView
- android:id="@+id/search_bar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="@dimen/search_bar_margin"
- app:cardCornerRadius="2dp"
- app:cardBackgroundColor="?android:attr/colorBackground"
- app:cardElevation="2dp">
- <Toolbar
- android:id="@+id/search_toolbar"
- android:layout_width="match_parent"
- android:layout_height="@dimen/search_bar_height"
- android:background="?android:attr/selectableItemBackground"
- android:contentInsetStart="0dp"
- android:contentInsetStartWithNavigation="0dp"
- android:theme="?android:attr/actionBarTheme">
- <SearchView
- android:id="@+id/search_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:iconifiedByDefault="false"
- android:imeOptions="actionSearch|flagNoExtractUi"
- android:searchIcon="@null"/>
- </Toolbar>
- </android.support.v7.widget.CardView>
- </FrameLayout>
-
- <FrameLayout
- android:id="@+id/layout_results"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:orientation="vertical">
-
- <!-- Padding is included in the background -->
- <android.support.v7.widget.RecyclerView
- android:id="@+id/list_results"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="@dimen/dashboard_padding_start"
- android:paddingEnd="@dimen/dashboard_padding_end"
- android:paddingTop="@dimen/dashboard_padding_top"
- android:paddingBottom="@dimen/dashboard_padding_bottom"
- android:scrollbarStyle="outsideOverlay"
- android:scrollbars="vertical"/>
-
- <LinearLayout
- android:id="@+id/no_results_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="35dp"
- android:orientation="vertical"
- android:visibility="gone">
-
- <Space
- android:layout_width="match_parent"
- android:layout_height="?android:attr/actionBarSize"/>
-
- <ImageView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_gravity="center_horizontal"
- android:src="@drawable/empty_search_results"/>
-
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:paddingTop="24dp"
- android:textSize="18sp"
- android:text="@string/search_settings_no_results"
- android:gravity="center"/>
-
- </LinearLayout>
-
- </FrameLayout>
-
- <include layout="@layout/search_feedback"/>
-
-</LinearLayout>
diff --git a/res/layout/settings_main_dashboard.xml b/res/layout/settings_main_dashboard.xml
index 4f8c308..10ff2ee 100644
--- a/res/layout/settings_main_dashboard.xml
+++ b/res/layout/settings_main_dashboard.xml
@@ -43,7 +43,6 @@
android:background="?android:attr/selectableItemBackground"
android:contentInsetStartWithNavigation="64dp"
android:navigationIcon="@drawable/ic_search_24dp"
- android:navigationContentDescription="@string/search_menu"
android:theme="?android:attr/actionBarTheme">
<TextView
android:id="@+id/search_action_bar_title"
diff --git a/res/layout/styled_switch_bar.xml b/res/layout/styled_switch_bar.xml
index 1777c0f..3baaac3 100644
--- a/res/layout/styled_switch_bar.xml
+++ b/res/layout/styled_switch_bar.xml
@@ -16,13 +16,13 @@
<!-- For use in a LayoutPreference -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="0px"
- android:layout_width="match_parent"
- android:layout_weight="1" >
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent" >
<com.android.settings.widget.SwitchBar
android:id="@+id/switch_bar"
- android:layout_height="?android:attr/actionBarSize"
+ android:minHeight="?android:attr/actionBarSize"
+ android:layout_height="wrap_content"
android:layout_width="match_parent"
android:paddingStart="0dp"
android:theme="?attr/switchBarTheme" />
diff --git a/res/layout/wifi_wps_dialog.xml b/res/layout/wifi_wps_dialog.xml
deleted file mode 100644
index a86823d..0000000
--- a/res/layout/wifi_wps_dialog.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="300sp"
- android:layout_height="wrap_content">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="8dip"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/wps_dialog_txt"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dip" />
-
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginTop="8dip"
- android:src="?attr/ic_wps" />
-
- <ProgressBar
- android:id="@+id/wps_timeout_bar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="20dip"
- style="?android:attr/progressBarStyleHorizontal" />
-
- <ProgressBar
- android:id="@+id/wps_progress_bar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="20dip"
- style="?android:attr/progressBarStyle" />
-
- <RelativeLayout
- android:gravity="center"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
-
- <Button
- android:id="@+id/wps_dialog_btn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/cancel" />
- </RelativeLayout>
- </LinearLayout>
-</ScrollView>
diff --git a/res/values-sw400dp/dimens.xml b/res/values-sw400dp/dimens.xml
index 8d45dd4..6a02422 100755
--- a/res/values-sw400dp/dimens.xml
+++ b/res/values-sw400dp/dimens.xml
@@ -23,8 +23,6 @@
<dimen name="support_escalation_card_padding_end">56dp</dimen>
<!-- Suggestion cards-->
- <dimen name="suggestion_card_width_one_card">384dp</dimen>
- <dimen name="suggestion_card_width_two_cards">188dp</dimen>
<dimen name="suggestion_card_width_multiple_cards">180dp</dimen>
<dimen name="suggestion_card_padding_bottom_one_card">22dp</dimen>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index fbc7490..6ede7c6 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -304,8 +304,6 @@
<!-- Suggestion cards size and padding -->
<dimen name="suggestion_card_icon_size">24dp</dimen>
- <dimen name="suggestion_card_width_one_card">332dp</dimen>
- <dimen name="suggestion_card_width_two_cards">162dp</dimen>
<dimen name="suggestion_card_width_multiple_cards">156dp</dimen>
<dimen name="suggestion_card_outer_margin">14dp</dimen>
<dimen name="suggestion_card_inner_margin">12dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3e9d716..72db253 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1845,12 +1845,8 @@
<string name="wifi_configure_settings_preference_summary_wakeup_off">Wi\u2011Fi doesn\u0027t turn back on automatically</string>
<!-- Header for the list of wifi networks-->
<string name="wifi_access_points">Wi\u2011Fi networks</string>
- <!-- Menu option to do WPS Push Button [CHAR LIMIT=25]-->
- <string name="wifi_menu_wps_pbc">WPS Push Button</string>
<!-- Content description for menu button in Wifi setup. Not shown on the screen. [CHAR LIMIT=NONE] -->
<string name="wifi_menu_more_options">More options</string>
- <!-- Menu option to do WPS Pin Entry [CHAR LIMIT=25]-->
- <string name="wifi_menu_wps_pin">WPS Pin Entry</string>
<!-- Menu option to launch Wi-Fi Direct settings [CHAR LIMIT=20]-->
<string name="wifi_menu_p2p">Wi\u2011Fi Direct</string>
<!-- Menu option to scan Wi-Fi networks -->
@@ -1887,32 +1883,6 @@
<string name="wifi_advanced_toggle_description_expanded">Drop down list Advanced Options. Double-tap to collapse.</string>
<!-- Message for talkback to say when Advanced Options is collapsed [CHAR LIMIT=NONE] -->
<string name="wifi_advanced_toggle_description_collapsed">Drop down list Advanced Options. Double-tap to expand.</string>
- <!-- Title for the WPS setup dialog [CHAR LIMIT=50] -->
- <string name="wifi_wps_setup_title">Wi\u2011Fi Protected Setup</string>
- <!-- Message in WPS dialog at start up [CHAR LIMIT=150] -->
- <string name="wifi_wps_setup_msg">Starting WPS\u2026</string>
- <!-- Message in WPS dialog for PBC after start up [CHAR LIMIT=150] -->
- <string name="wifi_wps_onstart_pbc">Press the Wi\u2011Fi Protected Setup button on your router. It may be called \u201cWPS\u201d or marked with this symbol:</string>
- <!-- Message in WPS dialog for PIN after start up [CHAR LIMIT=150] -->
- <string name="wifi_wps_onstart_pin">Enter pin <xliff:g id="number">%1$s</xliff:g> on your Wi\u2011Fi router. The setup can take up to two minutes to complete.</string>
- <!-- Text displayed when WPS succeeds [CHAR LIMIT=150] -->
- <string name="wifi_wps_complete">WPS succeeded. Connecting to the network\u2026</string>
- <!-- Text displayed when Wi-Fi is connected through WPS [CHAR LIMIT=150] -->
- <string name="wifi_wps_connected">Connected to Wi\u2011Fi network <xliff:g id="network_name">%s</xliff:g></string>
- <!-- Text displayed when WPS setup is in progress [CHAR LIMIT=150] -->
- <string name="wifi_wps_in_progress">WPS is already in progress and can take up to two minutes to complete</string>
- <!-- Text displayed when WPS fails to start [CHAR LIMIT=150] -->
- <string name="wifi_wps_failed_generic">WPS failed. Please try again in a few minutes.</string>
- <!-- Text displayed when WPS fails due to WEP [CHAR LIMIT=150] -->
- <string name="wifi_wps_failed_wep">The wireless router security setting (WEP) is not supported</string>
- <!-- Text displayed when WPS fails to TKIP [CHAR LIMIT=150] -->
- <string name="wifi_wps_failed_tkip">The wireless router security setting (TKIP) is not supported</string>
- <!-- Text displayed when WPS fails due to authentication issues [CHAR LIMIT=150] -->
- <string name="wifi_wps_failed_auth">Authentication failure. Please try again.</string>
- <!-- Text displayed when WPS fails due to another session [CHAR LIMIT=150] -->
- <string name="wifi_wps_failed_overlap">Another WPS session was detected. Please try again in a few minutes.</string>
- <!-- Text displayed when WPS fails due to wifi disconnected [CHAR LIMIT=150] -->
- <string name="wifi_wps_failed_wifi_disconnected">Wi\u2011Fi disconnected. WPS setup canceled.</string>
<!-- Label for the SSID of the network -->
<string name="wifi_ssid">Network name</string>
<!-- Hint for a text field to enter the SSID of a hidden wifi network. [CHAR LIMIT=35] -->
@@ -2423,13 +2393,6 @@
<!-- Main Settings screen, setting option name to go into search settings -->
<string name="search_settings">Search</string>
- <!-- Main Settings screen, setting option summary to go into search settings -->
- <string name="search_settings_summary">Manage search settings and history</string>
- <!-- There are no search results for the user's search [CHAR LIMIT=NONE]-->
- <string name="search_settings_no_results">No results</string>
-
- <!-- Button to clear all search history in Settings [CHAR LIMIT=40]-->
- <string name="search_clear_history">Clear history</string>
<!-- Display settings --><skip/>
<!-- Sound & display settings screen, section header for settings related to display -->
@@ -4431,6 +4394,12 @@
<string name="accessibility_autoclick_preference_title">Click after pointer stops moving</string>
<!-- Title for accessibility preference for configuring amount of time that has to pass after pointer stops moving before click action can be performed (if automatic click after pointer stops moving feature is enabled). [CHAR LIMIT=NONE] -->
<string name="accessibility_autoclick_delay_preference_title">Delay before click</string>
+ <!-- Title for accessibility preference screen for configuring vibrations. -->
+ <string name="accessibility_vibration_settings_title">Vibration</string>
+ <!-- Title for accessibility preference for configuring notification vibrations. -->
+ <string name="accessibility_notification_vibration_title">Ring & notification vibration</string>
+ <!-- Title for accessibility preference for configuring touch feedback vibrations. -->
+ <string name="accessibility_touch_vibration_title">Touch vibration</string>
<!-- Used in the acessibilty service settings to control turning on/off the service entirely -->
<string name="accessibility_service_master_switch_title">Use service</string>
<!-- Used in the Color correction settings screen to control turning on/off the feature entirely -->
@@ -4474,6 +4443,30 @@
<item quantity="other">Very long delay (<xliff:g id="click_delay_label" example="200">%1$d</xliff:g> ms)</item>
</plurals>
+ <!-- Summary for vibration settings preference when ring & notification are set to off-->
+ <string name="accessibility_vibration_summary_off">Ring & notification set to off</string>
+
+ <!-- Summary for vibration settings preference when ring & notification are set to low-->
+ <string name="accessibility_vibration_summary_low">Ring & notification set to low</string>
+
+ <!-- Summary for vibration settings preference when ring & notification are set to medium-->
+ <string name="accessibility_vibration_summary_medium">Ring & notification set to medium</string>
+
+ <!-- Summary for vibration settings preference when ring & notification are set to high-->
+ <string name="accessibility_vibration_summary_high">Ring & notification set to high</string>
+
+ <!-- Label describing an option turning vibrations off. [CHAR LIMIT=15] -->
+ <string name="accessibility_vibration_intensity_off">Off</string>
+
+ <!-- Label describing a low intensity vibration option. [CHAR LIMIT=15] -->
+ <string name="accessibility_vibration_intensity_low">Low</string>
+
+ <!-- Label describing a medium intensity vibration option. [CHAR LIMIT=15] -->
+ <string name="accessibility_vibration_intensity_medium">Medium</string>
+
+ <!-- Label describing a high intensity vibration option. [CHAR LIMIT=15] -->
+ <string name="accessibility_vibration_intensity_high">High</string>
+
<!-- Title for accessibility menu item to lauch a settings activity. [CHAR LIMIT=15] -->
<string name="accessibility_menu_item_settings">Settings</string>
@@ -5110,6 +5103,9 @@
<!-- Title for the battery management group [CHAR LIMIT=40] -->
<string name ="battery_detail_manage_title">Manage battery usage</string>
+ <!-- Graph subtext displayed to user when enhanced battery estimate is being used [CHAR LIMIT=120] -->
+ <string name="advanced_battery_graph_subtext">Battery left estimate is based on your device usage</string>
+
<!-- Description for battery time left, i.e. 50min Estimated time left. [CHAR LIMIT=80]-->
<string name="estimated_time_left">Estimated time left</string>
@@ -5136,8 +5132,17 @@
<!-- Label for dex2oat process in battery usage used for the optimization of one or more apps -->
<string name="process_dex2oat_label">App optimization</string>
- <!-- [CHAR_LIMIT=40] Battery saver: Label for feature, title + menu item -->
- <string name="battery_saver">Battery Saver</string>
+ <!-- Battery saver: Label for feature, title + menu item [CHAR_LIMIT=40] -->
+ <string name="battery_saver">Reduced power mode</string>
+
+ <!-- Battery saver: Label for preference to turn on battery saver automatically when battery is low [CHAR_LIMIT=40] -->
+ <string name="battery_saver_auto_title">Schedule</string>
+
+ <!-- Battery saver: Summary for preference to turn on battery saver automatically when battery is low [CHAR_LIMIT=40] -->
+ <string name="battery_saver_auto_summary">Turn on Reduced power mode automatically when battery is low</string>
+
+ <!-- Battery saver: Label for seekbar to change battery saver threshold [CHAR_LIMIT=40] -->
+ <string name="battery_saver_seekbar_title">Turn on automatically at <xliff:g id="percent">%1$s</xliff:g></string>
<!-- Used in the Battery Saver settings screen to control turning on/off the feature entirely -->
<string name="battery_saver_master_switch_title">Use Battery Saver</string>
@@ -5740,9 +5745,6 @@
<!-- action to select all [CHAR LIMIT=30] -->
<string name="select_all">Select all</string>
- <!-- A button that gets displayed in data plan usage preference in settings page to manage data plans [CHAR LIMIT=25] -->
- <string name="data_plan_usage_manage_plans_button_text">Manage plans</string>
-
<!-- Activity title for network data usage summary. [CHAR LIMIT=25] -->
<string name="data_usage_summary_title">Data usage</string>
<!-- Activity title for Appk data usage summary. [CHAR LIMIT=25] -->
@@ -5842,6 +5844,8 @@
<string name="data_usage_enable_3g">2G-3G data</string>
<!-- Toggle switch title for enabling 4G data network connection. [CHAR LIMIT=32] -->
<string name="data_usage_enable_4g">4G data</string>
+ <!-- Toggle switch title for enabling roaming on the primary data SIM card. [CHAR LIMIT=32] -->
+ <string name="data_roaming_enable_mobile">Roaming</string>
<!-- Data Usage Foreground label. [CHAR LIMIT=40] -->
<string name="data_usage_forground_label">Foreground:</string>
@@ -7051,7 +7055,7 @@
<string name="notification_pulse_title">Blink light</string>
<!-- Configure Notifications: Title for the option controlling notifications on the lockscreen. [CHAR LIMIT=30] -->
- <string name="lock_screen_notifications_title">On the lock screen</string>
+ <string name="lock_screen_notifications_title">On lock screen</string>
<!-- Configure Notifications: Value for lockscreen notifications: all information will be
shown in notifications shown on a secure lock screen
@@ -7061,7 +7065,7 @@
<!-- Configure Notifications: Value for lockscreen notifications: sensitive information will be
hidden or redacted from notifications shown on a secure lock screen
[CHAR LIMIT=50] -->
- <string name="lock_screen_notifications_summary_hide">Hide sensitive notification content</string>
+ <string name="lock_screen_notifications_summary_hide">Hide sensitive content</string>
<!-- Configure Notifications: Value for lockscreen notifications: notifications will not appear on a secure lock screen
[CHAR LIMIT=50] -->
@@ -7081,7 +7085,7 @@
<!-- Configure Notifications: Value for lockscreen notifications: sensitive information will be
hidden or redacted from work notifications shown on a secure lock screen
[CHAR LIMIT=50] -->
- <string name="lock_screen_notifications_summary_hide_profile">Hide sensitive work notification content</string>
+ <string name="lock_screen_notifications_summary_hide_profile">Hide sensitive work content</string>
<!-- Configure Notifications: Value for lockscreen notifications: work notifications will not appear on a secure lock screen
[CHAR LIMIT=50] -->
@@ -7341,7 +7345,7 @@
<string name="app_notification_override_dnd_summary">Let these notifications continue to interrupt when Do Not Disturb is set to Priority Only</string>
<!-- [CHAR LIMIT=NONE] App notification settings: Visibility override option title -->
- <string name="app_notification_visibility_override_title">On the lock screen</string>
+ <string name="app_notification_visibility_override_title">On lock screen</string>
<!-- [CHAR LIMIT=20] Notification settings: App notifications row summary when allowed -->
<string name="app_notification_row_banned">Blocked</string>
@@ -8478,7 +8482,7 @@
<!-- Summary of condition that airplane mode is on [CHAR LIMIT=NONE] -->
<string name="condition_airplane_summary">Wi-Fi, Bluetooth, and mobile network are turned off. You can\'t make phone calls or connect to the internet.</string>
- <!-- Title of condition that do not disturb is on [CHAR LIMIT=30] -->
+ <!-- Title of condition that do not disturb is on [CHAR LIMIT=36] -->
<string name="condition_zen_title">Do Not Disturb is on</string>
<!-- Title of condition that battery saver is on [CHAR LIMIT=30] -->
@@ -8653,6 +8657,27 @@
<item quantity="other"><xliff:g id="count" example="10">%1$d</xliff:g> apps allowed to use unrestricted data when Data Saver is on</item>
</plurals>
+ <!-- Data usage title text [CHAR LIMIT=30] -->
+ <string name="data_usage_title">Primary data</string>
+
+ <!-- Data usage string [CHAR LIMIT=30] -->
+ <string name="data_used"><xliff:g name="bytes" example="2 GB">^1</xliff:g> used</string>
+
+ <!-- Optional part of data usage showing the remaining amount [CHAR LIMIT=30] -->
+ <string name="data_remaining"><xliff:g name="bytes" example="2 GB">, ^1</xliff:g> left</string>
+
+ <!-- Informational text about time left in billing cycle [CHAR LIMIT=30] -->
+ <string name="cycle_left_time_text"><xliff:g name="time" example="2d">%1$s</xliff:g> left in this cycle</string>
+
+ <!-- Informational text about carrier and update time [CHAR LIMIT=30] -->
+ <string name="carrier_and_update_text">Updated by <xliff:g name="carrier" example="T-mobile">%1$s</xliff:g> <xliff:g name="time" example="3m">%2$s</xliff:g></string>
+
+ <!-- Informational text about update time only, without carrier [CHAR LIMIT=30] -->
+ <string name="no_carrier_update_text">Updated <xliff:g name="time" example="3m">%1$s</xliff:g></string>
+
+ <!-- Button to launch external data plan app [CHAR LIMIT=30] -->
+ <string name="launch_mdp_app_text">VIEW PLAN</string>
+
<!-- Name of Data Saver screens [CHAR LIMIT=30] -->
<string name="data_saver_title">Data saver</string>
@@ -8710,6 +8735,12 @@
<!-- [CHAR_LIMIT=NONE] Battery saver: Description for automatic entry option: pct% battery -->
<string name="battery_saver_desc_turn_on_auto_pct">Turn on automatically at %1$s battery</string>
+ <!-- Battery saver: Label for button that will turn on battery saver. [CHAR LIMIT=30] -->
+ <string name="battery_saver_button_turn_on">Turn on now</string>
+
+ <!-- Battery saver: Label for button that will turn off battery saver. [CHAR LIMIT=30] -->
+ <string name="battery_saver_button_turn_off">Turn off now</string>
+
<!-- [CHAR_LIMIT=NONE] Label for when app is ignoring battery optimizations -->
<string name="not_battery_optimizing">Not using battery optimization</string>
@@ -9264,6 +9295,9 @@
<!-- Help URI, USB Audio [DO NOT TRANSLATE] -->
<string name="help_url_audio_accessory_not_supported" translatable="false"></string>
+ <!-- Help URI, battery saver page [DO NOT TRANSLATE] -->
+ <string name="help_url_battery_saver_settings" translatable="false"></string>
+
<!-- Title label for new device suggestion, which is displayed in Settings homepage [CHAR LIMIT=100] -->
<string name="new_device_suggestion_title">What\'s new and exciting?</string>
@@ -9328,4 +9362,6 @@
<!-- Settings item summary for automatic Bluetooth on while driving preference [CHAR LIMIT=100] -->
<string name="bluetooth_on_while_driving_summary">Turn on Bluetooth automatically when driving</string>
+ <!-- Title for item to go to old battery settings page when clicking [CHAR LIMIT=100] -->
+ <string name="dev_android_o_battery_settings_title">See Android 8.0 battery settings</string>
</resources>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index e0f3989..d960654 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -17,7 +17,6 @@
<resources>
<attr name="fingerprint_layout_theme" format="reference" />
<attr name="ic_menu_moreoverflow" format="reference" />
- <attr name="ic_wps" format="reference" />
<attr name="side_margin" format="reference|dimension" />
<attr name="wifi_signal_color" format="reference" />
@@ -28,7 +27,6 @@
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
- <item name="ic_wps">@drawable/ic_wps_dark</item>
<item name="side_margin">0dip</item>
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
<item name="wifi_signal">@drawable/wifi_signal</item>
@@ -47,7 +45,6 @@
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
- <item name="ic_wps">@drawable/ic_wps_light</item>
<item name="side_margin">0dip</item>
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
<item name="wifi_signal">@drawable/wifi_signal</item>
@@ -65,7 +62,6 @@
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
- <item name="ic_wps">@drawable/ic_wps_dark</item>
<item name="side_margin">0dip</item>
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
<item name="wifi_signal">@drawable/wifi_signal</item>
@@ -84,7 +80,6 @@
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
- <item name="ic_wps">@drawable/ic_wps_light</item>
<item name="side_margin">0dip</item>
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
<item name="wifi_signal">@drawable/wifi_signal</item>
@@ -102,7 +97,6 @@
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
- <item name="ic_wps">@drawable/ic_wps_dark</item>
<item name="side_margin">0dip</item>
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
<item name="wifi_signal">@drawable/wifi_signal</item>
@@ -121,7 +115,6 @@
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
- <item name="ic_wps">@drawable/ic_wps_light</item>
<item name="side_margin">0dip</item>
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
<item name="wifi_signal">@drawable/wifi_signal</item>
@@ -221,7 +214,6 @@
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_holo_dark</item>
- <item name="ic_wps">@drawable/ic_wps_light</item>
<item name="wifi_signal">@drawable/wifi_signal</item>
<item name="wifi_signal_color">?android:attr/colorAccent</item>
<item name="wifi_friction">@drawable/wifi_friction</item>
diff --git a/res/layout/search_breadcrumb_view.xml b/res/xml/accessibility_notification_vibration_settings.xml
similarity index 63%
copy from res/layout/search_breadcrumb_view.xml
copy to res/xml/accessibility_notification_vibration_settings.xml
index 08a2651..b37d363 100644
--- a/res/layout/search_breadcrumb_view.xml
+++ b/res/xml/accessibility_notification_vibration_settings.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2017 The Android Open Source Project
+ Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -15,12 +15,6 @@
limitations under the License.
-->
-<TextView
+<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/breadcrumb"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingTop="5dp"
- android:textAppearance="?android:attr/textAppearanceListItemSecondary"
- android:textColor="?android:attr/textColorSecondary"
- android:ellipsize="marquee"/>
+ android:title="@string/accessibility_notification_vibration_title" />
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index b5da848..060868e 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -93,6 +93,12 @@
android:entries="@array/long_press_timeout_selector_titles"
android:entryValues="@array/long_press_timeout_selector_values"
android:persistent="false"/>
+
+ <Preference
+ android:fragment="com.android.settings.accessibility.VibrationSettings"
+ android:key="vibration_preference_screen"
+ android:title="@string/accessibility_vibration_settings_title" />
+
</PreferenceCategory>
<PreferenceCategory
diff --git a/res/layout/search_breadcrumb_view.xml b/res/xml/accessibility_touch_vibration_settings.xml
similarity index 63%
rename from res/layout/search_breadcrumb_view.xml
rename to res/xml/accessibility_touch_vibration_settings.xml
index 08a2651..ed8f550 100644
--- a/res/layout/search_breadcrumb_view.xml
+++ b/res/xml/accessibility_touch_vibration_settings.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2017 The Android Open Source Project
+ Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -15,12 +15,6 @@
limitations under the License.
-->
-<TextView
+<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/breadcrumb"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingTop="5dp"
- android:textAppearance="?android:attr/textAppearanceListItemSecondary"
- android:textColor="?android:attr/textColorSecondary"
- android:ellipsize="marquee"/>
+ android:title="@string/accessibility_touch_vibration_title" />
diff --git a/res/xml/accessibility_vibration_settings.xml b/res/xml/accessibility_vibration_settings.xml
new file mode 100644
index 0000000..d61454d
--- /dev/null
+++ b/res/xml/accessibility_vibration_settings.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:key="accessibility_settings_screen"
+ android:title="@string/accessibility_vibration_settings_title"
+ android:persistent="true">
+
+ <Preference
+ android:fragment="com.android.settings.accessibility.NotificationVibrationPreferenceFragment"
+ android:key="notification_vibration_preference_screen"
+ android:title="@string/accessibility_notification_vibration_title" />
+
+ <Preference
+ android:fragment="com.android.settings.accessibility.TouchVibrationPreferenceFragment"
+ android:key="touch_vibration_preference_screen"
+ android:title="@string/accessibility_touch_vibration_title" />
+</PreferenceScreen>
diff --git a/res/xml/battery_saver_settings.xml b/res/xml/battery_saver_settings.xml
index 1720c73..9e32440 100644
--- a/res/xml/battery_saver_settings.xml
+++ b/res/xml/battery_saver_settings.xml
@@ -14,14 +14,36 @@
limitations under the License.
-->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/battery_saver"
- android:key="battery_saver">
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:title="@string/battery_saver"
+ android:key="battery_saver">
<!-- Turn on automatically -->
- <DropDownPreference
- android:key="turn_on_automatically"
- android:title="@string/battery_saver_turn_on_automatically_title"
- android:summary="%s" />
+ <SwitchPreference
+ android:key="auto_battery_saver"
+ android:title="@string/battery_saver_auto_title"
+ android:summary="@string/battery_saver_auto_summary"
+ settings:controller="com.android.settings.fuelgauge.batterysaver.AutoBatterySaverPreferenceController"/>
+
+ <com.android.settings.widget.SeekBarPreference
+ android:key="battery_saver_seek_bar"
+ android:title="@string/battery_saver_seekbar_title"
+ android:max="75"
+ android:min="5"/>
+
+ <com.android.settings.applications.LayoutPreference
+ android:key="battery_saver_button_container"
+ android:selectable="false"
+ android:layout="@layout/battery_saver_settings_button"/>
+
+ <PreferenceCategory
+ android:key="battery_saver_footer">
+ <com.android.settingslib.widget.FooterPreference
+ android:key="battery_saver_footer_preference"
+ android:title="@*android:string/battery_saver_description"
+ android:selectable="false"/>
+ </PreferenceCategory>
</PreferenceScreen>
diff --git a/res/xml/connected_devices_advanced.xml b/res/xml/connected_devices_advanced.xml
index 0b75abf..83a63e4 100644
--- a/res/xml/connected_devices_advanced.xml
+++ b/res/xml/connected_devices_advanced.xml
@@ -25,8 +25,8 @@
android:title="@string/bluetooth_settings_title"
android:icon="@drawable/ic_settings_bluetooth"
android:summary="@string/bluetooth_pref_summary"
- settings:controller="com.android.settings.bluetooth.BluetoothSwitchPreferenceController"
- android:order="-7"/>
+ android:order="-7"
+ settings:controller="com.android.settings.bluetooth.BluetoothSwitchPreferenceController"/>
<SwitchPreference
android:key="toggle_nfc"
@@ -54,6 +54,7 @@
android:title="@string/bluetooth_on_while_driving_pref"
android:icon="@drawable/ic_settings_bluetooth"
android:summary="@string/bluetooth_on_while_driving_summary"
+ settings:controller="com.android.settings.connecteddevice.BluetoothOnWhileDrivingPreferenceController"
android:order="-2"/>
<Preference
diff --git a/res/xml/data_plan_usage.xml b/res/xml/data_plan_usage.xml
deleted file mode 100644
index 4691198..0000000
--- a/res/xml/data_plan_usage.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/data_usage_summary_title">
-
- <PreferenceCategory
- android:key="data_plan_usage"
- android:title="@string/usage">
-
- </PreferenceCategory>
-</PreferenceScreen>
diff --git a/res/xml/data_plan_usage_cell_data_preference_screen.xml b/res/xml/data_plan_usage_cell_data_preference_screen.xml
deleted file mode 100644
index 08f21c5..0000000
--- a/res/xml/data_plan_usage_cell_data_preference_screen.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/data_usage_summary_title">
-
- <com.android.settings.datausage.TemplatePreferenceCategory
- android:key="data_usage_mobile_category"
- android:title="@string/data_usage_tab_mobile">
-
- <com.android.settings.datausage.CellDataPreference
- android:key="data_usage_enable"
- android:title="@string/data_usage_enable_mobile" />
- </com.android.settings.datausage.TemplatePreferenceCategory>
-
-</PreferenceScreen>
diff --git a/res/xml/data_usage.xml b/res/xml/data_usage.xml
index 958459c..88d7f32 100644
--- a/res/xml/data_usage.xml
+++ b/res/xml/data_usage.xml
@@ -20,24 +20,8 @@
android:key="data_usage_screen"
android:title="@string/data_usage_summary_title">
- <PreferenceCategory
- android:key="data_usage_category"
- android:title="@string/usage">
-
- <com.android.settings.SummaryPreference
+ <com.android.settings.datausage.DataUsageSummaryPreference
android:key="status_header"
android:selectable="false" />
- <Preference
- android:key="limit_summary"
- android:selectable="false"
- settings:allowDividerBelow="true" />
-
- <com.android.settings.datausage.DataSaverPreference
- android:key="restrict_background"
- android:title="@string/data_saver_title"
- android:fragment="com.android.settings.datausage.DataSaverSummary" />
-
- </PreferenceCategory>
-
</PreferenceScreen>
diff --git a/res/xml/data_usage_legacy.xml b/res/xml/data_usage_legacy.xml
new file mode 100644
index 0000000..958459c
--- /dev/null
+++ b/res/xml/data_usage_legacy.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="data_usage_screen"
+ android:title="@string/data_usage_summary_title">
+
+ <PreferenceCategory
+ android:key="data_usage_category"
+ android:title="@string/usage">
+
+ <com.android.settings.SummaryPreference
+ android:key="status_header"
+ android:selectable="false" />
+
+ <Preference
+ android:key="limit_summary"
+ android:selectable="false"
+ settings:allowDividerBelow="true" />
+
+ <com.android.settings.datausage.DataSaverPreference
+ android:key="restrict_background"
+ android:title="@string/data_saver_title"
+ android:fragment="com.android.settings.datausage.DataSaverSummary" />
+
+ </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 5a0d249..a88a97b 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -77,6 +77,11 @@
android:fragment="com.android.settings.applications.RunningServices" />
<Preference
+ android:key="android_o_battery_settings"
+ android:fragment="com.android.settings.fuelgauge.PowerUsageSummaryLegacy"
+ android:title="@string/dev_android_o_battery_settings_title" />
+
+ <Preference
android:key="convert_to_file_encryption"
android:title="@string/convert_to_file_encryption"
android:summary="@string/convert_to_file_encryption_enabled"
@@ -471,7 +476,6 @@
android:entries="@array/app_process_limit_entries"
android:entryValues="@array/app_process_limit_values" />
-
<Preference
android:key="background_check"
android:fragment="com.android.settings.applications.appops.BackgroundCheckSummary"
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index 4d0c992..3cafc3f 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -43,8 +43,9 @@
<com.android.settingslib.RestrictedSwitchPreference
android:key="auto_brightness"
android:title="@string/auto_brightness_title"
- settings:keywords="@string/keywords_display_auto_brightness"
android:summary="@string/auto_brightness_summary"
+ settings:keywords="@string/keywords_display_auto_brightness"
+ settings:controller="com.android.settings.display.AutoBrightnessPreferenceController"
settings:useAdminDisabledSummary="true"
settings:userRestriction="no_config_brightness" />
diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml
index d7c3c39..fbe4e0d 100644
--- a/res/xml/power_usage_summary.xml
+++ b/res/xml/power_usage_summary.xml
@@ -23,7 +23,7 @@
<com.android.settings.applications.LayoutPreference
android:key="battery_header"
- android:selectable="true"
+ android:selectable="false"
android:layout="@layout/battery_header"/>
<PreferenceCategory
@@ -34,7 +34,7 @@
android:key="power_management">
<com.android.settings.widget.MasterSwitchPreference
- android:fragment="com.android.settings.fuelgauge.BatterySaverSettings"
+ android:fragment="com.android.settings.fuelgauge.batterysaver.BatterySaverSettings"
android:key="battery_saver_summary"
android:title="@string/battery_saver"/>
diff --git a/res/xml/power_usage_summary_legacy.xml b/res/xml/power_usage_summary_legacy.xml
index 0038cc0..059c737 100644
--- a/res/xml/power_usage_summary_legacy.xml
+++ b/res/xml/power_usage_summary_legacy.xml
@@ -51,7 +51,7 @@
android:title="@string/battery_power_management">
<com.android.settings.widget.MasterSwitchPreference
- android:fragment="com.android.settings.fuelgauge.BatterySaverSettings"
+ android:fragment="com.android.settings.fuelgauge.batterysaver.BatterySaverSettings"
android:key="battery_saver_summary"
android:title="@string/battery_saver"/>
diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml
index dafd36c..00eaa7e 100644
--- a/res/xml/security_dashboard_settings.xml
+++ b/res/xml/security_dashboard_settings.xml
@@ -79,7 +79,8 @@
<SwitchPreference
android:key="visiblepattern_profile"
android:summary="@string/summary_placeholder"
- android:title="@string/lockpattern_settings_enable_visible_pattern_title_profile" />
+ android:title="@string/lockpattern_settings_enable_visible_pattern_title_profile"
+ settings:controller="com.android.settings.security.VisiblePatternProfilePreferenceController"/>
<Preference
android:key="fingerprint_settings_profile"
@@ -103,7 +104,8 @@
<SwitchPreference
android:key="show_password"
android:title="@string/show_password"
- android:summary="@string/show_password_summary" />
+ android:summary="@string/show_password_summary"
+ settings:controller="com.android.settings.security.ShowPasswordPreferenceController"/>
</PreferenceCategory>
diff --git a/res/xml/security_lockscreen_settings.xml b/res/xml/security_lockscreen_settings.xml
index 1da1de5..3d3bfd0 100644
--- a/res/xml/security_lockscreen_settings.xml
+++ b/res/xml/security_lockscreen_settings.xml
@@ -16,6 +16,7 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="security_lockscreen_settings_screen"
android:title="@string/lockscreen_settings_title">
@@ -36,7 +37,8 @@
<SwitchPreference
android:key="security_setting_lockdown_enabled"
android:title="@string/lockdown_settings_title"
- android:summary="@string/lockdown_settings_summary" />
+ android:summary="@string/lockdown_settings_summary"
+ settings:controller="com.android.settings.security.LockdownButtonPreferenceController"/>
<PreferenceCategory
android:key="security_setting_lock_screen_notif_work_header"
diff --git a/res/xml/wifi_configure_settings.xml b/res/xml/wifi_configure_settings.xml
index 6993f26..eae6faa 100644
--- a/res/xml/wifi_configure_settings.xml
+++ b/res/xml/wifi_configure_settings.xml
@@ -64,14 +64,6 @@
android:fragment="com.android.settings.wifi.p2p.WifiP2pSettings"/>
<Preference
- android:key="wps_push_button"
- android:title="@string/wifi_menu_wps_pbc" />
-
- <Preference
- android:key="wps_pin_entry"
- android:title="@string/wifi_menu_wps_pin" />
-
- <Preference
android:key="mac_address"
android:title="@string/wifi_advanced_mac_address_title"/>
diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java
index 78e8339..8d6700c 100644
--- a/src/com/android/settings/ResetNetworkConfirm.java
+++ b/src/com/android/settings/ResetNetworkConfirm.java
@@ -225,6 +225,7 @@
mEraseEsimTask.cancel(true /* mayInterruptIfRunning */);
mEraseEsimTask = null;
}
+ super.onDestroy();
}
@Override
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 741bfda..599d6fb 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -78,8 +78,8 @@
public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }
public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ }
- public static class DataPlanUsageSummaryActivity extends SettingsActivity { /* empty */ }
public static class DataUsageSummaryActivity extends SettingsActivity { /* empty */ }
+ public static class DataUsageSummaryLegacyActivity extends SettingsActivity { /* empty */ }
public static class MobileDataUsageListActivity extends SettingsActivity { /* empty */ }
public static class ConfigureWifiSettingsActivity extends SettingsActivity { /* empty */ }
public static class SavedAccessPointsSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 3c18efb..f9aaf84 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -16,6 +16,8 @@
package com.android.settings;
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
+
import android.app.ActionBar;
import android.app.ActivityManager;
import android.app.Fragment;
@@ -44,6 +46,7 @@
import android.support.v7.preference.PreferenceManager;
import android.text.TextUtils;
import android.transition.TransitionManager;
+import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
@@ -55,6 +58,7 @@
import com.android.settings.Settings.WifiSettingsActivity;
import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.backup.BackupSettingsActivity;
+import com.android.settings.core.FeatureFlags;
import com.android.settings.core.gateway.SettingsGateway;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.DashboardSummary;
@@ -80,8 +84,6 @@
// Constants for state save/restore
private static final String SAVE_KEY_CATEGORIES = ":settings:categories";
- @VisibleForTesting
- static final String SAVE_KEY_SHOW_HOME_AS_UP = ":settings:show_home_as_up";
/**
* When starting this activity, the invoking Intent can contain this extra
@@ -144,12 +146,10 @@
public static final String EXTRA_HIDE_DRAWER = ":settings:hide_drawer";
public static final String META_DATA_KEY_FRAGMENT_CLASS =
- "com.android.settings.FRAGMENT_CLASS";
+ "com.android.settings.FRAGMENT_CLASS";
private static final String EXTRA_UI_OPTIONS = "settings:ui_options";
- private static final int REQUEST_SUGGESTION = 42;
-
private String mFragmentClass;
private CharSequence mInitialTitle;
@@ -181,9 +181,6 @@
private Button mNextButton;
- @VisibleForTesting
- boolean mDisplayHomeAsUpEnabled;
-
private boolean mIsShowingDashboard;
private boolean mIsShortcut;
@@ -195,7 +192,6 @@
private ArrayList<DashboardCategory> mCategories = new ArrayList<>();
private DashboardFeatureProvider mDashboardFeatureProvider;
- private ComponentName mCurrentSuggestion;
public SwitchBar getSwitchBar() {
return mSwitchBar;
@@ -308,9 +304,6 @@
mCategories.addAll(categories);
setTitleFromBackStack();
}
-
- mDisplayHomeAsUpEnabled = savedState.getBoolean(SAVE_KEY_SHOW_HOME_AS_UP);
-
} else {
launchSettingFragment(initialFragmentName, isSubSettings, intent);
}
@@ -329,13 +322,14 @@
// and goes to the search UI. Also set the background to null so there's no ripple.
View navView = toolbar.getNavigationView();
navView.setClickable(false);
+ navView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
navView.setBackground(null);
}
ActionBar actionBar = getActionBar();
if (actionBar != null) {
- actionBar.setDisplayHomeAsUpEnabled(mDisplayHomeAsUpEnabled);
- actionBar.setHomeButtonEnabled(mDisplayHomeAsUpEnabled);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayShowTitleEnabled(!mIsShowingDashboard);
}
mSwitchBar = findViewById(R.id.switch_bar);
@@ -350,21 +344,21 @@
if (buttonBar != null) {
buttonBar.setVisibility(View.VISIBLE);
- Button backButton = (Button)findViewById(R.id.back_button);
+ Button backButton = (Button) findViewById(R.id.back_button);
backButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
setResult(RESULT_CANCELED, null);
finish();
}
});
- Button skipButton = (Button)findViewById(R.id.skip_button);
+ Button skipButton = (Button) findViewById(R.id.skip_button);
skipButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
setResult(RESULT_OK, null);
finish();
}
});
- mNextButton = (Button)findViewById(R.id.next_button);
+ mNextButton = (Button) findViewById(R.id.next_button);
mNextButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
setResult(RESULT_OK, null);
@@ -377,8 +371,7 @@
String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_NEXT_TEXT);
if (TextUtils.isEmpty(buttonText)) {
mNextButton.setVisibility(View.GONE);
- }
- else {
+ } else {
mNextButton.setText(buttonText);
}
}
@@ -386,8 +379,7 @@
String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_BACK_TEXT);
if (TextUtils.isEmpty(buttonText)) {
backButton.setVisibility(View.GONE);
- }
- else {
+ } else {
backButton.setText(buttonText);
}
}
@@ -405,26 +397,17 @@
@VisibleForTesting
void launchSettingFragment(String initialFragmentName, boolean isSubSettings, Intent intent) {
if (!mIsShowingDashboard && initialFragmentName != null) {
- // UP will be shown only if it is a sub settings
- if (mIsShortcut) {
- mDisplayHomeAsUpEnabled = isSubSettings;
- } else if (isSubSettings) {
- mDisplayHomeAsUpEnabled = true;
- } else {
- mDisplayHomeAsUpEnabled = false;
- }
setTitleFromIntent(intent);
Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
switchToFragment(initialFragmentName, initialArguments, true, false,
- mInitialTitleResId, mInitialTitle, false);
+ mInitialTitleResId, mInitialTitle, false);
} else {
// Show search icon as up affordance if we are displaying the main Dashboard
- mDisplayHomeAsUpEnabled = true;
mInitialTitleResId = R.string.dashboard_title;
switchToFragment(DashboardSummary.class.getName(), null /* args */, false, false,
- mInitialTitleResId, mInitialTitle, false);
+ mInitialTitleResId, mInitialTitle, false);
}
}
@@ -506,15 +489,6 @@
if (mCategories.size() > 0) {
outState.putParcelableArrayList(SAVE_KEY_CATEGORIES, mCategories);
}
-
- outState.putBoolean(SAVE_KEY_SHOW_HOME_AS_UP, mDisplayHomeAsUpEnabled);
- }
-
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
-
- mDisplayHomeAsUpEnabled = savedInstanceState.getBoolean(SAVE_KEY_SHOW_HOME_AS_UP);
}
@Override
@@ -607,17 +581,17 @@
* single-pane mode, a new activity will be launched in which to show the
* fragment.
*
- * @param fragmentClass Full name of the class implementing the fragment.
- * @param args Any desired arguments to supply to the fragment.
- * @param titleRes Optional resource identifier of the title of this
- * fragment.
- * @param titleText Optional text of the title of this fragment.
- * @param resultTo Optional fragment that result data should be sent to.
- * If non-null, resultTo.onActivityResult() will be called when this
- * preference panel is done. The launched panel must use
- * {@link #finishPreferencePanel(Fragment, int, Intent)} when done.
+ * @param fragmentClass Full name of the class implementing the fragment.
+ * @param args Any desired arguments to supply to the fragment.
+ * @param titleRes Optional resource identifier of the title of this
+ * fragment.
+ * @param titleText Optional text of the title of this fragment.
+ * @param resultTo Optional fragment that result data should be sent to.
+ * If non-null, resultTo.onActivityResult() will be called when this
+ * preference panel is done. The launched panel must use
+ * {@link #finishPreferencePanel(Fragment, int, Intent)} when done.
* @param resultRequestCode If resultTo is non-null, this is the caller's
- * request code to be received with the result.
+ * request code to be received with the result.
*/
public void startPreferencePanel(Fragment caller, String fragmentClass, Bundle args,
int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode) {
@@ -636,10 +610,10 @@
* activity will be launched in which to show the fragment.
*
* @param fragmentClass Full name of the class implementing the fragment.
- * @param args Any desired arguments to supply to the fragment.
- * @param titleRes Optional resource identifier of the title of this fragment.
- * @param titleText Optional text of the title of this fragment.
- * @param userHandle The user for which the panel has to be started.
+ * @param args Any desired arguments to supply to the fragment.
+ * @param titleRes Optional resource identifier of the title of this fragment.
+ * @param titleText Optional text of the title of this fragment.
+ * @param userHandle The user for which the panel has to be started.
*/
public void startPreferencePanelAsUser(Fragment caller, String fragmentClass,
Bundle args, int titleRes, CharSequence titleText, UserHandle userHandle) {
@@ -673,11 +647,11 @@
/**
* Called by a preference panel fragment to finish itself.
*
- * @param caller The fragment that is asking to be finished.
+ * @param caller The fragment that is asking to be finished.
* @param resultCode Optional result code to send back to the original
- * launching fragment.
+ * launching fragment.
* @param resultData Optional result data to send back to the original
- * launching fragment.
+ * launching fragment.
*/
public void finishPreferencePanel(Fragment caller, int resultCode, Intent resultData) {
setResult(resultCode, resultData);
@@ -688,8 +662,8 @@
* Start a new fragment.
*
* @param fragment The fragment to start
- * @param push If true, the current fragment will be pushed onto the back stack. If false,
- * the current fragment will be replaced.
+ * @param push If true, the current fragment will be pushed onto the back stack. If false,
+ * the current fragment will be replaced.
*/
public void startPreferenceFragment(Fragment fragment, boolean push) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
@@ -759,31 +733,11 @@
pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH), isAdmin)
|| somethingChanged;
- boolean isDataPlanFeatureEnabled = FeatureFactory.getFactory(this)
- .getDataPlanFeatureProvider()
- .isEnabled();
-
- // When the data plan feature flag is turned on we disable DataUsageSummaryActivity
- // and enable DataPlanUsageSummaryActivity. When the feature flag is turned off we do the
- // reverse.
-
- // Disable DataUsageSummaryActivity if the data plan feature flag is turned on otherwise
- // disable DataPlanUsageSummaryActivity.
- somethingChanged = setTileEnabled(
- new ComponentName(packageName,
- isDataPlanFeatureEnabled
- ? Settings.DataUsageSummaryActivity.class.getName()
- : Settings.DataPlanUsageSummaryActivity.class.getName()),
- false /* enabled */,
- isAdmin) || somethingChanged;
// Enable DataUsageSummaryActivity if the data plan feature flag is turned on otherwise
// enable DataPlanUsageSummaryActivity.
somethingChanged = setTileEnabled(
- new ComponentName(packageName,
- isDataPlanFeatureEnabled
- ? Settings.DataPlanUsageSummaryActivity.class.getName()
- : Settings.DataUsageSummaryActivity.class.getName()),
+ new ComponentName(packageName, Settings.DataUsageSummaryActivity.class.getName()),
Utils.isBandwidthControlEnabled() /* enabled */,
isAdmin) || somethingChanged;
@@ -819,6 +773,19 @@
Settings.PowerUsageSummaryLegacyActivity.class.getName()),
mBatteryPresent && !isBatterySettingsV2Enabled, isAdmin) || somethingChanged;
+ final boolean isDataUsageSettingsV2Enabled =
+ FeatureFlagUtils.isEnabled(this, FeatureFlags.DATA_USAGE_SETTINGS_V2);
+ // Enable new data usage page if v2 enabled
+ somethingChanged = setTileEnabled(new ComponentName(packageName,
+ Settings.DataUsageSummaryActivity.class.getName()),
+ Utils.isBandwidthControlEnabled() && isDataUsageSettingsV2Enabled, isAdmin)
+ || somethingChanged;
+ // Enable legacy data usage page if v2 disabled
+ somethingChanged = setTileEnabled(new ComponentName(packageName,
+ Settings.DataUsageSummaryLegacyActivity.class.getName()),
+ Utils.isBandwidthControlEnabled() && !isDataUsageSettingsV2Enabled, isAdmin)
+ || somethingChanged;
+
somethingChanged = setTileEnabled(new ComponentName(packageName,
Settings.UserSettingsActivity.class.getName()),
UserHandle.MU_ENABLED && UserManager.supportsMultipleUsers()
@@ -841,7 +808,6 @@
|| somethingChanged;
final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)
- && !um.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)
&& !Utils.isMonkeyRunning();
somethingChanged = setTileEnabled(new ComponentName(packageName,
@@ -937,29 +903,6 @@
return mNextButton;
}
- @Override
- public boolean shouldUpRecreateTask(Intent targetIntent) {
- return super.shouldUpRecreateTask(new Intent(this, SettingsActivity.class));
- }
-
- public void startSuggestion(Intent intent) {
- if (intent == null || ActivityManager.isUserAMonkey()) {
- return;
- }
- mCurrentSuggestion = intent.getComponent();
- startActivityForResult(intent, REQUEST_SUGGESTION);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == REQUEST_SUGGESTION && mCurrentSuggestion != null
- && resultCode != RESULT_CANCELED) {
- getPackageManager().setComponentEnabledSetting(mCurrentSuggestion,
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
-
@VisibleForTesting
Bitmap getBitmapFromXmlResource(int drawableRes) {
Drawable drawable = getResources().getDrawable(drawableRes, getTheme());
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index f45ac5e..1a32127 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -52,11 +52,8 @@
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.fingerprint.FingerprintManager;
-import android.icu.text.MeasureFormat;
import android.icu.text.RelativeDateTimeFormatter;
import android.icu.text.RelativeDateTimeFormatter.RelativeUnit;
-import android.icu.util.Measure;
-import android.icu.util.MeasureUnit;
import android.icu.util.ULocale;
import android.net.ConnectivityManager;
import android.net.LinkProperties;
@@ -88,8 +85,6 @@
import android.telephony.TelephonyManager;
import android.text.Spannable;
import android.text.SpannableString;
-import android.text.SpannableStringBuilder;
-import android.text.Spanned;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.text.style.TtsSpan;
@@ -112,6 +107,7 @@
import com.android.settings.wrapper.FingerprintManagerWrapper;
import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
+import com.android.settingslib.utils.StringUtil;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Iterator;
@@ -138,10 +134,6 @@
private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
- private static final int SECONDS_PER_MINUTE = 60;
- private static final int SECONDS_PER_HOUR = 60 * 60;
- private static final int SECONDS_PER_DAY = 24 * 60 * 60;
-
public static final String OS_PKG = "os";
/**
@@ -772,113 +764,6 @@
}
/**
- * Returns elapsed time for the given millis, in the following format:
- * 2d 5h 40m 29s
- * @param context the application context
- * @param millis the elapsed time in milli seconds
- * @param withSeconds include seconds?
- * @return the formatted elapsed time
- */
- public static CharSequence formatElapsedTime(Context context, double millis,
- boolean withSeconds) {
- SpannableStringBuilder sb = new SpannableStringBuilder();
- int seconds = (int) Math.floor(millis / 1000);
- if (!withSeconds) {
- // Round up.
- seconds += 30;
- }
-
- int days = 0, hours = 0, minutes = 0;
- if (seconds >= SECONDS_PER_DAY) {
- days = seconds / SECONDS_PER_DAY;
- seconds -= days * SECONDS_PER_DAY;
- }
- if (seconds >= SECONDS_PER_HOUR) {
- hours = seconds / SECONDS_PER_HOUR;
- seconds -= hours * SECONDS_PER_HOUR;
- }
- if (seconds >= SECONDS_PER_MINUTE) {
- minutes = seconds / SECONDS_PER_MINUTE;
- seconds -= minutes * SECONDS_PER_MINUTE;
- }
-
- final ArrayList<Measure> measureList = new ArrayList(4);
- if (days > 0) {
- measureList.add(new Measure(days, MeasureUnit.DAY));
- }
- if (hours > 0) {
- measureList.add(new Measure(hours, MeasureUnit.HOUR));
- }
- if (minutes > 0) {
- measureList.add(new Measure(minutes, MeasureUnit.MINUTE));
- }
- if (withSeconds && seconds > 0) {
- measureList.add(new Measure(seconds, MeasureUnit.SECOND));
- }
- if (measureList.size() == 0) {
- // Everything addable was zero, so nothing was added. We add a zero.
- measureList.add(new Measure(0, withSeconds ? MeasureUnit.SECOND : MeasureUnit.MINUTE));
- }
- final Measure[] measureArray = measureList.toArray(new Measure[measureList.size()]);
-
- final Locale locale = context.getResources().getConfiguration().locale;
- final MeasureFormat measureFormat = MeasureFormat.getInstance(
- locale, MeasureFormat.FormatWidth.NARROW);
- sb.append(measureFormat.formatMeasures(measureArray));
-
- if (measureArray.length == 1 && MeasureUnit.MINUTE.equals(measureArray[0].getUnit())) {
- // Add ttsSpan if it only have minute value, because it will be read as "meters"
- final TtsSpan ttsSpan = new TtsSpan.MeasureBuilder().setNumber(minutes)
- .setUnit("minute").build();
- sb.setSpan(ttsSpan, 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
-
- return sb;
- }
-
- /**
- * Returns relative time for the given millis in the past, in a short format such as "2 days
- * ago", "5 hr. ago", "40 min. ago", or "29 sec. ago".
- *
- * <p>The unit is chosen to have good information value while only using one unit. So 27 hours
- * and 50 minutes would be formatted as "28 hr. ago", while 50 hours would be formatted as
- * "2 days ago".
- *
- * @param context the application context
- * @param millis the elapsed time in milli seconds
- * @param withSeconds include seconds?
- * @return the formatted elapsed time
- */
- public static CharSequence formatRelativeTime(Context context, double millis,
- boolean withSeconds) {
- final int seconds = (int) Math.floor(millis / 1000);
- final RelativeUnit unit;
- final int value;
- if (withSeconds && seconds < 2 * SECONDS_PER_MINUTE) {
- unit = RelativeUnit.SECONDS;
- value = seconds;
- } else if (seconds < 2 * SECONDS_PER_HOUR) {
- unit = RelativeUnit.MINUTES;
- value = (seconds + SECONDS_PER_MINUTE / 2) / SECONDS_PER_MINUTE;
- } else if (seconds < 2 * SECONDS_PER_DAY) {
- unit = RelativeUnit.HOURS;
- value = (seconds + SECONDS_PER_HOUR / 2) / SECONDS_PER_HOUR;
- } else {
- unit = RelativeUnit.DAYS;
- value = (seconds + SECONDS_PER_DAY / 2) / SECONDS_PER_DAY;
- }
-
- final Locale locale = context.getResources().getConfiguration().locale;
- final RelativeDateTimeFormatter formatter = RelativeDateTimeFormatter.getInstance(
- ULocale.forLocale(locale),
- null /* default NumberFormat */,
- RelativeDateTimeFormatter.Style.SHORT,
- android.icu.text.DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE);
-
- return formatter.format(value, RelativeDateTimeFormatter.Direction.LAST, unit);
- }
-
- /**
* Queries for the UserInfo of a user. Returns null if the user doesn't exist (was removed).
* @param userManager Instance of UserManager
* @param checkUser The user to check the existence of.
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index df8d4c8..7335bae 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -16,6 +16,8 @@
package com.android.settings.accessibility;
+import static android.os.Vibrator.VibrationIntensity;
+
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
@@ -28,6 +30,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;
+import android.os.Vibrator;
import android.provider.SearchIndexableResource;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
@@ -111,6 +114,8 @@
"tts_settings_preference";
private static final String AUTOCLICK_PREFERENCE_SCREEN =
"autoclick_preference_screen";
+ private static final String VIBRATION_PREFERENCE_SCREEN =
+ "vibration_preference_screen";
@VisibleForTesting static final String TOGGLE_INVERSION_PREFERENCE =
"toggle_inversion_preference";
@@ -215,6 +220,7 @@
private Preference mAutoclickPreferenceScreen;
private Preference mAccessibilityShortcutPreferenceScreen;
private Preference mDisplayDaltonizerPreferenceScreen;
+ private Preference mVibrationPreferenceScreen;
private SwitchPreference mToggleInversionPreference;
private int mLongPressTimeoutDefault;
@@ -452,9 +458,11 @@
// Display color adjustments.
mDisplayDaltonizerPreferenceScreen = findPreference(DISPLAY_DALTONIZER_PREFERENCE_SCREEN);
- // Accessibility shortcut
+ // Accessibility shortcut.
mAccessibilityShortcutPreferenceScreen = findPreference(ACCESSIBILITY_SHORTCUT_PREFERENCE);
+ // Vibrations.
+ mVibrationPreferenceScreen = findPreference(VIBRATION_PREFERENCE_SCREEN);
}
private void updateAllPreferences() {
@@ -661,6 +669,8 @@
mSelectLongPressTimeoutPreference.setValue(value);
mSelectLongPressTimeoutPreference.setSummary(mLongPressTimeoutValueToTitleMap.get(value));
+ updateVibrationSummary(mVibrationPreferenceScreen);
+
updateFeatureSummary(Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED,
mCaptioningPreferenceScreen);
updateFeatureSummary(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
@@ -726,6 +736,29 @@
pref.setSummary(entries[index]);
}
+ private void updateVibrationSummary(Preference pref) {
+ Vibrator vibrator = getContext().getSystemService(Vibrator.class);
+ final int intensity = Settings.System.getInt(getContext().getContentResolver(),
+ Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+ vibrator.getDefaultNotificationVibrationIntensity());
+ mVibrationPreferenceScreen.setSummary(getVibrationSummary(getContext(), intensity));
+ }
+
+ private String getVibrationSummary(Context context, @VibrationIntensity int intensity) {
+ switch (intensity) {
+ case Vibrator.VIBRATION_INTENSITY_OFF:
+ return context.getString(R.string.accessibility_vibration_summary_off);
+ case Vibrator.VIBRATION_INTENSITY_LOW:
+ return context.getString(R.string.accessibility_vibration_summary_low);
+ case Vibrator.VIBRATION_INTENSITY_MEDIUM:
+ return context.getString(R.string.accessibility_vibration_summary_medium);
+ case Vibrator.VIBRATION_INTENSITY_HIGH:
+ return context.getString(R.string.accessibility_vibration_summary_high);
+ default:
+ return "";
+ }
+ }
+
private void updateLockScreenRotationCheckbox() {
Context context = getActivity();
if (context != null) {
diff --git a/src/com/android/settings/accessibility/NotificationVibrationPreferenceFragment.java b/src/com/android/settings/accessibility/NotificationVibrationPreferenceFragment.java
new file mode 100644
index 0000000..6340bb1
--- /dev/null
+++ b/src/com/android/settings/accessibility/NotificationVibrationPreferenceFragment.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.accessibility;
+
+import android.os.Vibrator;
+import android.provider.Settings;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+
+/**
+ * Fragment for picking accessibility shortcut service
+ */
+public class NotificationVibrationPreferenceFragment extends VibrationPreferenceFragment {
+ @Override
+ public int getMetricsCategory() {
+ return MetricsEvent.ACCESSIBILITY_VIBRATION_NOTIFICATION;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.accessibility_notification_vibration_settings;
+ }
+
+ /**
+ * Get the setting string of the vibration intensity setting this preference is dealing with.
+ */
+ @Override
+ protected String getVibrationIntensitySetting() {
+ return Settings.System.NOTIFICATION_VIBRATION_INTENSITY;
+ }
+
+ @Override
+ protected int getDefaultVibrationIntensity() {
+ Vibrator vibrator = getContext().getSystemService(Vibrator.class);
+ return vibrator.getDefaultNotificationVibrationIntensity();
+ }
+}
diff --git a/src/com/android/settings/accessibility/TouchVibrationPreferenceFragment.java b/src/com/android/settings/accessibility/TouchVibrationPreferenceFragment.java
new file mode 100644
index 0000000..ea36833
--- /dev/null
+++ b/src/com/android/settings/accessibility/TouchVibrationPreferenceFragment.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.accessibility;
+
+import android.graphics.drawable.Drawable;
+import android.os.Vibrator;
+import android.provider.Settings;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+
+/**
+ * Fragment for picking accessibility shortcut service
+ */
+public class TouchVibrationPreferenceFragment extends VibrationPreferenceFragment {
+ @Override
+ public int getMetricsCategory() {
+ return MetricsEvent.ACCESSIBILITY_VIBRATION_TOUCH;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.accessibility_touch_vibration_settings;
+ }
+
+ /**
+ * Get the setting string of the vibration intensity setting this preference is dealing with.
+ */
+ @Override
+ protected String getVibrationIntensitySetting() {
+ return Settings.System.HAPTIC_FEEDBACK_INTENSITY;
+ }
+
+ @Override
+ protected int getDefaultVibrationIntensity() {
+ Vibrator vibrator = getContext().getSystemService(Vibrator.class);
+ return vibrator.getDefaultHapticFeedbackIntensity();
+ }
+
+ @Override
+ public void onVibrationIntensitySelected(int intensity) {
+ // We want to keep HAPTIC_FEEDBACK_ENABLED consistent with this setting since some
+ // applications check it directly before triggering their own haptic feedback.
+ final boolean hapticFeedbackEnabled = !(intensity == Vibrator.VIBRATION_INTENSITY_OFF);
+ Settings.System.putInt(getContext().getContentResolver(),
+ Settings.System.HAPTIC_FEEDBACK_ENABLED, hapticFeedbackEnabled ? 1 : 0);
+ }
+}
diff --git a/src/com/android/settings/accessibility/VibrationPreferenceFragment.java b/src/com/android/settings/accessibility/VibrationPreferenceFragment.java
new file mode 100644
index 0000000..f81208f
--- /dev/null
+++ b/src/com/android/settings/accessibility/VibrationPreferenceFragment.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.accessibility;
+
+import static android.os.Vibrator.VibrationIntensity;
+
+import android.support.annotation.VisibleForTesting;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Vibrator;
+import android.provider.Settings;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.internal.accessibility.AccessibilityShortcutController;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.widget.RadioButtonPickerFragment;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Fragment for changing vibration settings.
+ */
+public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragment {
+ private static final String TAG = "VibrationPreferenceFragment";
+
+ @VisibleForTesting
+ final static String KEY_INTENSITY_OFF = "intensity_off";
+ @VisibleForTesting
+ final static String KEY_INTENSITY_LOW = "intensity_low";
+ @VisibleForTesting
+ final static String KEY_INTENSITY_MEDIUM = "intensity_medium";
+ @VisibleForTesting
+ final static String KEY_INTENSITY_HIGH = "intensity_high";
+
+ private final Map<String, VibrationIntensityCandidateInfo> mCandidates;
+ private final SettingsObserver mSettingsObserver;
+
+ public VibrationPreferenceFragment() {
+ mCandidates = new ArrayMap<>();
+ mCandidates.put(KEY_INTENSITY_OFF,
+ new VibrationIntensityCandidateInfo(KEY_INTENSITY_OFF,
+ R.string.accessibility_vibration_intensity_off,
+ Vibrator.VIBRATION_INTENSITY_OFF));
+ mCandidates.put(KEY_INTENSITY_LOW,
+ new VibrationIntensityCandidateInfo(KEY_INTENSITY_LOW,
+ R.string.accessibility_vibration_intensity_low,
+ Vibrator.VIBRATION_INTENSITY_LOW));
+ mCandidates.put(KEY_INTENSITY_MEDIUM,
+ new VibrationIntensityCandidateInfo(KEY_INTENSITY_MEDIUM,
+ R.string.accessibility_vibration_intensity_medium,
+ Vibrator.VIBRATION_INTENSITY_MEDIUM));
+ mCandidates.put(KEY_INTENSITY_HIGH,
+ new VibrationIntensityCandidateInfo(KEY_INTENSITY_HIGH,
+ R.string.accessibility_vibration_intensity_high,
+ Vibrator.VIBRATION_INTENSITY_HIGH));
+ mSettingsObserver = new SettingsObserver();
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ mSettingsObserver.register();
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ mSettingsObserver.unregister();
+ }
+
+ /**
+ * Get the setting string of the vibration intensity setting this preference is dealing with.
+ */
+ protected abstract String getVibrationIntensitySetting();
+
+ /**
+ * Get the default intensity for the desired setting.
+ */
+ protected abstract int getDefaultVibrationIntensity();
+
+ /**
+ * When a new vibration intensity is selected by the user.
+ */
+ protected void onVibrationIntensitySelected(int intensity) { }
+
+ @Override
+ protected List<? extends CandidateInfo> getCandidates() {
+ List<VibrationIntensityCandidateInfo> candidates = new ArrayList<>(mCandidates.values());
+ candidates.sort(
+ Comparator.comparing(VibrationIntensityCandidateInfo::getIntensity).reversed());
+ return candidates;
+ }
+
+ @Override
+ protected String getDefaultKey() {
+ final int vibrationIntensity = Settings.System.getInt(getContext().getContentResolver(),
+ getVibrationIntensitySetting(), getDefaultVibrationIntensity());
+ for (VibrationIntensityCandidateInfo candidate : mCandidates.values()) {
+ if (candidate.getIntensity() == vibrationIntensity) {
+ return candidate.getKey();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected boolean setDefaultKey(String key) {
+ VibrationIntensityCandidateInfo candidate = mCandidates.get(key);
+ if (candidate == null) {
+ Log.e(TAG, "Tried to set unknown intensity (key=" + key + ")!");
+ return false;
+ }
+ Settings.System.putInt(getContext().getContentResolver(),
+ getVibrationIntensitySetting(), candidate.getIntensity());
+ onVibrationIntensitySelected(candidate.getIntensity());
+ return true;
+ }
+
+ @VisibleForTesting
+ class VibrationIntensityCandidateInfo extends CandidateInfo {
+ private String mKey;
+ private int mLabelId;
+ @VibrationIntensity
+ private int mIntensity;
+
+ public VibrationIntensityCandidateInfo(String key, int labelId, int intensity) {
+ super(true /* enabled */);
+ mKey = key;
+ mLabelId = labelId;
+ mIntensity = intensity;
+ }
+
+ @Override
+ public CharSequence loadLabel() {
+ return getContext().getString(mLabelId);
+ }
+
+ @Override
+ public Drawable loadIcon() {
+ return null;
+ }
+
+ @Override
+ public String getKey() {
+ return mKey;
+ }
+
+ public int getIntensity() {
+ return mIntensity;
+ }
+ }
+
+ private class SettingsObserver extends ContentObserver {
+ public SettingsObserver() {
+ super(new Handler());
+ }
+
+ public void register() {
+ getContext().getContentResolver().registerContentObserver(
+ Settings.System.getUriFor(getVibrationIntensitySetting()), false, this);
+ }
+
+ public void unregister() {
+ getContext().getContentResolver().unregisterContentObserver(this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ updateCandidates();
+ }
+ }
+}
diff --git a/src/com/android/settings/accessibility/VibrationSettings.java b/src/com/android/settings/accessibility/VibrationSettings.java
new file mode 100644
index 0000000..8aa4513
--- /dev/null
+++ b/src/com/android/settings/accessibility/VibrationSettings.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.content.Context;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Vibrator;
+import android.provider.SearchIndexableResource;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.Preference;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Activity with the accessibility settings.
+ */
+public class VibrationSettings extends SettingsPreferenceFragment implements Indexable {
+
+ // Preferences
+ @VisibleForTesting
+ static final String NOTIFICATION_VIBRATION_PREFERENCE_SCREEN =
+ "notification_vibration_preference_screen";
+ @VisibleForTesting
+ static final String TOUCH_VIBRATION_PREFERENCE_SCREEN =
+ "touch_vibration_preference_screen";
+
+ private final Handler mHandler = new Handler();
+ private final SettingsContentObserver mSettingsContentObserver;
+
+ private Preference mNotificationVibrationPreferenceScreen;
+ private Preference mTouchVibrationPreferenceScreen;
+
+ public VibrationSettings() {
+ List<String> vibrationSettings = new ArrayList<>();
+ vibrationSettings.add(Settings.System.HAPTIC_FEEDBACK_INTENSITY);
+ vibrationSettings.add(Settings.System.NOTIFICATION_VIBRATION_INTENSITY);
+ mSettingsContentObserver = new SettingsContentObserver(mHandler, vibrationSettings) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ updatePreferences();
+ }
+ };
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsEvent.ACCESSIBILITY_VIBRATION;
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ addPreferencesFromResource(R.xml.accessibility_vibration_settings);
+ initializePreferences();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updatePreferences();
+ mSettingsContentObserver.register(getContentResolver());
+ }
+
+ @Override
+ public void onPause() {
+ mSettingsContentObserver.unregister(getContentResolver());
+ super.onPause();
+ }
+
+ private void initializePreferences() {
+ // Notification and notification vibration strength adjustments.
+ mNotificationVibrationPreferenceScreen =
+ findPreference(NOTIFICATION_VIBRATION_PREFERENCE_SCREEN);
+
+ // Touch feedback strength adjustments.
+ mTouchVibrationPreferenceScreen = findPreference(TOUCH_VIBRATION_PREFERENCE_SCREEN);
+ }
+
+ private void updatePreferences() {
+ updateNotificationVibrationSummary(mNotificationVibrationPreferenceScreen);
+ updateTouchVibrationSummary(mTouchVibrationPreferenceScreen);
+ }
+
+ private void updateNotificationVibrationSummary(Preference pref) {
+ Vibrator vibrator = getContext().getSystemService(Vibrator.class);
+ final int intensity = Settings.System.getInt(getContext().getContentResolver(),
+ Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
+ vibrator.getDefaultNotificationVibrationIntensity());
+ CharSequence summary = getVibrationIntensitySummary(getContext(), intensity);
+ mNotificationVibrationPreferenceScreen.setSummary(summary);
+ }
+
+ private void updateTouchVibrationSummary(Preference pref) {
+ Vibrator vibrator = getContext().getSystemService(Vibrator.class);
+ final int intensity = Settings.System.getInt(getContext().getContentResolver(),
+ Settings.System.HAPTIC_FEEDBACK_INTENSITY,
+ vibrator.getDefaultHapticFeedbackIntensity());
+ CharSequence summary = getVibrationIntensitySummary(getContext(), intensity);
+ mTouchVibrationPreferenceScreen.setSummary(summary);
+ }
+
+ public static String getVibrationIntensitySummary(Context context, int intensity) {
+ switch (intensity) {
+ case Vibrator.VIBRATION_INTENSITY_OFF:
+ return context.getString(R.string.accessibility_vibration_intensity_off);
+ case Vibrator.VIBRATION_INTENSITY_LOW:
+ return context.getString(R.string.accessibility_vibration_intensity_low);
+ case Vibrator.VIBRATION_INTENSITY_MEDIUM:
+ return context.getString(R.string.accessibility_vibration_intensity_medium);
+ case Vibrator.VIBRATION_INTENSITY_HIGH:
+ return context.getString(R.string.accessibility_vibration_intensity_high);
+ default:
+ return "";
+ }
+ }
+
+ public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider() {
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
+ boolean enabled) {
+ List<SearchIndexableResource> indexables = new ArrayList<>();
+ SearchIndexableResource indexable = new SearchIndexableResource(context);
+ indexable.xmlResId = R.xml.accessibility_vibration_settings;
+ indexables.add(indexable);
+ return indexables;
+ }
+ };
+}
diff --git a/src/com/android/settings/applications/RecentAppsPreferenceController.java b/src/com/android/settings/applications/RecentAppsPreferenceController.java
index e15671b..b177225 100644
--- a/src/com/android/settings/applications/RecentAppsPreferenceController.java
+++ b/src/com/android/settings/applications/RecentAppsPreferenceController.java
@@ -38,13 +38,13 @@
import android.util.Log;
import com.android.settings.R;
-import com.android.settings.Utils;
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.widget.AppPreference;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.utils.StringUtil;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import java.util.ArrayList;
@@ -239,7 +239,7 @@
pref.setKey(pkgName);
pref.setTitle(appEntry.label);
pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info));
- pref.setSummary(Utils.formatRelativeTime(mContext,
+ pref.setSummary(StringUtil.formatRelativeTime(mContext,
System.currentTimeMillis() - stat.getLastTimeUsed(), false));
pref.setOrder(i);
pref.setOnPreferenceClickListener(preference -> {
diff --git a/src/com/android/settings/backup/BackupSettingsHelper.java b/src/com/android/settings/backup/BackupSettingsHelper.java
index b0d6cf8..d0a029c 100644
--- a/src/com/android/settings/backup/BackupSettingsHelper.java
+++ b/src/com/android/settings/backup/BackupSettingsHelper.java
@@ -24,13 +24,12 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
-import android.util.Log;
-
import android.support.annotation.VisibleForTesting;
+import android.util.Log;
import com.android.settings.R;
import com.android.settings.Settings.PrivacySettingsActivity;
-import com.android.settingslib.drawer.SettingsDrawerActivity;
+
import java.net.URISyntaxException;
/**
@@ -153,8 +152,7 @@
private Intent getIntentForDefaultBackupSettings() {
// Extra needed by {@link SettingsDrawerActivity} to show the back button navigation.
- return new Intent(mContext, PrivacySettingsActivity.class)
- .putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
+ return new Intent(mContext, PrivacySettingsActivity.class);
}
/**
diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java
index 01d98b8..4bd7ba4 100644
--- a/src/com/android/settings/core/BasePreferenceController.java
+++ b/src/com/android/settings/core/BasePreferenceController.java
@@ -30,6 +30,8 @@
* Abstract class to consolidate utility between preference controllers and act as an interface
* for Slices. The abstract classes that inherit from this class will act as the direct interfaces
* for each type when plugging into Slices.
+ *
+ * TODO (b/73074893) Add Lifecycle Setting method.
*/
public abstract class BasePreferenceController extends AbstractPreferenceController {
diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java
index 8fa1bb3..fd756df 100644
--- a/src/com/android/settings/core/FeatureFlags.java
+++ b/src/com/android/settings/core/FeatureFlags.java
@@ -26,4 +26,5 @@
public static final String ZONE_PICKER_V2 = "settings_zone_picker_v2";
public static final String ABOUT_PHONE_V2 = "settings_about_phone_v2";
public static final String BLUETOOTH_WHILE_DRIVING = "settings_bluetooth_while_driving";
+ public static final String DATA_USAGE_SETTINGS_V2 = "settings_data_usage_v2";
}
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index f43c3c8..76def2c 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -33,16 +33,16 @@
import com.android.settings.accessibility.AccessibilitySettingsForSetupWizard;
import com.android.settings.accessibility.CaptionPropertiesFragment;
import com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment;
+import com.android.settings.accounts.AccountDashboardFragment;
import com.android.settings.accounts.AccountSyncSettings;
import com.android.settings.accounts.ChooseAccountActivity;
import com.android.settings.accounts.ManagedProfileSettings;
-import com.android.settings.accounts.AccountDashboardFragment;
import com.android.settings.applications.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DefaultAppSettings;
+import com.android.settings.applications.DirectoryAccessDetails;
import com.android.settings.applications.ManageDomainUrls;
import com.android.settings.applications.ProcessStatsSummary;
import com.android.settings.applications.ProcessStatsUi;
-import com.android.settings.applications.DirectoryAccessDetails;
import com.android.settings.applications.UsageAccessDetails;
import com.android.settings.applications.VrListenerSettings;
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
@@ -59,9 +59,9 @@
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
import com.android.settings.connecteddevice.usb.UsbDetailsFragment;
-import com.android.settings.datausage.DataPlanUsageSummary;
import com.android.settings.datausage.DataUsageList;
import com.android.settings.datausage.DataUsageSummary;
+import com.android.settings.datausage.DataUsageSummaryLegacy;
import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
import com.android.settings.development.DevelopmentSettingsDashboardFragment;
import com.android.settings.deviceinfo.DeviceInfoSettings;
@@ -74,7 +74,7 @@
import com.android.settings.dream.DreamSettings;
import com.android.settings.enterprise.EnterprisePrivacySettings;
import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
-import com.android.settings.fuelgauge.BatterySaverSettings;
+import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
import com.android.settings.fuelgauge.PowerUsageSummary;
import com.android.settings.fuelgauge.PowerUsageSummaryLegacy;
import com.android.settings.gestures.AssistGestureSettings;
@@ -187,8 +187,8 @@
PickupGestureSettings.class.getName(),
DoubleTwistGestureSettings.class.getName(),
CryptKeeperSettings.class.getName(),
- DataPlanUsageSummary.class.getName(),
DataUsageSummary.class.getName(),
+ DataUsageSummaryLegacy.class.getName(),
DreamSettings.class.getName(),
UserSettings.class.getName(),
NotificationAccessSettings.class.getName(),
@@ -273,7 +273,6 @@
SupportDashboardActivity.class.getName(),
// Home page > Network & Internet
Settings.WifiSettingsActivity.class.getName(),
- Settings.DataPlanUsageSummaryActivity.class.getName(),
Settings.DataUsageSummaryActivity.class.getName(),
Settings.SimSettingsActivity.class.getName(),
// Home page > Connected devices
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 086a131..3ed76d8 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -33,21 +33,18 @@
import android.support.v7.preference.Preference;
import android.text.TextUtils;
import android.util.ArrayMap;
-import android.util.FeatureFlagUtils;
import android.util.Log;
import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
-import com.android.settings.core.FeatureFlags;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.drawer.CategoryManager;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.ProfileSelectDialog;
-import com.android.settingslib.drawer.SettingsDrawerActivity;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.drawer.TileUtils;
import com.android.settingslib.utils.ThreadUtils;
@@ -212,7 +209,6 @@
final Intent intent = new Intent(tile.intent)
.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
MetricsEvent.DASHBOARD_SUMMARY)
- .putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
launchIntentOrSelectProfile(activity, tile, intent, MetricsEvent.DASHBOARD_SUMMARY);
}
diff --git a/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java b/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java
index 7feac23..7877f9d 100644
--- a/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java
+++ b/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java
@@ -20,7 +20,7 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.Utils;
-import com.android.settings.fuelgauge.BatterySaverSettings;
+import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
public class BatterySaverCondition extends Condition {
public BatterySaverCondition(ConditionManager manager) {
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
index 62bc148..b24a914 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
@@ -23,12 +23,15 @@
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.service.settings.suggestions.Suggestion;
+import android.support.annotation.VisibleForTesting;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -117,7 +120,7 @@
mConfig.setCardLayout(holder, suggestionCount, position);
final Icon icon = suggestion.getIcon();
final Drawable drawable = mCache.getIcon(icon);
- if ((suggestion.getFlags() & Suggestion.FLAG_ICON_TINTABLE) != 0) {
+ if (drawable != null && (suggestion.getFlags() & Suggestion.FLAG_ICON_TINTABLE) != 0) {
drawable.setTint(Utils.getColorAccent(mContext));
}
holder.icon.setImageDrawable(drawable);
@@ -226,28 +229,27 @@
return mSuggestions;
}
- private static class CardConfig {
+ @VisibleForTesting
+ static class CardConfig {
// Card start/end margin
private final int mMarginInner;
private final int mMarginOuter;
- // Card width for different numbers of cards
- private final int mWidthSingleCard;
- private final int mWidthTwoCards;
+ // Card width if there are more than 2 cards
private final int mWidthMultipleCards;
// padding between icon and title
private final int mPaddingTitleTopSingleCard;
private final int mPaddingTitleTopMultipleCards;
+ private final WindowManager mWindowManager;
private static CardConfig sConfig;
private CardConfig(Context context) {
+ mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
final Resources res = context.getResources();
mMarginInner =
res.getDimensionPixelOffset(R.dimen.suggestion_card_inner_margin);
mMarginOuter =
res.getDimensionPixelOffset(R.dimen.suggestion_card_outer_margin);
- mWidthSingleCard = res.getDimensionPixelOffset(R.dimen.suggestion_card_width_one_card);
- mWidthTwoCards = res.getDimensionPixelOffset(R.dimen.suggestion_card_width_two_cards);
mWidthMultipleCards =
res.getDimensionPixelOffset(R.dimen.suggestion_card_width_multiple_cards);
mPaddingTitleTopSingleCard =
@@ -263,12 +265,12 @@
return sConfig;
}
- private void setCardLayout(DashboardItemHolder holder, int suggestionCount,
- int position) {
+ @VisibleForTesting
+ void setCardLayout(DashboardItemHolder holder, int suggestionCount, int position) {
final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
suggestionCount == 1
- ? mWidthSingleCard : suggestionCount == 2
- ? mWidthTwoCards : mWidthMultipleCards,
+ ? LinearLayout.LayoutParams.MATCH_PARENT : suggestionCount == 2
+ ? getWidthForTwoCrads() : mWidthMultipleCards,
LinearLayout.LayoutParams.WRAP_CONTENT);
if (suggestionCount == 1) {
params.setMarginStart(mMarginOuter);
@@ -281,6 +283,16 @@
holder.itemView.setLayoutParams(params);
}
+ private int getWidthForTwoCrads() {
+ return (getScreenWidth() - mMarginInner - mMarginOuter * 2) / 2;
+ }
+
+ @VisibleForTesting
+ int getScreenWidth() {
+ final DisplayMetrics metrics = new DisplayMetrics();
+ mWindowManager.getDefaultDisplay().getMetrics(metrics);
+ return metrics.widthPixels;
+ }
}
}
diff --git a/src/com/android/settings/datausage/DataPlanFeatureProvider.java b/src/com/android/settings/datausage/DataPlanFeatureProvider.java
deleted file mode 100644
index eb5b48f..0000000
--- a/src/com/android/settings/datausage/DataPlanFeatureProvider.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.datausage;
-
-/**
- * Feature provider for data plan feature.
- */
-public interface DataPlanFeatureProvider {
- /**
- * @return whether data plan feature is enabled.
- */
- boolean isEnabled();
-}
diff --git a/src/com/android/settings/datausage/DataPlanFeatureProviderImpl.java b/src/com/android/settings/datausage/DataPlanFeatureProviderImpl.java
deleted file mode 100644
index d5f435c..0000000
--- a/src/com/android/settings/datausage/DataPlanFeatureProviderImpl.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.datausage;
-
-import android.os.SystemProperties;
-
-/**
- * Impl for data plan feature provider.
- */
-public final class DataPlanFeatureProviderImpl implements DataPlanFeatureProvider {
- private static final String ENABLE_SETTINGS_DATA_PLAN = "enable.settings.data.plan";
-
- @Override
- public boolean isEnabled() {
- return SystemProperties.getBoolean(ENABLE_SETTINGS_DATA_PLAN, false /* default */);
- }
-}
diff --git a/src/com/android/settings/datausage/DataPlanSummaryPreference.java b/src/com/android/settings/datausage/DataPlanSummaryPreference.java
deleted file mode 100644
index f48e04d..0000000
--- a/src/com/android/settings/datausage/DataPlanSummaryPreference.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.settings.datausage;
-
-import android.content.Context;
-import android.support.annotation.ColorRes;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.util.AttributeSet;
-import android.widget.TextView;
-import com.android.settings.R;
-import com.android.settings.widget.DonutView;
-
-/**
- * Provides a summary of data plans as preferences on settings page.
- */
-public final class DataPlanSummaryPreference extends Preference {
- private String mName;
- private String mDescription;
- private double mPercentageUsage;
- private int mUsageTextColor;
- private int mMeterBackgroundColor;
- private int mMeterConsumedColor;
-
- public DataPlanSummaryPreference(Context context) {
- super(context);
- setLayoutResource(R.layout.settings_data_plan_summary_preference);
- }
-
- public DataPlanSummaryPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- setLayoutResource(R.layout.settings_data_plan_summary_preference);
- }
-
- public void setName(String planName) {
- mName = planName;
- notifyChanged();
- }
-
- public void setDescription(String planDescription) {
- mDescription = planDescription;
- notifyChanged();
- }
-
- public void setPercentageUsage(double percentageUsage) {
- mPercentageUsage = percentageUsage;
- notifyChanged();
- }
-
- public void setUsageTextColor(@ColorRes int planUsageTextColor) {
- mUsageTextColor = planUsageTextColor;
- notifyChanged();
- }
-
- public void setMeterBackgroundColor(@ColorRes int meterBackgroundColor) {
- mMeterBackgroundColor = meterBackgroundColor;
- notifyChanged();
- }
-
- public void setMeterConsumedColor(@ColorRes int meterConsumedColor) {
- mMeterConsumedColor = meterConsumedColor;
- notifyChanged();
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
- holder.setDividerAllowedAbove(false);
- TextView titleView = (TextView) holder.findViewById(android.R.id.title);
- titleView.setTextColor(mUsageTextColor);
- ((TextView) holder.findViewById(android.R.id.text1)).setText(mName);
- ((TextView) holder.findViewById(android.R.id.text2)).setText(mDescription);
- DonutView donutView = (DonutView) holder.findViewById(R.id.donut);
- donutView.setPercentage(mPercentageUsage);
- donutView.setMeterBackgroundColor(mMeterBackgroundColor);
- donutView.setMeterConsumedColor(mMeterConsumedColor);
- }
-}
diff --git a/src/com/android/settings/datausage/DataPlanUsageSummary.java b/src/com/android/settings/datausage/DataPlanUsageSummary.java
deleted file mode 100644
index 9489322..0000000
--- a/src/com/android/settings/datausage/DataPlanUsageSummary.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.settings.datausage;
-
-import static android.net.NetworkPolicy.LIMIT_DISABLED;
-
-import android.annotation.IdRes;
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.NetworkPolicy;
-import android.net.NetworkPolicyManager;
-import android.net.NetworkTemplate;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiManager;
-import android.os.Bundle;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceCategory;
-import android.support.v7.preference.PreferenceScreen;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.text.TextUtils;
-import android.text.format.Formatter;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.dashboard.SummaryLoader;
-import com.android.settingslib.NetworkPolicyEditor;
-import com.android.settingslib.net.DataUsageController;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @deprecated This fragment was supposed to be new version of {@link DataUsageSummary} however
- * unfinished and used nowhere. Keep it in case we may bring it back someday.
- */
-@Deprecated
-public class DataPlanUsageSummary extends DataUsageBase {
-
- public static final String KEY_DATA_PLAN_USAGE = "data_plan_usage";
-
- public static final String KEY_STATUS_HEADER = "status_header";
- public static final String KEY_LIMIT_SUMMARY = "plan_summary";
-
- // Mobile data keys
- public static final String KEY_MOBILE_USAGE_TITLE = "data_usage_mobile_category";
- public static final String KEY_MOBILE_DATA_USAGE_TOGGLE = "data_usage_enable";
-
- // Wifi keys
- public static final String KEY_WIFI_USAGE_TITLE = "wifi_category";
- public static final String KEY_WIFI_DATA_USAGE = "wifi_data_usage";
- public static final String KEY_NETWORK_RESTRICTIONS = "network_restrictions";
-
- private DataUsageController mDataUsageController;
- private DataUsageInfoController mDataInfoController;
- private List<DataPlanSummaryPreference> mDataPlanSummaryPreferenceList;
- private Preference mLimitPreference;
- private NetworkTemplate mDefaultTemplate;
- private NetworkRestrictionsPreference mNetworkRestrictionPreference;
- private WifiManager mWifiManager;
- private NetworkPolicyEditor mPolicyEditor;
-
- @Override
- public int getHelpResource() {
- return R.string.help_url_data_usage;
- }
-
- @Override
- public void onCreate(Bundle bundle) {
- super.onCreate(bundle);
-
- final Context context = getContext();
- NetworkPolicyManager policyManager = NetworkPolicyManager.from(context);
- mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
- mPolicyEditor = new NetworkPolicyEditor(policyManager);
- mDataUsageController = new DataUsageController(context);
- mDataInfoController = new DataUsageInfoController();
-
- int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(context);
- boolean hasMobileData = DataUsageUtils.hasMobileData(context);
- if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
- hasMobileData = false;
- }
- mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, defaultSubId);
-
- if (hasMobileData) {
- addDataPlanSection(defaultSubId);
- }
-
- if (DataUsageUtils.hasWifiRadio(context)) {
- addWifiSection();
- }
-
- if (hasEthernet(context)) {
- addEthernetSection();
- }
- setHasOptionsMenu(true);
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- if (UserManager.get(getContext()).isAdminUser()) {
- inflater.inflate(R.menu.data_usage, menu);
- }
- super.onCreateOptionsMenu(menu, inflater);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.data_usage_menu_cellular_networks: {
- final Intent intent = new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS);
- startActivity(intent);
- return true;
- }
- }
- return false;
- }
-
- private void addDataPlanSection(int defaultSubId) {
- Context context = getPrefContext();
- addPreferencesFromResource(R.xml.data_plan_usage);
- PreferenceScreen screen = getPreferenceScreen();
- screen.setTitle(context.getString(R.string.data_usage_summary_title));
-
- PreferenceCategory preferenceCategory =
- (PreferenceCategory) findPreference(KEY_DATA_PLAN_USAGE);
- screen.addPreference(preferenceCategory);
-
- Preference dataPlansSyncTimePreference = new Preference(context);
- dataPlansSyncTimePreference.setLayoutResource(R.layout.data_plans_sync_time_preference);
- dataPlansSyncTimePreference.setTitle(MockDataPlanUsage.SYNC_TIME);
- preferenceCategory.addPreference(dataPlansSyncTimePreference);
-
- mDataPlanSummaryPreferenceList = new ArrayList<>(MockDataPlanUsage.DATA_PLAN_USAGES.length);
- for (int i = 0; i < MockDataPlanUsage.DATA_PLAN_USAGES.length; i++) {
- DataPlanSummaryPreference dataPlanSummaryPreference =
- new DataPlanSummaryPreference(context);
- dataPlanSummaryPreference.setKey(KEY_STATUS_HEADER + (i + 1));
- mDataPlanSummaryPreferenceList.add(dataPlanSummaryPreference);
- preferenceCategory.addPreference(dataPlanSummaryPreference);
- }
-
- Preference preference = new Preference(context);
- preference.setLayoutResource(R.layout.manage_data_plans_preference);
- preferenceCategory.addPreference(preference);
- setPreferenceScreen(screen);
-
- mLimitPreference = findPreference(KEY_LIMIT_SUMMARY);
- List<SubscriptionInfo> subscriptions =
- services.mSubscriptionManager.getActiveSubscriptionInfoList();
-
- if (subscriptions == null || subscriptions.isEmpty()) {
- addMobileSection(defaultSubId);
- }
-
- for (int i = 0, subscriptionsSize = subscriptions != null ? subscriptions.size() : 0;
- i < subscriptionsSize; i++) {
- SubscriptionInfo subInfo = subscriptions.get(i);
- if (subscriptionsSize > 1) {
- addMobileSection(subInfo.getSubscriptionId(), subInfo);
- } else {
- addMobileSection(subInfo.getSubscriptionId());
- }
- }
- }
-
- private void addMobileSection(int subId) {
- addMobileSection(subId, null);
- }
-
- private void addMobileSection(int subId, SubscriptionInfo subInfo) {
- TemplatePreferenceCategory category = (TemplatePreferenceCategory)
- inflatePreferences(R.xml.data_plan_usage_cell_data_preference_screen);
- category.setTemplate(getNetworkTemplate(subId), subId, services);
- category.pushTemplates(services);
- if (subInfo != null && !TextUtils.isEmpty(subInfo.getDisplayName())) {
- Preference title = category.findPreference(KEY_MOBILE_USAGE_TITLE);
- title.setTitle(subInfo.getDisplayName());
- }
- }
-
- private void addWifiSection() {
- TemplatePreferenceCategory category = (TemplatePreferenceCategory)
- inflatePreferences(R.xml.data_usage_wifi);
- category.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(), 0 /* subId */, services);
- mNetworkRestrictionPreference =
- (NetworkRestrictionsPreference) category.findPreference(KEY_NETWORK_RESTRICTIONS);
- }
-
- private void addEthernetSection() {
- TemplatePreferenceCategory category = (TemplatePreferenceCategory)
- inflatePreferences(R.xml.data_usage_ethernet);
- category.setTemplate(NetworkTemplate.buildTemplateEthernet(), 0 /* subId */, services);
- }
-
- private Preference inflatePreferences(@IdRes int resId) {
- PreferenceScreen rootPreferences = getPreferenceManager().inflateFromResource(
- getPrefContext(), resId, null);
- Preference pref = rootPreferences.getPreference(0);
- rootPreferences.removeAll();
-
- PreferenceScreen screen = getPreferenceScreen();
- pref.setOrder(screen.getPreferenceCount());
- screen.addPreference(pref);
-
- return pref;
- }
-
- private NetworkTemplate getNetworkTemplate(int subscriptionId) {
- NetworkTemplate mobileAll = NetworkTemplate.buildTemplateMobileAll(
- services.mTelephonyManager.getSubscriberId(subscriptionId));
- return NetworkTemplate.normalize(mobileAll,
- services.mTelephonyManager.getMergedSubscriberIds());
- }
-
- @Override
- public void onResume() {
- super.onResume();
- updateState();
- }
-
- private void updateState() {
- DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
- mDefaultTemplate);
-
- Context context = getContext();
- mDataInfoController.updateDataLimit(info,
- services.mPolicyEditor.getPolicy(mDefaultTemplate));
-
- // TODO(b/63391323): Get rid of MockDataPlanUsage once we integrate with data plan APIs
- if (mDataPlanSummaryPreferenceList != null && !mDataPlanSummaryPreferenceList.isEmpty()) {
- MockDataPlanUsage[] dataPlanUsages = MockDataPlanUsage.getDataPlanUsage();
- for (int i = 0; i < dataPlanUsages.length; i++) {
- DataPlanSummaryPreference dataPlanSummaryPreference =
- mDataPlanSummaryPreferenceList.get(i);
- MockDataPlanUsage dataPlanUsage = dataPlanUsages[i];
- dataPlanSummaryPreference.setTitle(dataPlanUsage.mUsage);
- dataPlanSummaryPreference.setUsageTextColor(dataPlanUsage.mUsageTextColor);
- dataPlanSummaryPreference.setName(dataPlanUsage.mName);
- dataPlanSummaryPreference.setPercentageUsage(dataPlanUsage.mPercentageUsage);
- dataPlanSummaryPreference
- .setMeterBackgroundColor(dataPlanUsage.mMeterBackgroundColor);
- dataPlanSummaryPreference.setMeterConsumedColor(dataPlanUsage.mMeterConsumedColor);
- dataPlanSummaryPreference.setDescription(dataPlanUsage.mDescription);
- }
- }
-
- if (mLimitPreference != null && (info.warningLevel > 0 || info.limitLevel > 0)) {
- String warning = Formatter.formatFileSize(context, info.warningLevel);
- String limit = Formatter.formatFileSize(context, info.limitLevel);
- mLimitPreference.setSummary(getString(info.limitLevel <= 0 ? R.string.cell_warning_only
- : R.string.cell_warning_and_limit, warning, limit));
- } else if (mLimitPreference != null) {
- mLimitPreference.setSummary(null);
- }
-
- updateNetworkRestrictionSummary(mNetworkRestrictionPreference);
-
- PreferenceScreen screen = getPreferenceScreen();
- for (int i = 1, preferenceCount = screen.getPreferenceCount(); i < preferenceCount; i++) {
- ((TemplatePreferenceCategory) screen.getPreference(i)).pushTemplates(services);
- }
- }
-
- @Override
- public int getMetricsCategory() {
- return MetricsEvent.DATA_USAGE_SUMMARY;
- }
-
- @VisibleForTesting
- void updateNetworkRestrictionSummary(NetworkRestrictionsPreference preference) {
- if (preference == null) {
- return;
- }
- mPolicyEditor.read();
- int count = 0;
- List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
- for (int i = 0, configuredNetworksSize = configuredNetworks.size();
- i < configuredNetworksSize; i++) {
- WifiConfiguration config = configuredNetworks.get(i);
- if (isMetered(config)) {
- count++;
- }
- }
- preference.setSummary(getResources().getQuantityString(
- R.plurals.network_restrictions_summary, count, count));
- }
-
- @VisibleForTesting
- boolean isMetered(WifiConfiguration config) {
- if (config.SSID == null) {
- return false;
- }
- final String networkId = config.isPasspoint() ? config.providerFriendlyName : config.SSID;
- final NetworkPolicy policy =
- mPolicyEditor.getPolicyMaybeUnquoted(NetworkTemplate.buildTemplateWifi(networkId));
- if (policy == null) {
- return false;
- }
- if (policy.limitBytes != LIMIT_DISABLED) {
- return true;
- }
- return policy.metered;
- }
-
- private static class SummaryProvider
- implements SummaryLoader.SummaryProvider {
-
- private final Activity mActivity;
- private final SummaryLoader mSummaryLoader;
- private final DataUsageController mDataController;
-
- public SummaryProvider(Activity activity, SummaryLoader summaryLoader) {
- mActivity = activity;
- mSummaryLoader = summaryLoader;
- mDataController = new DataUsageController(activity);
- }
-
- @Override
- public void setListening(boolean listening) {
- if (listening) {
- DataUsageController.DataUsageInfo info = mDataController.getDataUsageInfo();
- String used;
- if (info == null) {
- used = Formatter.formatFileSize(mActivity, 0);
- } else if (info.limitLevel <= 0) {
- used = Formatter.formatFileSize(mActivity, info.usageLevel);
- } else {
- used = Utils.formatPercentage(info.usageLevel, info.limitLevel);
- }
- mSummaryLoader.setSummary(this,
- mActivity.getString(R.string.data_usage_summary_format, used));
- }
- }
- }
-
- public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
- = SummaryProvider::new;
-}
-
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index b63cee3..339de7c 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -18,7 +18,6 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.net.NetworkPolicyManager;
import android.net.NetworkTemplate;
import android.os.Bundle;
import android.os.UserManager;
@@ -28,6 +27,7 @@
import android.support.v7.preference.PreferenceScreen;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
import android.text.BidiFormatter;
import android.text.Spannable;
import android.text.SpannableString;
@@ -40,7 +40,6 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.SummaryPreference;
import com.android.settings.Utils;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -65,7 +64,6 @@
public static final String KEY_RESTRICT_BACKGROUND = "restrict_background";
private static final String KEY_STATUS_HEADER = "status_header";
- private static final String KEY_LIMIT_SUMMARY = "limit_summary";
// Mobile data keys
public static final String KEY_MOBILE_USAGE_TITLE = "mobile_category";
@@ -77,13 +75,9 @@
public static final String KEY_WIFI_USAGE_TITLE = "wifi_category";
public static final String KEY_WIFI_DATA_USAGE = "wifi_data_usage";
- private DataUsageController mDataUsageController;
- private DataUsageInfoController mDataInfoController;
- private SummaryPreference mSummaryPreference;
- private Preference mLimitPreference;
+ private DataUsageSummaryPreference mSummaryPreference;
+ private DataUsageSummaryPreferenceController mSummaryController;
private NetworkTemplate mDefaultTemplate;
- private int mDataUsageTemplate;
- private NetworkPolicyEditor mPolicyEditor;
@Override
public int getHelpResource() {
@@ -95,25 +89,20 @@
super.onCreate(icicle);
final Context context = getContext();
- NetworkPolicyManager policyManager = NetworkPolicyManager.from(context);
- mPolicyEditor = new NetworkPolicyEditor(policyManager);
boolean hasMobileData = DataUsageUtils.hasMobileData(context);
- mDataUsageController = new DataUsageController(context);
- mDataInfoController = new DataUsageInfoController();
int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(context);
if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
hasMobileData = false;
}
mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, defaultSubId);
- mSummaryPreference = (SummaryPreference) findPreference(KEY_STATUS_HEADER);
+ mSummaryPreference = (DataUsageSummaryPreference) findPreference(KEY_STATUS_HEADER);
if (!hasMobileData || !isAdmin()) {
removePreference(KEY_RESTRICT_BACKGROUND);
}
if (hasMobileData) {
- mLimitPreference = findPreference(KEY_LIMIT_SUMMARY);
List<SubscriptionInfo> subscriptions =
services.mSubscriptionManager.getActiveSubscriptionInfoList();
if (subscriptions == null || subscriptions.size() == 0) {
@@ -127,10 +116,6 @@
addMobileSection(subInfo.getSubscriptionId());
}
}
- mSummaryPreference.setSelectable(true);
- } else {
- removePreference(KEY_LIMIT_SUMMARY);
- mSummaryPreference.setSelectable(false);
}
boolean hasWifiRadio = DataUsageUtils.hasWifiRadio(context);
if (hasWifiRadio) {
@@ -139,10 +124,6 @@
if (hasEthernet(context)) {
addEthernetSection();
}
- mDataUsageTemplate = hasMobileData ? R.string.cell_data_template
- : hasWifiRadio ? R.string.wifi_data_template
- : R.string.ethernet_data_template;
-
setHasOptionsMenu(true);
}
@@ -189,7 +170,11 @@
@Override
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
- return null;
+ final ArrayList<AbstractPreferenceController> controllers = new ArrayList<>();
+ mSummaryController =
+ new DataUsageSummaryPreferenceController(context);
+ controllers.add(mSummaryController);
+ return controllers;
}
private void addMobileSection(int subId) {
@@ -269,36 +254,6 @@
}
private void updateState() {
- DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
- mDefaultTemplate);
- Context context = getContext();
- mDataInfoController.updateDataLimit(info,
- services.mPolicyEditor.getPolicy(mDefaultTemplate));
-
- if (mSummaryPreference != null) {
- mSummaryPreference.setTitle(
- formatUsage(context, getString(mDataUsageTemplate), info.usageLevel));
- final long limit = mDataInfoController.getSummaryLimit(info);
- mSummaryPreference.setSummary(info.period);
- if (limit <= 0) {
- mSummaryPreference.setChartEnabled(false);
- } else {
- mSummaryPreference.setChartEnabled(true);
- mSummaryPreference.setLabels(Formatter.formatFileSize(context, 0),
- Formatter.formatFileSize(context, limit));
- mSummaryPreference.setRatios(info.usageLevel / (float) limit, 0,
- (limit - info.usageLevel) / (float) limit);
- }
- }
- if (mLimitPreference != null && (info.warningLevel > 0 || info.limitLevel > 0)) {
- String warning = Formatter.formatFileSize(context, info.warningLevel);
- String limit = Formatter.formatFileSize(context, info.limitLevel);
- mLimitPreference.setSummary(getString(info.limitLevel <= 0 ? R.string.cell_warning_only
- : R.string.cell_warning_and_limit, warning, limit));
- } else if (mLimitPreference != null) {
- mLimitPreference.setSummary(null);
- }
-
PreferenceScreen screen = getPreferenceScreen();
for (int i = 1; i < screen.getPreferenceCount(); i++) {
((TemplatePreferenceCategory) screen.getPreference(i)).pushTemplates(services);
@@ -323,6 +278,7 @@
@Override
public void updateDataUsage() {
updateState();
+ mSummaryController.updateState(mSummaryPreference);
}
private static class SummaryProvider
@@ -341,17 +297,39 @@
@Override
public void setListening(boolean listening) {
if (listening) {
- DataUsageController.DataUsageInfo info = mDataController.getDataUsageInfo();
- String used;
- if (info == null) {
- used = Formatter.formatFileSize(mActivity, 0);
- } else if (info.limitLevel <= 0) {
- used = Formatter.formatFileSize(mActivity, info.usageLevel);
- } else {
- used = Utils.formatPercentage(info.usageLevel, info.limitLevel);
- }
mSummaryLoader.setSummary(this,
- mActivity.getString(R.string.data_usage_summary_format, used));
+ mActivity.getString(R.string.data_usage_summary_format, formatUsedData()));
+ }
+ }
+
+ private String formatUsedData() {
+ SubscriptionManager subscriptionManager = (SubscriptionManager) mActivity
+ .getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+ int defaultSubId = subscriptionManager.getDefaultSubscriptionId();
+ if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ return formatFallbackData();
+ }
+ SubscriptionPlan dfltPlan = DataUsageSummaryPreferenceController
+ .getPrimaryPlan(subscriptionManager, defaultSubId);
+ if (dfltPlan == null) {
+ return formatFallbackData();
+ }
+ if (DataUsageSummaryPreferenceController.unlimited(dfltPlan.getDataLimitBytes())) {
+ return Formatter.formatFileSize(mActivity, dfltPlan.getDataUsageBytes());
+ } else {
+ return Utils.formatPercentage(dfltPlan.getDataUsageBytes(),
+ dfltPlan.getDataLimitBytes());
+ }
+ }
+
+ private String formatFallbackData() {
+ DataUsageController.DataUsageInfo info = mDataController.getDataUsageInfo();
+ if (info == null) {
+ return Formatter.formatFileSize(mActivity, 0);
+ } else if (info.limitLevel <= 0) {
+ return Formatter.formatFileSize(mActivity, info.usageLevel);
+ } else {
+ return Utils.formatPercentage(info.usageLevel, info.limitLevel);
}
}
}
diff --git a/src/com/android/settings/datausage/DataUsageSummaryLegacy.java b/src/com/android/settings/datausage/DataUsageSummaryLegacy.java
new file mode 100644
index 0000000..6a241eb
--- /dev/null
+++ b/src/com/android/settings/datausage/DataUsageSummaryLegacy.java
@@ -0,0 +1,408 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.datausage;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+import android.os.UserManager;
+import android.provider.SearchIndexableResource;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.text.BidiFormatter;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.text.format.Formatter;
+import android.text.style.RelativeSizeSpan;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.SummaryPreference;
+import com.android.settings.Utils;
+import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settingslib.NetworkPolicyEditor;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.net.DataUsageController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Legacy {@link DataUsageSummary} fragment.
+ */
+public class DataUsageSummaryLegacy extends DataUsageBaseFragment implements Indexable,
+ DataUsageEditController {
+
+ private static final String TAG = "DataUsageSummaryLegacy";
+
+ static final boolean LOGD = false;
+
+ public static final String KEY_RESTRICT_BACKGROUND = "restrict_background";
+
+ private static final String KEY_STATUS_HEADER = "status_header";
+ private static final String KEY_LIMIT_SUMMARY = "limit_summary";
+
+ // Mobile data keys
+ public static final String KEY_MOBILE_USAGE_TITLE = "mobile_category";
+ public static final String KEY_MOBILE_DATA_USAGE_TOGGLE = "data_usage_enable";
+ public static final String KEY_MOBILE_DATA_USAGE = "cellular_data_usage";
+ public static final String KEY_MOBILE_BILLING_CYCLE = "billing_preference";
+
+ // Wifi keys
+ public static final String KEY_WIFI_USAGE_TITLE = "wifi_category";
+ public static final String KEY_WIFI_DATA_USAGE = "wifi_data_usage";
+
+ private DataUsageController mDataUsageController;
+ private DataUsageInfoController mDataInfoController;
+ private SummaryPreference mSummaryPreference;
+ private Preference mLimitPreference;
+ private NetworkTemplate mDefaultTemplate;
+ private int mDataUsageTemplate;
+ private NetworkPolicyEditor mPolicyEditor;
+
+ @Override
+ public int getHelpResource() {
+ return R.string.help_url_data_usage;
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ final Context context = getContext();
+ NetworkPolicyManager policyManager = NetworkPolicyManager.from(context);
+ mPolicyEditor = new NetworkPolicyEditor(policyManager);
+
+ boolean hasMobileData = DataUsageUtils.hasMobileData(context);
+ mDataUsageController = new DataUsageController(context);
+ mDataInfoController = new DataUsageInfoController();
+
+ int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(context);
+ if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ hasMobileData = false;
+ }
+ mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, defaultSubId);
+ mSummaryPreference = (SummaryPreference) findPreference(KEY_STATUS_HEADER);
+
+ if (!hasMobileData || !isAdmin()) {
+ removePreference(KEY_RESTRICT_BACKGROUND);
+ }
+ if (hasMobileData) {
+ mLimitPreference = findPreference(KEY_LIMIT_SUMMARY);
+ List<SubscriptionInfo> subscriptions =
+ services.mSubscriptionManager.getActiveSubscriptionInfoList();
+ if (subscriptions == null || subscriptions.size() == 0) {
+ addMobileSection(defaultSubId);
+ }
+ for (int i = 0; subscriptions != null && i < subscriptions.size(); i++) {
+ SubscriptionInfo subInfo = subscriptions.get(i);
+ if (subscriptions.size() > 1) {
+ addMobileSection(subInfo.getSubscriptionId(), subInfo);
+ } else {
+ addMobileSection(subInfo.getSubscriptionId());
+ }
+ }
+ mSummaryPreference.setSelectable(true);
+ } else {
+ removePreference(KEY_LIMIT_SUMMARY);
+ mSummaryPreference.setSelectable(false);
+ }
+ boolean hasWifiRadio = DataUsageUtils.hasWifiRadio(context);
+ if (hasWifiRadio) {
+ addWifiSection();
+ }
+ if (hasEthernet(context)) {
+ addEthernetSection();
+ }
+ mDataUsageTemplate = hasMobileData ? R.string.cell_data_template
+ : hasWifiRadio ? R.string.wifi_data_template
+ : R.string.ethernet_data_template;
+
+ setHasOptionsMenu(true);
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ if (UserManager.get(getContext()).isAdminUser()) {
+ inflater.inflate(R.menu.data_usage, menu);
+ }
+ super.onCreateOptionsMenu(menu, inflater);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.data_usage_menu_cellular_networks: {
+ final Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setComponent(new ComponentName("com.android.phone",
+ "com.android.phone.MobileNetworkSettings"));
+ startActivity(intent);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ if (preference == findPreference(KEY_STATUS_HEADER)) {
+ BillingCycleSettings.BytesEditorFragment.show(this, false);
+ return false;
+ }
+ return super.onPreferenceTreeClick(preference);
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.data_usage_legacy;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ return null;
+ }
+
+ private void addMobileSection(int subId) {
+ addMobileSection(subId, null);
+ }
+
+ private void addMobileSection(int subId, SubscriptionInfo subInfo) {
+ TemplatePreferenceCategory category = (TemplatePreferenceCategory)
+ inflatePreferences(R.xml.data_usage_cellular);
+ category.setTemplate(getNetworkTemplate(subId), subId, services);
+ category.pushTemplates(services);
+ if (subInfo != null && !TextUtils.isEmpty(subInfo.getDisplayName())) {
+ Preference title = category.findPreference(KEY_MOBILE_USAGE_TITLE);
+ title.setTitle(subInfo.getDisplayName());
+ }
+ }
+
+ private void addWifiSection() {
+ TemplatePreferenceCategory category = (TemplatePreferenceCategory)
+ inflatePreferences(R.xml.data_usage_wifi);
+ category.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(), 0, services);
+ }
+
+ private void addEthernetSection() {
+ TemplatePreferenceCategory category = (TemplatePreferenceCategory)
+ inflatePreferences(R.xml.data_usage_ethernet);
+ category.setTemplate(NetworkTemplate.buildTemplateEthernet(), 0, services);
+ }
+
+ private Preference inflatePreferences(int resId) {
+ PreferenceScreen rootPreferences = getPreferenceManager().inflateFromResource(
+ getPrefContext(), resId, null);
+ Preference pref = rootPreferences.getPreference(0);
+ rootPreferences.removeAll();
+
+ PreferenceScreen screen = getPreferenceScreen();
+ pref.setOrder(screen.getPreferenceCount());
+ screen.addPreference(pref);
+
+ return pref;
+ }
+
+ private NetworkTemplate getNetworkTemplate(int subscriptionId) {
+ NetworkTemplate mobileAll = NetworkTemplate.buildTemplateMobileAll(
+ services.mTelephonyManager.getSubscriberId(subscriptionId));
+ return NetworkTemplate.normalize(mobileAll,
+ services.mTelephonyManager.getMergedSubscriberIds());
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateState();
+ }
+
+ @VisibleForTesting
+ static CharSequence formatUsage(Context context, String template, long usageLevel) {
+ final float LARGER_SIZE = 1.25f * 1.25f; // (1/0.8)^2
+ final float SMALLER_SIZE = 1.0f / LARGER_SIZE; // 0.8^2
+ final int FLAGS = Spannable.SPAN_INCLUSIVE_INCLUSIVE;
+
+ final Formatter.BytesResult usedResult = Formatter.formatBytes(context.getResources(),
+ usageLevel, Formatter.FLAG_CALCULATE_ROUNDED);
+ final SpannableString enlargedValue = new SpannableString(usedResult.value);
+ enlargedValue.setSpan(new RelativeSizeSpan(LARGER_SIZE), 0, enlargedValue.length(), FLAGS);
+
+ final SpannableString amountTemplate = new SpannableString(
+ context.getString(com.android.internal.R.string.fileSizeSuffix)
+ .replace("%1$s", "^1").replace("%2$s", "^2"));
+ final CharSequence formattedUsage = TextUtils.expandTemplate(amountTemplate,
+ enlargedValue, usedResult.units);
+
+ final SpannableString fullTemplate = new SpannableString(template);
+ fullTemplate.setSpan(new RelativeSizeSpan(SMALLER_SIZE), 0, fullTemplate.length(), FLAGS);
+ return TextUtils.expandTemplate(fullTemplate,
+ BidiFormatter.getInstance().unicodeWrap(formattedUsage.toString()));
+ }
+
+ private void updateState() {
+ DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
+ mDefaultTemplate);
+ Context context = getContext();
+ mDataInfoController.updateDataLimit(info,
+ services.mPolicyEditor.getPolicy(mDefaultTemplate));
+
+ if (mSummaryPreference != null) {
+ mSummaryPreference.setTitle(
+ formatUsage(context, getString(mDataUsageTemplate), info.usageLevel));
+ final long limit = mDataInfoController.getSummaryLimit(info);
+ mSummaryPreference.setSummary(info.period);
+ if (limit <= 0) {
+ mSummaryPreference.setChartEnabled(false);
+ } else {
+ mSummaryPreference.setChartEnabled(true);
+ mSummaryPreference.setLabels(Formatter.formatFileSize(context, 0),
+ Formatter.formatFileSize(context, limit));
+ mSummaryPreference.setRatios(info.usageLevel / (float) limit, 0,
+ (limit - info.usageLevel) / (float) limit);
+ }
+ }
+ if (mLimitPreference != null && (info.warningLevel > 0 || info.limitLevel > 0)) {
+ String warning = Formatter.formatFileSize(context, info.warningLevel);
+ String limit = Formatter.formatFileSize(context, info.limitLevel);
+ mLimitPreference.setSummary(getString(info.limitLevel <= 0 ? R.string.cell_warning_only
+ : R.string.cell_warning_and_limit, warning, limit));
+ } else if (mLimitPreference != null) {
+ mLimitPreference.setSummary(null);
+ }
+
+ PreferenceScreen screen = getPreferenceScreen();
+ for (int i = 1; i < screen.getPreferenceCount(); i++) {
+ ((TemplatePreferenceCategory) screen.getPreference(i)).pushTemplates(services);
+ }
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsEvent.DATA_USAGE_SUMMARY;
+ }
+
+ @Override
+ public NetworkPolicyEditor getNetworkPolicyEditor() {
+ return services.mPolicyEditor;
+ }
+
+ @Override
+ public NetworkTemplate getNetworkTemplate() {
+ return mDefaultTemplate;
+ }
+
+ @Override
+ public void updateDataUsage() {
+ updateState();
+ }
+
+ private static class SummaryProvider
+ implements SummaryLoader.SummaryProvider {
+
+ private final Activity mActivity;
+ private final SummaryLoader mSummaryLoader;
+ private final DataUsageController mDataController;
+
+ public SummaryProvider(Activity activity, SummaryLoader summaryLoader) {
+ mActivity = activity;
+ mSummaryLoader = summaryLoader;
+ mDataController = new DataUsageController(activity);
+ }
+
+ @Override
+ public void setListening(boolean listening) {
+ if (listening) {
+ DataUsageController.DataUsageInfo info = mDataController.getDataUsageInfo();
+ String used;
+ if (info == null) {
+ used = Formatter.formatFileSize(mActivity, 0);
+ } else if (info.limitLevel <= 0) {
+ used = Formatter.formatFileSize(mActivity, info.usageLevel);
+ } else {
+ used = Utils.formatPercentage(info.usageLevel, info.limitLevel);
+ }
+ mSummaryLoader.setSummary(this,
+ mActivity.getString(R.string.data_usage_summary_format, used));
+ }
+ }
+ }
+
+ public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+ = SummaryProvider::new;
+
+ /**
+ * For search
+ */
+ public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider() {
+
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
+ boolean enabled) {
+ List<SearchIndexableResource> resources = new ArrayList<>();
+ SearchIndexableResource resource = new SearchIndexableResource(context);
+ resource.xmlResId = R.xml.data_usage;
+ resources.add(resource);
+
+ resource = new SearchIndexableResource(context);
+ resource.xmlResId = R.xml.data_usage_cellular;
+ resources.add(resource);
+
+ resource = new SearchIndexableResource(context);
+ resource.xmlResId = R.xml.data_usage_wifi;
+ resources.add(resource);
+
+ return resources;
+ }
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+
+ if (!DataUsageUtils.hasMobileData(context)) {
+ keys.add(KEY_MOBILE_USAGE_TITLE);
+ keys.add(KEY_MOBILE_DATA_USAGE_TOGGLE);
+ keys.add(KEY_MOBILE_DATA_USAGE);
+ keys.add(KEY_MOBILE_BILLING_CYCLE);
+ }
+
+ if (!DataUsageUtils.hasWifiRadio(context)) {
+ keys.add(KEY_WIFI_DATA_USAGE);
+ }
+
+ // This title is named Wifi, and will confuse users.
+ keys.add(KEY_WIFI_USAGE_TITLE);
+
+ return keys;
+ }
+ };
+}
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
new file mode 100644
index 0000000..984df02
--- /dev/null
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.datausage;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.android.settings.R;
+import com.android.settings.SummaryPreference;
+import com.android.settingslib.utils.StringUtil;
+
+import libcore.util.Objects;
+
+/**
+ * Provides a summary of data usage.
+ */
+public class DataUsageSummaryPreference extends SummaryPreference {
+
+ private int mNumPlans;
+ /** The ending time of the billing cycle in milliseconds since epoch. */
+ private long mCycleEndTimeMs;
+ /** The time of the last update in standard milliseconds since the epoch */
+ private long mSnapshotTimeMs;
+ /** Name of carrier, or null if not available */
+ private CharSequence mCarrierName;
+ private String mLimitInfoText;
+ private Intent mLaunchIntent;
+
+ public DataUsageSummaryPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setLayoutResource(R.layout.data_usage_summary_preference);
+ }
+
+ public void setLimitInfo(String text) {
+ if (!Objects.equal(text, mLimitInfoText)) {
+ mLimitInfoText = text;
+ notifyChanged();
+ }
+ }
+
+ public void setUsageInfo(long cycleEnd, long snapshotTime, CharSequence carrierName,
+ int numPlans, Intent launchIntent) {
+ mCycleEndTimeMs = cycleEnd;
+ mSnapshotTimeMs = snapshotTime;
+ mCarrierName = carrierName;
+ mNumPlans = numPlans;
+ mLaunchIntent = launchIntent;
+ notifyChanged();
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+
+ TextView usageTitle = (TextView) holder.findViewById(R.id.usage_title);
+ usageTitle.setVisibility(mNumPlans > 1 ? View.VISIBLE : View.GONE);
+
+ TextView cycleTime = (TextView) holder.findViewById(R.id.cycle_left_time);
+ cycleTime.setText(getContext().getString(R.string.cycle_left_time_text,
+ StringUtil.formatElapsedTime(getContext(),
+ mCycleEndTimeMs - System.currentTimeMillis(),false /* withSeconds */)));
+
+ TextView carrierInfo = (TextView) holder.findViewById(R.id.carrier_and_update);
+ setCarrierInfo(carrierInfo, mCarrierName, mSnapshotTimeMs);
+
+ Button launchButton = (Button) holder.findViewById(R.id.launch_mdp_app_button);
+ launchButton.setOnClickListener((view) -> {
+ getContext().sendBroadcast(mLaunchIntent);
+ });
+ if (mLaunchIntent != null) {
+ launchButton.setVisibility(View.VISIBLE);
+ } else {
+ launchButton.setVisibility(View.GONE);
+ }
+
+ TextView limitInfo = (TextView) holder.findViewById(R.id.data_limits);
+ limitInfo.setVisibility(
+ mLimitInfoText == null || mLimitInfoText.isEmpty() ? View.GONE : View.VISIBLE);
+ limitInfo.setText(mLimitInfoText);
+ }
+
+ private void setCarrierInfo(TextView carrierInfo, CharSequence carrierName, long updateAge) {
+ if (mNumPlans > 0 && updateAge >= 0L) {
+ carrierInfo.setVisibility(View.VISIBLE);
+ if (carrierName != null) {
+ carrierInfo.setText(getContext().getString(R.string.carrier_and_update_text,
+ carrierName, StringUtil.formatRelativeTime(
+ getContext(), updateAge, false /* withSeconds */)));
+ } else {
+ carrierInfo.setText(getContext().getString(R.string.no_carrier_update_text,
+ StringUtil.formatRelativeTime(
+ getContext(), updateAge, false /* withSeconds */)));
+ }
+ } else {
+ carrierInfo.setVisibility(View.GONE);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
new file mode 100644
index 0000000..11da829
--- /dev/null
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.datausage;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.Preference;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
+import android.text.BidiFormatter;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.text.format.Formatter;
+import android.text.style.RelativeSizeSpan;
+import android.util.Log;
+import android.util.RecurrenceRule;
+
+import com.android.internal.util.CollectionUtils;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.NetworkPolicyEditor;
+import com.android.settingslib.net.DataUsageController;
+
+import java.util.List;
+
+/**
+ * This is the controller for the top of the data usage screen that retrieves carrier data from the
+ * new subscriptions framework API if available. The controller reads subscription information from
+ * the framework and falls back to legacy usage data if none are available.
+ */
+public class DataUsageSummaryPreferenceController extends BasePreferenceController {
+
+ private static final String TAG = "DataUsageController";
+ private static final String KEY = "status_header";
+ private static final long PETA = 1000000000000000L;
+ private static final float RELATIVE_SIZE_LARGE = 1.25f * 1.25f; // (1/0.8)^2
+ private static final float RELATIVE_SIZE_SMALL = 1.0f / RELATIVE_SIZE_LARGE; // 0.8^2
+
+ private final DataUsageController mDataUsageController;
+ private final DataUsageInfoController mDataInfoController;
+ private final NetworkTemplate mDefaultTemplate;
+ private final NetworkPolicyEditor mPolicyEditor;
+ private final int mDataUsageTemplate;
+ private final boolean mHasMobileData;
+ private final SubscriptionManager mSubscriptionManager;
+
+ /** Name of the carrier, or null if not available */
+ private CharSequence mCarrierName;
+
+ /** The number of registered plans, [0,N] */
+ private int mDataplanCount;
+
+ /** The time of the last update in milliseconds since the epoch, or -1 if unknown */
+ private long mSnapshotTime;
+
+ /**
+ * The size of the first registered plan if one exists or the size of the warning if it is set.
+ * -1 if no information is available.
+ */
+ private long mDataplanSize;
+ /** The number of bytes used since the start of the cycle. */
+ private long mDataplanUse;
+ /** The starting time of the billing cycle in ms since the epoch */
+ private long mCycleStart;
+ /** The ending time of the billing cycle in ms since the epoch */
+ private long mCycleEnd;
+
+ private Intent mManageSubscriptionIntent;
+
+ public DataUsageSummaryPreferenceController(Context context) {
+ super(context, KEY);
+
+ final int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(context);
+ mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, defaultSubId);
+ NetworkPolicyManager policyManager = NetworkPolicyManager.from(context);
+ mPolicyEditor = new NetworkPolicyEditor(policyManager);
+
+ mHasMobileData = DataUsageUtils.hasMobileData(context)
+ && defaultSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+ mDataUsageController = new DataUsageController(context);
+ mDataInfoController = new DataUsageInfoController();
+
+ if (mHasMobileData) {
+ mDataUsageTemplate = R.string.cell_data_template;
+ } else if (DataUsageUtils.hasWifiRadio(context)) {
+ mDataUsageTemplate = R.string.wifi_data_template;
+ } else {
+ mDataUsageTemplate = R.string.ethernet_data_template;
+ }
+
+ mSubscriptionManager = (SubscriptionManager)
+ mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+ }
+
+ @VisibleForTesting
+ DataUsageSummaryPreferenceController(
+ Context context,
+ DataUsageController dataUsageController,
+ DataUsageInfoController dataInfoController,
+ NetworkTemplate defaultTemplate,
+ NetworkPolicyEditor policyEditor,
+ int dataUsageTemplate,
+ boolean hasMobileData,
+ SubscriptionManager subscriptionManager) {
+ super(context, KEY);
+ mDataUsageController = dataUsageController;
+ mDataInfoController = dataInfoController;
+ mDefaultTemplate = defaultTemplate;
+ mPolicyEditor = policyEditor;
+ mDataUsageTemplate = dataUsageTemplate;
+ mHasMobileData = hasMobileData;
+ mSubscriptionManager = subscriptionManager;
+ }
+
+ @VisibleForTesting
+ void setPlanValues(int dataPlanCount, long dataPlanSize, long dataPlanUse) {
+ mDataplanCount = dataPlanCount;
+ mDataplanSize = dataPlanSize;
+ mDataplanUse = dataPlanUse;
+ }
+
+ @VisibleForTesting
+ void setCarrierValues(String carrierName, long snapshotTime, long cycleEnd, Intent intent) {
+ mCarrierName = carrierName;
+ mSnapshotTime = snapshotTime;
+ mCycleEnd = cycleEnd;
+ mManageSubscriptionIntent = intent;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ DataUsageSummaryPreference summaryPreference = (DataUsageSummaryPreference) preference;
+ DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
+ mDefaultTemplate);
+
+ mDataInfoController.updateDataLimit(info, mPolicyEditor.getPolicy(mDefaultTemplate));
+
+ if (mSubscriptionManager != null) {
+ refreshDataplanInfo(info);
+ }
+
+ if (mDataplanCount == 0 && (info.warningLevel > 0 || info.limitLevel > 0)) {
+ final String warning = Formatter.formatFileSize(mContext, info.warningLevel);
+ final String limit = Formatter.formatFileSize(mContext, info.limitLevel);
+ summaryPreference.setLimitInfo(mContext.getString(info.limitLevel <= 0
+ ? R.string.cell_warning_only
+ : R.string.cell_warning_and_limit, warning, limit));
+ } else {
+ summaryPreference.setLimitInfo(null);
+ }
+
+ final StringBuilder title = new StringBuilder();
+ if (mHasMobileData) {
+ title.append(formatUsage(mContext, mContext.getString(R.string.data_used),
+ mDataplanUse));
+ if (mDataplanCount >= 0 && mDataplanSize > 0L) {
+ title.append(formatUsage(mContext, mContext.getString(R.string.data_remaining),
+ mDataplanSize - mDataplanUse));
+ }
+ } else {
+ title.append(formatUsage(mContext, mContext.getString(mDataUsageTemplate),
+ mDataplanUse));
+ }
+ summaryPreference.setTitle(title.toString());
+
+ if (mDataplanSize <= 0) {
+ summaryPreference.setChartEnabled(false);
+ } else {
+ summaryPreference.setChartEnabled(true);
+ summaryPreference.setLabels(Formatter.formatFileSize(mContext, 0 /* sizeBytes */),
+ Formatter.formatFileSize(mContext, mDataplanSize));
+ summaryPreference.setRatios(mDataplanUse / (float) mDataplanSize, 0 /* middle */,
+ (mDataplanSize - mDataplanUse) / (float) mDataplanSize);
+ }
+ summaryPreference.setUsageInfo(mCycleEnd, mSnapshotTime, mCarrierName,
+ mDataplanCount, mManageSubscriptionIntent);
+ }
+
+ // TODO(b/70950124) add test for this method once the robolectric shadow run script is
+ // completed (b/3526807)
+ private void refreshDataplanInfo(DataUsageController.DataUsageInfo info) {
+ // reset data before overwriting
+ mCarrierName = null;
+ mDataplanCount = 0;
+ mDataplanSize = mDataInfoController.getSummaryLimit(info);
+ mDataplanUse = info.usageLevel;
+ mCycleStart = info.cycleStart;
+ mCycleEnd = info.cycleEnd;
+ mSnapshotTime = -1L;
+
+ final int defaultSubId = SubscriptionManager.getDefaultSubscriptionId();
+ final SubscriptionInfo subInfo = mSubscriptionManager.getDefaultDataSubscriptionInfo();
+ if (subInfo != null && mHasMobileData) {
+ mCarrierName = subInfo.getCarrierName();
+ List<SubscriptionPlan> plans = mSubscriptionManager.getSubscriptionPlans(defaultSubId);
+ final SubscriptionPlan primaryPlan = getPrimaryPlan(mSubscriptionManager, defaultSubId);
+ if (primaryPlan != null) {
+ mDataplanCount = plans.size();
+ mDataplanSize = primaryPlan.getDataLimitBytes();
+ if (unlimited(mDataplanSize)) {
+ mDataplanSize = 0L;
+ }
+ mDataplanUse = primaryPlan.getDataUsageBytes();
+
+ RecurrenceRule rule = primaryPlan.getCycleRule();
+ if (rule != null && rule.start != null && rule.end != null) {
+ mCycleStart = rule.start.toEpochSecond() * 1000L;
+ mCycleEnd = rule.end.toEpochSecond() * 1000L;
+ }
+ mSnapshotTime = System.currentTimeMillis() - primaryPlan.getDataUsageTime();
+ }
+ }
+ mManageSubscriptionIntent =
+ mSubscriptionManager.createManageSubscriptionIntent(defaultSubId);
+ Log.i(TAG, "Have " + mDataplanCount + " plans, dflt sub-id " + defaultSubId
+ + ", intent " + mManageSubscriptionIntent);
+ }
+
+ public static SubscriptionPlan getPrimaryPlan(SubscriptionManager subManager, int primaryId) {
+ List<SubscriptionPlan> plans = subManager.getSubscriptionPlans(primaryId);
+ if (CollectionUtils.isEmpty(plans)) {
+ return null;
+ }
+ // First plan in the list is the primary plan
+ SubscriptionPlan plan = plans.get(0);
+ return plan.getDataLimitBytes() > 0
+ && saneSize(plan.getDataUsageBytes())
+ && plan.getCycleRule() != null ? plan : null;
+ }
+
+ private static boolean saneSize(long value) {
+ return value >= 0L && value < PETA;
+ }
+
+ public static boolean unlimited(long size) {
+ return size == SubscriptionPlan.BYTES_UNLIMITED;
+ }
+
+ @VisibleForTesting
+ private static CharSequence formatUsage(Context context, String template, long usageLevel) {
+ final int FLAGS = Spannable.SPAN_INCLUSIVE_INCLUSIVE;
+
+ final Formatter.BytesResult usedResult = Formatter.formatBytes(context.getResources(),
+ usageLevel, Formatter.FLAG_CALCULATE_ROUNDED);
+ final SpannableString enlargedValue = new SpannableString(usedResult.value);
+ enlargedValue.setSpan(
+ new RelativeSizeSpan(RELATIVE_SIZE_LARGE), 0, enlargedValue.length(), FLAGS);
+
+ final SpannableString amountTemplate = new SpannableString(
+ context.getString(com.android.internal.R.string.fileSizeSuffix)
+ .replace("%1$s", "^1").replace("%2$s", "^2"));
+ final CharSequence formattedUsage = TextUtils.expandTemplate(amountTemplate,
+ enlargedValue, usedResult.units);
+
+ final SpannableString fullTemplate = new SpannableString(template);
+ fullTemplate.setSpan(
+ new RelativeSizeSpan(RELATIVE_SIZE_SMALL), 0, fullTemplate.length(), FLAGS);
+ return TextUtils.expandTemplate(fullTemplate,
+ BidiFormatter.getInstance().unicodeWrap(formattedUsage.toString()));
+ }
+}
diff --git a/src/com/android/settings/datausage/MockDataPlanUsage.java b/src/com/android/settings/datausage/MockDataPlanUsage.java
deleted file mode 100644
index e3aa97a..0000000
--- a/src/com/android/settings/datausage/MockDataPlanUsage.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.settings.datausage;
-
-import android.graphics.Color;
-
-/**
- * Mock data plan usage data.
- */
-@Deprecated // This class is only needed because we don't have working API yet.
-final class MockDataPlanUsage {
- static final MockDataPlanUsage[] DATA_PLAN_USAGES = new MockDataPlanUsage[3];
- static final String SYNC_TIME = "Today 12:24pm";
- final String mUsage;
- final int mUsageTextColor;
- final String mName;
- final double mPercentageUsage;
- final int mMeterBackgroundColor;
- final int mMeterConsumedColor;
- final String mDescription;
-
- private MockDataPlanUsage(String usage, int usageTextColor, String name,
- double percentageUsage, int meterBackgroundColor, int meterConsumedColor,
- String description) {
- mUsage = usage;
- mUsageTextColor = usageTextColor;
- mName = name;
- mPercentageUsage = percentageUsage;
- mMeterBackgroundColor = meterBackgroundColor;
- mMeterConsumedColor = meterConsumedColor;
- mDescription = description;
- }
-
- static MockDataPlanUsage[] getDataPlanUsage() {
- DATA_PLAN_USAGES[0] = new MockDataPlanUsage("100 MB and 14 days left",
- Color.parseColor("#FF5C94F1"), "GigaMaxLite / 1GB", 0.27D,
- Color.parseColor("#FFDBDCDC"), Color.parseColor("#FF5C94F1"),
- "Premium plan from Telekomsel");
-
- DATA_PLAN_USAGES[1] = new MockDataPlanUsage("1.25 GB and 14 days left",
- Color.parseColor("#FF673AB7"), "GigaMaxLite 4G / 5GB", 0.47D,
- Color.parseColor("#FFDBDCDC"), Color.parseColor("#FF673AB7"),
- "Plenty of 4G data");
-
- DATA_PLAN_USAGES[2] = new MockDataPlanUsage("700 MB and 14 days left",
- Color.parseColor("#FF4CAF50"), "GigaMaxLite Video / 7GB", 0.67D,
- Color.parseColor("#FFDBDCDC"), Color.parseColor("#FF4CAF50"),
- "Use certain video apps for free");
- return DATA_PLAN_USAGES;
- }
-}
diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java
index efcf03d..2093469 100644
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ b/src/com/android/settings/deviceinfo/StorageSettings.java
@@ -236,7 +236,6 @@
Intent intent = Utils.onBuildStartFragmentIntent(getActivity(),
StorageDashboardFragment.class.getName(), args, null,
R.string.storage_settings, null, false, getMetricsCategory());
- intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
getActivity().startActivity(intent);
finish();
}
diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
index 4870e7e..c9fe54e 100644
--- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java
+++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
@@ -85,7 +85,6 @@
Intent intent = Utils.onBuildStartFragmentIntent(mContext,
StorageProfileFragment.class.getName(), args, null, 0,
mUser.name, false, MetricsProto.MetricsEvent.DEVICEINFO_STORAGE);
- intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
mContext.startActivity(intent);
return true;
}
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index e073456..981b0dc 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -58,6 +58,7 @@
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.utils.StringUtil;
import java.util.ArrayList;
import java.util.List;
@@ -284,10 +285,10 @@
final int powerMah = bundle.getInt(EXTRA_POWER_USAGE_AMOUNT);
mForegroundPreference.setSummary(
TextUtils.expandTemplate(getText(R.string.battery_used_for),
- Utils.formatElapsedTime(context, foregroundTimeMs, false)));
+ StringUtil.formatElapsedTime(context, foregroundTimeMs, false)));
mBackgroundPreference.setSummary(
TextUtils.expandTemplate(getText(R.string.battery_active_for),
- Utils.formatElapsedTime(context, backgroundTimeMs, false)));
+ StringUtil.formatElapsedTime(context, backgroundTimeMs, false)));
mPowerUsagePreference.setSummary(
getString(R.string.battery_detail_power_percentage, usagePercent, powerMah));
}
diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
index 91f35e2..2f93d0a 100644
--- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
@@ -18,7 +18,6 @@
package com.android.settings.fuelgauge;
import android.app.Activity;
-import android.app.Fragment;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.BatteryStats;
@@ -31,7 +30,6 @@
import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
-import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
import android.text.format.DateUtils;
@@ -48,16 +46,14 @@
import com.android.settings.SettingsActivity;
import com.android.settings.core.FeatureFlags;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.Utils;
import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnDestroy;
import com.android.settingslib.core.lifecycle.events.OnPause;
+import com.android.settingslib.utils.StringUtil;
import java.util.ArrayList;
import java.util.List;
@@ -66,7 +62,8 @@
*/
public class BatteryAppListPreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin, LifecycleObserver, OnPause, OnDestroy {
- private static final boolean USE_FAKE_DATA = true;
+ @VisibleForTesting
+ static final boolean USE_FAKE_DATA = false;
private static final int MAX_ITEMS_TO_LIST = USE_FAKE_DATA ? 30 : 10;
private static final int MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP = 10;
private static final int STATS_TYPE = BatteryStats.STATS_SINCE_CHARGED;
@@ -362,8 +359,8 @@
// Only show summary when usage time is longer than one minute
final long usageTimeMs = sipper.usageTimeMs;
if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) {
- final CharSequence timeSequence = Utils.formatElapsedTime(mContext, usageTimeMs,
- false);
+ final CharSequence timeSequence =
+ StringUtil.formatElapsedTime(mContext, usageTimeMs, false);
preference.setSummary(
(sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper))
? timeSequence
diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java
index 6384130..43465ab 100644
--- a/src/com/android/settings/fuelgauge/BatteryInfo.java
+++ b/src/com/android/settings/fuelgauge/BatteryInfo.java
@@ -25,7 +25,6 @@
import android.os.Bundle;
import android.os.SystemClock;
import android.support.annotation.WorkerThread;
-import android.text.TextUtils;
import android.text.format.Formatter;
import android.util.SparseIntArray;
@@ -34,8 +33,14 @@
import com.android.settings.graph.UsageView;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.R;
+import com.android.settingslib.utils.PowerUtil;
+import com.android.settingslib.utils.StringUtil;
+import java.util.concurrent.TimeUnit;
public class BatteryInfo {
+ private static final long SEVEN_MINUTES_MICROS = TimeUnit.MINUTES.toMicros(7);
+ private static final long FIFTEEN_MINUTES_MICROS = TimeUnit.MINUTES.toMicros(15);
+ private static final long ONE_DAY_MICROS = TimeUnit.DAYS.toMicros(1);
public CharSequence chargeLabel;
public CharSequence remainingLabel;
@@ -100,7 +105,7 @@
if (lastTime >= 0) {
points.put(lastTime, lastLevel);
points.put((int) (timePeriod +
- BatteryUtils.convertUsToMs(remainingTimeUs)),
+ PowerUtil.convertUsToMs(remainingTimeUs)),
mCharging ? 100 : 0);
}
}
@@ -160,7 +165,7 @@
PowerUsageFeatureProvider provider =
FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
final long elapsedRealtimeUs =
- BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
+ PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
Intent batteryBroadcast = context.registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
@@ -176,7 +181,7 @@
.logRuntime(LOG_TAG, "time for enhanced BatteryInfo", startTime);
return BatteryInfo.getBatteryInfo(context, batteryBroadcast, stats,
elapsedRealtimeUs, shortString,
- BatteryUtils.convertMsToUs(estimate.estimateMillis),
+ PowerUtil.convertMsToUs(estimate.estimateMillis),
estimate.isBasedOnUsage);
}
}
@@ -217,53 +222,61 @@
info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast);
if (!info.mCharging) {
- if (drainTimeUs > 0) {
- info.remainingTimeUs = drainTimeUs;
- CharSequence timeString = Utils.formatElapsedTime(context,
- BatteryUtils.convertUsToMs(drainTimeUs), false /* withSeconds */);
- info.remainingLabel = TextUtils.expandTemplate(context.getText(shortString ?
- R.string.power_remaining_duration_only_short :
- (basedOnUsage ?
- R.string.power_remaining_duration_only_enhanced :
- R.string.power_remaining_duration_only)), timeString);
- info.chargeLabel = TextUtils.expandTemplate(context.getText(
- shortString ?
- R.string.power_discharging_duration_short :
- basedOnUsage ?
- R.string.power_discharging_duration_enhanced :
- R.string.power_discharging_duration),
- info.batteryPercentString, timeString);
- } else {
- info.remainingLabel = null;
- info.chargeLabel = info.batteryPercentString;
- }
+ updateBatteryInfoDischarging(context, shortString, drainTimeUs, basedOnUsage, info);
} else {
- final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs);
- final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
- BatteryManager.BATTERY_STATUS_UNKNOWN);
- info.discharging = false;
- if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) {
- info.remainingTimeUs = chargeTime;
- CharSequence timeString = Utils.formatElapsedTime(context,
- BatteryUtils.convertUsToMs(chargeTime), false /* withSeconds */);
- int resId = R.string.power_charging_duration;
- info.remainingLabel = TextUtils.expandTemplate(context.getText(
- R.string.power_remaining_charging_duration_only), timeString);
- info.chargeLabel = TextUtils.expandTemplate(context.getText(resId),
- info.batteryPercentString, timeString);
- } else {
- final String chargeStatusLabel = resources.getString(
- R.string.battery_info_status_charging_lower);
- info.remainingLabel = null;
- info.chargeLabel = info.batteryLevel == 100 ? info.batteryPercentString :
- resources.getString(R.string.power_charging, info.batteryPercentString,
- chargeStatusLabel);
- }
+ updateBatteryInfoCharging(context, batteryBroadcast, stats, elapsedRealtimeUs, info);
}
BatteryUtils.logRuntime(LOG_TAG, "time for getBatteryInfo", startTime);
return info;
}
+ private static void updateBatteryInfoCharging(Context context, Intent batteryBroadcast,
+ BatteryStats stats, long elapsedRealtimeUs, BatteryInfo info) {
+ final Resources resources = context.getResources();
+ final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs);
+ final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
+ BatteryManager.BATTERY_STATUS_UNKNOWN);
+ info.discharging = false;
+ if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) {
+ info.remainingTimeUs = chargeTime;
+ CharSequence timeString = StringUtil.formatElapsedTime(context,
+ PowerUtil.convertUsToMs(info.remainingTimeUs), false /* withSeconds */);
+ int resId = R.string.power_charging_duration;
+ info.remainingLabel = context.getString(
+ R.string.power_remaining_charging_duration_only, timeString);
+ info.chargeLabel = context.getString(resId, info.batteryPercentString, timeString);
+ } else {
+ final String chargeStatusLabel = resources.getString(
+ R.string.battery_info_status_charging_lower);
+ info.remainingLabel = null;
+ info.chargeLabel = info.batteryLevel == 100 ? info.batteryPercentString :
+ resources.getString(R.string.power_charging, info.batteryPercentString,
+ chargeStatusLabel);
+ }
+ }
+
+ private static void updateBatteryInfoDischarging(Context context, boolean shortString,
+ long drainTimeUs, boolean basedOnUsage, BatteryInfo info) {
+ if (drainTimeUs > 0) {
+ info.remainingTimeUs = drainTimeUs;
+ info.remainingLabel = PowerUtil.getBatteryRemainingStringFormatted(
+ context,
+ PowerUtil.convertUsToMs(drainTimeUs),
+ null /* percentageString */,
+ basedOnUsage && !shortString
+ );
+ info.chargeLabel = PowerUtil.getBatteryRemainingStringFormatted(
+ context,
+ PowerUtil.convertUsToMs(drainTimeUs),
+ info.batteryPercentString,
+ basedOnUsage && !shortString
+ );
+ } else {
+ info.remainingLabel = null;
+ info.chargeLabel = info.batteryPercentString;
+ }
+ }
+
public interface BatteryDataParser {
void onParsingStarted(long startTime, long endTime);
diff --git a/src/com/android/settings/fuelgauge/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
deleted file mode 100644
index 2a4fd6e..0000000
--- a/src/com/android/settings/fuelgauge/BatterySaverSettings.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.res.Resources;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.PowerManager;
-import android.provider.SearchIndexableResource;
-import android.provider.Settings;
-import android.provider.Settings.Global;
-import android.support.annotation.VisibleForTesting;
-import android.util.Log;
-import android.widget.Switch;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.util.ArrayUtils;
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
-import com.android.settings.dashboard.conditional.BatterySaverCondition;
-import com.android.settings.dashboard.conditional.ConditionManager;
-import com.android.settings.notification.SettingPref;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Indexable;
-import com.android.settings.widget.SwitchBar;
-
-import java.util.Arrays;
-import java.util.List;
-
-public class BatterySaverSettings extends SettingsPreferenceFragment
- implements SwitchBar.OnSwitchChangeListener, BatterySaverReceiver.BatterySaverListener,
- Indexable {
- private static final String TAG = "BatterySaverSettings";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private static final String KEY_TURN_ON_AUTOMATICALLY = "turn_on_automatically";
- private static final long WAIT_FOR_SWITCH_ANIM = 500;
-
- private final Handler mHandler = new Handler();
- private final SettingsObserver mSettingsObserver = new SettingsObserver(mHandler);
-
- @VisibleForTesting
- SwitchBar mSwitchBar;
- private Context mContext;
- private boolean mCreated;
- private SettingPref mTriggerPref;
- private Switch mSwitch;
- private boolean mValidListener;
- private PowerManager mPowerManager;
- private BatterySaverReceiver mReceiver;
-
- @Override
- public int getMetricsCategory() {
- return MetricsEvent.FUELGAUGE_BATTERY_SAVER;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- if (mCreated) {
- mSwitchBar.show();
- return;
- }
- mCreated = true;
- addPreferencesFromResource(R.xml.battery_saver_settings);
- mFooterPreferenceMixin.createFooterPreference()
- .setTitle(com.android.internal.R.string.battery_saver_description);
- mContext = getActivity();
- mSwitchBar = ((SettingsActivity) mContext).getSwitchBar();
- mSwitchBar.setSwitchBarText(R.string.battery_saver_master_switch_title,
- R.string.battery_saver_master_switch_title);
- mSwitch = mSwitchBar.getSwitch();
- mSwitchBar.show();
-
- int[] levelChoices = getResources().getIntArray(R.array.battery_saver_trigger_values);
- final int currentThreshold = Global.getInt(mContext.getContentResolver(),
- Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
- levelChoices = ArrayUtils.appendInt(levelChoices, currentThreshold);
- Arrays.sort(levelChoices);
-
- mTriggerPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_TURN_ON_AUTOMATICALLY,
- Global.LOW_POWER_MODE_TRIGGER_LEVEL,
- 0, /*default*/
- levelChoices) {
- @Override
- protected String getCaption(Resources res, int value) {
- if (value > 0 && value <= 100) {
- return res.getString(R.string.battery_saver_turn_on_automatically_pct,
- Utils.formatPercentage(value));
- }
- return res.getString(R.string.battery_saver_turn_on_automatically_never);
- }
- };
- mTriggerPref.init(this);
-
- mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
- mReceiver = new BatterySaverReceiver(mContext);
- mReceiver.setBatterySaverListener(this);
- }
-
- @Override
- public void onDestroyView() {
- super.onDestroyView();
- mSwitchBar.hide();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mSettingsObserver.setListening(true);
- mReceiver.setListening(true);
- if (!mValidListener) {
- mSwitchBar.addOnSwitchChangeListener(this);
- mValidListener = true;
- }
- updateSwitch();
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mSettingsObserver.setListening(false);
- mReceiver.setListening(false);
- if (mValidListener) {
- mSwitchBar.removeOnSwitchChangeListener(this);
- mValidListener = false;
- }
- }
-
- @Override
- public void onSwitchChanged(Switch switchView, boolean isChecked) {
- mHandler.removeCallbacks(mStartMode);
- if (isChecked) {
- mHandler.postDelayed(mStartMode, WAIT_FOR_SWITCH_ANIM);
- } else {
- if (DEBUG) Log.d(TAG, "Stopping low power mode from settings");
- trySetPowerSaveMode(false);
- }
- }
-
- private void trySetPowerSaveMode(boolean mode) {
- if (!mPowerManager.setPowerSaveMode(mode)) {
- if (DEBUG) Log.d(TAG, "Setting mode failed, fallback to current value");
- mHandler.post(mUpdateSwitch);
- }
- // TODO: Remove once broadcast is in place.
- ConditionManager.get(getContext()).getCondition(BatterySaverCondition.class).refreshState();
- }
-
- private void updateSwitch() {
- final boolean mode = mPowerManager.isPowerSaveMode();
- if (DEBUG) Log.d(TAG, "updateSwitch: isChecked=" + mSwitch.isChecked() + " mode=" + mode);
- if (mode == mSwitch.isChecked()) return;
-
- // set listener to null so that that code below doesn't trigger onCheckedChanged()
- if (mValidListener) {
- mSwitchBar.removeOnSwitchChangeListener(this);
- }
- mSwitch.setChecked(mode);
- if (mValidListener) {
- mSwitchBar.addOnSwitchChangeListener(this);
- }
- }
-
- private final Runnable mUpdateSwitch = new Runnable() {
- @Override
- public void run() {
- updateSwitch();
- }
- };
-
- private final Runnable mStartMode = new Runnable() {
- @Override
- public void run() {
- AsyncTask.execute(new Runnable() {
- @Override
- public void run() {
- if (DEBUG) Log.d(TAG, "Starting low power mode from settings");
- trySetPowerSaveMode(true);
- }
- });
- }
- };
-
- @Override
- public void onPowerSaveModeChanged() {
- mHandler.post(mUpdateSwitch);
- }
-
- @Override
- public void onBatteryChanged(boolean pluggedIn) {
- mSwitchBar.setEnabled(!pluggedIn);
- }
-
- private final class SettingsObserver extends ContentObserver {
- private final Uri LOW_POWER_MODE_TRIGGER_LEVEL_URI
- = Global.getUriFor(Global.LOW_POWER_MODE_TRIGGER_LEVEL);
-
- public SettingsObserver(Handler handler) {
- super(handler);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) {
- mTriggerPref.update(mContext);
- }
- }
-
- public void setListening(boolean listening) {
- final ContentResolver cr = getContentResolver();
- if (listening) {
- cr.registerContentObserver(LOW_POWER_MODE_TRIGGER_LEVEL_URI, false, this);
- } else {
- cr.unregisterContentObserver(this);
- }
- }
- }
-
- /**
- * For Search.
- */
- public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider() {
- @Override
- public List<SearchIndexableResource> getXmlResourcesToIndex(
- Context context, boolean enabled) {
- final SearchIndexableResource sir = new SearchIndexableResource(context);
- sir.xmlResId = R.xml.battery_saver_settings;
- return Arrays.asList(sir);
- }
- };
-}
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 5738c29..da9b705 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -43,6 +43,7 @@
import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.utils.PowerUtil;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Collections;
@@ -68,19 +69,18 @@
int BACKGROUND = 2;
int ALL = 3;
}
-
private static final String TAG = "BatteryUtils";
private static final int MIN_POWER_THRESHOLD_MILLI_AMP = 5;
+
private static final int SECONDS_IN_HOUR = 60 * 60;
private static BatteryUtils sInstance;
-
private PackageManager mPackageManager;
+
private AppOpsManager mAppOpsManager;
private Context mContext;
@VisibleForTesting
PowerUsageFeatureProvider mPowerUsageFeatureProvider;
-
public static BatteryUtils getInstance(Context context) {
if (sInstance == null || sInstance.isDataCorrupted()) {
sInstance = new BatteryUtils(context);
@@ -131,29 +131,30 @@
// Return the min value of STATE_TOP time and foreground activity time, since both of these
// time have some errors
- return convertUsToMs(
+ return PowerUtil.convertUsToMs(
Math.min(timeUs, getForegroundActivityTotalTimeUs(uid, rawRealTimeUs)));
}
private long getScreenUsageTimeMs(BatteryStats.Uid uid, int which) {
- final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
+ final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
return getScreenUsageTimeMs(uid, which, rawRealTimeUs);
}
private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) {
- final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
+ final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
final long timeUs = uid.getProcessStateTime(
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which);
Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid()));
Log.v(TAG, "background time(us): " + timeUs);
- return convertUsToMs(timeUs);
+ return PowerUtil.convertUsToMs(timeUs);
}
private long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) {
- final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
+ final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
return getScreenUsageTimeMs(uid, which, rawRealTimeUs)
- + convertUsToMs(getForegroundServiceTotalTimeUs(uid, rawRealTimeUs));
+ + PowerUtil.convertUsToMs(
+ getForegroundServiceTotalTimeUs(uid, rawRealTimeUs));
}
/**
@@ -267,9 +268,10 @@
*/
public long calculateRunningTimeBasedOnStatsType(BatteryStatsHelper batteryStatsHelper,
int statsType) {
- final long elapsedRealtimeUs = convertMsToUs(SystemClock.elapsedRealtime());
+ final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
+ SystemClock.elapsedRealtime());
// Return the battery time (millisecond) on status mStatsType
- return convertUsToMs(
+ return PowerUtil.convertUsToMs(
batteryStatsHelper.getStats().computeBatteryRealtime(elapsedRealtimeUs, statsType));
}
@@ -390,25 +392,15 @@
}
}
- public static long convertUsToMs(long timeUs) {
- return timeUs / 1000;
- }
-
- public static long convertMsToUs(long timeMs) {
- return timeMs * 1000;
- }
-
public void setForceAppStandby(int uid, String packageName,
int mode) {
final boolean isPreOApp = isLegacyApp(packageName);
if (isPreOApp) {
// Control whether app could run in the background if it is pre O app
- mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName,
- mode);
+ mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName, mode);
}
// Control whether app could run jobs in the background
- mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName,
- mode);
+ mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName, mode);
}
public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle,
@@ -425,7 +417,8 @@
// Stuff we always need to get BatteryInfo
final Intent batteryBroadcast = mContext.registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
- final long elapsedRealtimeUs = BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
+ final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
+ SystemClock.elapsedRealtime());
BatteryInfo batteryInfo;
// 0 means we are discharging, anything else means charging
@@ -443,7 +436,7 @@
if (estimate != null) {
batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats,
elapsedRealtimeUs, false /* shortString */,
- BatteryUtils.convertMsToUs(estimate.estimateMillis),
+ PowerUtil.convertMsToUs(estimate.estimateMillis),
estimate.isBasedOnUsage);
} else {
batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats,
diff --git a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
index e58ccd3..509f967 100644
--- a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
+++ b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
@@ -22,6 +22,7 @@
import android.os.SystemClock;
import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.utils.PowerUtil;
import com.android.settingslib.utils.AsyncLoader;
import java.util.ArrayList;
import java.util.List;
@@ -46,7 +47,8 @@
FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
// get stuff we'll need for both BatteryInfo
- final long elapsedRealtimeUs = BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
+ final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
+ SystemClock.elapsedRealtime());
Intent batteryBroadcast = getContext().registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
BatteryStats stats = mStatsHelper.getStats();
@@ -60,7 +62,7 @@
}
BatteryInfo newInfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast, stats,
elapsedRealtimeUs, false,
- BatteryUtils.convertMsToUs(estimate.estimateMillis),
+ PowerUtil.convertMsToUs(estimate.estimateMillis),
estimate.isBasedOnUsage);
List<BatteryInfo> infos = new ArrayList<>();
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index 6ed92a7..25351d3 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -47,6 +47,7 @@
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.utils.StringUtil;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -318,7 +319,7 @@
return;
}
if (usageData.usageList.size() <= 1) {
- CharSequence timeSequence = Utils.formatElapsedTime(getContext(),
+ CharSequence timeSequence = StringUtil.formatElapsedTime(getContext(),
usageData.totalUsageTimeMs, false);
usageData.summary = usageData.usageType == UsageType.IDLE ? timeSequence
: TextUtils.expandTemplate(getText(R.string.battery_used_for), timeSequence);
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 2a841f9..3583b14 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -37,10 +37,7 @@
import android.view.View.OnLongClickListener;
import android.widget.TextView;
-import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatterySipper.DrainType;
import com.android.settings.R;
import com.android.settings.Settings.HighPowerApplicationsActivity;
import com.android.settings.SettingsActivity;
@@ -48,10 +45,7 @@
import com.android.settings.applications.LayoutPreference;
import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.display.AmbientDisplayPreferenceController;
-import com.android.settings.display.AutoBrightnessPreferenceController;
import com.android.settings.display.BatteryPercentagePreferenceController;
-import com.android.settings.display.TimeoutPreferenceController;
import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
import com.android.settings.fuelgauge.batterytip.BatteryTipLoader;
@@ -63,6 +57,8 @@
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.utils.PowerUtil;
+import com.android.settingslib.utils.StringUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -72,7 +68,7 @@
* consumed since the last time it was unplugged.
*/
public class PowerUsageSummary extends PowerUsageBase implements OnLongClickListener,
- OnClickListener, BatteryTipPreferenceController.BatteryTipListener {
+ BatteryTipPreferenceController.BatteryTipListener {
static final String TAG = "PowerUsageSummary";
@@ -80,7 +76,6 @@
private static final String KEY_APP_LIST = "app_list";
private static final String KEY_BATTERY_HEADER = "battery_header";
private static final String KEY_BATTERY_TIP = "battery_tip";
- private static final String KEY_SHOW_ALL_APPS = "show_all_apps";
private static final String KEY_SCREEN_USAGE = "screen_usage";
private static final String KEY_TIME_SINCE_LAST_FULL_CHARGE = "last_full_charge";
@@ -165,12 +160,12 @@
// be unplugged for a period of time before being willing ot make an estimate.
summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString(
Formatter.formatShortElapsedTime(getContext(),
- BatteryUtils.convertUsToMs(oldInfo.remainingTimeUs))));
+ PowerUtil.convertUsToMs(oldInfo.remainingTimeUs))));
// for this one we can just set the string directly
summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString(
Formatter.formatShortElapsedTime(getContext(),
- BatteryUtils.convertUsToMs(newInfo.remainingTimeUs))));
+ PowerUtil.convertUsToMs(newInfo.remainingTimeUs))));
batteryView.setBatteryLevel(oldInfo.batteryLevel);
batteryView.setCharging(!oldInfo.discharging);
@@ -225,15 +220,6 @@
}
@Override
- public boolean onPreferenceTreeClick(Preference preference) {
- if (KEY_BATTERY_HEADER.equals(preference.getKey())) {
- performBatteryHeaderClick();
- return true;
- }
- return super.onPreferenceTreeClick(preference);
- }
-
- @Override
protected String getLogTag() {
return TAG;
}
@@ -311,22 +297,6 @@
}
}
- private void performBatteryHeaderClick() {
- if (mPowerFeatureProvider.isAdvancedUiEnabled()) {
- Utils.startWithFragment(getContext(), PowerUsageAdvanced.class.getName(), null,
- null, 0, R.string.advanced_battery_title, null, getMetricsCategory());
- } else {
- mStatsHelper.storeStatsHistoryInFile(BatteryHistoryDetail.BATTERY_HISTORY_FILE);
- Bundle args = new Bundle(2);
- args.putString(BatteryHistoryDetail.EXTRA_STATS,
- BatteryHistoryDetail.BATTERY_HISTORY_FILE);
- args.putParcelable(BatteryHistoryDetail.EXTRA_BROADCAST,
- mStatsHelper.getBatteryBroadcast());
- Utils.startWithFragment(getContext(), BatteryHistoryDetail.class.getName(), args,
- null, 0, R.string.history_details_title, null, getMetricsCategory());
- }
- }
-
protected void refreshUi() {
final Context context = getContext();
if (context == null) {
@@ -340,10 +310,10 @@
final long lastFullChargeTime = mBatteryUtils.calculateLastFullChargeTime(mStatsHelper,
System.currentTimeMillis());
updateLastFullChargePreference(lastFullChargeTime);
- mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(),
+ mScreenUsagePref.setSubtitle(StringUtil.formatElapsedTime(getContext(),
mBatteryUtils.calculateScreenUsageTime(mStatsHelper), false));
- final CharSequence timeSequence = Utils.formatRelativeTime(context, lastFullChargeTime,
+ final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime,
false);
mBatteryAppListPreferenceController.refreshAppListGroup(mStatsHelper,
false /* showAllApps */, timeSequence);
@@ -366,7 +336,7 @@
@VisibleForTesting
void updateLastFullChargePreference(long timeMs) {
- final CharSequence timeSequence = Utils.formatRelativeTime(getContext(), timeMs, false);
+ final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false);
mLastFullChargePref.setSubtitle(timeSequence);
}
@@ -405,12 +375,9 @@
getLoaderManager().restartLoader(BATTERY_INFO_LOADER, Bundle.EMPTY,
mBatteryInfoLoaderCallbacks);
if (mPowerFeatureProvider.isEstimateDebugEnabled()) {
- // Unfortunately setting a long click listener on a view means it will no
- // longer pass the regular click event to the parent, so we have to register
- // a regular click listener as well.
+ // Set long click action for summary to show debug info
View header = mBatteryLayoutPref.findViewById(R.id.summary1);
header.setOnLongClickListener(this);
- header.setOnClickListener(this);
}
}
@@ -422,11 +389,6 @@
}
@Override
- public void onClick(View view) {
- performBatteryHeaderClick();
- }
-
- @Override
protected void restartBatteryStatsLoader() {
restartBatteryStatsLoader(true /* clearHeader */);
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
index 605591d..e6c4923 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
@@ -69,6 +69,8 @@
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.utils.PowerUtil;
+import com.android.settingslib.utils.StringUtil;
import java.util.ArrayList;
import java.util.List;
@@ -210,12 +212,12 @@
// be unplugged for a period of time before being willing ot make an estimate.
summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString(
Formatter.formatShortElapsedTime(getContext(),
- BatteryUtils.convertUsToMs(oldInfo.remainingTimeUs))));
+ PowerUtil.convertUsToMs(oldInfo.remainingTimeUs))));
// for this one we can just set the string directly
summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString(
Formatter.formatShortElapsedTime(getContext(),
- BatteryUtils.convertUsToMs(newInfo.remainingTimeUs))));
+ PowerUtil.convertUsToMs(newInfo.remainingTimeUs))));
batteryView.setBatteryLevel(oldInfo.batteryLevel);
batteryView.setCharging(!oldInfo.discharging);
@@ -524,7 +526,7 @@
updateScreenPreference();
updateLastFullChargePreference(lastFullChargeTime);
- final CharSequence timeSequence = Utils.formatRelativeTime(context, lastFullChargeTime,
+ final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime,
false);
final int resId = mShowAllApps ? R.string.power_usage_list_summary_device
: R.string.power_usage_list_summary;
@@ -653,12 +655,13 @@
mStatsHelper.getUsageList(), DrainType.SCREEN);
final long usageTimeMs = sipper != null ? sipper.usageTimeMs : 0;
- mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(), usageTimeMs, false));
+ mScreenUsagePref.setSubtitle(
+ StringUtil.formatElapsedTime(getContext(), usageTimeMs, false));
}
@VisibleForTesting
void updateLastFullChargePreference(long timeMs) {
- final CharSequence timeSequence = Utils.formatRelativeTime(getContext(), timeMs, false);
+ final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false);
mLastFullChargePref.setSubtitle(timeSequence);
}
@@ -685,8 +688,8 @@
// Only show summary when usage time is longer than one minute
final long usageTimeMs = sipper.usageTimeMs;
if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) {
- final CharSequence timeSequence = Utils.formatElapsedTime(getContext(), usageTimeMs,
- false);
+ final CharSequence timeSequence =
+ StringUtil.formatElapsedTime(getContext(), usageTimeMs, false);
preference.setSummary(
(sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper))
? timeSequence
diff --git a/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceController.java
new file mode 100644
index 0000000..4d3dd31
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceController.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge.batterysaver;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.TogglePreferenceController;
+
+/**
+ * Controller that update whether to turn on battery saver automatically
+ */
+public class AutoBatterySaverPreferenceController extends TogglePreferenceController implements
+ Preference.OnPreferenceChangeListener {
+ private static final int LOW_POWER_MODE_TRIGGER_THRESHOLD = 15;
+
+ @VisibleForTesting
+ static final String KEY_AUTO_BATTERY_SAVER = "auto_battery_saver";
+
+ public AutoBatterySaverPreferenceController(Context context) {
+ super(context, KEY_AUTO_BATTERY_SAVER);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public boolean isChecked() {
+ return Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0) != 0;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL,
+ isChecked
+ ? LOW_POWER_MODE_TRIGGER_THRESHOLD
+ : 0);
+ return true;
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java
new file mode 100644
index 0000000..1c787ab
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge.batterysaver;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.widget.SeekBarPreference;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+
+/**
+ * Controller that update the battery saver seekbar
+ */
+public class AutoBatterySeekBarPreferenceController extends BasePreferenceController implements
+ LifecycleObserver, OnStart, OnStop, SeekBarPreference.OnPreferenceChangeListener {
+ @VisibleForTesting
+ static final String KEY_AUTO_BATTERY_SEEK_BAR = "battery_saver_seek_bar";
+ private SeekBarPreference mPreference;
+ private AutoBatterySaverSettingObserver mContentObserver;
+
+ public AutoBatterySeekBarPreferenceController(Context context, Lifecycle lifecycle) {
+ super(context, KEY_AUTO_BATTERY_SEEK_BAR);
+ mContentObserver = new AutoBatterySaverSettingObserver(new Handler());
+ if (lifecycle != null) {
+ lifecycle.addObserver(this);
+ }
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = (SeekBarPreference) screen.findPreference(
+ KEY_AUTO_BATTERY_SEEK_BAR);
+ updatePreference(mPreference);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ updatePreference(preference);
+ }
+
+ @Override
+ public void onStart() {
+ mContentObserver.registerContentObserver();
+ }
+
+ @Override
+ public void onStop() {
+ mContentObserver.unRegisterContentObserver();
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final int progress = (int) newValue;
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, progress);
+ return true;
+ }
+
+ @VisibleForTesting
+ void updatePreference(Preference preference) {
+ final ContentResolver contentResolver = mContext.getContentResolver();
+ final int level = Settings.Global.getInt(contentResolver,
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ if (level == 0) {
+ preference.setVisible(false);
+ } else {
+ preference.setVisible(true);
+ preference.setTitle(mContext.getString(R.string.battery_saver_seekbar_title,
+ Utils.formatPercentage(level)));
+ ((SeekBarPreference) preference).setProgress(level);
+ }
+ }
+
+ /**
+ * Observer that listens to change from {@link Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL}
+ */
+ private final class AutoBatterySaverSettingObserver extends ContentObserver {
+ private final Uri mUri = Settings.Global.getUriFor(
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL);
+ private final ContentResolver mContentResolver;
+
+ public AutoBatterySaverSettingObserver(Handler handler) {
+ super(handler);
+ mContentResolver = mContext.getContentResolver();
+ }
+
+ public void registerContentObserver() {
+ mContentResolver.registerContentObserver(mUri, false, this);
+ }
+
+ public void unRegisterContentObserver() {
+ mContentResolver.unregisterContentObserver(this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri, int userId) {
+ if (mUri.equals(uri)) {
+ updatePreference(mPreference);
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java
new file mode 100644
index 0000000..392032c
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge.batterysaver;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.PowerManager;
+import android.provider.SearchIndexableResource;
+import android.provider.Settings.Global;
+import android.support.annotation.VisibleForTesting;
+import android.util.Log;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.util.ArrayUtils;
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Battery saver settings page
+ */
+public class BatterySaverSettings extends DashboardFragment {
+ private static final String TAG = "BatterySaverSettings";
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsEvent.FUELGAUGE_BATTERY_SAVER;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.battery_saver_settings;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ return buildPreferenceControllers(context, getLifecycle());
+ }
+
+ @Override
+ public int getHelpResource() {
+ return R.string.help_url_battery_saver_settings;
+ }
+
+ private static List<AbstractPreferenceController> buildPreferenceControllers(
+ Context context, Lifecycle lifecycle) {
+ final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ controllers.add(new AutoBatterySaverPreferenceController(context));
+ controllers.add(new AutoBatterySeekBarPreferenceController(context, lifecycle));
+ return controllers;
+ }
+
+ /**
+ * For Search.
+ */
+ public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider() {
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(
+ Context context, boolean enabled) {
+ final SearchIndexableResource sir = new SearchIndexableResource(context);
+ sir.xmlResId = R.xml.battery_saver_settings;
+ return Arrays.asList(sir);
+ }
+
+ @Override
+ public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ return buildPreferenceControllers(context, null);
+ }
+ };
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
index 66ce3ca..d93b589 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
@@ -36,6 +36,7 @@
import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
+import com.android.settingslib.utils.StringUtil;
import java.util.List;
@@ -83,7 +84,8 @@
return new AlertDialog.Builder(context)
.setMessage(getString(R.string.battery_tip_dialog_message,
- Utils.formatElapsedTime(context, highUsageTip.getScreenTimeMs(),
+ StringUtil.formatElapsedTime(
+ context, highUsageTip.getScreenTimeMs(),
false /* withSeconds */)))
.setView(view)
.setPositiveButton(android.R.string.ok, null)
diff --git a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
index 6c129d8..d982280 100644
--- a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
+++ b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
@@ -30,6 +30,7 @@
import com.android.settings.R;
import com.android.settings.Utils;
+import com.android.settingslib.utils.StringUtil;
import java.util.List;
/**
@@ -78,7 +79,7 @@
UserHandle.myUserId()));
holder.appName.setText(Utils.getApplicationLabel(mContext, app.packageName));
if (app.screenOnTimeMs != 0) {
- holder.appTime.setText(Utils.formatElapsedTime(mContext, app.screenOnTimeMs, false));
+ holder.appTime.setText(StringUtil.formatElapsedTime(mContext, app.screenOnTimeMs, false));
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java
index 2aabf98..6091131 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/HighUsageTip.java
@@ -22,9 +22,9 @@
import android.support.annotation.VisibleForTesting;
import com.android.settings.R;
-import com.android.settings.Utils;
import com.android.settings.fuelgauge.batterytip.AppInfo;
+import com.android.settingslib.utils.StringUtil;
import java.util.List;
/**
@@ -65,7 +65,7 @@
@Override
public CharSequence getSummary(Context context) {
return context.getString(R.string.battery_tip_high_usage_summary,
- Utils.formatElapsedTime(context, mScreenTimeMs, false));
+ StringUtil.formatElapsedTime(context, mScreenTimeMs, false));
}
@Override
diff --git a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
index 279dcd3..ce5e1d1 100644
--- a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
+++ b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
@@ -46,6 +46,7 @@
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.utils.StringUtil;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import java.util.ArrayList;
@@ -229,7 +230,7 @@
pref.setKey(pkgName);
pref.setTitle(appEntry.label);
pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info));
- pref.setSummary(Utils.formatRelativeTime(mContext,
+ pref.setSummary(StringUtil.formatRelativeTime(mContext,
System.currentTimeMillis() - app.getLastNotified(), false));
pref.setOrder(i);
Bundle args = new Bundle();
diff --git a/src/com/android/settings/notification/VisibilityPreferenceController.java b/src/com/android/settings/notification/VisibilityPreferenceController.java
index 62ca183..dac90ef 100644
--- a/src/com/android/settings/notification/VisibilityPreferenceController.java
+++ b/src/com/android/settings/notification/VisibilityPreferenceController.java
@@ -84,14 +84,17 @@
| DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
}
- final String summaryHideEntry =
- mContext.getString(R.string.lock_screen_notifications_summary_hide);
- final String summaryHideEntryValue = Integer.toString(Notification.VISIBILITY_PRIVATE);
- entries.add(summaryHideEntry);
- values.add(summaryHideEntryValue);
- setRestrictedIfNotificationFeaturesDisabled(pref,
- summaryHideEntry, summaryHideEntryValue,
- DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
+ if (getLockscreenNotificationsEnabled()) {
+ final String summaryHideEntry =
+ mContext.getString(R.string.lock_screen_notifications_summary_hide);
+ final String summaryHideEntryValue = Integer.toString(
+ Notification.VISIBILITY_PRIVATE);
+ entries.add(summaryHideEntry);
+ values.add(summaryHideEntryValue);
+ setRestrictedIfNotificationFeaturesDisabled(pref,
+ summaryHideEntry, summaryHideEntryValue,
+ DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
+ }
entries.add(mContext.getString(R.string.lock_screen_notifications_summary_disable));
values.add(Integer.toString(Notification.VISIBILITY_SECRET));
pref.setEntries(entries.toArray(new CharSequence[entries.size()]));
diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java
index 80d435f..585a2c1 100644
--- a/src/com/android/settings/overlay/FeatureFactory.java
+++ b/src/com/android/settings/overlay/FeatureFactory.java
@@ -27,13 +27,12 @@
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
-import com.android.settings.datausage.DataPlanFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.gestures.AssistGestureFeatureProvider;
import com.android.settings.localepicker.LocaleFeatureProvider;
-import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.search.SearchFeatureProvider;
+import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.slices.SlicesFeatureProvider;
import com.android.settings.users.UserFeatureProvider;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -104,8 +103,6 @@
public abstract BluetoothFeatureProvider getBluetoothFeatureProvider(Context context);
- public abstract DataPlanFeatureProvider getDataPlanFeatureProvider();
-
public abstract SmsMirroringFeatureProvider getSmsMirroringFeatureProvider();
public abstract SlicesFeatureProvider getSlicesFeatureProvider();
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java
index 55f408d..965bfb1 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.java
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java
@@ -35,8 +35,6 @@
import com.android.settings.dashboard.DashboardFeatureProviderImpl;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
-import com.android.settings.datausage.DataPlanFeatureProvider;
-import com.android.settings.datausage.DataPlanFeatureProviderImpl;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
@@ -77,7 +75,6 @@
private AssistGestureFeatureProvider mAssistGestureFeatureProvider;
private UserFeatureProvider mUserFeatureProvider;
private BluetoothFeatureProvider mBluetoothFeatureProvider;
- private DataPlanFeatureProvider mDataPlanFeatureProvider;
private SmsMirroringFeatureProvider mSmsMirroringFeatureProvider;
private SlicesFeatureProvider mSlicesFeatureProvider;
private AccountFeatureProvider mAccountFeatureProvider;
@@ -192,14 +189,6 @@
}
@Override
- public DataPlanFeatureProvider getDataPlanFeatureProvider() {
- if (mDataPlanFeatureProvider == null) {
- mDataPlanFeatureProvider = new DataPlanFeatureProviderImpl();
- }
- return mDataPlanFeatureProvider;
- }
-
- @Override
public AssistGestureFeatureProvider getAssistGestureFeatureProvider() {
if (mAssistGestureFeatureProvider == null) {
mAssistGestureFeatureProvider = new AssistGestureFeatureProviderImpl();
diff --git a/src/com/android/settings/search/CursorToSearchResultConverter.java b/src/com/android/settings/search/CursorToSearchResultConverter.java
deleted file mode 100644
index 8e5577d..0000000
--- a/src/com/android/settings/search/CursorToSearchResultConverter.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package com.android.settings.search;
-
-import static com.android.settings.search.DatabaseResultLoader.BASE_RANKS;
-import static com.android.settings.search.SearchResult.TOP_RANK;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.graphics.drawable.Drawable;
-import android.os.BadParcelableException;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Controller to Build search results from {@link Cursor} Objects.
- *
- * Each converted {@link Cursor} has the following fields:
- * - String Title
- * - String Summary
- * - int rank
- * - {@link Drawable} icon
- * - {@link ResultPayload} payload
- */
-public class CursorToSearchResultConverter {
-
- private static final String TAG = "CursorConverter";
-
- /**
- * These indices are used to match the columns of the this loader's SELECT statement.
- * These are not necessarily the same order nor similar coverage as the schema defined in
- * IndexDatabaseHelper
- */
- public static final int COLUMN_INDEX_ID = 0;
- public static final int COLUMN_INDEX_TITLE = 1;
- public static final int COLUMN_INDEX_SUMMARY_ON = 2;
- public static final int COLUMN_INDEX_SUMMARY_OFF = 3;
- public static final int COLUMN_INDEX_CLASS_NAME = 4;
- public static final int COLUMN_INDEX_SCREEN_TITLE = 5;
- public static final int COLUMN_INDEX_ICON = 6;
- public static final int COLUMN_INDEX_INTENT_ACTION = 7;
- public static final int COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE = 8;
- public static final int COLUMN_INDEX_INTENT_ACTION_TARGET_CLASS = 9;
- public static final int COLUMN_INDEX_KEY = 10;
- public static final int COLUMN_INDEX_PAYLOAD_TYPE = 11;
- public static final int COLUMN_INDEX_PAYLOAD = 12;
-
- private final Context mContext;
-
- private final int LONG_TITLE_LENGTH = 20;
-
- private static final String[] whiteList = {
- "main_toggle_wifi",
- "main_toggle_bluetooth",
- "main_toggle_bluetooth_obsolete",
- "toggle_airplane",
- "tether_settings",
- "battery_saver",
- "toggle_nfc",
- "restrict_background",
- "data_usage_enable",
- "button_roaming_key",
- };
- private static final Set<String> prioritySettings = new HashSet(Arrays.asList(whiteList));
-
-
- public CursorToSearchResultConverter(Context context) {
- mContext = context;
- }
-
- public Set<SearchResult> convertCursor(Cursor cursorResults, int baseRank) {
- if (cursorResults == null) {
- return null;
- }
- final Map<String, Context> contextMap = new HashMap<>();
- final Set<SearchResult> results = new HashSet<>();
-
- while (cursorResults.moveToNext()) {
- SearchResult result = buildSingleSearchResultFromCursor(contextMap, cursorResults,
- baseRank);
- if (result != null) {
- results.add(result);
- }
- }
- return results;
- }
-
- public static ResultPayload getUnmarshalledPayload(byte[] marshalledPayload,
- int payloadType) {
- try {
- switch (payloadType) {
- case ResultPayload.PayloadType.INTENT:
- return ResultPayloadUtils.unmarshall(marshalledPayload,
- ResultPayload.CREATOR);
- case ResultPayload.PayloadType.INLINE_SWITCH:
- return ResultPayloadUtils.unmarshall(marshalledPayload,
- InlineSwitchPayload.CREATOR);
- case ResultPayload.PayloadType.INLINE_LIST:
- return ResultPayloadUtils.unmarshall(marshalledPayload,
- InlineListPayload.CREATOR);
- }
- } catch (BadParcelableException e) {
- Log.w(TAG, "Error creating parcelable: " + e);
- }
- return null;
- }
-
- private SearchResult buildSingleSearchResultFromCursor(Map<String, Context> contextMap,
- Cursor cursor, int baseRank) {
- final int docId = cursor.getInt(COLUMN_INDEX_ID);
- final String pkgName = cursor.getString(COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE);
- final String title = cursor.getString(COLUMN_INDEX_TITLE);
- final String summaryOn = cursor.getString(COLUMN_INDEX_SUMMARY_ON);
- final String className = cursor.getString(COLUMN_INDEX_CLASS_NAME);
- final String key = cursor.getString(COLUMN_INDEX_KEY);
- final String iconResStr = cursor.getString(COLUMN_INDEX_ICON);
- final int payloadType = cursor.getInt(COLUMN_INDEX_PAYLOAD_TYPE);
- final byte[] marshalledPayload = cursor.getBlob(COLUMN_INDEX_PAYLOAD);
- final ResultPayload payload = getUnmarshalledPayload(marshalledPayload, payloadType);
-
- final int rank = getRank(title, baseRank, key);
-
- final SearchResult.Builder builder = new SearchResult.Builder()
- .setStableId(docId)
- .setTitle(title)
- .setSummary(summaryOn)
- .setRank(rank)
- .setIcon(getIconForPackage(contextMap, pkgName, className, iconResStr))
- .setPayload(payload);
- return builder.build();
- }
-
- private Drawable getIconForPackage(Map<String, Context> contextMap, String pkgName,
- String className, String iconResStr) {
- final int iconId = TextUtils.isEmpty(iconResStr)
- ? 0 : Integer.parseInt(iconResStr);
- Drawable icon;
- Context packageContext;
- if (iconId == 0) {
- icon = null;
- } else {
- if (TextUtils.isEmpty(className) && !TextUtils.isEmpty(pkgName)) {
- packageContext = contextMap.get(pkgName);
- if (packageContext == null) {
- try {
- packageContext = mContext.createPackageContext(pkgName, 0);
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(TAG, "Cannot create Context for package: " + pkgName);
- return null;
- }
- contextMap.put(pkgName, packageContext);
- }
- } else {
- packageContext = mContext;
- }
- try {
- icon = packageContext.getDrawable(iconId);
- } catch (Resources.NotFoundException nfe) {
- icon = null;
- }
- }
- return icon;
- }
-
-
- /** Uses the breadcrumbs to determine the offset to the base rank.
- * There are three checks
- * A) If the result is prioritized and the highest base level
- * B) If the query matches the highest level menu title
- * C) If the query is longer than 20
- *
- * If the query matches A, set it to TOP_RANK
- * If the query matches B, the offset is 0.
- * If the query matches C, the offset is 1
-
- * @param title of the result.
- * @param baseRank of the result. Lower if it's a better result.
- * @return
- */
- private int getRank(String title, int baseRank, String key) {
- // The result can only be prioritized if it is a top ranked result.
- if (prioritySettings.contains(key) && baseRank < BASE_RANKS[1]) {
- return TOP_RANK;
- }
- if (title.length() > LONG_TITLE_LENGTH) {
- return baseRank + 1;
- }
- return baseRank;
- }
-}
\ No newline at end of file
diff --git a/src/com/android/settings/search/DatabaseIndexingManager.java b/src/com/android/settings/search/DatabaseIndexingManager.java
index 7b9a635..0c02b67 100644
--- a/src/com/android/settings/search/DatabaseIndexingManager.java
+++ b/src/com/android/settings/search/DatabaseIndexingManager.java
@@ -18,10 +18,10 @@
package com.android.settings.search;
-import static com.android.settings.search.CursorToSearchResultConverter.COLUMN_INDEX_ID;
-import static com.android.settings.search.CursorToSearchResultConverter
+import static com.android.settings.search.DatabaseResultLoader.COLUMN_INDEX_ID;
+import static com.android.settings.search.DatabaseResultLoader
.COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE;
-import static com.android.settings.search.CursorToSearchResultConverter.COLUMN_INDEX_KEY;
+import static com.android.settings.search.DatabaseResultLoader.COLUMN_INDEX_KEY;
import static com.android.settings.search.DatabaseResultLoader.SELECT_COLUMNS;
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.CLASS_NAME;
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_ENTRIES;
diff --git a/src/com/android/settings/search/DatabaseResultLoader.java b/src/com/android/settings/search/DatabaseResultLoader.java
index 3b5cc47..7902eef 100644
--- a/src/com/android/settings/search/DatabaseResultLoader.java
+++ b/src/com/android/settings/search/DatabaseResultLoader.java
@@ -43,14 +43,11 @@
};
/**
- * Base ranks defines the best possible rank based on what the query matches.
- * If the query matches the prefix of the first word in the title, the best rank it can be
- * is 1
- * If the query matches the prefix of the other words in the title, the best rank it can be
- * is 3
- * If the query only matches the summary, the best rank it can be is 7
- * If the query only matches keywords or entries, the best rank it can be is 9
+ * These indices are used to match the columns of the this loader's SELECT statement.
+ * These are not necessarily the same order nor similar coverage as the schema defined in
+ * IndexDatabaseHelper
*/
- public static final int[] BASE_RANKS = {1, 3, 7, 9};
-
+ public static final int COLUMN_INDEX_ID = 0;
+ public static final int COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE = 8;
+ public static final int COLUMN_INDEX_KEY = 10;
}
\ No newline at end of file
diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java
index 1edc2de..55235a4 100644
--- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java
+++ b/src/com/android/settings/search/SearchIndexableResourcesImpl.java
@@ -22,10 +22,12 @@
import com.android.settings.DisplaySettings;
import com.android.settings.LegalSettings;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
+import com.android.settings.datausage.DataUsageSummaryLegacy;
import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
import com.android.settings.accessibility.AccessibilitySettings;
import com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment;
import com.android.settings.accessibility.MagnificationPreferenceFragment;
+import com.android.settings.accessibility.VibrationSettings;
import com.android.settings.accounts.AccountDashboardFragment;
import com.android.settings.applications.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DefaultAppSettings;
@@ -49,7 +51,7 @@
import com.android.settings.display.ScreenZoomSettings;
import com.android.settings.dream.DreamSettings;
import com.android.settings.enterprise.EnterprisePrivacySettings;
-import com.android.settings.fuelgauge.BatterySaverSettings;
+import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
import com.android.settings.fuelgauge.PowerUsageAdvanced;
import com.android.settings.fuelgauge.PowerUsageSummary;
import com.android.settings.fuelgauge.SmartBatterySettings;
@@ -111,6 +113,7 @@
addIndex(BluetoothSettings.class);
addIndex(SimSettings.class);
addIndex(DataUsageSummary.class);
+ addIndex(DataUsageSummaryLegacy.class);
addIndex(ScreenZoomSettings.class);
addIndex(DisplaySettings.class);
addIndex(AmbientDisplaySettings.class);
@@ -176,6 +179,7 @@
addIndex(NightDisplaySettings.class);
addIndex(SmartBatterySettings.class);
addIndex(MyDeviceInfoFragment.class);
+ addIndex(VibrationSettings.class);
}
@Override
diff --git a/src/com/android/settings/search/SearchResult.java b/src/com/android/settings/search/SearchResult.java
deleted file mode 100644
index d96661a..0000000
--- a/src/com/android/settings/search/SearchResult.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package com.android.settings.search;
-
-import android.graphics.drawable.Drawable;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.util.List;
-
-/**
- * Data class as an interface for all Search Results.
- */
-public class SearchResult implements Comparable<SearchResult> {
-
- private static final String TAG = "SearchResult";
-
- /**
- * Defines the lowest rank for a search result to be considered as ranked. Results with ranks
- * higher than this have no guarantee for sorting order.
- */
- public static final int BOTTOM_RANK = 10;
-
- /**
- * Defines the highest rank for a search result. Used for special search results only.
- */
- public static final int TOP_RANK = 0;
-
- /**
- * The title of the result and main text displayed.
- * Intent Results: Displays as the primary
- */
- public final CharSequence title;
-
- /**
- * Summary / subtitle text
- * Intent Results: Displays the text underneath the title
- */
- final public CharSequence summary;
-
- /**
- * An ordered list of the information hierarchy.
- * Intent Results: Displayed a hierarchy of selections to reach the setting from the home screen
- */
- public final List<String> breadcrumbs;
-
- /**
- * A suggestion for the ranking of the result.
- * Based on Settings Rank:
- * 1 is a near perfect match
- * 9 is the weakest match
- * TODO subject to change
- */
- public final int rank;
-
- /**
- * Identifier for the recycler view adapter.
- */
- @ResultPayload.PayloadType
- public final int viewType;
-
- /**
- * Metadata for the specific result types.
- */
- public final ResultPayload payload;
-
- /**
- * Result's icon.
- */
- public final Drawable icon;
-
- /**
- * Stable id for this object.
- */
- public final int stableId;
-
- protected SearchResult(Builder builder) {
- stableId = builder.mStableId;
- title = builder.mTitle;
- summary = builder.mSummary;
- breadcrumbs = builder.mBreadcrumbs;
- rank = builder.mRank;
- icon = builder.mIcon;
- payload = builder.mResultPayload;
- viewType = payload.getType();
- }
-
- @Override
- public int compareTo(SearchResult searchResult) {
- if (searchResult == null) {
- return -1;
- }
- return this.rank - searchResult.rank;
- }
-
- @Override
- public boolean equals(Object that) {
- if (this == that) {
- return true;
- }
- if (!(that instanceof SearchResult)) {
- return false;
- }
- return this.stableId == ((SearchResult) that).stableId;
- }
-
- @Override
- public int hashCode() {
- return stableId;
- }
-
- public static class Builder {
- protected CharSequence mTitle;
- protected CharSequence mSummary;
- protected List<String> mBreadcrumbs;
- protected int mRank = 42;
- protected ResultPayload mResultPayload;
- protected Drawable mIcon;
- protected int mStableId;
-
- public Builder setTitle(CharSequence title) {
- mTitle = title;
- return this;
- }
-
- public Builder setSummary(CharSequence summary) {
- mSummary = summary;
- return this;
- }
-
- public Builder addBreadcrumbs(List<String> breadcrumbs) {
- mBreadcrumbs = breadcrumbs;
- return this;
- }
-
- public Builder setRank(int rank) {
- if (rank >= 0 && rank <= 9) {
- mRank = rank;
- }
- return this;
- }
-
- public Builder setIcon(Drawable icon) {
- mIcon = icon;
- return this;
- }
-
- public Builder setPayload(ResultPayload payload) {
- mResultPayload = payload;
- return this;
- }
-
- public Builder setStableId(int stableId) {
- mStableId = stableId;
- return this;
- }
-
- public SearchResult build() {
- // Check that all of the mandatory fields are set.
- if (TextUtils.isEmpty(mTitle)) {
- throw new IllegalStateException("SearchResult missing title argument");
- } else if (mStableId == 0) {
- Log.v(TAG, "No stable ID on SearchResult with title: " + mTitle);
- throw new IllegalStateException("SearchResult missing stableId argument");
- } else if (mResultPayload == null) {
- throw new IllegalStateException("SearchResult missing Payload argument");
- }
- return new SearchResult(this);
- }
- }
-}
\ No newline at end of file
diff --git a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
index a9e56f4..55448e2 100644
--- a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
+++ b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
@@ -44,6 +44,11 @@
private Preference mPreference;
+ public VisiblePatternProfilePreferenceController(Context context) {
+ this(context, null /* lifecycle */);
+ }
+
+ // TODO (b/73074893) Replace this constructor without Lifecycle using setter method instead.
public VisiblePatternProfilePreferenceController(Context context, Lifecycle lifecycle) {
super(context, KEY_VISIBLE_PATTERN_PROFILE);
mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
diff --git a/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java b/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java
index 5bb8f75..3e39860 100644
--- a/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java
+++ b/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceController.java
@@ -20,7 +20,6 @@
import android.os.UserHandle;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R;
@@ -52,21 +51,18 @@
}
@Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- final Preference preference = screen.findPreference(getPreferenceKey());
- if (preference == null) {
- return;
- }
+ public void updateState(Preference preference) {
final int numberOfTrustAgent = getTrustAgentCount();
if (!mLockPatternUtils.isSecure(MY_USER_ID)) {
preference.setEnabled(false);
preference.setSummary(R.string.disabled_because_no_backup_security);
} else if (numberOfTrustAgent > 0) {
+ preference.setEnabled(true);
preference.setSummary(mContext.getResources().getQuantityString(
R.plurals.manage_trust_agents_summary_on,
numberOfTrustAgent, numberOfTrustAgent));
} else {
+ preference.setEnabled(true);
preference.setSummary(R.string.manage_trust_agents_summary);
}
}
diff --git a/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java b/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java
index 1970195..5e8ad2c 100644
--- a/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java
+++ b/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java
@@ -17,6 +17,7 @@
import android.app.Fragment;
import android.content.Context;
+import android.os.UserHandle;
import com.android.settings.Utils;
@@ -34,4 +35,10 @@
public String getPreferenceKey() {
return KEY_AUTO_SYNC_WORK_ACCOUNT;
}
+
+ @Override
+ public boolean isAvailable() {
+ return mUserHandle != null && !mUserManager.isManagedProfile() && !mUserManager.isLinkedUser()
+ && mUserManager.getProfiles(UserHandle.myUserId()).size() > 1;
+ }
}
diff --git a/src/com/android/settings/wallpaper/WallpaperSuggestionActivity.java b/src/com/android/settings/wallpaper/WallpaperSuggestionActivity.java
index 77142ed..8d798b1 100644
--- a/src/com/android/settings/wallpaper/WallpaperSuggestionActivity.java
+++ b/src/com/android/settings/wallpaper/WallpaperSuggestionActivity.java
@@ -59,7 +59,8 @@
@VisibleForTesting
public static boolean isSuggestionComplete(Context context) {
final WallpaperManagerWrapper manager = new WallpaperManagerWrapper(context);
- return manager.getWallpaperId(WallpaperManager.FLAG_SYSTEM) > 0;
+ return manager.isWallpaperServiceEnabled() ? manager.getWallpaperId(
+ WallpaperManager.FLAG_SYSTEM) > 0 : false;
}
}
diff --git a/src/com/android/settings/widget/MasterCheckBoxPreference.java b/src/com/android/settings/widget/MasterCheckBoxPreference.java
index 552f51c..fceeac2 100644
--- a/src/com/android/settings/widget/MasterCheckBoxPreference.java
+++ b/src/com/android/settings/widget/MasterCheckBoxPreference.java
@@ -83,6 +83,7 @@
if (mCheckBox != null) {
mCheckBox.setContentDescription(getTitle());
mCheckBox.setChecked(mChecked);
+ mCheckBox.setEnabled(mEnableCheckBox);
}
}
diff --git a/src/com/android/settings/widget/SeekBarPreference.java b/src/com/android/settings/widget/SeekBarPreference.java
index ee7d4b8..5af21b3 100644
--- a/src/com/android/settings/widget/SeekBarPreference.java
+++ b/src/com/android/settings/widget/SeekBarPreference.java
@@ -40,6 +40,7 @@
private int mProgress;
private int mMax;
+ private int mMin;
private boolean mTrackingTouch;
private boolean mContinuousUpdates;
@@ -55,6 +56,7 @@
TypedArray a = context.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.ProgressBar, defStyleAttr, defStyleRes);
setMax(a.getInt(com.android.internal.R.styleable.ProgressBar_max, mMax));
+ setMin(a.getInt(com.android.internal.R.styleable.ProgressBar_min, mMin));
a.recycle();
a = context.obtainStyledAttributes(attrs,
@@ -94,6 +96,7 @@
com.android.internal.R.id.seekbar);
mSeekBar.setOnSeekBarChangeListener(this);
mSeekBar.setMax(mMax);
+ mSeekBar.setMin(mMin);
mSeekBar.setProgress(mProgress);
mSeekBar.setEnabled(isEnabled());
final CharSequence title = getTitle();
@@ -154,10 +157,21 @@
}
}
+ public void setMin(int min) {
+ if (min != mMin) {
+ mMin = min;
+ notifyChanged();
+ }
+ }
+
public int getMax() {
return mMax;
}
+ public int getMin() {
+ return mMin;
+ }
+
public void setProgress(int progress) {
setProgress(progress, true);
}
@@ -187,8 +201,8 @@
if (progress > mMax) {
progress = mMax;
}
- if (progress < 0) {
- progress = 0;
+ if (progress < mMin) {
+ progress = mMin;
}
if (progress != mProgress) {
mProgress = progress;
@@ -257,6 +271,7 @@
final SavedState myState = new SavedState(superState);
myState.progress = mProgress;
myState.max = mMax;
+ myState.min = mMin;
return myState;
}
@@ -273,6 +288,7 @@
super.onRestoreInstanceState(myState.getSuperState());
mProgress = myState.progress;
mMax = myState.max;
+ mMin = myState.min;
notifyChanged();
}
@@ -285,6 +301,7 @@
private static class SavedState extends BaseSavedState {
int progress;
int max;
+ int min;
public SavedState(Parcel source) {
super(source);
@@ -292,6 +309,7 @@
// Restore the click counter
progress = source.readInt();
max = source.readInt();
+ min = source.readInt();
}
@Override
@@ -301,6 +319,7 @@
// Save the click counter
dest.writeInt(progress);
dest.writeInt(max);
+ dest.writeInt(min);
}
public SavedState(Parcelable superState) {
diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java
index b359bf3..1607b74 100644
--- a/src/com/android/settings/wifi/ConfigureWifiSettings.java
+++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java
@@ -92,8 +92,6 @@
controllers.add(new WifiInfoPreferenceController(context, getLifecycle(), wifiManager));
controllers.add(new CellularFallbackPreferenceController(context));
controllers.add(new WifiP2pPreferenceController(context, getLifecycle(), wifiManager));
- controllers.add(new WpsPreferenceController(
- context, getLifecycle(), wifiManager, getFragmentManager()));
return controllers;
}
diff --git a/src/com/android/settings/wifi/ConnectedAccessPointPreference.java b/src/com/android/settings/wifi/ConnectedAccessPointPreference.java
index 6b9c788..514525c 100644
--- a/src/com/android/settings/wifi/ConnectedAccessPointPreference.java
+++ b/src/com/android/settings/wifi/ConnectedAccessPointPreference.java
@@ -36,6 +36,7 @@
public ConnectedAccessPointPreference(AccessPoint accessPoint, Context context,
UserBadgeCache cache, @DrawableRes int iconResId, boolean forSavedNetworks) {
super(accessPoint, context, cache, iconResId, forSavedNetworks);
+ setWidgetLayoutResource(R.layout.preference_widget_gear_no_bg);
}
public void setOnGearClickListener(OnGearClickListener l) {
@@ -44,26 +45,6 @@
}
@Override
- protected int getSecondTargetResId() {
- return R.layout.preference_widget_gear;
- }
-
- @Override
- protected boolean shouldHideSecondTarget() {
- return mOnGearClickListener == null;
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
- final View gear = holder.findViewById(R.id.settings_button);
- if (gear != null) {
- gear.setOnClickListener(this);
- }
- setDividerVisibility(holder, View.VISIBLE);
- }
-
- @Override
public void onClick(View v) {
if (v.getId() == R.id.settings_button) {
if (mOnGearClickListener != null) {
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 22f8c43..69dc130 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -85,16 +85,12 @@
private static final String TAG = "WifiSettings";
- /* package */ static final int MENU_ID_WPS_PBC = Menu.FIRST;
- private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
private static final int MENU_ID_FORGET = Menu.FIRST + 7;
private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
private static final int MENU_ID_WRITE_NFC = Menu.FIRST + 9;
public static final int WIFI_DIALOG_ID = 1;
- /* package */ static final int WPS_PBC_DIALOG_ID = 2;
- private static final int WPS_PIN_DIALOG_ID = 3;
private static final int WRITE_NFC_DIALOG_ID = 6;
// Instance state keys
@@ -109,6 +105,10 @@
private static final String PREF_KEY_CONFIGURE_WIFI_SETTINGS = "configure_settings";
private static final String PREF_KEY_SAVED_NETWORKS = "saved_networks";
+ private static boolean isVerboseLoggingEnabled() {
+ return WifiTracker.sVerboseLogging || Log.isLoggable(TAG, Log.VERBOSE);
+ }
+
private final Runnable mUpdateAccessPointsRunnable = () -> {
updateAccessPointPreferences();
};
@@ -371,7 +371,7 @@
}
setProgressBarVisible(true);
mWifiTracker.forceUpdate();
- if (WifiTracker.sVerboseLogging) {
+ if (isVerboseLoggingEnabled()) {
Log.i(TAG, "WifiSettings force update APs: " + mWifiTracker.getAccessPoints());
}
getView().removeCallbacks(mUpdateAccessPointsRunnable);
@@ -460,24 +460,6 @@
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // If the user is not allowed to configure wifi, do not handle menu selections.
- if (mIsRestricted) {
- return false;
- }
-
- switch (item.getItemId()) {
- case MENU_ID_WPS_PBC:
- showDialog(WPS_PBC_DIALOG_ID);
- return true;
- case MENU_ID_WPS_PIN:
- showDialog(WPS_PIN_DIALOG_ID);
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
Preference preference = (Preference) view.getTag();
@@ -635,10 +617,6 @@
mSelectedAccessPoint = mDlgAccessPoint;
return mDialog;
- case WPS_PBC_DIALOG_ID:
- return new WpsDialog(getActivity(), WpsInfo.PBC);
- case WPS_PIN_DIALOG_ID:
- return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
case WRITE_NFC_DIALOG_ID:
if (mSelectedAccessPoint != null) {
mWifiToNfcDialog = new WriteWifiConfigToNfcDialog(
@@ -660,10 +638,6 @@
switch (dialogId) {
case WIFI_DIALOG_ID:
return MetricsEvent.DIALOG_WIFI_AP_EDIT;
- case WPS_PBC_DIALOG_ID:
- return MetricsEvent.DIALOG_WIFI_PBC;
- case WPS_PIN_DIALOG_ID:
- return MetricsEvent.DIALOG_WIFI_PIN;
case WRITE_NFC_DIALOG_ID:
return MetricsEvent.DIALOG_WIFI_WRITE_NFC;
default:
@@ -762,7 +736,7 @@
}
// AccessPoints are sorted by the WifiTracker
final List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
- if (WifiTracker.sVerboseLogging) {
+ if (isVerboseLoggingEnabled()) {
Log.i(TAG, "updateAccessPoints called for: " + accessPoints);
}
@@ -884,13 +858,14 @@
connectedAp);
// Launch details page on click.
- pref.setOnGearClickListener(l -> {
+ pref.setOnPreferenceClickListener(preference -> {
pref.getAccessPoint().saveWifiState(pref.getExtras());
SettingsActivity activity = (SettingsActivity) WifiSettings.this.getActivity();
activity.startPreferencePanel(this,
WifiNetworkDetailsFragment.class.getName(), pref.getExtras(),
-1 /* resId */, pref.getTitle(), null, 0 /* resultRequestCode */);
+ return true;
});
pref.refresh();
diff --git a/src/com/android/settings/wifi/WpsDialog.java b/src/com/android/settings/wifi/WpsDialog.java
deleted file mode 100644
index 440b72d..0000000
--- a/src/com/android/settings/wifi/WpsDialog.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.wifi;
-
-import android.app.AlertDialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.NetworkInfo;
-import android.net.NetworkInfo.DetailedState;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import android.net.wifi.WpsInfo;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.View;
-import android.widget.Button;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.android.settings.R;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-
-/**
- * Dialog to show WPS progress.
- */
-public class WpsDialog extends AlertDialog {
-
- private final static String TAG = "WpsDialog";
- private static final String DIALOG_STATE = "android:dialogState";
- private static final String DIALOG_MSG_STRING = "android:dialogMsg";
-
- private View mView;
- private TextView mTextView;
- private ProgressBar mTimeoutBar;
- private ProgressBar mProgressBar;
- private Button mButton;
- private Timer mTimer;
-
- private static final int WPS_TIMEOUT_S = 120;
-
- private WifiManager mWifiManager;
- private WifiManager.WpsCallback mWpsListener;
- private int mWpsSetup;
-
- private final IntentFilter mFilter;
- private BroadcastReceiver mReceiver;
-
- private Context mContext;
- private Handler mHandler = new Handler();
- private String mMsgString = "";
-
- private enum DialogState {
- WPS_INIT,
- WPS_START,
- WPS_COMPLETE,
- CONNECTED, //WPS + IP config is done
- WPS_FAILED
- }
- DialogState mDialogState = DialogState.WPS_INIT;
-
- public WpsDialog(Context context, int wpsSetup) {
- super(context);
- mContext = context;
- mWpsSetup = wpsSetup;
-
- class WpsListener extends WifiManager.WpsCallback {
-
- public void onStarted(String pin) {
- if (pin != null) {
- updateDialog(DialogState.WPS_START, String.format(
- mContext.getString(R.string.wifi_wps_onstart_pin), pin));
- } else {
- updateDialog(DialogState.WPS_START, mContext.getString(
- R.string.wifi_wps_onstart_pbc));
- }
- }
-
- public void onSucceeded() {
- updateDialog(DialogState.WPS_COMPLETE,
- mContext.getString(R.string.wifi_wps_complete));
- }
-
- public void onFailed(int reason) {
- String msg;
- switch (reason) {
- case WifiManager.WPS_OVERLAP_ERROR:
- msg = mContext.getString(R.string.wifi_wps_failed_overlap);
- break;
- case WifiManager.WPS_WEP_PROHIBITED:
- msg = mContext.getString(R.string.wifi_wps_failed_wep);
- break;
- case WifiManager.WPS_TKIP_ONLY_PROHIBITED:
- msg = mContext.getString(R.string.wifi_wps_failed_tkip);
- break;
- case WifiManager.IN_PROGRESS:
- msg = mContext.getString(R.string.wifi_wps_in_progress);
- break;
- default:
- msg = mContext.getString(R.string.wifi_wps_failed_generic);
- break;
- }
- updateDialog(DialogState.WPS_FAILED, msg);
- }
- }
-
- mWpsListener = new WpsListener();
-
-
- mFilter = new IntentFilter();
- mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
- mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
- mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- handleEvent(context, intent);
- }
- };
- setCanceledOnTouchOutside(false);
- }
-
- @Override
- public Bundle onSaveInstanceState () {
- Bundle bundle = super.onSaveInstanceState();
- bundle.putString(DIALOG_STATE, mDialogState.toString());
- bundle.putString(DIALOG_MSG_STRING, mMsgString.toString());
- return bundle;
- }
-
- @Override
- public void onRestoreInstanceState(Bundle savedInstanceState) {
- if (savedInstanceState != null) {
- super.onRestoreInstanceState(savedInstanceState);
- DialogState dialogState = mDialogState.valueOf(savedInstanceState.getString(DIALOG_STATE));
- String msg = savedInstanceState.getString(DIALOG_MSG_STRING);
- updateDialog(dialogState, msg);
- if (dialogState == DialogState.WPS_START) {
- startWps();
- }
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- mView = getLayoutInflater().inflate(R.layout.wifi_wps_dialog, null);
-
- mTextView = (TextView) mView.findViewById(R.id.wps_dialog_txt);
- mTextView.setText(R.string.wifi_wps_setup_msg);
-
- mTimeoutBar = ((ProgressBar) mView.findViewById(R.id.wps_timeout_bar));
- mTimeoutBar.setMax(WPS_TIMEOUT_S);
- mTimeoutBar.setProgress(0);
-
- mProgressBar = ((ProgressBar) mView.findViewById(R.id.wps_progress_bar));
- mProgressBar.setVisibility(View.GONE);
-
- mButton = ((Button) mView.findViewById(R.id.wps_dialog_btn));
- mButton.setText(R.string.wifi_cancel);
- mButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- dismiss();
- }
- });
-
- mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
-
- setView(mView);
- if (savedInstanceState == null) {
- startWps();
- }
- super.onCreate(savedInstanceState);
- }
-
- @Override
- protected void onStart() {
- /*
- * increment timeout bar per second.
- */
- mTimer = new Timer(false);
- mTimer.schedule(new TimerTask() {
- @Override
- public void run() {
- mHandler.post(new Runnable() {
-
- @Override
- public void run() {
- mTimeoutBar.incrementProgressBy(1);
- }
- });
- }
- }, 1000, 1000);
-
- mContext.registerReceiver(mReceiver, mFilter);
-
- }
-
- @Override
- protected void onStop() {
- if (mDialogState != DialogState.WPS_COMPLETE) {
- mWifiManager.cancelWps(null);
- }
-
- if (mReceiver != null) {
- mContext.unregisterReceiver(mReceiver);
- mReceiver = null;
- }
-
- if (mTimer != null) {
- mTimer.cancel();
- }
- }
-
- private void updateDialog(final DialogState state, final String msg) {
- if (mDialogState.ordinal() >= state.ordinal()) {
- //ignore.
- return;
- }
- mDialogState = state;
- mMsgString = msg;
-
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- switch(state) {
- case WPS_COMPLETE:
- mTimeoutBar.setVisibility(View.GONE);
- mProgressBar.setVisibility(View.VISIBLE);
- break;
- case CONNECTED:
- case WPS_FAILED:
- mButton.setText(mContext.getString(R.string.dlg_ok));
- mTimeoutBar.setVisibility(View.GONE);
- mProgressBar.setVisibility(View.GONE);
- if (mReceiver != null) {
- mContext.unregisterReceiver(mReceiver);
- mReceiver = null;
- }
- break;
- }
- mTextView.setText(msg);
- }
- });
- }
-
- private void handleEvent(Context context, Intent intent) {
- String action = intent.getAction();
- if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
- final int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
- WifiManager.WIFI_STATE_UNKNOWN);
- if (state == WifiManager.WIFI_STATE_DISABLED) {
- if (mTimer != null) {
- mTimer.cancel();
- mTimer = null;
- }
- String msg = mContext.getString(R.string.wifi_wps_failed_wifi_disconnected);
- updateDialog(DialogState.WPS_FAILED, msg);
- }
- } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
- NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
- WifiManager.EXTRA_NETWORK_INFO);
- final NetworkInfo.DetailedState state = info.getDetailedState();
- if (state == DetailedState.CONNECTED &&
- mDialogState == DialogState.WPS_COMPLETE) {
- WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
- if (wifiInfo != null) {
- String msg = String.format(mContext.getString(
- R.string.wifi_wps_connected), wifiInfo.getSSID());
- updateDialog(DialogState.CONNECTED, msg);
- }
- }
- }
- }
-
- private void startWps() {
- WpsInfo wpsConfig = new WpsInfo();
- wpsConfig.setup = mWpsSetup;
- mWifiManager.startWps(wpsConfig, mWpsListener);
- }
-}
diff --git a/src/com/android/settings/wifi/WpsPreferenceController.java b/src/com/android/settings/wifi/WpsPreferenceController.java
deleted file mode 100644
index f636593..0000000
--- a/src/com/android/settings/wifi/WpsPreferenceController.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.wifi;
-
-import android.app.Dialog;
-import android.app.FragmentManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.wifi.WifiManager;
-import android.net.wifi.WpsInfo;
-import android.os.Bundle;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
-
-/**
- * {@link PreferenceControllerMixin} that shows Dialog for WPS progress. Disabled when Wi-Fi is off.
- */
-public class WpsPreferenceController extends AbstractPreferenceController
- implements PreferenceControllerMixin, LifecycleObserver, OnPause, OnResume {
-
- private static final String KEY_WPS_PUSH = "wps_push_button";
- private static final String KEY_WPS_PIN = "wps_pin_entry";
-
- private final WifiManager mWifiManager;
- private final FragmentManager mFragmentManager;
- @VisibleForTesting
- final BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- togglePreferences();
- }
- };
- private final IntentFilter mFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
-
- private Preference mWpsPushPref;
- private Preference mWpsPinPref;
-
- public WpsPreferenceController(
- Context context,
- Lifecycle lifecycle,
- WifiManager wifiManager,
- FragmentManager fragmentManager) {
- super(context);
- mWifiManager = wifiManager;
- mFragmentManager = fragmentManager;
- lifecycle.addObserver(this);
- }
-
- @Override
- public boolean isAvailable() {
- // Always show preference.
- return true;
- }
-
- @Override
- public String getPreferenceKey() {
- // Returns null because this controller contains more than 1 preference.
- return null;
- }
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mWpsPushPref = screen.findPreference(KEY_WPS_PUSH);
- mWpsPinPref = screen.findPreference(KEY_WPS_PIN);
- if (mWpsPushPref == null || mWpsPinPref == null) {
- return;
- }
- // WpsDialog: Create the dialog like WifiSettings does.
- mWpsPushPref.setOnPreferenceClickListener((arg) -> {
- WpsFragment wpsFragment = new WpsFragment(WpsInfo.PBC);
- wpsFragment.show(mFragmentManager, KEY_WPS_PUSH);
- return true;
- }
- );
-
- // WpsDialog: Create the dialog like WifiSettings does.
- mWpsPinPref.setOnPreferenceClickListener((arg) -> {
- WpsFragment wpsFragment = new WpsFragment(WpsInfo.DISPLAY);
- wpsFragment.show(mFragmentManager, KEY_WPS_PIN);
- return true;
- });
- togglePreferences();
- }
-
- @Override
- public void onResume() {
- mContext.registerReceiver(mReceiver, mFilter);
- }
-
- @Override
- public void onPause() {
- mContext.unregisterReceiver(mReceiver);
- }
-
- private void togglePreferences() {
- if (mWpsPushPref != null && mWpsPinPref != null) {
- boolean enabled = mWifiManager.isWifiEnabled();
- mWpsPushPref.setEnabled(enabled);
- mWpsPinPref.setEnabled(enabled);
- }
- }
-
- /**
- * Fragment for Dialog to show WPS progress.
- */
- public static class WpsFragment extends InstrumentedDialogFragment {
- private static int mWpsSetup;
-
- // Public default constructor is required for rotation.
- public WpsFragment() {
- super();
- }
-
- public WpsFragment(int wpsSetup) {
- super();
- mWpsSetup = wpsSetup;
- }
-
- @Override
- public int getMetricsCategory() {
- return MetricsEvent.DIALOG_WPS_SETUP;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- return new WpsDialog(getActivity(), mWpsSetup);
- }
- }
-}
diff --git a/src/com/android/settings/wrapper/WallpaperManagerWrapper.java b/src/com/android/settings/wrapper/WallpaperManagerWrapper.java
index 89015e5..eabc5bb 100644
--- a/src/com/android/settings/wrapper/WallpaperManagerWrapper.java
+++ b/src/com/android/settings/wrapper/WallpaperManagerWrapper.java
@@ -22,12 +22,23 @@
public class WallpaperManagerWrapper {
private final WallpaperManager mWallpaperManager;
+ private final boolean mWallpaperServiceEnabled;
public WallpaperManagerWrapper(Context context) {
- mWallpaperManager = (WallpaperManager) context.getSystemService(Context.WALLPAPER_SERVICE);
+ mWallpaperServiceEnabled = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_enableWallpaperService);
+ mWallpaperManager = mWallpaperServiceEnabled ? (WallpaperManager) context.getSystemService(
+ Context.WALLPAPER_SERVICE) : null;
+ }
+
+ public boolean isWallpaperServiceEnabled() {
+ return mWallpaperServiceEnabled;
}
public int getWallpaperId(int which) {
+ if (!mWallpaperServiceEnabled) {
+ throw new RuntimeException("This device does not have wallpaper service enabled.");
+ }
return mWallpaperManager.getWallpaperId(which);
}
}
diff --git a/tests/robotests/assets/grandfather_not_implementing_indexable b/tests/robotests/assets/grandfather_not_implementing_indexable
index ece35fb..5a3c044 100644
--- a/tests/robotests/assets/grandfather_not_implementing_indexable
+++ b/tests/robotests/assets/grandfather_not_implementing_indexable
@@ -15,7 +15,6 @@
com.android.settings.inputmethod.UserDictionaryList
com.android.settings.datausage.DataSaverSummary
com.android.settings.datausage.AppDataUsage
-com.android.settings.datausage.DataPlanUsageSummary
com.android.settings.accessibility.FontSizePreferenceFragmentForSetupWizard
com.android.settings.applications.ManageDomainUrls
com.android.settings.applications.appinfo.WriteSettingsDetails
@@ -72,4 +71,4 @@
com.android.settings.ApnEditor
com.android.settings.UserCredentialsSettings
com.android.settings.TestingSettings
-com.android.settings.applications.DirectoryAccessDetails
\ No newline at end of file
+com.android.settings.applications.DirectoryAccessDetails
diff --git a/tests/robotests/assets/grandfather_slice_controller_not_in_xml b/tests/robotests/assets/grandfather_slice_controller_not_in_xml
new file mode 100644
index 0000000..f11027e
--- /dev/null
+++ b/tests/robotests/assets/grandfather_slice_controller_not_in_xml
@@ -0,0 +1 @@
+com.android.settings.testutils.FakeToggleController
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/internal/app/ColorDisplayController.java b/tests/robotests/src/com/android/internal/app/ColorDisplayController.java
index 74e7d8a..e31ba51 100644
--- a/tests/robotests/src/com/android/internal/app/ColorDisplayController.java
+++ b/tests/robotests/src/com/android/internal/app/ColorDisplayController.java
@@ -16,8 +16,8 @@
package com.android.internal.app;
/**
- * Fake controller to make robolectric test compile. Should be removed when Robolectric supports
- * API 25.
+ * Fake controller to make robolectric test compile. This is necessary since
+ * ColorDisplayController is not part of Android's API.
*/
public class ColorDisplayController {
diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
index 509ecda..25abd4d 100644
--- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
@@ -16,7 +16,6 @@
package com.android.settings;
-import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.doReturn;
@@ -28,17 +27,14 @@
import android.app.ActivityManager;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
-import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
-import android.os.Bundle;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
@@ -48,9 +44,6 @@
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class SettingsActivityTest {
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Context mContext;
-
@Mock
private FragmentManager mFragmentManager;
@Mock
@@ -84,13 +77,4 @@
verify(mTaskDescription).setIcon(nullable(Bitmap.class));
}
-
- @Test
- public void testSaveState_EnabledHomeSaved() {
- mActivity.mDisplayHomeAsUpEnabled = true;
- Bundle bundle = new Bundle();
- mActivity.saveState(bundle);
-
- assertThat((boolean) bundle.get(SettingsActivity.SAVE_KEY_SHOW_HOME_AS_UP)).isTrue();
- }
}
diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java
index fb571bb..d1c4a55 100644
--- a/tests/robotests/src/com/android/settings/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/UtilsTest.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.android.settings;
import static com.google.common.truth.Truth.assertThat;
@@ -25,9 +41,7 @@
import android.os.storage.DiskInfo;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
-import android.text.SpannableStringBuilder;
import android.text.format.DateUtils;
-import android.text.style.TtsSpan;
import android.util.IconDrawableFactory;
import android.widget.EditText;
import android.widget.TextView;
@@ -35,6 +49,7 @@
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
+import com.android.settingslib.utils.StringUtil;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -110,175 +125,6 @@
}
@Test
- public void testFormatElapsedTime_WithSeconds_ShowSeconds() {
- final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "5m 30s";
-
- assertThat(Utils.formatElapsedTime(mContext, testMillis, true).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatElapsedTime_NoSeconds_DoNotShowSeconds() {
- final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "6m";
-
- assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatElapsedTime_TimeMoreThanOneDay_ShowCorrectly() {
- final double testMillis = 2 * DateUtils.DAY_IN_MILLIS
- + 4 * DateUtils.HOUR_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS;
- final String expectedTime = "2d 4h 15m";
-
- assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatElapsedTime_ZeroFieldsInTheMiddleDontShow() {
- final double testMillis = 2 * DateUtils.DAY_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS;
- final String expectedTime = "2d 15m";
-
- assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatElapsedTime_FormatZero_WithSeconds() {
- final double testMillis = 0;
- final String expectedTime = "0s";
-
- assertThat(Utils.formatElapsedTime(mContext, testMillis, true).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatElapsedTime_FormatZero_NoSeconds() {
- final double testMillis = 0;
- final String expectedTime = "0m";
-
- assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatElapsedTime_onlyContainsMinute_hasTtsSpan() {
- final double testMillis = 15 * DateUtils.MINUTE_IN_MILLIS;
-
- final CharSequence charSequence = Utils.formatElapsedTime(mContext, testMillis, false);
- assertThat(charSequence).isInstanceOf(SpannableStringBuilder.class);
-
- final SpannableStringBuilder expectedString = (SpannableStringBuilder) charSequence;
- final TtsSpan[] ttsSpans = expectedString.getSpans(0, expectedString.length(),
- TtsSpan.class);
-
- assertThat(ttsSpans).asList().hasSize(1);
- assertThat(ttsSpans[0].getType()).isEqualTo(TtsSpan.TYPE_MEASURE);
- }
-
- @Test
- public void testFormatRelativeTime_WithSeconds_ShowSeconds() {
- final double testMillis = 40 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "40 sec. ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatRelativeTime_NoSeconds_DoNotShowSeconds() {
- final double testMillis = 40 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "1 min. ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatRelativeTime_LessThanTwoMinutes_withSeconds() {
- final double testMillis = 119 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "119 sec. ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatRelativeTime_LessThanTwoMinutes_NoSeconds() {
- final double testMillis = 119 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "2 min. ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatRelativeTime_TwoMinutes_withSeconds() {
- final double testMillis = 2 * DateUtils.MINUTE_IN_MILLIS;
- final String expectedTime = "2 min. ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatRelativeTime_LessThanTwoHours_withSeconds() {
- final double testMillis = 119 * DateUtils.MINUTE_IN_MILLIS;
- final String expectedTime = "119 min. ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatRelativeTime_TwoHours_withSeconds() {
- final double testMillis = 2 * DateUtils.HOUR_IN_MILLIS;
- final String expectedTime = "2 hr. ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatRelativeTime_LessThanTwoDays_withSeconds() {
- final double testMillis = 47 * DateUtils.HOUR_IN_MILLIS;
- final String expectedTime = "47 hr. ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatRelativeTime_TwoDays_withSeconds() {
- final double testMillis = 2 * DateUtils.DAY_IN_MILLIS;
- final String expectedTime = "2 days ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatRelativeTime_FormatZero_WithSeconds() {
- final double testMillis = 0;
- final String expectedTime = "0 sec. ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
- public void testFormatRelativeTime_FormatZero_NoSeconds() {
- final double testMillis = 0;
- final String expectedTime = "0 min. ago";
-
- assertThat(Utils.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
- expectedTime);
- }
-
- @Test
public void testInitializeVolumeDoesntBreakOnNullVolume() {
VolumeInfo info = new VolumeInfo("id", 0, new DiskInfo("id", 0), "");
StorageManager storageManager = mock(StorageManager.class, RETURNS_DEEP_STUBS);
diff --git a/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceFragmentTest.java
new file mode 100644
index 0000000..f6a5a82
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceFragmentTest.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_OFF;
+import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_LOW;
+import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_MEDIUM;
+import static com.android.settings.accessibility.VibrationPreferenceFragment.KEY_INTENSITY_HIGH;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.UserManager;
+import android.os.Vibrator;
+import android.provider.Settings;
+
+import com.android.settings.TestConfig;
+import com.android.settings.accessibility.VibrationPreferenceFragment.VibrationIntensityCandidateInfo;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.widget.RadioButtonPickerFragment.CandidateInfo;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class VibrationPreferenceFragmentTest {
+ public static final Map<Integer, String> INTENSITY_TO_KEY = new HashMap<>();
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Activity mActivity;
+ @Mock
+ private UserManager mUserManager;
+
+ private Context mContext;
+ private TestVibrationPreferenceFragment mFragment;
+
+ static {
+ INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_OFF, KEY_INTENSITY_OFF);
+ INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_LOW, KEY_INTENSITY_LOW);
+ INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_MEDIUM, KEY_INTENSITY_MEDIUM);
+ INTENSITY_TO_KEY.put(Vibrator.VIBRATION_INTENSITY_HIGH, KEY_INTENSITY_HIGH);
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ FakeFeatureFactory.setupForTest();
+
+ mContext = RuntimeEnvironment.application;
+
+ mFragment = spy(new TestVibrationPreferenceFragment());
+ doReturn(mUserManager).when(mActivity).getSystemService(Context.USER_SERVICE);
+ doReturn(mContext).when(mFragment).getContext();
+ mFragment.onAttach(mActivity);
+ }
+
+ @Test
+ public void changeIntensitySetting_shouldResultInCorrespondingKey() {
+ for (Map.Entry<Integer, String> entry : INTENSITY_TO_KEY.entrySet()) {
+ Settings.System.putInt(mContext.getContentResolver(),
+ Settings.System.HAPTIC_FEEDBACK_INTENSITY, entry.getKey());
+ assertThat(mFragment.getDefaultKey()).isEqualTo(entry.getValue());
+ }
+ }
+
+ @Test
+ public void initialDefaultKey_shouldBeMedium() {
+ assertThat(mFragment.getDefaultKey()).isEqualTo(KEY_INTENSITY_MEDIUM);
+ }
+
+ @Test
+ public void candidates_shouldBeSortedByIntensity() {
+ final List<? extends CandidateInfo> candidates = mFragment.getCandidates();
+ assertThat(candidates.size()).isEqualTo(INTENSITY_TO_KEY.size());
+ VibrationIntensityCandidateInfo prevCandidate =
+ (VibrationIntensityCandidateInfo) candidates.get(0);
+ for (int i = 1; i < candidates.size(); i++) {
+ VibrationIntensityCandidateInfo candidate =
+ (VibrationIntensityCandidateInfo) candidates.get(i);
+ assertThat(candidate.getIntensity()).isLessThan(prevCandidate.getIntensity());
+ }
+ }
+
+ private class TestVibrationPreferenceFragment extends VibrationPreferenceFragment {
+ @Override
+ protected int getPreferenceScreenResId() {
+ return 0;
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return 0;
+ }
+
+ /**
+ * Get the setting string of the vibration intensity setting this preference is dealing with.
+ */
+ @Override
+ protected String getVibrationIntensitySetting() {
+ return Settings.System.HAPTIC_FEEDBACK_INTENSITY;
+ }
+
+ @Override
+ protected int getDefaultVibrationIntensity() {
+ return Vibrator.VIBRATION_INTENSITY_MEDIUM;
+ }
+ }
+}
+
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java
index fd136c1..532522c 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java
@@ -37,7 +37,9 @@
import com.android.settings.applications.ProcStatsData;
import com.android.settings.applications.ProcessStatsDetail;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowUserManager;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -48,7 +50,9 @@
import org.robolectric.util.ReflectionHelpers;
@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
+ ShadowUserManager.class
+})
public class AppMemoryPreferenceControllerTest {
@Mock
@@ -67,6 +71,7 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
+ ShadowUserManager.getShadow().setIsAdminUser(true);
mController =
spy(new AppMemoryPreferenceController(mContext, mFragment, null /* lifecycle */));
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
@@ -75,6 +80,11 @@
when(mFragment.getActivity()).thenReturn(mActivity);
}
+ @After
+ public void tearDown() {
+ ShadowUserManager.getShadow().reset();
+ }
+
@Test
public void getAvailabilityStatus_developmentSettingsEnabled_shouldReturnAvailable() {
Settings.Global.putInt(mContext.getContentResolver(),
diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
index 9de0c6a..4e5428c 100644
--- a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
+++ b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
@@ -16,6 +16,14 @@
package com.android.settings.backup;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
import android.app.backup.BackupManager;
import android.app.backup.IBackupManager;
import android.content.ComponentName;
@@ -26,6 +34,10 @@
import android.os.IBinder;
import android.os.RemoteException;
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -36,19 +48,6 @@
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-import com.android.settingslib.drawer.SettingsDrawerActivity;
-
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
shadows = {BackupSettingsHelperTest.ShadowBackupManagerStub.class})
@@ -263,8 +262,6 @@
assertThat(backupIntent.getComponent().getClassName()).isEqualTo(
DEFAULT_SETTINGS_CLASSNAME);
- assertThat(backupIntent.getExtras().getBoolean(
- SettingsDrawerActivity.EXTRA_SHOW_MENU)).isTrue();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
index d25969e..cc25b5d 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
@@ -35,6 +35,7 @@
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.WindowManager;
import android.widget.TextView;
import com.android.settings.R;
@@ -77,6 +78,8 @@
private Condition mCondition;
@Mock
private Resources mResources;
+ @Mock
+ private WindowManager mWindowManager;
private FakeFeatureFactory mFactory;
private DashboardAdapter mDashboardAdapter;
private List<Condition> mConditionList;
@@ -87,6 +90,7 @@
mFactory = FakeFeatureFactory.setupForTest();
when(mFactory.dashboardFeatureProvider.shouldTintIcon()).thenReturn(true);
+ when(mContext.getSystemService(Context.WINDOW_SERVICE)).thenReturn(mWindowManager);
when(mContext.getResources()).thenReturn(mResources);
when(mResources.getQuantityString(any(int.class), any(int.class), any()))
.thenReturn("");
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
index fc773a7..bac02d3 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
@@ -28,12 +28,15 @@
import android.app.PendingIntent;
import android.content.Context;
+import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.service.settings.suggestions.Suggestion;
+import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
@@ -67,17 +70,33 @@
private SettingsActivity mActivity;
@Mock
private SuggestionControllerMixin mSuggestionControllerMixin;
+ @Mock
+ private Resources mResources;
+ @Mock
+ private WindowManager mWindowManager;
+
private FakeFeatureFactory mFeatureFactory;
private Context mContext;
private SuggestionAdapter mSuggestionAdapter;
private DashboardAdapter.DashboardItemHolder mSuggestionHolder;
private List<Suggestion> mOneSuggestion;
private List<Suggestion> mTwoSuggestions;
+ private SuggestionAdapter.CardConfig mConfig;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
+ when(mActivity.getSystemService(Context.WINDOW_SERVICE)).thenReturn(mWindowManager);
+ when(mActivity.getResources()).thenReturn(mResources);
+ when(mResources.getDimensionPixelOffset(R.dimen.suggestion_card_inner_margin))
+ .thenReturn(10);
+ when(mResources.getDimensionPixelOffset(R.dimen.suggestion_card_outer_margin))
+ .thenReturn(20);
+ when(mResources.getDimensionPixelOffset(R.dimen.suggestion_card_width_multiple_cards))
+ .thenReturn(120);
+ mConfig = spy(SuggestionAdapter.CardConfig.get(mActivity));
+
mFeatureFactory = FakeFeatureFactory.setupForTest();
final Suggestion suggestion1 = new Suggestion.Builder("id1")
@@ -275,6 +294,44 @@
verify(drawable).setTint(colorAccent);
}
+ @Test
+ public void setCardLayout_oneCard_shouldSetCardWidthToMatchParent() {
+ final List<Suggestion> suggestions = makeSuggestions("pkg1");
+ setupSuggestions(mContext, suggestions);
+
+ mConfig.setCardLayout(mSuggestionHolder, 1, 0);
+
+ assertThat(mSuggestionHolder.itemView.getLayoutParams().width)
+ .isEqualTo(LinearLayout.LayoutParams.MATCH_PARENT);
+ }
+
+ @Test
+ public void setCardLayout_twoCards_shouldSetCardWidthToHalfScreenMinusPadding() {
+ final List<Suggestion> suggestions = makeSuggestions("pkg1");
+ setupSuggestions(mContext, suggestions);
+ doReturn(200).when(mConfig).getScreenWidth();
+
+ mConfig.setCardLayout(mSuggestionHolder, 2, 0);
+
+ /*
+ * card width = (screen width - left margin - inner margin - right margin) / 2
+ * = (200 - 20 - 10 - 20) / 2
+ * = 75
+ */
+ assertThat(mSuggestionHolder.itemView.getLayoutParams().width).isEqualTo(75);
+ }
+
+
+ @Test
+ public void setCardLayout_multipleCards_shouldSetCardWidthFromResource() {
+ final List<Suggestion> suggestions = makeSuggestions("pkg1");
+ setupSuggestions(mContext, suggestions);
+
+ mConfig.setCardLayout(mSuggestionHolder, 3, 0);
+
+ assertThat(mSuggestionHolder.itemView.getLayoutParams().width).isEqualTo(120);
+ }
+
private void setupSuggestions(Context context, List<Suggestion> suggestions) {
mSuggestionAdapter = new SuggestionAdapter(context, mSuggestionControllerMixin,
null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
diff --git a/tests/robotests/src/com/android/settings/datausage/DataPlanSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataPlanSummaryPreferenceTest.java
deleted file mode 100644
index 9ddce53..0000000
--- a/tests/robotests/src/com/android/settings/datausage/DataPlanSummaryPreferenceTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-package com.android.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.SettingsShadowResources;
-import com.android.settings.widget.DonutView;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
- shadows = {
- SettingsShadowResources.class,
- SettingsShadowResources.SettingsShadowTheme.class
- }
-)
-public final class DataPlanSummaryPreferenceTest {
-
- private static final String TEST_PLAN_USAGE = "Test plan usage";
- private static final String TEST_PLAN_NAME = "Test plan name";
- private static final String TEST_PLAN_DESCRIPTION = "Test plan description";
- private static int sPlanUsageTextColor;
- private static int sMeterBackgroundColor;
- private static int sMeterConsumedColor;
-
- @BeforeClass
- public static void beforeClass() {
- sPlanUsageTextColor = Color.parseColor("#FF5C94F1");
- sMeterBackgroundColor = Color.parseColor("#FFDBDCDC");
- sMeterConsumedColor = Color.parseColor("#FF5C94F1");
- }
-
- private DataPlanSummaryPreference mPreference;
- private PreferenceViewHolder mHolder;
-
- @Before
- public void setUp() {
- SettingsShadowResources.overrideResource(
- com.android.internal.R.string.config_headlineFontFamily, "");
- Context context = RuntimeEnvironment.application;
- mPreference = new DataPlanSummaryPreference(context);
- LayoutInflater inflater = LayoutInflater.from(context);
- View view = inflater.inflate(mPreference.getLayoutResource(),
- new LinearLayout(context), false);
- mHolder = PreferenceViewHolder.createInstanceForTests(view);
- }
-
- @After
- public void tearDown() {
- SettingsShadowResources.reset();
- }
-
- @Test
- public void shouldRender_withoutData() {
- mPreference.onBindViewHolder(mHolder);
-
- TextView planUsageTextView = (TextView) mHolder.findViewById(android.R.id.title);
- assertThat(planUsageTextView.getText().toString()).isEmpty();
- TextView planNameTextView = (TextView) mHolder.findViewById(android.R.id.text1);
- assertThat(planNameTextView.getText().toString()).isEmpty();
- TextView planDescriptionTextView = (TextView) mHolder.findViewById(android.R.id.text2);
- assertThat(planDescriptionTextView.getText().toString()).isEmpty();
- }
-
- @Test
- public void shouldRender_withData() {
- mPreference.setTitle(TEST_PLAN_USAGE);
- mPreference.setUsageTextColor(sPlanUsageTextColor);
- mPreference.setName(TEST_PLAN_NAME);
- mPreference.setDescription(TEST_PLAN_DESCRIPTION);
- mPreference.setPercentageUsage(0.25D);
- mPreference.setMeterBackgroundColor(sMeterBackgroundColor);
- mPreference.setMeterConsumedColor(sMeterConsumedColor);
-
- mPreference.onBindViewHolder(mHolder);
-
- TextView planUsageTextView = (TextView) mHolder.findViewById(android.R.id.title);
- assertThat(planUsageTextView.getTextColors().getDefaultColor())
- .isEqualTo(sPlanUsageTextColor);
- assertThat(planUsageTextView.getText()).isEqualTo(TEST_PLAN_USAGE);
-
- TextView planNameTextView = (TextView) mHolder.findViewById(android.R.id.text1);
- assertThat(planNameTextView.getText()).isEqualTo(TEST_PLAN_NAME);
-
- TextView planDescriptionTextView = (TextView) mHolder.findViewById(android.R.id.text2);
- assertThat(planDescriptionTextView.getText()).isEqualTo(TEST_PLAN_DESCRIPTION);
-
- DonutView donutView = (DonutView) mHolder.findViewById(R.id.donut);
- assertThat(donutView.getMeterBackgroundColor()).isEqualTo(sMeterBackgroundColor);
- assertThat(donutView.getMeterConsumedColor()).isEqualTo(sMeterConsumedColor);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/datausage/DataPlanUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataPlanUsageSummaryTest.java
deleted file mode 100644
index 748c317..0000000
--- a/tests/robotests/src/com/android/settings/datausage/DataPlanUsageSummaryTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.NetworkPolicy;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiManager;
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.NetworkPolicyEditor;
-import java.util.ArrayList;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class DataPlanUsageSummaryTest {
- @Mock
- private ConnectivityManager mManager;
-
- private Context mContext;
- private DataPlanUsageSummary mDataUsageSummary;
- private NetworkPolicyEditor mPolicyEditor;
- private WifiConfiguration mWifiConfiguration;
- private NetworkPolicy mNetworkPolicy;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- ShadowApplication shadowContext = ShadowApplication.getInstance();
- shadowContext.setSystemService(Context.CONNECTIVITY_SERVICE, mManager);
- mContext = shadowContext.getApplicationContext();
- when(mManager.isNetworkSupported(anyInt())).thenReturn(true);
- }
-
- @Test
- public void testUpdateNetworkRestrictionSummary_shouldSetSummary() {
- mDataUsageSummary = spy(new DataPlanUsageSummary());
- NetworkRestrictionsPreference preference = mock(NetworkRestrictionsPreference.class);
- mPolicyEditor = mock(NetworkPolicyEditor.class);
- WifiManager wifiManager = mock(WifiManager.class);
- ReflectionHelpers.setField(mDataUsageSummary, "mPolicyEditor", mPolicyEditor);
- ReflectionHelpers.setField(mDataUsageSummary, "mWifiManager", wifiManager);
- when(wifiManager.getConfiguredNetworks()).thenReturn(new ArrayList<>());
- doReturn(mContext.getResources()).when(mDataUsageSummary).getResources();
-
- mDataUsageSummary.updateNetworkRestrictionSummary(preference);
-
- verify(preference).setSummary(mContext.getResources().getQuantityString(
- R.plurals.network_restrictions_summary, 0, 0));
- }
-
- @Test
- public void testIsMetered_noSsid_shouldReturnFalse() {
- initTest();
-
- assertThat(mDataUsageSummary.isMetered(mWifiConfiguration)).isFalse();
- }
-
- @Test
- public void testIsMetered_noNetworkPolicy_shouldReturnFalse() {
- initTest();
- mWifiConfiguration.SSID = "network1";
- doReturn(null).when(mPolicyEditor).getPolicyMaybeUnquoted(any());
-
- assertThat(mDataUsageSummary.isMetered(mWifiConfiguration)).isFalse();
- }
-
- @Test
- public void testIsMetered_policyHasLimit_shouldReturnTrue() {
- initTest();
- mWifiConfiguration.SSID = "network1";
- mNetworkPolicy = mock(NetworkPolicy.class);
- mNetworkPolicy.limitBytes = 100;
- doReturn(mNetworkPolicy).when(mPolicyEditor).getPolicyMaybeUnquoted(any());
-
- assertThat(mDataUsageSummary.isMetered(mWifiConfiguration)).isTrue();
- }
-
- @Test
- public void testIsMetered_noPolicyLimit_shouldReturnMeteredValue() {
- initTest();
- mWifiConfiguration.SSID = "network1";
- mNetworkPolicy = mock(NetworkPolicy.class);
- mNetworkPolicy.limitBytes = NetworkPolicy.LIMIT_DISABLED;
- doReturn(mNetworkPolicy).when(mPolicyEditor).getPolicyMaybeUnquoted(any());
-
- mNetworkPolicy.metered = true;
- assertThat(mDataUsageSummary.isMetered(mWifiConfiguration)).isTrue();
-
- mNetworkPolicy.metered = false;
- assertThat(mDataUsageSummary.isMetered(mWifiConfiguration)).isFalse();
- }
-
- private void initTest() {
- mDataUsageSummary = new DataPlanUsageSummary();
- mPolicyEditor = mock(NetworkPolicyEditor.class);
- ReflectionHelpers.setField(mDataUsageSummary, "mPolicyEditor", mPolicyEditor);
- mWifiConfiguration = mock(WifiConfiguration.class);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/datausage/DataPlansSyncTimePreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataPlansSyncTimePreferenceTest.java
deleted file mode 100644
index ba2d5f1..0000000
--- a/tests/robotests/src/com/android/settings/datausage/DataPlansSyncTimePreferenceTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public final class DataPlansSyncTimePreferenceTest {
- private static final String SYNC_TIME = "Today 12:24pm";
-
- private Preference mPreference;
- private PreferenceViewHolder mHolder;
-
- @Before
- public void setUp() {
- Context context = RuntimeEnvironment.application;
- mPreference = new Preference(context);
- mPreference.setLayoutResource(R.layout.data_plans_sync_time_preference);
-
- LayoutInflater inflater = LayoutInflater.from(context);
- View view = inflater.inflate(mPreference.getLayoutResource(),
- new LinearLayout(context), false);
- mHolder = PreferenceViewHolder.createInstanceForTests(view);
- }
-
- @Test
- public void shouldRender_withData() {
- mPreference.setTitle(SYNC_TIME);
-
- mPreference.onBindViewHolder(mHolder);
-
- TextView syncTimeTextView = (TextView) mHolder.findViewById(android.R.id.title);
- assertThat(syncTimeTextView.getText()).isEqualTo(SYNC_TIME);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryLegacyTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryLegacyTest.java
new file mode 100644
index 0000000..ad1defb
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryLegacyTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.text.format.Formatter;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settingslib.NetworkPolicyEditor;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.ArrayList;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DataUsageSummaryLegacyTest {
+ @Mock
+ private ConnectivityManager mManager;
+ private Context mContext;
+
+ /**
+ * This set up is contrived to get a passing test so that the build doesn't block without tests.
+ * These tests should be updated as code gets refactored to improve testability.
+ */
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ ShadowApplication shadowContext = ShadowApplication.getInstance();
+ shadowContext.setSystemService(Context.CONNECTIVITY_SERVICE, mManager);
+ mContext = shadowContext.getApplicationContext();
+ when(mManager.isNetworkSupported(anyInt())).thenReturn(true);
+ }
+
+ @Test
+ @Config(shadows = {
+ SettingsShadowResources.class,
+ SettingsShadowResources.SettingsShadowTheme.class
+ })
+ public void formatUsage_shouldLookLikeFormatFileSize() {
+ SettingsShadowResources.overrideResource(com.android.internal.R.string.fileSizeSuffix,
+ "%1$s %2$s");
+ final long usage = 2147483648L; // 2GB
+ final String formattedUsage =
+ DataUsageSummaryLegacy.formatUsage(mContext, "^1", usage).toString();
+ final String formattedAsFileSize = Formatter.formatFileSize(mContext, usage);
+ assertThat(formattedUsage).isEqualTo(formattedAsFileSize);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
new file mode 100644
index 0000000..ea1d29b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.datausage;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.NetworkTemplate;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.NetworkPolicyEditor;
+import com.android.settingslib.net.DataUsageController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.concurrent.TimeUnit;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DataUsageSummaryPreferenceControllerTest {
+ private static final long UPDATE_BACKOFF_MS = TimeUnit.MINUTES.toMillis(13);
+ private static final long CYCLE_BACKOFF_MS = TimeUnit.DAYS.toMillis(6);
+ private static final long CYCLE_LENGTH_MS = TimeUnit.DAYS.toMillis(30);
+ private static final long USAGE1 = 373000000L;
+ private static final long LIMIT1 = 1000000000L;
+ private static final String CARRIER_NAME = "z-mobile";
+ private static final String PERIOD = "Feb";
+
+ @Mock
+ private DataUsageController mDataUsageController;
+ @Mock
+ private DataUsageInfoController mDataInfoController;
+ @Mock
+ private DataUsageSummaryPreference mSummaryPreference;
+ @Mock
+ private NetworkPolicyEditor mPolicyEditor;
+ @Mock
+ private NetworkTemplate mNetworkTemplate;
+
+ private Context mContext;
+ private DataUsageSummaryPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+
+ mController = new DataUsageSummaryPreferenceController(
+ mContext,
+ mDataUsageController,
+ mDataInfoController,
+ mNetworkTemplate,
+ mPolicyEditor,
+ R.string.cell_data_template,
+ true,
+ null);
+ }
+
+ @Test
+ public void testSummaryUpdate_onePlan_basic() {
+ final long now = System.currentTimeMillis();
+ final DataUsageController.DataUsageInfo info = createTestDataUsageInfo(now);
+
+ final Intent intent = new Intent();
+
+ when(mDataUsageController.getDataUsageInfo()).thenReturn(info);
+ mController.setPlanValues(1 /* dataPlanCount */, LIMIT1, USAGE1);
+ mController.setCarrierValues(CARRIER_NAME, now - UPDATE_BACKOFF_MS, info.cycleEnd, intent);
+
+ mController.updateState(mSummaryPreference);
+ verify(mSummaryPreference).setLimitInfo(null);
+ verify(mSummaryPreference).setUsageInfo(info.cycleEnd, now - UPDATE_BACKOFF_MS,
+ CARRIER_NAME, 1 /* numPlans */, intent);
+ verify(mSummaryPreference).setChartEnabled(true);
+ }
+
+ @Test
+ public void testSummaryUpdate_noPlan_basic() {
+ final long now = System.currentTimeMillis();
+ final DataUsageController.DataUsageInfo info = createTestDataUsageInfo(now);
+
+ final Intent intent = new Intent();
+
+ when(mDataUsageController.getDataUsageInfo(any())).thenReturn(info);
+ mController.setPlanValues(0 /* dataPlanCount */, LIMIT1, USAGE1);
+ mController.setCarrierValues(CARRIER_NAME, now - UPDATE_BACKOFF_MS, info.cycleEnd, intent);
+
+ mController.updateState(mSummaryPreference);
+ verify(mSummaryPreference).setLimitInfo("500 MB Data warning / 1.00 GB Data limit");
+ verify(mSummaryPreference).setUsageInfo(info.cycleEnd, now - UPDATE_BACKOFF_MS,
+ CARRIER_NAME, 0 /* numPlans */, intent);
+ verify(mSummaryPreference).setChartEnabled(true);
+ }
+
+ @Test
+ public void testSummaryUpdate_noCarrier_basic() {
+ final long now = System.currentTimeMillis();
+ final DataUsageController.DataUsageInfo info = createTestDataUsageInfo(now);
+
+ when(mDataUsageController.getDataUsageInfo(any())).thenReturn(info);
+ mController.setPlanValues(0 /* dataPlanCount */, LIMIT1, USAGE1);
+ mController.setCarrierValues(null /* carrierName */, -1L /* snapshotTime */,
+ info.cycleEnd, null /* intent */);
+ mController.updateState(mSummaryPreference);
+
+ verify(mSummaryPreference).setLimitInfo("500 MB Data warning / 1.00 GB Data limit");
+ verify(mSummaryPreference).setUsageInfo(
+ info.cycleEnd,
+ -1L /* snapshotTime */,
+ null /* carrierName */,
+ 0 /* numPlans */,
+ null /* launchIntent */);
+ verify(mSummaryPreference).setChartEnabled(true);
+ }
+
+ @Test
+ public void testSummaryUpdate_noPlanData_basic() {
+ final long now = System.currentTimeMillis();
+
+ final DataUsageController.DataUsageInfo info = createTestDataUsageInfo(now);
+
+ when(mDataUsageController.getDataUsageInfo(any())).thenReturn(info);
+ mController.setPlanValues(0 /* dataPlanCount */, -1L /* dataPlanSize */, USAGE1);
+ mController.setCarrierValues(null /* carrierName */, -1L /* snapshotTime */,
+ info.cycleEnd, null /* intent */);
+ mController.updateState(mSummaryPreference);
+
+ verify(mSummaryPreference).setLimitInfo("500 MB Data warning / 1.00 GB Data limit");
+ verify(mSummaryPreference).setUsageInfo(
+ info.cycleEnd,
+ -1L /* snapshotTime */,
+ null /* carrierName */,
+ 0 /* numPlans */,
+ null /* launchIntent */);
+ verify(mSummaryPreference).setChartEnabled(false);
+ }
+
+ private DataUsageController.DataUsageInfo createTestDataUsageInfo(long now) {
+ DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+ info.carrier = CARRIER_NAME;
+ info.period = PERIOD;
+ info.startDate = now;
+ info.limitLevel = LIMIT1;
+ info.warningLevel = LIMIT1 >> 1;
+ info.usageLevel = USAGE1;
+ info.cycleStart = now - CYCLE_BACKOFF_MS;
+ info.cycleEnd = info.cycleStart + CYCLE_LENGTH_MS;
+ return info;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
new file mode 100644
index 0000000..769d9e7
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.datausage;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settingslib.utils.StringUtil;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.spy;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows =
+ SettingsShadowResourcesImpl.class)
+public class DataUsageSummaryPreferenceTest {
+ private static final long CYCLE_DURATION_MILLIS = 1000000000L;
+ private static final long UPDATE_LAG_MILLIS = 10000000L;
+ private static final String DUMMY_CARRIER = "z-mobile";
+
+ private Context mContext;
+ private PreferenceViewHolder mHolder;
+ private DataUsageSummaryPreference mSummaryPreference;
+ private TextView mUsageTitle;
+ private TextView mCycleTime;
+ private TextView mCarrierInfo;
+ private TextView mDataLimits;
+ private Button mLaunchButton;
+
+ private long mCycleEnd;
+ private long mUpdateTime;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ mSummaryPreference = new DataUsageSummaryPreference(mContext, null /* attrs */);
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ View view = inflater.inflate(mSummaryPreference.getLayoutResource(), null /* root */,
+ false /* attachToRoot */);
+
+ mHolder = PreferenceViewHolder.createInstanceForTests(view);
+
+ final long now = System.currentTimeMillis();
+ mCycleEnd = now + CYCLE_DURATION_MILLIS;
+ mUpdateTime = now - UPDATE_LAG_MILLIS;
+ }
+
+ @Test
+ public void testSetUsageInfo_withLaunchIntent_launchButtonShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mLaunchButton.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void testSetUsageInfo_withoutLaunchIntent_launchButtonNotShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */,
+ null /* launchIntent */);
+
+ bindViewHolder();
+ assertThat(mLaunchButton.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testSetUsageInfo_withDataPlans_carrierInfoShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 1 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void testSetUsageInfo_withNoDataPlans_carrierInfoNotShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testSetUsageInfo_withNoDataPlans_usageTitleNotShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mUsageTitle.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testSetUsageInfo_withMultipleDataPlans_usageTitleShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 2 /* numPlans */,
+ new Intent());
+
+ bindViewHolder();
+ assertThat(mUsageTitle.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void testSetUsageInfo_cycleRemainingTimeShown() {
+ mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */,
+ new Intent());
+ String cyclePrefix = StringUtil.formatElapsedTime(mContext, CYCLE_DURATION_MILLIS,
+ false /* withSeconds */).toString();
+ String text = mContext.getString(R.string.cycle_left_time_text, cyclePrefix);
+
+ bindViewHolder();
+ assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mCycleTime.getText()).isEqualTo(text);
+ }
+
+ @Test
+ public void testSetLimitInfo_withLimitInfo_dataLimitsShown() {
+ final String limitText = "test limit text";
+ mSummaryPreference.setLimitInfo(limitText);
+
+ bindViewHolder();
+ assertThat(mDataLimits.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mDataLimits.getText()).isEqualTo(limitText);
+ }
+
+ @Test
+ public void testSetLimitInfo_withNullLimitInfo_dataLimitsNotShown() {
+ mSummaryPreference.setLimitInfo(null);
+
+ bindViewHolder();
+ assertThat(mDataLimits.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ private void bindViewHolder() {
+ mSummaryPreference.onBindViewHolder(mHolder);
+ mUsageTitle = (TextView) mHolder.findViewById(R.id.usage_title);
+ mCycleTime = (TextView) mHolder.findViewById(R.id.cycle_left_time);
+ mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
+ mDataLimits = (TextView) mHolder.findViewById(R.id.data_limits);
+ mLaunchButton = (Button) mHolder.findViewById(R.id.launch_mdp_app_button);
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/datausage/ManageDataPlansPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/ManageDataPlansPreferenceTest.java
deleted file mode 100644
index 6eff393..0000000
--- a/tests/robotests/src/com/android/settings/datausage/ManageDataPlansPreferenceTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.settings.datausage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public final class ManageDataPlansPreferenceTest {
- private Preference mPreference;
- private PreferenceViewHolder mHolder;
- private Context mContext;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- mPreference = new Preference(mContext);
- mPreference.setLayoutResource(R.layout.manage_data_plans_preference);
- LayoutInflater inflater = LayoutInflater.from(mContext);
- View view = inflater.inflate(mPreference.getLayoutResource(),
- new LinearLayout(mContext), false);
- mHolder = PreferenceViewHolder.createInstanceForTests(view);
- }
-
- @Test
- public void shouldRender_withData() {
- mPreference.onBindViewHolder(mHolder);
- Button managePlanButton = (Button) mHolder.findViewById(R.id.manage_data_plans);
- assertThat(managePlanButton.getText())
- .isEqualTo(mContext.getString(R.string.data_plan_usage_manage_plans_button_text));
- }
-}
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
index 881ee84..640e9d5 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
@@ -17,7 +17,6 @@
package com.android.settings.development;
import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
@@ -33,6 +32,7 @@
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.widget.SwitchBar;
import com.android.settings.widget.ToggleSwitch;
import com.android.settingslib.development.AbstractEnableAdbPreferenceController;
@@ -52,7 +52,9 @@
import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
+ ShadowUserManager.class
+})
public class DevelopmentSettingsDashboardFragmentTest {
private SwitchBar mSwitchBar;
@@ -68,11 +70,13 @@
mSwitch = mSwitchBar.getSwitch();
mDashboard = spy(new DevelopmentSettingsDashboardFragment());
ReflectionHelpers.setField(mDashboard, "mSwitchBar", mSwitchBar);
+ ShadowUserManager.getShadow().setIsAdminUser(true);
}
@After
public void tearDown() {
ShadowEnableDevelopmentSettingWarningDialog.reset();
+ ShadowUserManager.getShadow().reset();
}
@Test
@@ -101,7 +105,7 @@
SettingsShadowResources.class,
SettingsShadowResources.SettingsShadowTheme.class
})
- public void searchIndex_pageDisabled_shouldAddAllKeysToNonIndexable() {
+ public void searchIndex_pageDisabledBySetting_shouldAddAllKeysToNonIndexable() {
final Context appContext = RuntimeEnvironment.application;
DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(appContext, false);
@@ -109,7 +113,24 @@
DevelopmentSettingsDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(appContext);
- assertThat(nonIndexableKeys).contains("development_prefs_screen");
+ assertThat(nonIndexableKeys).contains("enable_adb");
+ }
+
+ @Test
+ @Config(shadows = {
+ SettingsShadowResources.class,
+ SettingsShadowResources.SettingsShadowTheme.class
+ })
+ public void searchIndex_pageDisabledForNonAdmin_shouldAddAllKeysToNonIndexable() {
+ final Context appContext = RuntimeEnvironment.application;
+ DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(appContext, true);
+ ShadowUserManager.getShadow().setIsAdminUser(false);
+
+ final List<String> nonIndexableKeys =
+ DevelopmentSettingsDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(appContext);
+
+ assertThat(nonIndexableKeys).contains("enable_adb");
}
@Test
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSwitchBarControllerTest.java
index a5dfa56..95fd0dd 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentSwitchBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSwitchBarControllerTest.java
@@ -28,6 +28,7 @@
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
import com.android.settings.widget.SwitchBar;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -47,7 +48,8 @@
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
shadows = {
- ShadowUtils.class
+ ShadowUtils.class,
+ ShadowUserManager.class
})
public class DevelopmentSwitchBarControllerTest {
@@ -63,6 +65,7 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
+ ShadowUserManager.getShadow().setIsAdminUser(true);
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
mSwitchBar = new SwitchBar(mContext);
@@ -72,6 +75,7 @@
@After
public void tearDown() {
ShadowUtils.reset();
+ ShadowUserManager.getShadow().reset();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
index ee5d5d0..17122ae 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
@@ -43,6 +43,7 @@
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowUtils;
+import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.development.DevelopmentSettingsEnabler;
@@ -60,7 +61,8 @@
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
shadows = {
- ShadowUtils.class
+ ShadowUtils.class,
+ ShadowUserManager.class,
})
public class BuildNumberPreferenceControllerTest {
@@ -84,6 +86,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ ShadowUserManager.getShadow().setIsAdminUser(true);
mFactory = FakeFeatureFactory.setupForTest();
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
@@ -98,6 +101,7 @@
@After
public void tearDown() {
ShadowUtils.reset();
+ ShadowUserManager.getShadow().reset();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
index a814989..cee84de 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
@@ -220,4 +220,9 @@
assertThat(mPreferenceController.isAvailable()).isFalse();
}
+
+ @Test
+ public void testNeverUseFakeData() {
+ assertThat(BatteryAppListPreferenceController.USE_FAKE_DATA).isFalse();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
index 70958a9..45edb47 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
@@ -43,6 +43,9 @@
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.R;
+import com.android.settingslib.utils.PowerUtil;
+import java.time.Duration;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -72,6 +75,8 @@
public static final long TEST_CHARGE_TIME_REMAINING = TimeUnit.MINUTES.toMicros(1);
public static final String TEST_CHARGE_TIME_REMAINING_STRINGIFIED =
"1m left until fully charged";
+ public static final String TEST_BATTERY_LEVEL_10 = "10%";
+ public static final String FIFTEEN_MIN_FORMATTED = "15m";
private Intent mDisChargingBatteryBroadcast;
private Intent mChargingBatteryBroadcast;
private Context mContext;
@@ -134,13 +139,15 @@
}
@Test
- public void testGetBatteryInfo_basedOnUsageTrue_usesCorrectString() {
+ public void testGetBatteryInfo_basedOnUsageTrueMoreThanFifteenMinutes_usesCorrectString() {
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
- 1000, true /* basedOnUsage */);
+ PowerUtil.convertMsToUs(Duration.ofHours(4).toMillis()),
+ true /* basedOnUsage */);
BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */,
- 1000, true /* basedOnUsage */);
+ PowerUtil.convertMsToUs(Duration.ofHours(4).toMillis()),
+ true /* basedOnUsage */);
// We only add special mention for the long string
assertThat(info.remainingLabel.toString()).contains(ENHANCED_STRING_SUFFIX);
@@ -149,6 +156,41 @@
}
@Test
+ public void testGetBatteryInfo_basedOnUsageTrueLessThanSevenMinutes_usesCorrectString() {
+ BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
+ mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
+ PowerUtil.convertMsToUs(Duration.ofMinutes(7).toMillis()),
+ true /* basedOnUsage */);
+ BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
+ mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */,
+ PowerUtil.convertMsToUs(Duration.ofMinutes(7).toMillis()),
+ true /* basedOnUsage */);
+
+ // These should be identical in either case
+ assertThat(info.remainingLabel.toString()).isEqualTo(
+ mContext.getString(R.string.power_remaining_duration_only_shutdown_imminent));
+ assertThat(info2.remainingLabel.toString()).isEqualTo(
+ mContext.getString(R.string.power_remaining_duration_only_shutdown_imminent));
+ }
+
+ @Test
+ public void testGetBatteryInfo_basedOnUsageTrueBetweenSevenAndFifteenMinutes_usesCorrectString() {
+ BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
+ mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
+ PowerUtil.convertMsToUs(Duration.ofMinutes(10).toMillis()),
+ true /* basedOnUsage */);
+
+ // Check that strings are showing less than 15 minutes remaining regardless of exact time.
+ assertThat(info.chargeLabel.toString()).isEqualTo(
+ mContext.getString(R.string.power_remaining_less_than_duration,
+ TEST_BATTERY_LEVEL_10, FIFTEEN_MIN_FORMATTED));
+ assertThat(info.remainingLabel.toString()).isEqualTo(
+ mContext.getString(R.string.power_remaining_less_than_duration_only,
+ FIFTEEN_MIN_FORMATTED));
+ }
+
+
+ @Test
public void testGetBatteryInfo_basedOnUsageFalse_usesDefaultString() {
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverSettingsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverSettingsTest.java
deleted file mode 100644
index 0e32f6b..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverSettingsTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.fuelgauge;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.provider.SearchIndexableResource;
-
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.widget.SwitchBar;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.List;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class BatterySaverSettingsTest {
- private Context mContext;
- private BatterySaverSettings mBatterySaverSettings;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- mBatterySaverSettings = new BatterySaverSettings();
- mBatterySaverSettings.mSwitchBar = new SwitchBar(mContext);
- }
-
- @Test
- public void testOnBatteryChanged_pluggedIn_setDisable() {
- mBatterySaverSettings.onBatteryChanged(true /* pluggedIn */);
-
- assertThat(mBatterySaverSettings.mSwitchBar.isEnabled()).isFalse();
- }
-
- @Test
- public void testOnBatteryChanged_notPluggedIn_setEnable() {
- mBatterySaverSettings.onBatteryChanged(false /* pluggedIn */);
-
- assertThat(mBatterySaverSettings.mSwitchBar.isEnabled()).isTrue();
- }
-
- @Test
- public void searchProvider_shouldIndexDefaultXml() {
- final List<SearchIndexableResource> sir = mBatterySaverSettings.SEARCH_INDEX_DATA_PROVIDER
- .getXmlResourcesToIndex(mContext, true /* enabled */);
-
- assertThat(sir).hasSize(1);
- assertThat(sir.get(0).xmlResId).isEqualTo(R.xml.battery_saver_settings);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
index e707ede..a3786c2 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
@@ -55,7 +55,6 @@
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.TestConfig;
-import com.android.settings.Utils;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
@@ -65,6 +64,7 @@
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.utils.StringUtil;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -367,8 +367,8 @@
public void testUpdateScreenPreference_showCorrectSummary() {
doReturn(mScreenBatterySipper).when(mFragment).findBatterySipperByType(any(), any());
doReturn(mRealContext).when(mFragment).getContext();
- final CharSequence expectedSummary = Utils.formatElapsedTime(mRealContext, USAGE_TIME_MS,
- false);
+ final CharSequence expectedSummary =
+ StringUtil.formatElapsedTime(mRealContext, USAGE_TIME_MS, false);
mFragment.updateScreenPreference();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceControllerTest.java
new file mode 100644
index 0000000..cabcdcf
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceControllerTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+
+package com.android.settings.fuelgauge.batterysaver;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class AutoBatterySaverPreferenceControllerTest {
+
+ private AutoBatterySaverPreferenceController mController;
+ private Context mContext;
+ private SwitchPreference mPreference;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = RuntimeEnvironment.application;
+ mPreference = new SwitchPreference(mContext);
+ mController = new AutoBatterySaverPreferenceController(mContext);
+ }
+
+ @Test
+ public void testUpdateState_lowPowerLevelZero_preferenceNotChecked() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void testUpdateState_lowPowerLevelZero_preferenceChecked() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 15);
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void testOnPreferenceChange_turnOn_setValueNotZero() {
+ mController.onPreferenceChange(mPreference, true);
+
+ assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0)).isNotEqualTo(0);
+ }
+
+ @Test
+ public void testOnPreferenceChange_turnOff_setValueZero() {
+ mController.onPreferenceChange(mPreference, false);
+
+ assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0)).isEqualTo(0);
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceControllerTest.java
new file mode 100644
index 0000000..32a4fac
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceControllerTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge.batterysaver;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.arch.lifecycle.LifecycleOwner;
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.widget.SeekBarPreference;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class AutoBatterySeekBarPreferenceControllerTest {
+ private static final int TRIGGER_LEVEL = 15;
+
+ private AutoBatterySeekBarPreferenceController mController;
+ private Context mContext;
+ private SeekBarPreference mPreference;
+ private Lifecycle mLifecycle;
+ private LifecycleOwner mLifecycleOwner;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+
+ mContext = RuntimeEnvironment.application;
+ mPreference = new SeekBarPreference(mContext);
+ mPreference.setMax(100);
+ mController = new AutoBatterySeekBarPreferenceController(mContext, mLifecycle);
+ }
+
+ @Test
+ public void testPreference_lowPowerLevelZero_preferenceInvisible() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void testPreference_lowPowerLevelNotZero_updatePreference() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, TRIGGER_LEVEL);
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isVisible()).isTrue();
+ assertThat(mPreference.getTitle()).isEqualTo("Turn on automatically at 15%");
+ assertThat(mPreference.getProgress()).isEqualTo(TRIGGER_LEVEL);
+ }
+
+ @Test
+ public void testOnPreferenceChange_updateValue() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+
+ mController.onPreferenceChange(mPreference, TRIGGER_LEVEL);
+
+ assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0)).isEqualTo(TRIGGER_LEVEL);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java
index 25dba80..d3863db 100644
--- a/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java
@@ -16,6 +16,7 @@
package com.android.settings.notification;
+import static android.app.Notification.VISIBILITY_PRIVATE;
import static android.app.NotificationChannel.DEFAULT_CHANNEL_ID;
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_MIN;
@@ -114,14 +115,14 @@
}
@Test
- public void testNoCrashIfNoOnResume() throws Exception {
+ public void testNoCrashIfNoOnResume() {
mController.isAvailable();
mController.updateState(mock(RestrictedListPreference.class));
mController.onPreferenceChange(mock(RestrictedListPreference.class), true);
}
@Test
- public void testIsAvailable_notSecure() throws Exception {
+ public void testIsAvailable_notSecure() {
when(mLockUtils.isSecure(anyInt())).thenReturn(false);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_DEFAULT);
@@ -130,7 +131,7 @@
}
@Test
- public void testIsAvailable_notIfNotImportant() throws Exception {
+ public void testIsAvailable_notIfNotImportant() {
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_MIN);
mController.onResume(appRow, channel, null, null);
@@ -138,7 +139,7 @@
}
@Test
- public void testIsAvailable() throws Exception {
+ public void testIsAvailable() {
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
NotificationChannel channel =
new NotificationChannel(DEFAULT_CHANNEL_ID, "", IMPORTANCE_DEFAULT);
@@ -151,7 +152,7 @@
}
@Test
- public void testUpdateState_disabledByAdmin_disableSecure() throws Exception {
+ public void testUpdateState_disabledByAdmin_disableSecure() {
ShadowRestrictionUtils.setRestricted(true);
UserInfo userInfo = new UserInfo(2, "user 2", UserInfo.FLAG_MANAGED_PROFILE);
when(mUm.getUserInfo(anyInt())).thenReturn(userInfo);
@@ -173,7 +174,7 @@
}
@Test
- public void testUpdateState_disabledByAdmin_disableUnredacted() throws Exception {
+ public void testUpdateState_disabledByAdmin_disableUnredacted() {
ShadowRestrictionUtils.setRestricted(true);
UserInfo userInfo = new UserInfo(2, "user 2", UserInfo.FLAG_MANAGED_PROFILE);
when(mUm.getUserInfo(anyInt())).thenReturn(userInfo);
@@ -195,7 +196,7 @@
}
@Test
- public void testUpdateState_noLockScreenNotificationsGlobally() throws Exception {
+ public void testUpdateState_noLockScreenNotificationsGlobally() {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0);
@@ -211,10 +212,14 @@
verify(pref, times(1)).setEntryValues(argumentCaptor.capture());
assertFalse(toStringList(argumentCaptor.getValue())
.contains(String.valueOf(VISIBILITY_NO_OVERRIDE)));
+ assertFalse(toStringList(argumentCaptor.getValue())
+ .contains(String.valueOf(VISIBILITY_PRIVATE)));
}
@Test
- public void testUpdateState_noPrivateLockScreenNotificationsGlobally() throws Exception {
+ public void testUpdateState_noPrivateLockScreenNotificationsGlobally() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 1);
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0);
@@ -228,12 +233,13 @@
ArgumentCaptor<CharSequence[]> argumentCaptor =
ArgumentCaptor.forClass(CharSequence[].class);
verify(pref, times(1)).setEntryValues(argumentCaptor.capture());
+ assertEquals(2, toStringList(argumentCaptor.getValue()).size());
assertFalse(toStringList(argumentCaptor.getValue())
.contains(String.valueOf(VISIBILITY_NO_OVERRIDE)));
}
@Test
- public void testUpdateState_noGlobalRestriction() throws Exception {
+ public void testUpdateState_noGlobalRestriction() {
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
NotificationChannel channel = mock(NotificationChannel.class);
mController.onResume(appRow, channel, null, null);
@@ -247,7 +253,7 @@
List<String> values = toStringList(argumentCaptor.getValue());
assertEquals(3, values.size());
assertTrue(values.contains(String.valueOf(VISIBILITY_NO_OVERRIDE)));
- assertTrue(values.contains(String.valueOf(Notification.VISIBILITY_PRIVATE)));
+ assertTrue(values.contains(String.valueOf(VISIBILITY_PRIVATE)));
assertTrue(values.contains(String.valueOf(Notification.VISIBILITY_SECRET)));
}
@@ -260,7 +266,7 @@
}
@Test
- public void testUpdateState_noChannelOverride() throws Exception {
+ public void testUpdateState_noChannelOverride() {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0);
@@ -275,11 +281,11 @@
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
verify(pref, times(1)).setValue(argumentCaptor.capture());
- assertEquals(String.valueOf(Notification.VISIBILITY_PRIVATE), argumentCaptor.getValue());
+ assertEquals(String.valueOf(VISIBILITY_PRIVATE), argumentCaptor.getValue());
}
@Test
- public void testUpdateState_channelOverride() throws Exception {
+ public void testUpdateState_channelOverride() {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0);
@@ -310,7 +316,7 @@
RestrictedListPreference pref = mock(RestrictedListPreference.class);
mController.updateState(pref);
- mController.onPreferenceChange(pref, String.valueOf(Notification.VISIBILITY_PRIVATE));
+ mController.onPreferenceChange(pref, String.valueOf(VISIBILITY_PRIVATE));
assertEquals(VISIBILITY_NO_OVERRIDE, channel.getLockscreenVisibility());
verify(mBackend, times(1)).updateChannel(any(), anyInt(), any());
diff --git a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
index 6c6d7ab..260e3ae 100644
--- a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
@@ -137,7 +137,6 @@
final List<String> nonIndexableKeys = provider
.getNonIndexableKeys(RuntimeEnvironment.application);
- assertThat(nonIndexableKeys).containsAllOf("status_header", "limit_summary",
- "restrict_background");
+ assertThat(nonIndexableKeys).contains("status_header");
}
}
diff --git a/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java b/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java
deleted file mode 100644
index a1cafc5..0000000
--- a/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package com.android.settings.search;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.graphics.drawable.Drawable;
-
-import com.android.settings.DisplaySettings;
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.gestures.SwipeToNotificationSettings;
-import com.android.settings.search.ResultPayload.Availability;
-import com.android.settings.search.ResultPayload.PayloadType;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.wifi.WifiSettings;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
-import org.robolectric.annotation.Config;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class CursorToSearchResultConverterTest {
-
- private static final List<String> TITLES = Arrays.asList("title1", "title2", "title3");
- private static final String SUMMARY = "summary";
- private static final String TARGET_PACKAGE = "a.b.c";
- private static final String TARGET_CLASS = "a.b.c.class";
- private static final String KEY = "key";
- private static final int ICON = R.drawable.ic_search_24dp;
- private static final int BASE_RANK = 1;
- private static Intent sIntent;
-
- @BeforeClass
- public static void beforeClass() {
- sIntent = new Intent("com.android.settings");
- }
-
- private Drawable mDrawable;
- private CursorToSearchResultConverter mConverter;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- Context context = Robolectric.buildActivity(Activity.class).get();
- mDrawable = context.getDrawable(ICON);
- mConverter = new CursorToSearchResultConverter(context);
- }
-
- @Test
- public void testParseCursor_MatchesIcon() {
- final MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
- final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(sIntent));
- final String BLANK = "";
- cursor.addRow(new Object[] {
- KEY.hashCode(), // Doc ID
- "Longer than 20 characters", // Title
- SUMMARY, // Summary on
- SUMMARY, // summary off
- DisplaySettings.class.getName(),
- BLANK, // screen title
- ICON, // icon
- BLANK, // action
- null, // target package
- BLANK, // target class
- KEY, // Key
- PayloadType.INTENT, // Payload Type
- payload // Payload
- });
-
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
-
- for (SearchResult result : results) {
- Drawable resultDrawable = result.icon;
- assertThat(resultDrawable).isNotNull();
- assertThat(resultDrawable.toString()).isEqualTo(mDrawable.toString());
- }
- }
-
- @Test
- public void testParseCursor_NoIcon() {
- final Set<SearchResult> results = mConverter.convertCursor(
- getDummyCursor("noIcon" /* key */, "" /* className */), BASE_RANK);
- for (SearchResult result : results) {
- assertThat(result.icon).isNull();
- }
- }
-
- @Test
- public void testParseCursor_MatchesPayloadType() {
- final Set<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
- ResultPayload payload;
- for (SearchResult result : results) {
- payload = result.payload;
- assertThat(payload.getType()).isEqualTo(PayloadType.INTENT);
- }
- }
-
- @Test
- public void testLongTitle_PenalizedInRank() {
- final MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
- final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(sIntent));
- final String BLANK = "";
- cursor.addRow(new Object[] {
- KEY.hashCode(), // Doc ID
- "Longer than 20 characters", // Title
- SUMMARY, // Summary on
- SUMMARY, // summary off
- DisplaySettings.class.getName(),
- BLANK, // screen title
- null, // icon
- BLANK, // action
- null, // target package
- BLANK, // target class
- KEY, // Key
- PayloadType.INTENT, // Payload Type
- payload // Payload
- });
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
- for (SearchResult result : results) {
- assertThat(result.rank).isEqualTo(BASE_RANK + 1);
- }
- }
-
- @Test
- public void testParseCursor_MatchesResultPayload() {
- final Set<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
- ResultPayload payload;
- for (SearchResult result : results) {
- payload = result.payload;
- Intent intent = payload.getIntent();
- assertThat(intent.getAction()).isEqualTo(sIntent.getAction());
- }
- }
-
-
- @Test
- public void testParseCursor_MatchesInlineSwitchPayload() {
- MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
- final String BLANK = "";
- final String uri = "test.com";
- final int type = ResultPayload.PayloadType.INLINE_SWITCH;
- final int source = ResultPayload.SettingsSource.SECURE;
- final String intentKey = "key";
- final String intentVal = "value";
- final Intent intent = new Intent();
- intent.putExtra(intentKey, intentVal);
- final InlineSwitchPayload payload = new InlineSwitchPayload(uri, source, 1 /* onValue */,
- intent, true /* isDeviceSupported */, 0 /* defautValue */);
-
- cursor.addRow(new Object[] {
- KEY.hashCode(), // Doc ID
- TITLES.get(0), // Title
- SUMMARY, // Summary on
- SUMMARY, // summary off
- SwipeToNotificationSettings.class.getName(),
- BLANK, // screen title
- null, // icon
- BLANK, // action
- null, // target package
- BLANK, // target class
- KEY, // Key
- type, // Payload Type
- ResultPayloadUtils.marshall(payload) // Payload
- });
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
-
- for (SearchResult result : results) {
- final InlineSwitchPayload newPayload = (InlineSwitchPayload) result.payload;
- final Intent rebuiltIntent = newPayload.getIntent();
- assertThat(newPayload.getKey()).isEqualTo(uri);
- assertThat(newPayload.getType()).isEqualTo(type);
- assertThat(newPayload.mSettingSource).isEqualTo(source);
- assertThat(newPayload.isStandard()).isTrue();
- assertThat(newPayload.getAvailability()).isEqualTo(Availability.AVAILABLE);
- assertThat(rebuiltIntent.getStringExtra(intentKey)).isEqualTo(intentVal);
- }
- }
-
- // The following tests are temporary, and should be removed when we replace the Search
- // White-list solution for elevating ranking.
-
- @Test
- public void testWifiKey_PrioritizedResult() {
- final String key = "main_toggle_wifi";
- final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
-
- for (SearchResult result : results) {
- assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
- }
- }
-
- @Test
- public void testBluetoothKey_PrioritizedResult() {
- final String key = "main_toggle_bluetooth";
- final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
-
- for (SearchResult result : results) {
- assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
- }
- }
-
- @Test
- public void testAirplaneKey_PrioritizedResult() {
- final String key = "toggle_airplane";
- final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
- Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
- for (SearchResult result : results) {
- assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
- }
- }
-
- @Test
- public void testHotspotKey_PrioritizedResult() {
- final String key = "tether_settings";
- final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
-
- for (SearchResult result : results) {
- assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
- }
- }
-
- @Test
- public void testBatterySaverKey_PrioritizedResult() {
- final String key = "battery_saver";
- final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
-
- for (SearchResult result : results) {
- assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
- }
- }
-
- @Test
- public void testNFCKey_PrioritizedResult() {
- final String key = "toggle_nfc";
- final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
-
- for (SearchResult result : results) {
- assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
- }
- }
-
- @Test
- public void testDataSaverKey_PrioritizedResult() {
- final String key = "restrict_background";
- final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
-
- for (SearchResult result : results) {
- assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
- }
- }
-
- @Test
- public void testDataUsageKey_PrioritizedResult() {
- final String key = "data_usage_enable";
- final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
- for (SearchResult result : results) {
- assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
- }
- }
-
- @Test
- public void testRoamingKey_PrioritizedResult() {
- final String key = "button_roaming_key";
- final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
- final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
-
- for (SearchResult result : results) {
- assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
- }
- }
-
- // End of temporary tests
-
- private MatrixCursor getDummyCursor() {
- String[] keys = new String[] {KEY + "1", KEY + "2", KEY + "3"};
- return getDummyCursor(keys, "" /* className */);
- }
-
- private MatrixCursor getDummyCursor(String key, String className) {
- String[] keys = new String[] {key};
- return getDummyCursor(keys, className);
- }
-
- private MatrixCursor getDummyCursor(String[] keys, String className) {
- MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
- final String BLANK = "";
- final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(sIntent));
-
- for (int i = 0; i < keys.length; i++) {
- ArrayList<Object> item = new ArrayList<>(DatabaseResultLoader.SELECT_COLUMNS.length);
- item.add(keys[i].hashCode()); // Doc ID
- item.add(TITLES.get(i)); // Title
- item.add(SUMMARY); // Summary on
- item.add(BLANK); // summary off
- item.add(className); // classname
- item.add(BLANK); // screen title
- item.add(null); // Icon
- item.add(sIntent.getAction()); // Intent action
- item.add(TARGET_PACKAGE); // target package
- item.add(TARGET_CLASS); // target class
- item.add(keys[i]); // Key
- item.add(Integer.toString(0)); // Payload Type
- item.add(payload); // Payload
-
- cursor.addRow(item);
- }
- return cursor;
- }
-}
diff --git a/tests/robotests/src/com/android/settings/search/SearchResultBuilderTest.java b/tests/robotests/src/com/android/settings/search/SearchResultBuilderTest.java
deleted file mode 100644
index cd77b25..0000000
--- a/tests/robotests/src/com/android/settings/search/SearchResultBuilderTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package com.android.settings.search;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.search.SearchResult.Builder;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
-
-import java.util.ArrayList;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class SearchResultBuilderTest {
-
- private static final String TITLE = "title";
- private static final String SUMMARY = "summary";
-
- private Builder mBuilder;
- private ArrayList<String> mBreadcrumbs;
- private int mRank;
- private ResultPayload mResultPayload;
- private Drawable mIcon;
-
- @Before
- public void setUp() {
- mBuilder = new Builder();
- mBreadcrumbs = new ArrayList<>();
- mRank = 3;
- mResultPayload = new ResultPayload(new Intent());
-
- final Context context = ShadowApplication.getInstance().getApplicationContext();
- mIcon = context.getDrawable(R.drawable.ic_search_24dp);
- }
-
- @Test
- public void testAllInfo_BuildSearchResult() {
- mBuilder.setTitle(TITLE)
- .setSummary(SUMMARY)
- .setRank(mRank)
- .addBreadcrumbs(mBreadcrumbs)
- .setIcon(mIcon)
- .setPayload(mResultPayload)
- .setStableId(1);
- SearchResult result = mBuilder.build();
-
- assertThat(result).isNotNull();
- assertThat(result.title).isEqualTo(TITLE);
- assertThat(result.summary).isEqualTo(SUMMARY);
- assertThat(result.rank).isEqualTo(mRank);
- assertThat(result.breadcrumbs).isEqualTo(mBreadcrumbs);
- assertThat(result.icon).isEqualTo(mIcon);
- assertThat(result.payload).isEqualTo(mResultPayload);
- }
-
- @Test(expected = IllegalStateException.class)
- public void testNoStableId_BuildSearchResultException() {
- mBuilder.setTitle(TITLE)
- .setSummary(SUMMARY)
- .setRank(mRank)
- .addBreadcrumbs(mBreadcrumbs)
- .setIcon(mIcon)
- .setPayload(mResultPayload);
-
- mBuilder.build();
- }
-
- @Test(expected = IllegalStateException.class)
- public void testNoTitle_BuildSearchResultException() {
- mBuilder.setSummary(SUMMARY)
- .setRank(mRank)
- .addBreadcrumbs(mBreadcrumbs)
- .setIcon(mIcon)
- .setPayload(mResultPayload)
- .setStableId(1);
-
- mBuilder.build();
- }
-
- @Test
- public void testNoRank_BuildSearchResult_pass() {
- mBuilder.setTitle(TITLE)
- .setSummary(SUMMARY)
- .addBreadcrumbs(mBreadcrumbs)
- .setIcon(mIcon)
- .setPayload(mResultPayload)
- .setStableId(1);
-
- assertThat(mBuilder.build()).isNotNull();
- }
-
- @Test
- public void testNoIcon_BuildSearchResult_pass() {
- mBuilder.setTitle(TITLE)
- .setSummary(SUMMARY)
- .setRank(mRank)
- .addBreadcrumbs(mBreadcrumbs)
- .setPayload(mResultPayload)
- .setStableId(1);
-
- assertThat(mBuilder.build()).isNotNull();
- }
-
- @Test(expected = IllegalStateException.class)
- public void testNoPayload_BuildSearchResultException() {
- mBuilder.setTitle(TITLE)
- .setSummary(SUMMARY)
- .setRank(mRank)
- .addBreadcrumbs(mBreadcrumbs)
- .setIcon(mIcon)
- .setStableId(1);
-
- mBuilder.build();
- }
-}
-
-
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
index 42d640a..64a0cea 100644
--- a/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
@@ -16,14 +16,12 @@
package com.android.settings.security.trustagent;
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R;
@@ -50,8 +48,6 @@
private TrustAgentManager mTrustAgentManager;
@Mock
private LockPatternUtils mLockPatternUtils;
- @Mock
- private PreferenceScreen mScreen;
private FakeFeatureFactory mFeatureFactory;
private Context mContext;
@@ -70,8 +66,6 @@
mController = new ManageTrustAgentsPreferenceController(mContext);
mPreference = new Preference(mContext);
mPreference.setKey(mController.getPreferenceKey());
- when(mScreen.findPreference(mController.getPreferenceKey()))
- .thenReturn(mPreference);
}
@Test
@@ -86,10 +80,10 @@
}
@Test
- public void displayPreference_isNotSecure_shouldDisablePreference() {
+ public void updateState_isNotSecure_shouldDisablePreference() {
when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
- mController.displayPreference(mScreen);
+ mController.updateState(mPreference);
assertThat(mPreference.isEnabled()).isFalse();
assertThat(mPreference.getSummary())
@@ -97,12 +91,12 @@
}
@Test
- public void displayPreference_isSecure_noTrustAgent_shouldShowGenericSummary() {
+ public void updateState_isSecure_noTrustAgent_shouldShowGenericSummary() {
when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
when(mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils))
.thenReturn(new ArrayList<>());
- mController.displayPreference(mScreen);
+ mController.updateState(mPreference);
assertThat(mPreference.isEnabled()).isTrue();
assertThat(mPreference.getSummary())
@@ -110,12 +104,12 @@
}
@Test
- public void displayPreference_isSecure_hasTrustAgent_shouldShowDetailedSummary() {
+ public void updateState_isSecure_hasTrustAgent_shouldShowDetailedSummary() {
when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
when(mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils))
.thenReturn(Arrays.asList(new TrustAgentManager.TrustAgentComponentInfo()));
- mController.displayPreference(mScreen);
+ mController.updateState(mPreference);
assertThat(mPreference.isEnabled()).isTrue();
assertThat(mPreference.getSummary())
diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
index 340d04b..3512ded 100644
--- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
@@ -31,6 +31,7 @@
import com.android.settings.TestConfig;
import com.android.settings.testutils.DatabaseTestUtils;
+import com.android.settings.testutils.FakeToggleController;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.After;
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
index f5d5ff0..1c5899d 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
@@ -31,6 +31,7 @@
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.FakeToggleController;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.After;
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index 0923571..88e4695 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -29,6 +29,7 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeToggleController;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java b/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
new file mode 100644
index 0000000..66ed459
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.slices;
+
+import static com.android.settings.TestConfig.SDK_VERSION;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+import android.content.res.XmlResourceParser;
+import android.provider.SearchIndexableResource;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Xml;
+
+import com.android.settings.TestConfig;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.core.codeinspection.ClassScanner;
+import com.android.settings.core.codeinspection.CodeInspector;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.search.DatabaseIndexingUtils;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchFeatureProvider;
+import com.android.settings.search.SearchFeatureProviderImpl;
+import com.android.settings.search.XmlParserUtils;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.xmlpull.v1.XmlPullParser;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = SDK_VERSION)
+public class SliceControllerInXmlTest {
+
+ private static final List<Class> mSliceControllerClasses = new ArrayList<>(Arrays.asList(
+ TogglePreferenceController.class
+ ));
+
+ private final List<String> mXmlDeclaredControllers = new ArrayList<>();
+ private final List<String> mGrandfatheredClasses = new ArrayList<>();
+
+ private final String ERROR_MISSING_CONTROLLER =
+ "The following controllers were expected to be declared by "
+ + "'settings:controller=Controller_Class_Name' in their corresponding Xml. "
+ + "If it should not appear in XML, add the controller's classname to "
+ + "grandfather_slice_controller_not_in_xml. Controllers:\n";
+
+ private Context mContext;
+
+ SearchFeatureProvider mSearchProvider;
+ private FakeFeatureFactory mFakeFeatureFactory;
+
+ @Before
+ public void setUp() {
+ mContext = spy(RuntimeEnvironment.application);
+
+ mSearchProvider = new SearchFeatureProviderImpl();
+ mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
+ mFakeFeatureFactory.searchFeatureProvider = mSearchProvider;
+
+ CodeInspector.initializeGrandfatherList(mGrandfatheredClasses,
+ "grandfather_slice_controller_not_in_xml");
+ initDeclaredControllers();
+ }
+
+ private void initDeclaredControllers() {
+ final List<Integer> xmlResources = getIndexableXml();
+ XmlResourceParser parser;
+
+ for (int xmlResId : xmlResources) {
+ try {
+ parser = mContext.getResources().getXml(xmlResId);
+
+ int type;
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && type != XmlPullParser.START_TAG) {
+ // Parse next until start tag is found
+ }
+
+ final int outerDepth = parser.getDepth();
+ final AttributeSet attrs = Xml.asAttributeSet(parser);
+ String controllerClassName;
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+ continue;
+ }
+ controllerClassName = XmlParserUtils.getController(mContext, attrs);
+
+ if (!TextUtils.isEmpty(controllerClassName)) {
+ mXmlDeclaredControllers.add(controllerClassName);
+ }
+ }
+ } catch (Exception e) {
+ // Assume an issue with robolectric resources
+ }
+ }
+ }
+
+ @Test
+ public void testAllControllersDeclaredInXml() throws Exception {
+ final List<Class<?>> classes = new ClassScanner().getClassesForPackage(
+ mContext.getPackageName());
+ final List<String> missingControllersInXml = new ArrayList<>();
+
+ for (Class<?> clazz : classes) {
+ if (!isInlineSliceClass(clazz)) {
+ // Only care about inline-slice controller classes.
+ continue;
+ }
+
+ if (!mXmlDeclaredControllers.contains(clazz.getName())) {
+ // Class clazz should have been declared in XML (unless whitelisted).
+ missingControllersInXml.add(clazz.getName());
+ }
+ }
+
+ // Removed whitelisted classes
+ missingControllersInXml.removeAll(mGrandfatheredClasses);
+
+ final String missingControllerError = buildErrorMessage(ERROR_MISSING_CONTROLLER,
+ missingControllersInXml);
+
+ assertWithMessage(missingControllerError).that(missingControllersInXml).isEmpty();
+ }
+
+ private boolean isInlineSliceClass(Class clazz) {
+ while (clazz != null) {
+ clazz = clazz.getSuperclass();
+ if (mSliceControllerClasses.contains(clazz)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private String buildErrorMessage(String errorSummary, List<String> errorClasses) {
+ final StringBuilder error = new StringBuilder(errorSummary);
+ for (String c : errorClasses) {
+ error.append(c).append("\n");
+ }
+ return error.toString();
+ }
+
+ private List<Integer> getIndexableXml() {
+ final List<Integer> xmlResSet = new ArrayList<>();
+
+ final Collection<Class> indexableClasses = FeatureFactory.getFactory(
+ mContext).getSearchFeatureProvider().getSearchIndexableResources()
+ .getProviderValues();
+
+ for (Class clazz : indexableClasses) {
+
+ Indexable.SearchIndexProvider provider = DatabaseIndexingUtils.getSearchIndexProvider(
+ clazz);
+
+ if (provider == null) {
+ continue;
+ }
+
+ List<SearchIndexableResource> resources = provider.getXmlResourcesToIndex(mContext,
+ true);
+
+ if (resources == null) {
+ continue;
+ }
+
+ for (SearchIndexableResource resource : resources) {
+ // Add '0's anyway. It won't break the test.
+ xmlResSet.add(resource.xmlResId);
+ }
+ }
+ return xmlResSet;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
index ad72e6b..57244c1 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -27,7 +27,6 @@
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
-import com.android.settings.datausage.DataPlanFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.gestures.AssistGestureFeatureProvider;
@@ -62,7 +61,6 @@
public final UserFeatureProvider userFeatureProvider;
public final AssistGestureFeatureProvider assistGestureFeatureProvider;
public final BluetoothFeatureProvider bluetoothFeatureProvider;
- public final DataPlanFeatureProvider dataPlanFeatureProvider;
public final SmsMirroringFeatureProvider smsMirroringFeatureProvider;
public final SlicesFeatureProvider slicesFeatureProvider;
public SearchFeatureProvider searchFeatureProvider;
@@ -103,7 +101,6 @@
userFeatureProvider = mock(UserFeatureProvider.class);
assistGestureFeatureProvider = mock(AssistGestureFeatureProvider.class);
bluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
- dataPlanFeatureProvider = mock(DataPlanFeatureProvider.class);
smsMirroringFeatureProvider = mock(SmsMirroringFeatureProvider.class);
slicesFeatureProvider = mock(SlicesFeatureProvider.class);
mAccountFeatureProvider = mock(AccountFeatureProvider.class);
@@ -175,11 +172,6 @@
}
@Override
- public DataPlanFeatureProvider getDataPlanFeatureProvider() {
- return dataPlanFeatureProvider;
- }
-
- @Override
public AssistGestureFeatureProvider getAssistGestureFeatureProvider() {
return assistGestureFeatureProvider;
}
diff --git a/tests/robotests/src/com/android/settings/slices/FakeToggleController.java b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
similarity index 97%
rename from tests/robotests/src/com/android/settings/slices/FakeToggleController.java
rename to tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
index 1b08e35..c984c6c 100644
--- a/tests/robotests/src/com/android/settings/slices/FakeToggleController.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
@@ -15,7 +15,7 @@
*
*/
-package com.android.settings.slices;
+package com.android.settings.testutils;
import android.content.Context;
import android.provider.Settings;
diff --git a/tests/robotests/src/com/android/settings/users/AutoSyncWorkDataPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/users/AutoSyncWorkDataPreferenceControllerTest.java
index 19f3732..22dae37 100644
--- a/tests/robotests/src/com/android/settings/users/AutoSyncWorkDataPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/users/AutoSyncWorkDataPreferenceControllerTest.java
@@ -92,6 +92,21 @@
}
@Test
+ public void checkIsAvailable_null_workProfileUserHandle_shouldNotDisplay() {
+ when(mUserManager.isManagedProfile()).thenReturn(false);
+ when(mUserManager.isLinkedUser()).thenReturn(false);
+
+ final List<UserInfo> infos = new ArrayList<>();
+ infos.add(new UserInfo(UserHandle.USER_SYSTEM, "user 1", 0 /* flags */));
+ infos.add(new UserInfo(999, "xspace", 800010));
+ when(mUserManager.getProfiles(eq(UserHandle.USER_SYSTEM))).thenReturn(infos);
+ mController = new AutoSyncWorkDataPreferenceController(mContext, mFragment);
+
+ assertThat(mController.mUserHandle).isEqualTo(null);
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
public void multipleProfile_shouldInitWithWorkProfileUserHandle() {
when(mUserManager.isManagedProfile()).thenReturn(false);
when(mUserManager.isLinkedUser()).thenReturn(false);
diff --git a/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java b/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
index ced4b0a..daaf4b3 100644
--- a/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
@@ -17,12 +17,14 @@
package com.android.settings.wallpaper;
import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.res.Resources;
import com.android.settings.SubSettings;
import com.android.settings.TestConfig;
@@ -42,16 +44,16 @@
import org.robolectric.shadows.ShadowActivity;
@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
- shadows = {
- WallpaperSuggestionActivityTest.ShadowWallpaperManagerWrapper.class
- })
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class WallpaperSuggestionActivityTest {
@Mock
private Context mContext;
@Mock
private PackageManager mPackageManager;
+ @Mock
+ private Resources mResources;
+
private ActivityController<WallpaperSuggestionActivity> mController;
@Before
@@ -72,6 +74,17 @@
}
@Test
+ public void wallpaperServiceEnabled_no_shouldReturnFalse() {
+ when(mContext.getResources()).thenReturn(mResources);
+ when(mResources.getBoolean(
+ com.android.internal.R.bool.config_enableWallpaperService)).thenReturn(false);
+
+ assertThat(WallpaperSuggestionActivity.isSuggestionComplete(mContext))
+ .isFalse();
+ }
+
+ @Test
+ @Config(shadows = WallpaperSuggestionActivityTest.ShadowWallpaperManagerWrapper.class)
public void hasWallpaperSet_no_shouldReturnFalse() {
ShadowWallpaperManagerWrapper.setWallpaperId(0);
@@ -80,6 +93,7 @@
}
@Test
+ @Config(shadows = WallpaperSuggestionActivityTest.ShadowWallpaperManagerWrapper.class)
public void hasWallpaperSet_yes_shouldReturnTrue() {
ShadowWallpaperManagerWrapper.setWallpaperId(100);
@@ -100,6 +114,15 @@
sWallpaperId = 0;
}
+ public void __constructor__(Context context) {
+
+ }
+
+ @Implementation
+ public boolean isWallpaperServiceEnabled() {
+ return true;
+ }
+
@Implementation
public int getWallpaperId(int which) {
return sWallpaperId;
diff --git a/tests/robotests/src/com/android/settings/widget/MasterCheckBoxPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/MasterCheckBoxPreferenceTest.java
index ac3e0b6..55ce27f 100644
--- a/tests/robotests/src/com/android/settings/widget/MasterCheckBoxPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/MasterCheckBoxPreferenceTest.java
@@ -106,6 +106,24 @@
}
@Test
+ public void onBindViewHolder_shouldSetCheckboxEnabledState() {
+ final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
+ LayoutInflater.from(mContext).inflate(
+ R.layout.preference_widget_master_checkbox, null));
+ final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget);
+
+ mPreference.setCheckBoxEnabled(false);
+ mPreference.onBindViewHolder(holder);
+
+ assertThat(mPreference.isEnabled()).isTrue();
+ assertThat(checkBox.isEnabled()).isFalse();
+
+ mPreference.setCheckBoxEnabled(true);
+ assertThat(mPreference.isEnabled()).isTrue();
+ assertThat(checkBox.isEnabled()).isTrue();
+ }
+
+ @Test
public void clickWidgetView_shouldToggleCheckBox() {
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
diff --git a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
new file mode 100644
index 0000000..7a042a0
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.widget;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.os.Parcelable;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SeekBarPreferenceTest {
+ private static final int MAX = 75;
+ private static final int MIN = 5;
+ private static final int PROGRESS = 16;
+
+ private Context mContext;
+ private SeekBarPreference mSeekBarPreference;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+
+ mSeekBarPreference = new SeekBarPreference(mContext);
+ mSeekBarPreference.setMax(MAX);
+ mSeekBarPreference.setMin(MIN);
+ mSeekBarPreference.setProgress(PROGRESS);
+ mSeekBarPreference.setPersistent(false);
+ }
+
+ @Test
+ public void testSaveAndRestoreInstanceState() {
+ final Parcelable parcelable = mSeekBarPreference.onSaveInstanceState();
+
+ final SeekBarPreference preference = new SeekBarPreference(mContext);
+ preference.onRestoreInstanceState(parcelable);
+
+ assertThat(preference.getMax()).isEqualTo(MAX);
+ assertThat(preference.getMin()).isEqualTo(MIN);
+ assertThat(preference.getProgress()).isEqualTo(PROGRESS);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/ConnectedAccessPointPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/ConnectedAccessPointPreferenceTest.java
index 2eaa587..c122a65 100644
--- a/tests/robotests/src/com/android/settings/wifi/ConnectedAccessPointPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/ConnectedAccessPointPreferenceTest.java
@@ -16,6 +16,8 @@
package com.android.settings.wifi;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -75,4 +77,9 @@
verify(mOnGearClickListener, never()).onGearClick(mConnectedAccessPointPreference);
}
+ @Test
+ public void testWidgetLayoutPreference() {
+ assertThat(mConnectedAccessPointPreference.getWidgetLayoutResource()).isEqualTo(
+ R.layout.preference_widget_gear_no_bg);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/wifi/WpsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WpsPreferenceControllerTest.java
deleted file mode 100644
index e4dfea4..0000000
--- a/tests/robotests/src/com/android/settings/wifi/WpsPreferenceControllerTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.wifi;
-
-import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.FragmentManager;
-import android.arch.lifecycle.LifecycleOwner;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.wifi.WifiManager;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class WpsPreferenceControllerTest {
-
- @Mock
- private Context mContext;
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private WifiManager mWifiManager;
- @Mock
- private FragmentManager mFragmentManager;
- @Mock
- private PreferenceScreen mScreen;
- @Mock
- private Preference mWpsPushPref;
- @Mock
- private Preference mWpsPinPref;
-
- private Lifecycle mLifecycle;
- private LifecycleOwner mLifecycleOwner;
- private WpsPreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- when(mContext.getSystemService(WifiManager.class))
- .thenReturn(mWifiManager);
- when(mScreen.findPreference(anyString()))
- .thenReturn(mWpsPushPref)
- .thenReturn(mWpsPinPref);
- mController = new WpsPreferenceController(
- mContext, mLifecycle, mWifiManager, mFragmentManager);
- }
-
- @Test
- public void testIsAvailable_shouldAlwaysReturnTrue() {
- assertThat(mController.isAvailable()).isTrue();
- }
-
- @Test
- public void testOnResume_shouldRegisterListener() {
- mLifecycle.handleLifecycleEvent(ON_RESUME);
- verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
- }
- @Test
- public void testOnPause_shouldUnregisterListener() {
- mLifecycle.handleLifecycleEvent(ON_RESUME);
- mLifecycle.handleLifecycleEvent(ON_PAUSE);
- verify(mContext).unregisterReceiver(any(BroadcastReceiver.class));
- }
-
- @Test
- public void testWifiStateChange_shouldToggleEnabledState() {
- when(mWifiManager.isWifiEnabled()).thenReturn(true);
-
- //Sets the preferences.
- mController.displayPreference(mScreen);
- verify(mWpsPushPref).setEnabled(true);
- verify(mWpsPinPref).setEnabled(true);
-
- Intent dummyIntent = new Intent();
- mController.mReceiver.onReceive(mContext, dummyIntent);
- verify(mWpsPushPref, times(2)).setEnabled(true);
- verify(mWpsPinPref, times(2)).setEnabled(true);
-
- when(mWifiManager.isWifiEnabled()).thenReturn(false);
- mController.mReceiver.onReceive(mContext, dummyIntent);
- verify(mWpsPushPref).setEnabled(false);
- verify(mWpsPinPref).setEnabled(false);
- }
-
- @Test
- public void testDisplayPreference_shouldSetPreferenceClickListenerAndToggleEnabledState() {
- when(mWifiManager.isWifiEnabled()).thenReturn(true);
- mController.displayPreference(mScreen);
- verify(mWpsPushPref).setOnPreferenceClickListener(any());
- verify(mWpsPinPref).setOnPreferenceClickListener(any());
- verify(mWpsPushPref).setEnabled(true);
- verify(mWpsPinPref).setEnabled(true);
- }
-
- @Test
- public void testDisplayPreference_shouldDisablePreferenceWhenWifiDisabled() {
- when(mWifiManager.isWifiEnabled()).thenReturn(false);
- mController.displayPreference(mScreen);
- verify(mWpsPushPref).setEnabled(false);
- verify(mWpsPinPref).setEnabled(false);
- }
-}