Merge "Fix null pointer from PowerUsageFeatureProvider"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a36ec8b..29459a0e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -36,6 +36,7 @@
<uses-permission android:name="com.android.certinstaller.INSTALL_AS_USER" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.TETHER_PRIVILEGED" />
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
@@ -157,7 +158,7 @@
<activity android:name=".Settings$NetworkDashboardActivity"
android:taskAffinity="com.android.settings"
android:label="@string/network_dashboard_title"
- android:icon="@drawable/ic_settings_wireless"
+ android:icon="@drawable/ic_homepage_network"
android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.WIRELESS_SETTINGS" />
@@ -183,7 +184,7 @@
<activity android:name=".Settings$ConnectedDeviceDashboardActivity"
android:taskAffinity="com.android.settings"
android:label="@string/connected_devices_dashboard_title"
- android:icon="@drawable/ic_devices_other"
+ android:icon="@drawable/ic_homepage_connected_device"
android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.NFC_SETTINGS" />
@@ -209,7 +210,7 @@
android:enabled="false"
android:taskAffinity="com.android.settings"
android:label="@string/connected_devices_dashboard_title"
- android:icon="@drawable/ic_devices_other"
+ android:icon="@drawable/ic_homepage_connected_device"
android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.NFC_SETTINGS" />
@@ -902,7 +903,7 @@
<activity android:name="Settings$DisplaySettingsActivity"
android:label="@string/display_settings"
- android:icon="@drawable/ic_settings_display"
+ android:icon="@drawable/ic_homepage_display"
android:taskAffinity="">
<intent-filter android:priority="1">
<action android:name="com.android.settings.DISPLAY_SETTINGS" />
@@ -1011,7 +1012,7 @@
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
<intent-filter android:priority="1">
- <action android:name="android.settings.DEVICE_HEALTH_SETTINGS" />
+ <action android:name="android.settings.DEVICE_INFO_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
@@ -1027,7 +1028,7 @@
<meta-data android:name="com.android.settings.title"
android:resource="@string/about_settings" />
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.MeCardFragment" />
+ android:value="com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
@@ -1283,7 +1284,7 @@
<activity android:name="Settings$SecuritySettingsActivity"
android:label="@string/security_settings_title"
- android:icon="@drawable/ic_settings_security"
+ android:icon="@drawable/ic_homepage_security"
android:configChanges="orientation|keyboardHidden|screenSize"
android:taskAffinity=""
android:parentActivityName="Settings">
@@ -1311,7 +1312,7 @@
<!-- TODO(32953042) Merge with Settings$SecuritySettingsActivity -->
<activity android:name="Settings$SecuritySettingsActivityV2"
android:label="@string/security_settings_title"
- android:icon="@drawable/ic_settings_security"
+ android:icon="@drawable/ic_homepage_security"
android:enabled="false"
android:configChanges="orientation|keyboardHidden|screenSize"
android:taskAffinity=""
@@ -1474,7 +1475,7 @@
<activity android:name="Settings$AccessibilitySettingsActivity"
android:label="@string/accessibility_settings"
- android:icon="@drawable/ic_settings_accessibility"
+ android:icon="@drawable/ic_homepage_accessibility"
android:configChanges="orientation|keyboardHidden|screenSize"
android:taskAffinity="">
<intent-filter android:priority="1">
@@ -1804,7 +1805,7 @@
<activity android:name=".Settings$StorageDashboardActivity"
android:label="@string/storage_settings"
- android:icon="@drawable/ic_settings_storage"
+ android:icon="@drawable/ic_homepage_storage"
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
<intent-filter android:priority="1">
@@ -2226,14 +2227,17 @@
<activity android:name="Settings$PowerUsageSummaryActivity"
android:label="@string/power_usage_summary_title"
- android:icon="@drawable/ic_settings_battery"
+ android:icon="@drawable/ic_homepage_battery"
android:enabled="false">
- <!-- TODO(b/69867246): add priority for this intent-filter -->
- <intent-filter>
+ <intent-filter android:priority="1">
<action android:name="android.intent.action.POWER_USAGE_SUMMARY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
- <!-- TODO(b/69867246): add shortcut intent-filter -->
+ <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="8">
<action android:name="com.android.settings.action.SETTINGS" />
</intent-filter>
@@ -2254,16 +2258,11 @@
<activity android:name=".Settings$PowerUsageSummaryLegacyActivity"
android:label="@string/power_usage_summary_title"
- android:icon="@drawable/ic_settings_battery">
- <intent-filter android:priority="1">
+ android:icon="@drawable/ic_homepage_battery">
+ <intent-filter>
<action android:name="android.intent.action.POWER_USAGE_SUMMARY" />
<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" />
- <category android:name="com.android.settings.SHORTCUT" />
- </intent-filter>
<intent-filter android:priority="8">
<action android:name="com.android.settings.action.SETTINGS" />
</intent-filter>
@@ -2644,7 +2643,7 @@
<!-- Keep compatibility with old shortcuts. -->
<activity android:name="Settings$SoundSettingsActivity"
android:label="@string/sound_settings"
- android:icon="@drawable/ic_settings_sound"
+ android:icon="@drawable/ic_homepage_sound"
android:taskAffinity=""
android:exported="true">
<intent-filter android:priority="1">
@@ -2714,10 +2713,6 @@
<!-- Show channel group-level notification settings (group passed in as extras) -->
<activity android:name="Settings$ChannelGroupNotificationSettingsActivity"
android:exported="true">
- <intent-filter android:priority="1">
- <action android:name="android.settings.CHANNEL_GROUP_NOTIFICATION_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" />
@@ -3091,7 +3086,7 @@
<!-- 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_apps">
+ android:icon="@drawable/ic_homepage_apps">
<intent-filter android:priority="9">
<action android:name="com.android.settings.action.SETTINGS"/>
</intent-filter>
@@ -3105,7 +3100,7 @@
<activity android:name=".Settings$UserAndAccountDashboardActivity"
android:label="@string/account_dashboard_title"
- android:icon="@drawable/ic_settings_accounts">
+ android:icon="@drawable/ic_homepage_accounts">
<intent-filter android:priority="3">
<action android:name="com.android.settings.action.SETTINGS"/>
</intent-filter>
@@ -3123,7 +3118,7 @@
<activity android:name=".Settings$SystemDashboardActivity"
android:label="@string/header_category_system"
- android:icon="@drawable/ic_settings_about">
+ android:icon="@drawable/ic_homepage_system_dashboard">
<intent-filter android:priority="-1">
<action android:name="com.android.settings.action.SETTINGS"/>
</intent-filter>
@@ -3137,7 +3132,7 @@
<activity android:name=".support.SupportDashboardActivity"
android:label="@string/page_tab_title_support"
- android:icon="@drawable/ic_help"
+ android:icon="@drawable/ic_homepage_support"
android:theme="@android:style/Theme.DeviceDefault.Light.Panel"
android:enabled="@bool/config_support_enabled">
<intent-filter android:priority="-2">
@@ -3228,99 +3223,6 @@
android:permission="android.permission.DUMP"
android:enabled="@bool/config_has_help" />
-
- <!-- Activities for moves/gestures suggestions -->
- <activity
- android:name=".Settings$DoubleTapPowerSuggestionActivity"
- android:label="@string/double_tap_power_for_camera_title"
- android:icon="@drawable/ic_settings_gestures">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="com.android.settings.suggested.category.GESTURE" />
- </intent-filter>
- <meta-data android:name="com.android.settings.dismiss"
- android:value="4,8,30" />
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.gestures.DoubleTapPowerSettings"/>
- <meta-data android:name="com.android.settings.title"
- android:resource="@string/double_tap_power_for_camera_suggestion_title" />
- <meta-data android:name="com.android.settings.summary"
- android:resource="@string/double_tap_power_for_camera_suggestion_summary" />
- </activity>
-
- <activity
- android:name=".Settings$DoubleTwistSuggestionActivity"
- android:label="@string/double_twist_for_camera_mode_title"
- android:icon="@drawable/ic_settings_gestures">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="com.android.settings.suggested.category.GESTURE" />
- </intent-filter>
- <meta-data android:name="com.android.settings.dismiss"
- android:value="4,8,30" />
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.gestures.DoubleTwistGestureSettings"/>
- <meta-data android:name="com.android.settings.title"
- android:resource="@string/double_twist_for_camera_suggestion_title" />
- <meta-data android:name="com.android.settings.summary"
- android:resource="@string/double_twist_for_camera_suggestion_summary" />
- </activity>
-
- <activity
- android:name=".Settings$AmbientDisplaySuggestionActivity"
- android:label="@string/ambient_display_title"
- android:icon="@drawable/ic_settings_gestures">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="com.android.settings.suggested.category.GESTURE" />
- </intent-filter>
- <meta-data android:name="com.android.settings.dismiss"
- android:value="9,13,30" />
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.gestures.DoubleTapScreenSettings"/>
- <meta-data android:name="com.android.settings.title"
- android:resource="@string/ambient_display_title" />
- <meta-data android:name="com.android.settings.summary"
- android:resource="@string/ambient_display_suggestion_summary" />
- </activity>
-
- <activity
- android:name=".Settings$AmbientDisplayPickupSuggestionActivity"
- android:label="@string/ambient_display_pickup_title"
- android:icon="@drawable/ic_settings_gestures">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="com.android.settings.suggested.category.GESTURE" />
- </intent-filter>
- <meta-data android:name="com.android.settings.dismiss"
- android:value="9,13,30" />
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.gestures.PickupGestureSettings"/>
- <meta-data android:name="com.android.settings.title"
- android:resource="@string/ambient_display_pickup_title" />
- <meta-data android:name="com.android.settings.summary"
- android:resource="@string/ambient_display_pickup_suggestion_summary" />
- </activity>
-
- <activity
- android:name=".Settings$SwipeToNotificationSuggestionActivity"
- android:label="@string/fingerprint_swipe_for_notifications_title"
- android:icon="@drawable/ic_settings_gestures">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="com.android.settings.suggested.category.GESTURE" />
- </intent-filter>
- <meta-data android:name="com.android.settings.dismiss"
- android:value="9,13,30" />
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.gestures.SwipeToNotificationSettings"/>
- <meta-data android:name="com.android.settings.title"
- android:resource="@string/fingerprint_swipe_for_notifications_suggestion_title" />
- <meta-data android:name="com.android.settings.summary"
- android:resource="@string/fingerprint_swipe_for_notifications_suggestion_summary" />
- </activity>
- <!-- End activities for moves/gestures suggestions -->
-
<activity android:name=".applications.autofill.AutofillPickerActivity"
android:excludeFromRecents="true"
android:launchMode="singleInstance"
@@ -3358,6 +3260,17 @@
android:value="true" />
</activity>
+ <activity android:name="Settings$DirectoryAccessSettingsActivity"
+ android:label="@string/directory_access"
+ android:taskAffinity="">
+ <intent-filter>
+ <action android:name="android.settings.STORAGE_VOLUME_ACCESS_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.applications.manageapplications.ManageApplications" />
+ </activity>
+
<provider android:name=".slices.SettingsSliceProvider"
android:authorities="com.android.settings.slices"
android:exported="true">
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 506770c..066dab9 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -93,7 +93,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout-land/choose_lock_pattern.xml"
- line="160"
+ line="170"
column="17"/>
</issue>
@@ -1081,6 +1081,214 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_network_background">#2196F3</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="123"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_connected_device_background">#71A234</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="124"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_app_and_notification_background">#FF7E0F</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="125"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_battery_background">#258982</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="126"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_display_background">#FFB600</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="127"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_sound_background">#01B1AF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="128"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_storage_background">#C14CE6</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="129"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_security_background">#0F9D58</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="130"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_accounts_background">#F15B8D</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="131"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_accessibility_background">#5011C1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="132"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_system_background">#757575</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="133"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_support_background">#26459C</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="134"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="homepage_generic_icon_background">#1A73E8</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="135"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
errorLine1=" android:background="@color/condition_card_background""
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -1449,6 +1657,198 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_accessibility_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_accessibility.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_accounts_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_accounts.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_app_and_notification_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_apps.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_battery_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_battery.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_connected_device_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_connected_device.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_display_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_display.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_network_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_network.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_security_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_security.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_sound_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_sound.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_storage_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_storage.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_support_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_support.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/homepage_system_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_system_dashboard.xml"
+ line="24"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
errorLine1=" android:tint="#db4437""
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2073,22 +2473,6 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" <string name="sync_plug" msgid="3905078969081888738">""<font fgcolor="#ffffffff">"Welcome to Google sync!"</font>" \nA Google approach to syncing data to allow access to your contacts, appointments, and more from wherever you are."</string>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values-en-rXC/strings.xml"
- line="2353"
- column="168"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
errorLine1=" <string name="sync_plug" msgid="3905078969081888738"><font fgcolor="#ffffffff">"Welcome to Google sync!"</font>" \nA Google approach to syncing data to allow access to your contacts, appointments and more from wherever you are."</string>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
@@ -2153,11 +2537,27 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <string name="sync_plug" msgid="3905078969081888738">""<font fgcolor="#ffffffff">"Welcome to Google sync!"</font>" \nA Google approach to syncing data to allow access to your contacts, appointments, and more from wherever you are."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values-en-rXC/strings.xml"
+ line="2396"
+ column="168"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
errorLine1=" <string name="sync_plug"><font fgcolor="#ffffffff">Welcome to Google sync!</font>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/strings.xml"
- line="5539"
+ line="5637"
column="36"/>
</issue>
@@ -2189,7 +2589,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="442"
+ line="437"
column="44"/>
</issue>
@@ -2205,7 +2605,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="448"
+ line="443"
column="44"/>
</issue>
@@ -2221,7 +2621,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="449"
+ line="444"
column="44"/>
</issue>
@@ -2237,7 +2637,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="472"
+ line="467"
column="41"/>
</issue>
@@ -2445,7 +2845,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="316"
+ line="308"
column="45"/>
</issue>
@@ -2461,7 +2861,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="317"
+ line="309"
column="49"/>
</issue>
@@ -2477,7 +2877,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="325"
+ line="317"
column="45"/>
</issue>
@@ -2493,7 +2893,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="326"
+ line="318"
column="49"/>
</issue>
diff --git a/res/drawable/ic_apps.xml b/res/drawable/ic_apps.xml
index 9f00141..841c25a 100644
--- a/res/drawable/ic_apps.xml
+++ b/res/drawable/ic_apps.xml
@@ -17,8 +17,7 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="?android:attr/colorControlNormal">
+ android:viewportHeight="24.0">
<path
android:pathData="M6 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6 12c1.1 0 2-.9 2-2s-.9-2-2-2-2
.9-2 2 .9 2 2 2zm-6 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0-6c1.1 0 2-.9
diff --git a/res/drawable/ic_devices_other.xml b/res/drawable/ic_devices_other.xml
index b22e483..b40aceb 100644
--- a/res/drawable/ic_devices_other.xml
+++ b/res/drawable/ic_devices_other.xml
@@ -17,8 +17,7 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="?android:attr/colorControlNormal">
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3,6h17c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H3C1.9,4,1,4.9,1,6v12c0,1.1,0.9,2,2,2h3c0.55,0,1-0.45,1-1v0
diff --git a/res/drawable/ic_help.xml b/res/drawable/ic_help.xml
index 6add484..841de58 100644
--- a/res/drawable/ic_help.xml
+++ b/res/drawable/ic_help.xml
@@ -17,8 +17,7 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="?android:attr/colorControlNormal">
+ android:viewportHeight="24.0">
<path
android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 16.81c-.72
0-1.3-.58-1.3-1.3s.58-1.3 1.3-1.3 1.3 .58 1.3 1.3-.58 1.3-1.3
diff --git a/res/drawable/ic_help_24dp.xml b/res/drawable/ic_help_24dp.xml
deleted file mode 100644
index d80b717..0000000
--- a/res/drawable/ic_help_24dp.xml
+++ /dev/null
@@ -1,31 +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.
--->
-
-<vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="?android:attr/colorAccent">
- <path
- android:fillColor="#FF000000"
- android:pathData="M20,19.59V8l-6,-6H6c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2
- 1.99,2H18c0.45,0 0.85,-0.15 1.19,-0.4l-4.43,-4.43c-0.8,0.52 -1.74,0.83 -2.76,0.83 -2.76,0
- -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5c0,1.02 -0.31,1.96 -0.83,2.75L20,19.59zM9,13c0,1.66
- 1.34,3 3,3s3,-1.34 3,-3 -1.34,-3 -3,-3 -3,1.34 -3,3z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_homepage_accessibility.xml b/res/drawable/ic_homepage_accessibility.xml
new file mode 100644
index 0000000..6cfb124
--- /dev/null
+++ b/res/drawable/ic_homepage_accessibility.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_accessibility_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_accessibility" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_accounts.xml b/res/drawable/ic_homepage_accounts.xml
new file mode 100644
index 0000000..4cfccc2
--- /dev/null
+++ b/res/drawable/ic_homepage_accounts.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_accounts_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_accounts" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_apps.xml b/res/drawable/ic_homepage_apps.xml
new file mode 100644
index 0000000..d494799
--- /dev/null
+++ b/res/drawable/ic_homepage_apps.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_app_and_notification_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_apps" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_battery.xml b/res/drawable/ic_homepage_battery.xml
new file mode 100644
index 0000000..d9ad3d3
--- /dev/null
+++ b/res/drawable/ic_homepage_battery.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_battery_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_battery_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_connected_device.xml b/res/drawable/ic_homepage_connected_device.xml
new file mode 100644
index 0000000..20707fb
--- /dev/null
+++ b/res/drawable/ic_homepage_connected_device.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_connected_device_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_devices_other" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_display.xml b/res/drawable/ic_homepage_display.xml
new file mode 100644
index 0000000..ec5e54f
--- /dev/null
+++ b/res/drawable/ic_homepage_display.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_display_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_display_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_network.xml b/res/drawable/ic_homepage_network.xml
new file mode 100644
index 0000000..c72e152
--- /dev/null
+++ b/res/drawable/ic_homepage_network.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_network_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_wireless_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_security.xml b/res/drawable/ic_homepage_security.xml
new file mode 100644
index 0000000..52dedfb
--- /dev/null
+++ b/res/drawable/ic_homepage_security.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_security_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_security_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_sound.xml b/res/drawable/ic_homepage_sound.xml
new file mode 100644
index 0000000..7210889
--- /dev/null
+++ b/res/drawable/ic_homepage_sound.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_sound_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_sound_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_storage.xml b/res/drawable/ic_homepage_storage.xml
new file mode 100644
index 0000000..e7f5819
--- /dev/null
+++ b/res/drawable/ic_homepage_storage.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_storage_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_storage_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_support.xml b/res/drawable/ic_homepage_support.xml
new file mode 100644
index 0000000..31d51bf
--- /dev/null
+++ b/res/drawable/ic_homepage_support.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_support_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_help" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_system_dashboard.xml b/res/drawable/ic_homepage_system_dashboard.xml
new file mode 100644
index 0000000..bf3d0eb
--- /dev/null
+++ b/res/drawable/ic_homepage_system_dashboard.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid
+ android:color="@color/homepage_system_background" />
+ <size
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size" />
+ </shape>
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_system_dashboard_white" />
+</layer-list>
diff --git a/res/drawable/ic_settings_accessibility.xml b/res/drawable/ic_settings_accessibility.xml
index 4cf5182..67b6c9a 100644
--- a/res/drawable/ic_settings_accessibility.xml
+++ b/res/drawable/ic_settings_accessibility.xml
@@ -17,8 +17,7 @@
android:width="24.0dp"
android:height="24.0dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="?android:attr/colorControlNormal">
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M20.75,6.99c-0.14,-0.55 -0.69,-0.87 -1.24,-0.75C17.13,6.77 14.48,7 12,7S6.87,6.77 4.49,6.24c-0.55,-0.12 -1.1,0.2 -1.24,0.75l0,0C3.11,7.55 3.45,8.12 4,8.25C5.61,8.61 7.35,8.86 9,9v12c0,0.55 0.45,1 1,1h0c0.55,0 1,-0.45 1,-1v-5h2v5c0,0.55 0.45,1 1,1h0c0.55,0 1,-0.45 1,-1V9c1.65,-0.14 3.39,-0.39 5,-0.75C20.55,8.12 20.89,7.55 20.75,6.99L20.75,6.99zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S10.9,6 12,6z"/>
diff --git a/res/drawable/ic_settings_accounts.xml b/res/drawable/ic_settings_accounts.xml
index 154c09c..d152b14 100644
--- a/res/drawable/ic_settings_accounts.xml
+++ b/res/drawable/ic_settings_accounts.xml
@@ -17,8 +17,7 @@
android:width="24.0dp"
android:height="24.0dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="?android:attr/colorControlNormal">
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3.0,5.0
diff --git a/res/drawable/ic_settings_battery_white.xml b/res/drawable/ic_settings_battery_white.xml
new file mode 100644
index 0000000..255b75e
--- /dev/null
+++ b/res/drawable/ic_settings_battery_white.xml
@@ -0,0 +1,24 @@
+<!--
+ 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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V5.33C17,4.6 16.4,4 15.67,4z"/>
+</vector>
diff --git a/res/drawable/ic_settings_display_white.xml b/res/drawable/ic_settings_display_white.xml
new file mode 100644
index 0000000..4a41691
--- /dev/null
+++ b/res/drawable/ic_settings_display_white.xml
@@ -0,0 +1,27 @@
+<!--
+ 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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M20,15.31l2.6-2.6c0.39-0.39,0.39-1.02,0-1.41L20,8.69V5c0-0.55-0.45-1-1-1h-3.69l-2.6-2.6c-0.39-0.39-1.02-0.39-1.41,0
+L8.69,4H5C4.45,4,4,4.45,4,5v3.69l-2.6,2.6c-0.39,0.39-0.39,1.02,0,1.41l2.6,2.6V19c0,0.55,0.45,1,1,1h3.69l2.6,2.6
+c0.39,0.39,1.02,0.39,1.41,0l2.6-2.6H19c0.55,0,1-0.45,1-1V15.31z
+M12,18V6c3.31,0,6,2.69,6,6S15.31,18,12,18z"/>
+</vector>
diff --git a/res/drawable/ic_settings_security_white.xml b/res/drawable/ic_settings_security_white.xml
new file mode 100644
index 0000000..d6c5b64
--- /dev/null
+++ b/res/drawable/ic_settings_security_white.xml
@@ -0,0 +1,24 @@
+<!--
+ 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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.76 -2.24,-5.0 -5.0,-5.0S7.0,3.24 7.0,6.0l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.0 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0zm-6.0,9.0c-1.1,0.0 -2.0,-0.9 -2.0,-2.0s0.9,-2.0 2.0,-2.0 2.0,0.9 2.0,2.0 -0.9,2.0 -2.0,2.0zm3.1,-9.0L8.9,8.0L8.9,6.0c0.0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0.0 3.1,1.39 3.1,3.1l0.0,2.0z"/>
+</vector>
diff --git a/res/drawable/ic_settings_sound_white.xml b/res/drawable/ic_settings_sound_white.xml
new file mode 100644
index 0000000..4737349
--- /dev/null
+++ b/res/drawable/ic_settings_sound_white.xml
@@ -0,0 +1,29 @@
+<!--
+ 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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M3 10v4c0 .55 .45 1 1 1h3l3.29 3.29c.63 .63 1.71 .18
+1.71-.71V6.41c0-.89-1.08-1.34-1.71-.71L7 9H4c-.55 0-1 .45-1 1zm13.5 2A4.5 4.5 0
+0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 4.46v.19c0 .38 .25 .71 .61
+.85C17.18 6.54 19 9.06 19 12s-1.82 5.46-4.39 6.5c-.36 .14 -.61 .47 -.61 .85
+v.19c0 .63 .63 1.08 1.22 .86 a8.995 8.995 0 0 0 0-16.8c-.59-.23-1.22 .23 -1.22
+.86 z"/>
+</vector>
diff --git a/res/drawable/ic_settings_storage_white.xml b/res/drawable/ic_settings_storage_white.xml
new file mode 100644
index 0000000..8f662f3
--- /dev/null
+++ b/res/drawable/ic_settings_storage_white.xml
@@ -0,0 +1,24 @@
+<!--
+ 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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M20,16L4,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2zM5,19.1c-0.61,0 -1.1,-0.49 -1.1,-1.1 0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1c0,0.61 -0.49,1.1 -1.1,1.1zM4,8h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2L4,4c-1.1,0 -2,0.9 -2,2s0.9,2 2,2zM5,4.9c0.61,0 1.1,0.49 1.1,1.1 0,0.61 -0.49,1.1 -1.1,1.1S3.9,6.61 3.9,6c0,-0.61 0.49,-1.1 1.1,-1.1zM20,10L4,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2zM5,13.1c-0.61,0 -1.1,-0.49 -1.1,-1.1 0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1c0,0.61 -0.49,1.1 -1.1,1.1z"/>
+</vector>
diff --git a/res/drawable/ic_settings_system_dashboard_white.xml b/res/drawable/ic_settings_system_dashboard_white.xml
new file mode 100644
index 0000000..5308cb0
--- /dev/null
+++ b/res/drawable/ic_settings_system_dashboard_white.xml
@@ -0,0 +1,30 @@
+<!--
+ 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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M12,17L12,17c0.55,0 1,-0.45 1,-1v-4c0,-0.55 -0.45,-1 -1,-1l0,0c-0.55,0 -1,0.45 -1,1v4C11,16.55 11.45,17 12,17z"/>
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M12,2c-5.52,0 -10,4.48 -10,10s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20z"/>
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M12,9.1L12,9.1c0.61,0 1.1,-0.49 1.1,-1.1l0,0c0,-0.61 -0.49,-1.1 -1.1,-1.1l0,0c-0.61,0 -1.1,0.49 -1.1,1.1l0,0C10.9,8.61 11.39,9.1 12,9.1z"/>
+</vector>
diff --git a/res/drawable/ic_settings_wireless_white.xml b/res/drawable/ic_settings_wireless_white.xml
new file mode 100644
index 0000000..8dedb0d
--- /dev/null
+++ b/res/drawable/ic_settings_wireless_white.xml
@@ -0,0 +1,24 @@
+<!--
+ 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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M23.66,8.11c0.39,-0.48 0.29,-1.19 -0.22,-1.54C21.67,5.36 17.55,3 12,3 6.44,3 2.33,5.36 0.56,6.57c-0.51,0.35 -0.61,1.06 -0.23,1.54L11.16,21.6c0.42,0.53 1.23,0.53 1.66,0L23.66,8.11z"/>
+</vector>
diff --git a/res/layout/dialog_sim_status.xml b/res/layout/dialog_sim_status.xml
index 66b17d7..66d583b 100644
--- a/res/layout/dialog_sim_status.xml
+++ b/res/layout/dialog_sim_status.xml
@@ -141,5 +141,18 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/device_info_not_available"/>
+
+ <TextView
+ style="@style/device_info_dialog_label"
+ android:id="@+id/esim_id_label"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/status_esim_id"/>
+ <TextView
+ style="@style/device_info_dialog_value"
+ android:id="@+id/esim_id_value"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/device_info_not_available"/>
</LinearLayout>
</ScrollView>
diff --git a/res/layout/suggestion_container.xml b/res/layout/suggestion_container.xml
index e01a590..9110c58 100644
--- a/res/layout/suggestion_container.xml
+++ b/res/layout/suggestion_container.xml
@@ -20,7 +20,7 @@
style="@style/SuggestionConditionStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingTop="20dp"
+ android:paddingTop="12dp"
android:orientation="vertical">
<LinearLayout
@@ -55,7 +55,7 @@
android:id="@+id/suggestion_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingTop="20dp"
+ android:paddingTop="18dp"
android:paddingBottom="16dp"
android:scrollbars="none"/>
diff --git a/res/layout/suggestion_tile_v2.xml b/res/layout/suggestion_tile_v2.xml
index 27b3c34..e04febb 100644
--- a/res/layout/suggestion_tile_v2.xml
+++ b/res/layout/suggestion_tile_v2.xml
@@ -20,6 +20,7 @@
android:id="@+id/suggestion_card"
android:layout_width="328dp"
android:layout_height="wrap_content"
+ app:cardPreventCornerOverlap="false"
app:cardUseCompatPadding="true"
app:cardElevation="2dp"
app:cardCornerRadius="@dimen/suggestion_card_corner_radius">
@@ -37,16 +38,17 @@
<ImageView
android:id="@android:id/icon"
- android:layout_width="@dimen/dashboard_tile_image_size"
- android:layout_height="@dimen/dashboard_tile_image_size"
+ android:layout_width="@dimen/suggestion_card_icon_size"
+ android:layout_height="@dimen/suggestion_card_icon_size"
style="@style/SuggestionCardIcon"
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp" />
<ImageView
android:id="@+id/close_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_width="18dp"
+ android:layout_height="18dp"
+ android:alpha="0.54"
android:layout_alignParentEnd="true"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
@@ -62,7 +64,7 @@
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:singleLine="true"
- android:textAppearance="@style/TextAppearance.TileTitle"
+ android:textAppearance="@style/TextAppearance.SuggestionTitleV2"
android:ellipsize="marquee"
android:fadingEdge="horizontal" />
diff --git a/res/layout/zen_mode_settings_button.xml b/res/layout/zen_mode_settings_button.xml
index 82989fc..4fe522d7 100644
--- a/res/layout/zen_mode_settings_button.xml
+++ b/res/layout/zen_mode_settings_button.xml
@@ -30,7 +30,7 @@
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
- android:layout_gravity="center"
+ android:layout_gravity="left"
android:text="@string/zen_mode_button_turn_on"
android:paddingEnd="8dp" />
@@ -40,7 +40,7 @@
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
- android:layout_gravity="center"
+ android:layout_gravity="left"
android:text="@string/zen_mode_button_turn_off"
android:paddingEnd="8dp" />
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 7ab9afb..cb6f9be 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -266,14 +266,16 @@
<item>PWD</item>
</string-array>
- <!-- Wi-Fi AP band settings. Either 2.4GHz or 5GHz. -->
+ <!-- Wi-Fi AP band settings. Either Auto, 2.4GHz or 5GHz. -->
<!-- Note that adding/removing/moving the items will need wifi settings code change. -->
<string-array name="wifi_ap_band_config_full">
+ <item>@string/wifi_ap_choose_auto</item>
<item>@string/wifi_ap_choose_2G</item>
<item>@string/wifi_ap_choose_5G</item>
</string-array>
<string-array name="wifi_ap_band_config_2G_only">
+ <item>@string/wifi_ap_choose_auto</item>
<item>@string/wifi_ap_choose_2G</item>
</string-array>
diff --git a/res/values/bools.xml b/res/values/bools.xml
index e4a57ab..ab8a6fd 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -155,4 +155,7 @@
<!-- Whether assist_and_voice_input should be shown or not. -->
<bool name="config_show_assist_and_voice_input">true</bool>
+
+ <!-- Whether system_update_settings should be shown or not. -->
+ <bool name="config_show_system_update_settings">true</bool>
</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 72f2d91..e10b4cb 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -118,4 +118,22 @@
<!-- Suggestion/condition colors -->
<color name="suggestion_condition_background">#f2f2f2</color>
<color name="condition_card_background">#f8f8f8</color>
+
+ <!-- Dashboard/homepage icon background colors -->
+ <color name="homepage_network_background">#2196F3</color>
+ <color name="homepage_connected_device_background">#71A234</color>
+ <color name="homepage_app_and_notification_background">#FF7E0F</color>
+ <color name="homepage_battery_background">#258982</color>
+ <color name="homepage_display_background">#FFB600</color>
+ <color name="homepage_sound_background">#01B1AF</color>
+ <color name="homepage_storage_background">#C14CE6</color>
+ <color name="homepage_security_background">#0F9D58</color>
+ <color name="homepage_accounts_background">#F15B8D</color>
+ <color name="homepage_accessibility_background">#5011C1</color>
+ <color name="homepage_system_background">#757575</color>
+ <color name="homepage_support_background">#26459C</color>
+ <color name="homepage_generic_icon_background">#1A73E8</color>
+ <!-- End of dashboard/homepage icon background colors -->
+
</resources>
+
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d4071ed..332deea 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -101,18 +101,20 @@
<dimen name="dashboard_tile_minimum_height">72dp</dimen>
<!-- Dashboard image tile size -->
- <dimen name="dashboard_tile_image_size">24dp</dimen>
+ <dimen name="dashboard_tile_image_size">36dp</dimen>
+
+ <!-- Dashboard foreground image size -->
+ <dimen name="dashboard_tile_foreground_image_size">24dp</dimen>
+
+ <!-- Dashboard foreground image inset (from background edge to foreground edge) -->
+ <dimen name="dashboard_tile_foreground_image_inset">6dp</dimen>
<!-- Dashboard tile image margin start / end -->
<dimen name="dashboard_tile_image_margin">24dp</dimen>
- <!-- SwitchBar margin start / end -->
- <dimen name="switchbar_margin_start">16dp</dimen>
- <dimen name="switchbar_margin_end">16dp</dimen>
-
<!-- SwitchBar sub settings margin start / end -->
<dimen name="switchbar_subsettings_margin_start">72dp</dimen>
- <dimen name="switchbar_subsettings_margin_end">24dp</dimen>
+ <dimen name="switchbar_subsettings_margin_end">16dp</dimen>
<!-- The following two margins need to match, with the caveat that
the second should be negative. The second one ensures that the icons and text
@@ -301,6 +303,7 @@
<dimen name="suggestion_condition_header_padding_expanded">5dp</dimen>
<!-- Suggestion cards size and padding -->
+ <dimen name="suggestion_card_icon_size">24dp</dimen>
<dimen name="suggestion_card_width_one_card">328dp</dimen>
<dimen name="suggestion_card_width_two_cards">158dp</dimen>
<dimen name="suggestion_card_width_multiple_cards">152dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index eea6ddd..fe1783b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -788,6 +788,10 @@
<string name="security_enable_widgets_title">Enable widgets</string>
<!-- Summary for settings checkbox to disable widgets when the setting has been disabled by an installed device admin [CHAR LIMIT=50] -->
<string name="security_enable_widgets_disabled_summary">Disabled by admin</string>
+ <!-- Text shown for the title of the lockdown option -->
+ <string name="lockdown_settings_title">Show lockdown option</string>
+ <!-- Text shown for the description of the lockdown option -->
+ <string name="lockdown_settings_summary">Display power button option that turns off extended access and fingerprint unlocking.</string>
<!-- Text shown for summary of owner info setting (if none set) [CHAR LIMIT=40]-->
<string name="owner_info_settings_summary">None</string>
<!-- Description of how many characters are used in owner info [CHAR LIMIT=40]-->
@@ -1116,14 +1120,18 @@
<!-- Security Picker --><skip />
- <!-- Title for suggested actions for screen lock -->
- <string name="suggested_lock_settings_title">Set screen lock</string>
+ <!-- Title for suggested actions for screen lock [CHAR LIMIT=34] -->
+ <string name="suggested_lock_settings_title">Set screen lock for security</string>
- <!-- Summary for suggested actions for screen lock -->
- <string name="suggested_lock_settings_summary">Protect your device</string>
+ <!-- Summary for suggested actions for screen lock (tablet) -->
+ <string name="suggested_lock_settings_summary" product="tablet">Prevent others from using your tablet</string>
+ <!-- Summary for suggested actions for screen lock (device) -->
+ <string name="suggested_lock_settings_summary" product="device">Prevent others from using your device</string>
+ <!-- Summary for suggested actions for screen lock (phone) -->
+ <string name="suggested_lock_settings_summary" product="default">Prevent others from using your phone</string>
- <!-- Title for suggested actions for settings up a fingerprint lock -->
- <string name="suggested_fingerprint_lock_settings_title">Use fingerprint</string>
+ <!-- Title for suggested actions for settings up a fingerprint lock [CHAR LIMIT=34] -->
+ <string name="suggested_fingerprint_lock_settings_title">Unlock with fingerprint</string>
<!-- Summary for suggested actions for settings up a fingerprint lock -->
<string name="suggested_fingerprint_lock_settings_summary">Unlock with your fingerprint</string>
@@ -1941,6 +1949,8 @@
<string name="wifi_show_password">Show password</string>
<!-- Label for the RadioGroup to choose wifi ap band -->
<string name="wifi_ap_band_config">Select AP Band</string>
+ <!-- Label for the radio button to choose wifi ap channel automatically-->
+ <string name="wifi_ap_choose_auto">Auto</string>
<!-- Label for the radio button to choose wifi ap 2.4 GHz band -->
<string name="wifi_ap_choose_2G">2.4 GHz Band</string>
<!-- Label for the radio button to choose wifi ap 5GHz band -->
@@ -2247,7 +2257,7 @@
<!-- Title of suggestion to turn on wifi calling [CHAR LIMIT=30] -->
<string name="wifi_calling_suggestion_title">Turn on Wi-Fi Calling</string>
<!-- Summary of suggestion to turn on wifi calling [CHAR LIMIT=60] -->
- <string name="wifi_calling_suggestion_summary">Use Wi-Fi instead of mobile network</string>
+ <string name="wifi_calling_suggestion_summary">Extend coverage by calling over Wi-Fi</string>
<!-- Title of WFC preference item [CHAR LIMIT=30] -->
<string name="wifi_calling_mode_title">Calling preference</string>
<!-- Title of WFC preference selection dialog [CHAR LIMIT=30] -->
@@ -2755,6 +2765,8 @@
<string name="status_latest_area_info">Operator info</string>
<!-- About phone, status item title. The status of data access. For example, the value may be "Connected" -->
<string name="status_data_state">Mobile network state</string>
+ <!-- About phone, status item title. The ID of embedded SIM card. -->
+ <string name="status_esim_id">EID</string>
<!-- About phone, status item title. The status of whether we have service. for example, the value may be "In service" -->
<string name="status_service_state">Service state</string>
<!-- About phone, status item title. The current cell tower signal strength -->
@@ -3216,7 +3228,7 @@
<!-- SD card & phone storage settings screen, title for the checkbox to let user decide whether erase eSIM data together [CHAR LIMIT=NONE] -->
<string name="reset_esim_title">Also reset eSIMs</string>
<!-- SD card & phone storage settings screen, message for the checkbox to let user decide whether erase eSIM data together [CHAR LIMIT=NONE] -->
- <string name="reset_esim_desc">Erase all eSIMs on the phone. You\u2019ll have to contract your carrier to redownload your eSIMs. This will not cancel your mobile service plan.</string>
+ <string name="reset_esim_desc">Erase all eSIMs on the phone. You\u2019ll have to contact your carrier to redownload your eSIMs. This will not cancel your mobile service plan.</string>
<!-- SD card & phone storage settings screen, button on screen after user selects Reset network settings -->
<string name="reset_network_button_text">Reset settings</string>
<!-- SD card & phone storage settings screen, message on screen after user selects Reset settings button -->
@@ -3379,16 +3391,6 @@
<string name="location_title">My Location</string>
<!-- [CHAR LIMIT=30] Title for managed profile location switch -->
<string name="managed_profile_location_switch_title">Location for work profile</string>
- <!-- [CHAR LIMIT=30] Location settings screen, setting preference screen box label for location mode -->
- <string name="location_mode_title">Mode</string>
- <!-- [CHAR LIMIT=30] Location settings screen, high accuracy location mode -->
- <string name="location_mode_high_accuracy_title">High accuracy</string>
- <!-- [CHAR LIMIT=30] Location settings screen, battery saving location mode -->
- <string name="location_mode_battery_saving_title">Battery saving</string>
- <!-- [CHAR LIMIT=30] Location settings screen, device only location mode -->
- <string name="location_mode_sensors_only_title">Device only</string>
- <!-- [CHAR LIMIT=30] Location settings screen, location off mode -->
- <string name="location_mode_location_off_title">Location off</string>
<!-- [CHAR LIMIT=30] Location settings screen. It's a link that directs the user to a page that
shows the location permission setting for each installed app -->
<string name="location_app_level_permissions">App-level permissions</string>
@@ -3402,14 +3404,6 @@
<string name="location_high_battery_use">High battery use</string>
<!-- [CHAR LIMIT=30] Location settings screen, recent location requests low battery use-->
<string name="location_low_battery_use">Low battery use</string>
- <!-- [CHAR LIMIT=30] Location mode screen, screen title -->
- <string name="location_mode_screen_title">Location mode</string>
- <!-- [CHAR LIMIT=130] Location mode screen, description for high accuracy mode -->
- <string name="location_mode_high_accuracy_description">Use GPS, Wi\u2011Fi, Bluetooth, or mobile networks to determine location </string>
- <!-- [CHAR LIMIT=130] Location mode screen, description for battery saving mode -->
- <string name="location_mode_battery_saving_description">Use Wi\u2011Fi, Bluetooth, or mobile networks to determine location</string>
- <!-- [CHAR LIMIT=130] Location mode screen, description for sensors only mode -->
- <string name="location_mode_sensors_only_description">Use GPS and device sensors to determine location</string>
<!-- [CHAR LIMIT=30] Wireless background scanning settings screen, screen title -->
<string name="location_scanning_screen_title">Scanning</string>
<!-- [CHAR LIMIT=130] Preference title for Wi-Fi always scanning -->
@@ -5588,10 +5582,12 @@
<string name="add_account_label">Add account</string>
<!-- Label for the state of the work profile [CHAR LIMIT=80] -->
<string name="managed_profile_not_available_label">Work profile isn\u2019t available yet</string>
- <!-- Account Settings. The preference title for enabling work mode -->
- <string name="work_mode_label">Work mode</string>
- <!-- Account Settings. The preference summary for enabling work mode -->
- <string name="work_mode_summary">Allow work profile to function, including apps, background sync, and related features</string>
+ <!-- This string is the title of a setting. If a user taps the setting, they can turn their work profile on or off. The work profile is a section of their phone that's managed by their employer. "Work" is an adjective. -->
+ <string name="work_mode_label">Work profile</string>
+ <!-- This string is located under a setting and describes what the setting does. It's letting a user know whether their work profile is on or off, and they can use the setting to turn it on or off. The work profile is a section of their phone that's managed by their employer. "Work" is an adjective.-->
+ <string name="work_mode_on_summary">Managed by your organization</string>
+ <!-- This string is located under a setting and describes what the setting does. It's letting a user know whether their work profile is on or off, and they can use the setting to turn it on or off. The work profile is a section of their phone that's managed by their employer. "Work" is an adjective.-->
+ <string name="work_mode_off_summary">Apps and notifications are off</string>
<!-- Button label to remove the work profile [CHAR LIMIT=35] -->
<string name="remove_managed_profile_label">Remove work profile</string>
<!-- Data synchronization settings screen, title of setting that controls whether background data should be used [CHAR LIMIT=30] -->
@@ -6437,6 +6433,7 @@
<string name="help_uri_process_stats_summary" translatable="false"></string>
<string name="help_uri_process_stats_apps" translatable="false"></string>
<string name="help_uri_private_dns" translatable="false"></string>
+ <string name="help_uri_about_phone_v2" translatable="false"></string>
<!-- User account title [CHAR LIMIT=30] -->
<string name="user_account_title">Account for content</string>
@@ -6694,7 +6691,6 @@
<string name="keywords_sounds_and_notifications_interruptions">dont don\u2019t disturb, interrupt, interruption, break</string>
<string name="keywords_app">RAM</string>
<string name="keywords_location">nearby, location, history, reporting</string>
- <string name="keywords_location_mode">accuracy</string>
<string name="keywords_accounts">account</string>
<string name="keywords_users">restriction, restrict, restricted</string>
<string name="keywords_keyboard_and_ime">text correction, correct, sound, vibrate, auto, language, gesture, suggest, suggestion, theme, offensive, word, type, emoji, international</string>
@@ -6845,6 +6841,9 @@
<!-- Sound: Title for the Do not Disturb option and associated settings page. [CHAR LIMIT=50]-->
<string name="zen_mode_settings_title">Do Not Disturb</string>
+ <!-- Do not disturb: Title for the Do not Disturb dialog to turn on Do not disturb. [CHAR LIMIT=50]-->
+ <string name="zen_mode_settings_turn_on_dialog_title">Turn on Do Not Disturb</string>
+
<!-- Do not disturb: Title for the behaviors option and associated settings page. [CHAR LIMIT=30] -->
<string name="zen_mode_behavior_settings_title">Behavior</string>
@@ -6872,11 +6871,11 @@
<!-- Do not disturb: Title for a specific zen mode automatic rule in settings. [CHAR LIMIT=30] -->
<string name="zen_mode_automatic_rule_settings_page_title">Automatic rule</string>
- <!-- Do not disturb: Title for the zen mode automation option Suggestion. [CHAR LIMIT=50] -->
- <string name="zen_mode_automation_suggestion_title">Set Do Not Disturb rules</string>
+ <!-- Do not disturb: Title for the zen mode automation option Suggestion. [CHAR LIMIT=34] -->
+ <string name="zen_mode_automation_suggestion_title">Silence phone at certain times</string>
<!-- Do not disturb: Summary for the zen mode automation option Suggestion. [CHAR LIMIT=NONE] -->
- <string name="zen_mode_automation_suggestion_summary">Limit sounds & vibrations at certain times</string>
+ <string name="zen_mode_automation_suggestion_summary">Set Do Not Disturb rules</string>
<!-- Do not disturb: Switch toggle to toggle whether to use an automatic dnd rule or not [CHAR LIMIT=40] -->
<string name="zen_mode_use_automatic_rule">Use rule</string>
@@ -6902,6 +6901,9 @@
<!-- Do not disturb: Button to add new automatic rule to DND. [CHAR LIMIT=30] -->
<string name="zen_mode_add">Add</string>
+ <!-- Do not disturb: Label for button in enable zen dialog that will turn on zen mode. [CHAR LIMIT=30] -->
+ <string name="zen_mode_enable_dialog_turn_on">Turn on</string>
+
<!-- Do not disturb: Label for button that will turn on zen mode. [CHAR LIMIT=30] -->
<string name="zen_mode_button_turn_on">Turn on now</string>
@@ -6920,6 +6922,12 @@
<!-- [CHAR LIMIT=110] Zen mode settings footer: Footer how DND was triggered by an app -->
<string name="zen_mode_settings_dnd_automatic_rule_app">Do Not Disturb was automatically turned on by an app (<xliff:g id="app_name" example="Android Services">%s</xliff:g>)</string>
+ <!--[CHAR LIMIT=40] Zen Interruption level: Priority. -->
+ <string name="zen_interruption_level_priority">Priority only</string>
+
+ <!-- [CHAR LIMIT=20] Accessibility string for current zen mode and selected exit condition. A template that simply concatenates existing mode string and the current condition description. -->
+ <string name="zen_mode_and_condition"><xliff:g id="zen_mode" example="Priority interruptions only">%1$s</xliff:g>. <xliff:g id="exit_condition" example="For one hour">%2$s</xliff:g></string>
+
<!-- Work Sounds: Work sound settings section header. [CHAR LIMIT=50] -->
<string name="sound_work_settings">Work profile sounds</string>
@@ -8319,8 +8327,8 @@
<!-- Summary of payment screen [CHAR LIMIT=NONE] -->
<string name="payment_summary"><xliff:g id="app_name" example="Payment App">%1$s</xliff:g> is default</string>
- <!-- Summary of location screen [CHAR LIMIT=NONE] -->
- <string name="location_on_summary">ON / <xliff:g id="location_mode" example="High accuracy">%1$s</xliff:g></string>
+ <!-- Summary of location on screen [CHAR LIMIT=NONE] -->
+ <string name="location_on_summary">ON</string>
<!-- Location off [CHAR LIMIT=NONE] -->
<string name="location_off_summary">OFF</string>
@@ -8418,7 +8426,7 @@
<string name="night_display_suggestion_title">Set Night Light schedule</string>
<!-- Night display: Summary for the night display option Suggestion (renamed "Night Light" with title caps). [CHAR LIMIT=NONE] -->
- <string name="night_display_suggestion_summary">Tint screen amber to help you fall asleep</string>
+ <string name="night_display_suggestion_summary">Automatically tint screen every night</string>
<!-- Title of condition that night display is on (renamed "Night Light" with title caps). [CHAR LIMIT=30] -->
<string name="condition_night_display_title">Night Light is on</string>
@@ -8840,9 +8848,6 @@
<!-- Title for settings suggestion for double tap power for camera [CHAR LIMIT=60] -->
<string name="double_tap_power_for_camera_suggestion_title">Open camera quickly</string>
- <!-- Summary for settings suggestion for double tap power for camera [CHAR LIMIT=60] -->
- <string name="double_tap_power_for_camera_suggestion_summary">Press power button twice to open camera</string>
-
<!-- Title text for double twist for camera mode [CHAR LIMIT=60]-->
<string name="double_twist_for_camera_mode_title">Flip camera</string>
@@ -8852,13 +8857,6 @@
<!-- Title for settings suggestion for double twist for camera [CHAR LIMIT=60] -->
<string name="double_twist_for_camera_suggestion_title">Take selfies faster</string>
- <!-- Summary for settings suggestion for double twist for camera (phone) [CHAR LIMIT=60] -->
- <string name="double_twist_for_camera_suggestion_summary" product="default">Double-twist phone for selfie mode</string>
- <!-- Summary for settings suggestion for double twist for camera (tablet) [CHAR LIMIT=60] -->
- <string name="double_twist_for_camera_suggestion_summary" product="tablet">Double-twist tablet for selfie mode</string>
- <!-- Summary for settings suggestion for double twist for camera (device) [CHAR LIMIT=60] -->
- <string name="double_twist_for_camera_suggestion_summary" product="device">Double-twist device for selfie mode</string>
-
<!-- Preference and settings suggestion title text for ambient display double tap (phone) [CHAR LIMIT=60]-->
<string name="ambient_display_title" product="default">Double-tap to check phone</string>
<!-- Preference and settings suggestion title text for ambient display double tap (tablet) [CHAR LIMIT=60]-->
@@ -8869,9 +8867,6 @@
<!-- Summary text for ambient display double tap [CHAR LIMIT=NONE]-->
<string name="ambient_display_summary">To check time, notification icons, and other info, double-tap your screen.</string>
- <!-- Summary for settings suggestion for double tap power for camera [CHAR LIMIT=60] -->
- <string name="ambient_display_suggestion_summary">Check notifications when screen is off</string>
-
<!-- Preference and settings suggestion title text for ambient display pick up (phone) [CHAR LIMIT=60]-->
<string name="ambient_display_pickup_title" product="default">Lift to check phone</string>
<!-- Preference and settings suggestion title text for ambient display pick up (tablet) [CHAR LIMIT=60]-->
@@ -8886,9 +8881,6 @@
<!-- Summary text for ambient display (device) [CHAR LIMIT=NONE]-->
<string name="ambient_display_pickup_summary" product="device">To check time, notification icons, and other info, pick up your device.</string>
- <!-- Summary for settings suggestion for ambient display pick up [CHAR LIMIT=60] -->
- <string name="ambient_display_pickup_suggestion_summary">Check notifications when screen is off</string>
-
<!-- Title text for swiping downwards on fingerprint sensor for notifications [CHAR LIMIT=80]-->
<string name="fingerprint_swipe_for_notifications_title">Swipe fingerprint for notifications</string>
<!-- Title text for fingerprint gesture preference screen [CHAR LIMIT=25] -->
@@ -8904,9 +8896,6 @@
<!-- Title for settings suggestion for fingerprint swipe for notifications [CHAR LIMIT=60] -->
<string name="fingerprint_swipe_for_notifications_suggestion_title">See notifications quickly</string>
- <!-- Summary for settings suggestion for fingerprint swipe for notifications [CHAR LIMIT=60] -->
- <string name="fingerprint_swipe_for_notifications_suggestion_summary">Swipe down on the fingerprint sensor</string>
-
<!-- Title text for the assist gesture [CHAR LIMIT=60] DO NOT TRANSLATE -->
<string name="assist_gesture_title" translatable="false"></string>
@@ -9223,21 +9212,30 @@
<string name="keywords_directory_access">directory access</string>
<!-- Account type associated with the backup account. Empty for AOSP. [DO NOT TRANSLATE] -->
- <string name="account_type"></string>
+ <string name="account_type" translatable="false"></string>
<!-- Package to target for Account credential confirmation. This will allow users to
remind/rediscover their backup account password prior to a reset. Empty for AOSP.
[DO NOT TRANSLATE] -->
- <string name="account_confirmation_package"></string>
+ <string name="account_confirmation_package" translatable="false"></string>
+ <!-- Class to target for Account credential confirmation. This will allow users to
+ remind/rediscover their backup account password prior to a reset. Empty for AOSP.
+ [DO NOT TRANSLATE] -->
+ <string name="account_confirmation_class" translatable="false"></string>
<!-- Title for the new About Phone screen [CHAR LIMIT=40] -->
- <string name="me_card_title" product="default">My Phone</string>
+ <string name="my_device_info_title" product="default">My Phone</string>
<!-- Title for the new About Phone screen [CHAR LIMIT=40] -->
- <string name="me_card_title" product="tablet">My Tablet</string>
+ <string name="my_device_info_title" product="tablet">My Tablet</string>
<!-- Title for the new About Phone screen [CHAR LIMIT=40] -->
- <string name="me_card_title" product="device">My Device</string>
+ <string name="my_device_info_title" product="device">My Device</string>
<!-- Title for preference showing the primary account on the device [CHAR LIMIT=60]-->
- <string name="me_card_account_preference_title">Account</string>
+ <string name="my_device_info_account_preference_title">Account</string>
<!-- Title for preference showing the name of the device. [CHAR LIMIT=60]-->
- <string name="me_card_device_name_preference_title">Device name</string>
+ <string name="my_device_info_device_name_preference_title">Device name</string>
+
+ <!-- Settings item title for automatic Bluetooth on while driving preference [CHAR LIMIT=35] -->
+ <string name="bluetooth_on_while_driving_pref">Use Bluetooth when driving</string>
+ <!-- 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>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 7764e74..b672247 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -318,7 +318,7 @@
<style name="TextAppearance.SuggestionHeader"
parent="@android:style/TextAppearance.Material.Subhead">
- <item name="android:fontFamily">sans-serif-medium</item>
+ <item name="android:fontFamily">@config/config_headlineFontFamilyMedium</item>
<item name="android:textSize">14sp</item>
<item name="android:textColor">?android:attr/colorAccent</item>
</style>
@@ -337,6 +337,11 @@
<item name="android:fontFamily">sans-serif-medium</item>
</style>
+ <style name="TextAppearance.SuggestionTitleV2"
+ parent="@android:style/TextAppearance.Material.Subhead">
+ <item name="android:fontFamily">@config/config_headlineFontFamily</item>
+ </style>
+
<style name="TextAppearance.SuggestionSummary" parent="TextAppearance.Small">
<item name="android:textColor">?android:attr/textColorSecondary</item>
</style>
@@ -469,6 +474,7 @@
<style name="TextAppearance.SearchBar" parent="@android:style/TextAppearance.Material.Widget.Toolbar.Subtitle">
<item name="android:textSize">@dimen/search_bar_text_size</item>
+ <item name="android:fontFamily">@config/config_headlineFontFamily</item>
</style>
<style name="device_info_dialog_label">
diff --git a/res/xml/connected_devices_advanced.xml b/res/xml/connected_devices_advanced.xml
index dfe23df..8ca6b81 100644
--- a/res/xml/connected_devices_advanced.xml
+++ b/res/xml/connected_devices_advanced.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="connected_devices_screen"
android:title="@string/connected_device_connections_title">
@@ -24,6 +25,7 @@
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"/>
<SwitchPreference
@@ -47,11 +49,18 @@
android:summary="@string/summary_placeholder"
android:order="-3"/>
+ <SwitchPreference
+ android:key="bluetooth_on_while_driving"
+ android:title="@string/bluetooth_on_while_driving_pref"
+ android:icon="@drawable/ic_settings_bluetooth"
+ android:summary="@string/bluetooth_on_while_driving_summary"
+ android:order="-2"/>
+
<Preference
android:key="usb_mode"
android:title="@string/usb_pref"
android:icon="@drawable/ic_usb"
- android:order="-2">
+ android:order="-1">
<intent android:action="android.intent.action.MAIN"
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.deviceinfo.UsbModeChooserActivity"/>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 04644f5..42e5c54 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -15,109 +15,116 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res-auto"
- android:key="development_prefs_screen"
- android:title="@string/development_settings_title">
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="development_prefs_screen"
+ android:title="@string/development_settings_title">
- <Preference
- android:key="memory"
- android:icon="@drawable/ic_settings_memory"
- android:title="@string/memory_settings_title"
- android:summary="@string/summary_placeholder"
- android:fragment="com.android.settings.applications.ProcessStatsSummary" />
+ <PreferenceCategory
+ android:key="debug_misc_category"
+ android:order="100">
- <com.android.settings.BugreportPreference
+ <Preference
+ android:key="memory"
+ android:icon="@drawable/ic_settings_memory"
+ android:title="@string/memory_settings_title"
+ android:summary="@string/summary_placeholder"
+ android:fragment="com.android.settings.applications.ProcessStatsSummary" />
+
+ <com.android.settings.BugreportPreference
android:key="bugreport"
android:title="@*android:string/bugreport_title"
android:dialogTitle="@*android:string/bugreport_title" />
- <Preference
+ <Preference
android:key="local_backup_password"
android:title="@string/local_backup_password_title"
android:summary="@string/local_backup_password_summary_none"
- android:persistent="false" >
- <intent
+ android:persistent="false">
+ <intent
android:action="android.settings.privacy.SET_FULL_BACKUP_PASSWORD"
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.SetFullBackupPassword" />
- </Preference>
+ </Preference>
- <com.android.settingslib.RestrictedSwitchPreference
- android:key="keep_screen_on"
- android:title="@string/keep_screen_on"
- android:summary="@string/keep_screen_on_summary"
- settings:useAdditionalSummary="true" />
+ <com.android.settingslib.RestrictedSwitchPreference
+ android:key="keep_screen_on"
+ android:title="@string/keep_screen_on"
+ android:summary="@string/keep_screen_on_summary"
+ settings:useAdditionalSummary="true" />
- <ListPreference
- android:key="hdcp_checking"
- android:title="@string/hdcp_checking_title"
- android:dialogTitle="@string/hdcp_checking_dialog_title"
- android:entries="@array/hdcp_checking_titles"
- android:entryValues="@array/hdcp_checking_values" />
+ <ListPreference
+ android:key="hdcp_checking"
+ android:title="@string/hdcp_checking_title"
+ android:dialogTitle="@string/hdcp_checking_dialog_title"
+ android:entries="@array/hdcp_checking_titles"
+ android:entryValues="@array/hdcp_checking_values" />
- <SwitchPreference
- android:key="bt_hci_snoop_log"
- android:title="@string/bt_hci_snoop_log"
- android:summary="@string/bt_hci_snoop_log_summary"/>
+ <SwitchPreference
+ android:key="bt_hci_snoop_log"
+ android:title="@string/bt_hci_snoop_log"
+ android:summary="@string/bt_hci_snoop_log_summary" />
- <com.android.settingslib.RestrictedSwitchPreference
- android:key="oem_unlock_enable"
- android:title="@string/oem_unlock_enable"
- android:summary="@string/oem_unlock_enable_summary"
- settings:useAdditionalSummary="true"/>
+ <com.android.settingslib.RestrictedSwitchPreference
+ android:key="oem_unlock_enable"
+ android:title="@string/oem_unlock_enable"
+ android:summary="@string/oem_unlock_enable_summary"
+ settings:useAdditionalSummary="true" />
- <Preference
- android:key="running_apps"
- android:title="@string/runningservices_settings_title"
- android:summary="@string/runningservices_settings_summary"
- android:fragment="com.android.settings.applications.RunningServices" />
+ <Preference
+ android:key="running_apps"
+ android:title="@string/runningservices_settings_title"
+ android:summary="@string/runningservices_settings_summary"
+ android:fragment="com.android.settings.applications.RunningServices" />
- <Preference
- android:key="convert_to_file_encryption"
- android:title="@string/convert_to_file_encryption"
- android:summary="@string/convert_to_file_encryption_enabled"
- android:fragment="com.android.settings.applications.ConvertToFbe" />
+ <Preference
+ android:key="convert_to_file_encryption"
+ android:title="@string/convert_to_file_encryption"
+ android:summary="@string/convert_to_file_encryption_enabled"
+ android:fragment="com.android.settings.applications.ConvertToFbe" />
- <com.android.settings.development.ColorModePreference
- android:key="picture_color_mode"
- android:title="@string/picture_color_mode"
- android:summary="@string/picture_color_mode_desc" />
+ <com.android.settings.development.ColorModePreference
+ android:key="picture_color_mode"
+ android:title="@string/picture_color_mode"
+ android:summary="@string/picture_color_mode_desc" />
- <Preference android:key="select_webview_provider"
- android:title="@string/select_webview_provider_title"
- android:dialogTitle="@string/select_webview_provider_dialog_title"
- android:fragment="com.android.settings.webview.WebViewAppPicker" />
+ <Preference android:key="select_webview_provider"
+ android:title="@string/select_webview_provider_title"
+ android:dialogTitle="@string/select_webview_provider_dialog_title"
+ android:fragment="com.android.settings.webview.WebViewAppPicker" />
- <SwitchPreference
- android:key="color_temperature"
- android:title="@string/color_temperature"
- android:summary="@string/color_temperature_desc" />
+ <SwitchPreference
+ android:key="color_temperature"
+ android:title="@string/color_temperature"
+ android:summary="@string/color_temperature_desc" />
- <SwitchPreference
- android:key="ota_disable_automatic_update"
- android:title="@string/ota_disable_automatic_update" />
+ <SwitchPreference
+ android:key="ota_disable_automatic_update"
+ android:title="@string/ota_disable_automatic_update" />
- <Preference
- android:key="demo_mode"
- android:title="@string/demo_mode">
- <intent android:action="com.android.settings.action.DEMO_MODE" />
- </Preference>
+ <Preference
+ android:key="demo_mode"
+ android:title="@string/demo_mode">
+ <intent android:action="com.android.settings.action.DEMO_MODE" />
+ </Preference>
- <Preference
- android:key="quick_settings_tiles"
- android:title="@string/quick_settings_developer_tiles"
- android:fragment="com.android.settings.development.qstile.DevelopmentTileConfigFragment" />
+ <Preference
+ android:key="quick_settings_tiles"
+ android:title="@string/quick_settings_developer_tiles"
+ android:fragment="com.android.settings.development.qstile.DevelopmentTileConfigFragment" />
+ </PreferenceCategory>
- <PreferenceCategory android:key="debug_debugging_category"
- android:title="@string/debug_debugging_category">
+ <PreferenceCategory
+ android:key="debug_debugging_category"
+ android:title="@string/debug_debugging_category"
+ android:order="200">
<SwitchPreference
android:key="enable_adb"
android:title="@string/enable_adb"
- android:summary="@string/enable_adb_summary"/>
+ android:summary="@string/enable_adb_summary" />
<Preference android:key="clear_adb_keys"
- android:title="@string/clear_adb_keys" />
+ android:title="@string/clear_adb_keys" />
<SwitchPreference
android:key="enable_terminal"
@@ -127,32 +134,32 @@
<SwitchPreference
android:key="bugreport_in_power"
android:title="@string/bugreport_in_power"
- android:summary="@string/bugreport_in_power_summary"/>
+ android:summary="@string/bugreport_in_power_summary" />
<Preference android:key="mock_location_app"
- android:title="@string/mock_location_app" />
+ android:title="@string/mock_location_app" />
<SwitchPreference
android:key="enable_gnss_raw_meas_full_tracking"
android:title="@string/enable_gnss_raw_meas_full_tracking"
- android:summary="@string/enable_gnss_raw_meas_full_tracking_summary"/>
+ android:summary="@string/enable_gnss_raw_meas_full_tracking_summary" />
<SwitchPreference
- android:key="debug_view_attributes"
- android:title="@string/debug_view_attributes" />
+ android:key="debug_view_attributes"
+ android:title="@string/debug_view_attributes" />
<Preference android:key="debug_app"
- android:title="@string/debug_app" />
+ android:title="@string/debug_app" />
<SwitchPreference
android:key="wait_for_debugger"
android:title="@string/wait_for_debugger"
- android:summary="@string/wait_for_debugger_summary"/>
+ android:summary="@string/wait_for_debugger_summary" />
<com.android.settingslib.RestrictedSwitchPreference
android:key="verify_apps_over_usb"
android:title="@string/verify_apps_over_usb_title"
- android:summary="@string/verify_apps_over_usb_summary"/>
+ android:summary="@string/verify_apps_over_usb_summary" />
<ListPreference
android:key="select_logd_size"
@@ -171,7 +178,7 @@
<SwitchPreference
android:key="connectivity_monitor_switch"
android:title="@string/connectivity_monitor_switch"
- android:summary="@string/connectivity_monitor_switch_summary"/>
+ android:summary="@string/connectivity_monitor_switch_summary" />
<SwitchPreference
android:key="camera_laser_sensor_switch"
@@ -180,42 +187,48 @@
<Preference
android:key="feature_flags_dashboard"
android:title="@string/feature_flags_dashboard_title"
- android:fragment="com.android.settings.development.featureflags.FeatureFlagsDashboard"/>
+ android:fragment="com.android.settings.development.featureflags.FeatureFlagsDashboard" />
<SwitchPreference
android:key="enable_gpu_debug_layers"
android:title="@string/enable_gpu_debug_layers"
- android:summary="@string/enable_gpu_debug_layers_summary"/>
+ android:summary="@string/enable_gpu_debug_layers_summary" />
</PreferenceCategory>
- <PreferenceCategory android:key="debug_networking_category"
- android:title="@string/debug_networking_category">
+ <PreferenceCategory
+ android:key="dashboard_tile_placeholder"
+ android:order="300" />
+
+ <PreferenceCategory
+ android:key="debug_networking_category"
+ android:title="@string/debug_networking_category"
+ android:order="400">
<SwitchPreference
android:key="wifi_display_certification"
android:title="@string/wifi_display_certification"
- android:summary="@string/wifi_display_certification_summary"/>
+ android:summary="@string/wifi_display_certification_summary" />
<SwitchPreference
android:key="wifi_verbose_logging"
android:title="@string/wifi_verbose_logging"
- android:summary="@string/wifi_verbose_logging_summary"/>
+ android:summary="@string/wifi_verbose_logging_summary" />
<SwitchPreference
android:key="wifi_connected_mac_randomization"
android:title="@string/wifi_connected_mac_randomization"
- android:summary="@string/wifi_connected_mac_randomization_summary"/>
+ android:summary="@string/wifi_connected_mac_randomization_summary" />
<SwitchPreference
android:key="mobile_data_always_on"
android:title="@string/mobile_data_always_on"
- android:summary="@string/mobile_data_always_on_summary"/>
+ android:summary="@string/mobile_data_always_on_summary" />
<SwitchPreference
android:key="tethering_hardware_offload"
android:title="@string/tethering_hardware_offload"
- android:summary="@string/tethering_hardware_offload_summary"/>
+ android:summary="@string/tethering_hardware_offload_summary" />
<ListPreference
android:key="select_usb_configuration"
@@ -227,17 +240,17 @@
<SwitchPreference
android:key="bluetooth_show_devices_without_names"
android:title="@string/bluetooth_show_devices_without_names"
- android:summary="@string/bluetooth_show_devices_without_names_summary"/>
+ android:summary="@string/bluetooth_show_devices_without_names_summary" />
<SwitchPreference
android:key="bluetooth_disable_absolute_volume"
android:title="@string/bluetooth_disable_absolute_volume"
- android:summary="@string/bluetooth_disable_absolute_volume_summary"/>
+ android:summary="@string/bluetooth_disable_absolute_volume_summary" />
<SwitchPreference
android:key="bluetooth_disable_inband_ringing"
android:title="@string/bluetooth_disable_inband_ringing"
- android:summary="@string/bluetooth_disable_inband_ringing_summary"/>
+ android:summary="@string/bluetooth_disable_inband_ringing_summary" />
<ListPreference
android:key="bluetooth_select_avrcp_version"
@@ -282,46 +295,50 @@
android:entryValues="@array/bluetooth_a2dp_codec_ldac_playback_quality_values" />
<ListPreference
- android:key="bluetooth_max_connected_audio_devices"
- android:title="@string/bluetooth_max_connected_audio_devices_string"
- android:dialogTitle="@string/bluetooth_max_connected_audio_devices_dialog_title"
- android:entries="@array/bluetooth_max_connected_audio_devices"
- android:entryValues="@array/bluetooth_max_connected_audio_devices_values" />
+ android:key="bluetooth_max_connected_audio_devices"
+ android:title="@string/bluetooth_max_connected_audio_devices_string"
+ android:dialogTitle="@string/bluetooth_max_connected_audio_devices_dialog_title"
+ android:entries="@array/bluetooth_max_connected_audio_devices"
+ android:entryValues="@array/bluetooth_max_connected_audio_devices_values" />
</PreferenceCategory>
- <PreferenceCategory android:key="debug_input_category"
- android:title="@string/debug_input_category">
+ <PreferenceCategory
+ android:key="debug_input_category"
+ android:title="@string/debug_input_category"
+ android:order="500">
<SwitchPreference
android:key="show_touches"
android:title="@string/show_touches"
- android:summary="@string/show_touches_summary"/>
+ android:summary="@string/show_touches_summary" />
<SwitchPreference
android:key="pointer_location"
android:title="@string/pointer_location"
- android:summary="@string/pointer_location_summary"/>
+ android:summary="@string/pointer_location_summary" />
</PreferenceCategory>
- <PreferenceCategory android:key="debug_drawing_category"
- android:title="@string/debug_drawing_category">
+ <PreferenceCategory
+ android:key="debug_drawing_category"
+ android:title="@string/debug_drawing_category"
+ android:order="600">
<SwitchPreference
android:key="show_screen_updates"
android:title="@string/show_screen_updates"
- android:summary="@string/show_screen_updates_summary"/>
+ android:summary="@string/show_screen_updates_summary" />
<SwitchPreference
android:key="debug_layout"
android:title="@string/debug_layout"
- android:summary="@string/debug_layout_summary"/>
+ android:summary="@string/debug_layout_summary" />
<SwitchPreference
android:key="force_rtl_layout_all_locales"
android:title="@string/force_rtl_layout_all_locales"
- android:summary="@string/force_rtl_layout_all_locales_summary"/>
+ android:summary="@string/force_rtl_layout_all_locales_summary" />
<ListPreference
android:key="window_animation_scale"
@@ -357,78 +374,84 @@
</PreferenceCategory>
- <PreferenceCategory android:key="debug_hw_drawing_category"
- android:title="@string/debug_hw_drawing_category">
+ <PreferenceCategory
+ android:key="debug_hw_drawing_category"
+ android:title="@string/debug_hw_drawing_category"
+ android:order="700">
<SwitchPreference
- android:key="force_hw_ui"
- android:title="@string/force_hw_ui"
- android:summary="@string/force_hw_ui_summary"/>
+ android:key="force_hw_ui"
+ android:title="@string/force_hw_ui"
+ android:summary="@string/force_hw_ui_summary" />
<SwitchPreference
- android:key="show_hw_screen_updates"
- android:title="@string/show_hw_screen_updates"
- android:summary="@string/show_hw_screen_updates_summary"/>
+ android:key="show_hw_screen_updates"
+ android:title="@string/show_hw_screen_updates"
+ android:summary="@string/show_hw_screen_updates_summary" />
<SwitchPreference
- android:key="show_hw_layers_updates"
- android:title="@string/show_hw_layers_updates"
- android:summary="@string/show_hw_layers_updates_summary"/>
+ android:key="show_hw_layers_updates"
+ android:title="@string/show_hw_layers_updates"
+ android:summary="@string/show_hw_layers_updates_summary" />
<ListPreference
- android:key="debug_hw_overdraw"
- android:title="@string/debug_hw_overdraw"
- android:entries="@array/debug_hw_overdraw_entries"
- android:entryValues="@array/debug_hw_overdraw_values" />
+ android:key="debug_hw_overdraw"
+ android:title="@string/debug_hw_overdraw"
+ android:entries="@array/debug_hw_overdraw_entries"
+ android:entryValues="@array/debug_hw_overdraw_values" />
<ListPreference
- android:key="show_non_rect_clip"
- android:title="@string/show_non_rect_clip"
- android:entries="@array/show_non_rect_clip_entries"
- android:entryValues="@array/show_non_rect_clip_values" />
+ android:key="show_non_rect_clip"
+ android:title="@string/show_non_rect_clip"
+ android:entries="@array/show_non_rect_clip_entries"
+ android:entryValues="@array/show_non_rect_clip_values" />
<SwitchPreference
- android:key="force_msaa"
- android:title="@string/force_msaa"
- android:summary="@string/force_msaa_summary"/>
+ android:key="force_msaa"
+ android:title="@string/force_msaa"
+ android:summary="@string/force_msaa_summary" />
<SwitchPreference
- android:key="disable_overlays"
- android:title="@string/disable_overlays"
- android:summary="@string/disable_overlays_summary"/>
+ android:key="disable_overlays"
+ android:title="@string/disable_overlays"
+ android:summary="@string/disable_overlays_summary" />
<ListPreference
- android:entries="@array/simulate_color_space_entries"
- android:entryValues="@array/simulate_color_space_values"
- android:key="simulate_color_space"
- android:summary="%s"
- android:title="@string/simulate_color_space" />
+ android:entries="@array/simulate_color_space_entries"
+ android:entryValues="@array/simulate_color_space_values"
+ android:key="simulate_color_space"
+ android:summary="%s"
+ android:title="@string/simulate_color_space" />
<ListPreference
- android:key="debug_hw_renderer"
- android:title="@string/debug_hw_renderer"
- android:entries="@array/debug_hw_renderer_entries"
- android:entryValues="@array/debug_hw_renderer_values" />
+ android:key="debug_hw_renderer"
+ android:title="@string/debug_hw_renderer"
+ android:entries="@array/debug_hw_renderer_entries"
+ android:entryValues="@array/debug_hw_renderer_values" />
</PreferenceCategory>
- <PreferenceCategory android:key="media_category"
- android:title="@string/media_category">
+ <PreferenceCategory
+ android:key="media_category"
+ android:title="@string/media_category"
+ android:order="800">
<SwitchPreference
- android:key="usb_audio"
- android:title="@string/usb_audio_disable_routing"
- android:summary="@string/usb_audio_disable_routing_summary" />
+ android:key="usb_audio"
+ android:title="@string/usb_audio_disable_routing"
+ android:summary="@string/usb_audio_disable_routing_summary" />
</PreferenceCategory>
- <PreferenceCategory android:key="debug_monitoring_category"
- android:title="@string/debug_monitoring_category">
+ <PreferenceCategory
+ android:key="debug_monitoring_category"
+ android:title="@string/debug_monitoring_category"
+ android:order="900">
<SwitchPreference
android:key="strict_mode"
android:title="@string/strict_mode"
- android:summary="@string/strict_mode_summary"/>
+ android:summary="@string/strict_mode_summary" />
<ListPreference
android:key="track_frame_time"
@@ -438,13 +461,15 @@
</PreferenceCategory>
- <PreferenceCategory android:key="debug_applications_category"
- android:title="@string/debug_applications_category">
+ <PreferenceCategory
+ android:key="debug_applications_category"
+ android:title="@string/debug_applications_category"
+ android:order="1000">
<SwitchPreference
android:key="immediately_destroy_activities"
android:title="@string/immediately_destroy_activities"
- android:summary="@string/immediately_destroy_activities_summary"/>
+ android:summary="@string/immediately_destroy_activities_summary" />
<ListPreference
android:key="app_process_limit"
@@ -454,52 +479,48 @@
<Preference
- android:key="background_check"
- android:fragment="com.android.settings.applications.appops.BackgroundCheckSummary"
- android:title="@string/background_check_pref" />
+ android:key="background_check"
+ android:fragment="com.android.settings.applications.appops.BackgroundCheckSummary"
+ android:title="@string/background_check_pref" />
<SwitchPreference
android:key="show_first_crash_dialog"
android:title="@string/show_first_crash_dialog"
- android:summary="@string/show_first_crash_dialog_summary"/>
+ android:summary="@string/show_first_crash_dialog_summary" />
<SwitchPreference
android:key="show_all_anrs"
android:title="@string/show_all_anrs"
- android:summary="@string/show_all_anrs_summary"/>
+ android:summary="@string/show_all_anrs_summary" />
<SwitchPreference
android:key="show_notification_channel_warnings"
android:title="@string/show_notification_channel_warnings"
- android:summary="@string/show_notification_channel_warnings_summary"/>
+ android:summary="@string/show_notification_channel_warnings_summary" />
<Preference
- android:key="inactive_apps"
- android:title="@string/inactive_apps_title"
- android:fragment="com.android.settings.fuelgauge.InactiveApps"/>
+ android:key="inactive_apps"
+ android:title="@string/inactive_apps_title"
+ android:fragment="com.android.settings.fuelgauge.InactiveApps" />
<SwitchPreference
android:key="force_allow_on_external"
android:title="@string/force_allow_on_external"
- android:summary="@string/force_allow_on_external_summary"/>
+ android:summary="@string/force_allow_on_external_summary" />
<SwitchPreference
android:key="force_resizable_activities"
android:title="@string/force_resizable_activities"
- android:summary="@string/force_resizable_activities_summary"/>
+ android:summary="@string/force_resizable_activities_summary" />
<SwitchPreference
- android:key="enable_freeform_support"
- android:title="@string/enable_freeform_support"
- android:summary="@string/enable_freeform_support_summary"/>
+ android:key="enable_freeform_support"
+ android:title="@string/enable_freeform_support"
+ android:summary="@string/enable_freeform_support_summary" />
<Preference
android:key="reset_shortcut_manager_throttling"
android:title="@string/reset_shortcut_manager_throttling" />
- </PreferenceCategory>
-
- <PreferenceCategory
- android:key="dashboard_tile_placeholder"
- android:order="200"/>
+ </PreferenceCategory>
</PreferenceScreen>
diff --git a/res/xml/location_mode.xml b/res/xml/location_mode.xml
deleted file mode 100644
index ac8e584..0000000
--- a/res/xml/location_mode.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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="location_mode_settings"
- android:title="@string/location_mode_screen_title">
-
- <com.android.settings.widget.RadioButtonPreference
- android:key="high_accuracy"
- android:title="@string/location_mode_high_accuracy_title"
- android:summary="@string/location_mode_high_accuracy_description" />
- <com.android.settings.widget.RadioButtonPreference
- android:key="battery_saving"
- android:title="@string/location_mode_battery_saving_title"
- android:summary="@string/location_mode_battery_saving_description" />
- <com.android.settings.widget.RadioButtonPreference
- android:key="sensors_only"
- android:title="@string/location_mode_sensors_only_title"
- android:summary="@string/location_mode_sensors_only_description" />
-
-</PreferenceScreen>
diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml
index 0414f20..267fce9 100644
--- a/res/xml/location_settings.xml
+++ b/res/xml/location_settings.xml
@@ -50,10 +50,4 @@
<PreferenceCategory
android:key="location_services"
android:title="@string/location_category_location_services" />
-
- <Preference
- android:key="location_mode"
- android:title="@string/location_mode_title"
- settings:keywords="@string/keywords_location_mode"
- android:summary="@string/summary_placeholder" />
</PreferenceScreen>
diff --git a/res/xml/managed_profile_settings.xml b/res/xml/managed_profile_settings.xml
index 58fcd88..c283e13 100644
--- a/res/xml/managed_profile_settings.xml
+++ b/res/xml/managed_profile_settings.xml
@@ -20,14 +20,13 @@
<SwitchPreference
android:key="work_mode"
- android:summary="@string/work_mode_summary"
- android:title="@string/work_mode_label"/>
+ android:title="@string/work_mode_label"
+ android:summary="@string/summary_placeholder"/>
<com.android.settingslib.RestrictedSwitchPreference
android:key="contacts_search"
android:summary="@string/managed_profile_contact_search_summary"
android:title="@string/managed_profile_contact_search_title"
- settings:useAdditionalSummary="true"
- />
+ settings:useAdditionalSummary="true"/>
</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/me_card.xml b/res/xml/me_card.xml
deleted file mode 100644
index 2d8c21f..0000000
--- a/res/xml/me_card.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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="me_card_pref_screen"
- android:title="@string/me_card_title">
-
- <com.android.settings.applications.LayoutPreference
- android:key="me_card_header"
- android:order="0"
- android:layout="@layout/settings_entity_header"
- android:selectable="false"/>
-
- <!-- Account name -->
- <Preference
- android:key="account"
- android:order="1"
- android:title="@string/me_card_account_preference_title"
- android:summary="@string/summary_placeholder"/>
-
- <!-- Phone number -->
- <Preference
- android:key="phone_number"
- android:order="2"
- android:title="@string/status_number"
- android:summary="@string/summary_placeholder"/>
-
- <!-- Device name -->
- <Preference
- android:key="device_name"
- android:order="3"
- android:title="@string/me_card_device_name_preference_title"
- android:summary="@string/summary_placeholder"/>
-
-</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
new file mode 100644
index 0000000..4988b16
--- /dev/null
+++ b/res/xml/my_device_info.xml
@@ -0,0 +1,167 @@
+<?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"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="my_device_info_pref_screen"
+ android:title="@string/my_device_info_title"
+ settings:initialExpandedChildrenCount="4">
+
+ <com.android.settings.applications.LayoutPreference
+ android:key="my_device_info_header"
+ android:order="0"
+ android:layout="@layout/settings_entity_header"
+ android:selectable="false"/>
+
+ <!-- Account name -->
+ <Preference
+ android:key="branded_account"
+ android:order="1"
+ android:title="@string/my_device_info_account_preference_title"
+ android:summary="@string/summary_placeholder"/>
+
+ <!-- Phone number -->
+ <Preference
+ android:key="phone_number"
+ android:order="2"
+ android:title="@string/status_number"
+ android:summary="@string/summary_placeholder"/>
+
+ <!-- Device name -->
+ <com.android.settings.widget.ValidatedEditTextPreference
+ android:key="device_name"
+ android:order="3"
+ android:title="@string/my_device_info_device_name_preference_title"
+ android:summary="@string/summary_placeholder"/>
+
+ <!-- SIM status -->
+ <Preference
+ android:key="sim_status"
+ android:order="4"
+ android:title="@string/sim_status_title"
+ settings:keywords="@string/keywords_sim_status"
+ android:summary="@string/summary_placeholder"/>
+
+ <!-- Model & hardware -->
+ <Preference
+ android:key="device_model"
+ android:order="21"
+ android:title="@string/hardware_info"
+ settings:keywords="@string/keywords_model_and_hardware"
+ android:summary="@string/summary_placeholder"/>
+
+ <!-- IMEI -->
+ <Preference
+ android:key="imei_info"
+ android:order="22"
+ android:title="@string/status_imei"
+ settings:keywords="@string/keywords_imei_info"
+ android:summary="@string/summary_placeholder"/>
+
+ <!-- Android version -->
+ <Preference
+ android:key="firmware_version"
+ android:order="32"
+ android:title="@string/firmware_version"
+ settings:keywords="@string/keywords_android_version"
+ android:summary="@string/summary_placeholder"/>
+
+ <!-- IMS registration -->
+ <Preference
+ android:key="ims_reg_state"
+ android:order="33"
+ android:title="@string/ims_reg_title"
+ android:summary="@string/summary_placeholder"/>
+
+ <!--IP address -->
+ <Preference
+ android:key="wifi_ip_address"
+ android:order="34"
+ android:title="@string/wifi_ip_address"
+ android:summary="@string/summary_placeholder"
+ settings:allowDividerAbove="true"/>
+
+ <!-- Wi-Fi MAC address -->
+ <Preference
+ android:key="wifi_mac_address"
+ android:order="35"
+ android:title="@string/status_wifi_mac_address"
+ android:summary="@string/summary_placeholder"/>
+
+ <!-- Bluetooth address -->
+ <Preference
+ android:key="bt_address"
+ android:order="36"
+ android:title="@string/status_bt_address"
+ android:summary="@string/summary_placeholder"/>
+
+
+ <!-- Legal information -->
+ <Preference
+ android:key="legal_container"
+ android:order="37"
+ android:title="@string/legal_information"
+ android:fragment="com.android.settings.LegalSettings"
+ settings:allowDividerAbove="true"/>
+
+ <!-- Regulatory labels -->
+ <Preference
+ android:key="regulatory_info"
+ android:order="38"
+ android:title="@string/regulatory_labels">
+ <intent android:action="android.settings.SHOW_REGULATORY_INFO"/>
+ </Preference>
+
+ <!-- Safety & regulatory manual -->
+ <Preference
+ android:key="safety_info"
+ android:order="39"
+ android:title="@string/safety_and_regulatory_info">
+ <intent android:action="android.settings.SHOW_SAFETY_AND_REGULATORY_INFO"/>
+ </Preference>
+
+ <!-- Manual -->
+ <Preference
+ android:key="manual"
+ android:order="40"
+ android:title="@string/manual">
+ <intent android:action="android.settings.SHOW_MANUAL"/>
+ </Preference>
+
+ <!-- Feedback on the device -->
+ <Preference
+ android:key="device_feedback"
+ android:order="41"
+ android:title="@string/device_feedback"/>
+
+ <!-- Device FCC equipment id -->
+ <Preference
+ android:key="fcc_equipment_id"
+ android:order="42"
+ android:title="@string/fcc_equipment_id"
+ android:summary="@string/summary_placeholder"/>
+
+ <!-- Build number -->
+ <Preference
+ android:key="build_number"
+ android:order="43"
+ android:title="@string/build_number"
+ android:summary="@string/summary_placeholder"
+ settings:allowDividerAbove="true"/>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/security_lockscreen_settings.xml b/res/xml/security_lockscreen_settings.xml
index 7a45bec..6faedd7 100644
--- a/res/xml/security_lockscreen_settings.xml
+++ b/res/xml/security_lockscreen_settings.xml
@@ -33,6 +33,11 @@
android:title="@string/owner_info_settings_title"
android:summary="@string/owner_info_settings_summary" />
+ <SwitchPreference
+ android:key="security_setting_lockdown_enabled"
+ android:title="@string/lockdown_settings_title"
+ android:summary="@string/lockdown_settings_summary" />
+
<PreferenceCategory
android:key="security_setting_lock_screen_notif_work_header"
android:title="@string/profile_section_header">
diff --git a/src/com/android/settings/AirplaneModeEnabler.java b/src/com/android/settings/AirplaneModeEnabler.java
index 4fc205d..5f93589 100644
--- a/src/com/android/settings/AirplaneModeEnabler.java
+++ b/src/com/android/settings/AirplaneModeEnabler.java
@@ -30,8 +30,8 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.telephony.PhoneStateIntentReceiver;
import com.android.internal.telephony.TelephonyProperties;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.WirelessUtils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListener {
diff --git a/src/com/android/settings/ApnPreference.java b/src/com/android/settings/ApnPreference.java
index 4e89efc..9a6eeaf 100755
--- a/src/com/android/settings/ApnPreference.java
+++ b/src/com/android/settings/ApnPreference.java
@@ -16,6 +16,7 @@
package com.android.settings;
+import static android.provider.Telephony.Carriers.CONTENT_URI;
import static android.provider.Telephony.Carriers.FILTERED_URI;
import android.content.ContentUris;
@@ -36,6 +37,7 @@
public class ApnPreference extends Preference implements
CompoundButton.OnCheckedChangeListener, OnClickListener {
final static String TAG = "ApnPreference";
+ private boolean mDpcEnforced = false;
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -119,7 +121,8 @@
Context context = getContext();
if (context != null) {
int pos = Integer.parseInt(getKey());
- Uri url = ContentUris.withAppendedId(FILTERED_URI, pos);
+ Uri url = ContentUris.withAppendedId(
+ mDpcEnforced ? FILTERED_URI : CONTENT_URI, pos);
Intent editIntent = new Intent(Intent.ACTION_EDIT, url);
editIntent.putExtra(ApnSettings.SUB_ID, mSubId);
context.startActivity(editIntent);
@@ -138,4 +141,8 @@
public void setSubId(int subId) {
mSubId = subId;
}
+
+ public void setDpcEnforced(boolean enforced) {
+ mDpcEnforced = enforced;
+ }
}
diff --git a/src/com/android/settings/ApnSettings.java b/src/com/android/settings/ApnSettings.java
index 3628121..2c22a79 100755
--- a/src/com/android/settings/ApnSettings.java
+++ b/src/com/android/settings/ApnSettings.java
@@ -16,6 +16,7 @@
package com.android.settings;
+import static android.provider.Telephony.Carriers.CONTENT_URI;
import static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI;
import static android.provider.Telephony.Carriers.FILTERED_URI;
@@ -291,6 +292,7 @@
mSelectedKey = getSelectedApnKey();
cursor.moveToFirst();
+ boolean enforced = isDpcApnEnforced();
while (!cursor.isAfterLast()) {
String name = cursor.getString(NAME_INDEX);
String apn = cursor.getString(APN_INDEX);
@@ -307,6 +309,7 @@
pref.setPersistent(false);
pref.setOnPreferenceChangeListener(this);
pref.setSubId(subId);
+ pref.setDpcEnforced(enforced);
boolean selectable = ((type == null) || !type.equals("mms"));
pref.setSelectable(selectable);
@@ -398,7 +401,7 @@
@Override
public boolean onPreferenceTreeClick(Preference preference) {
int pos = Integer.parseInt(preference.getKey());
- Uri url = ContentUris.withAppendedId(FILTERED_URI, pos);
+ Uri url = ContentUris.withAppendedId(isDpcApnEnforced() ? FILTERED_URI : CONTENT_URI, pos);
startActivity(new Intent(Intent.ACTION_EDIT, url));
return true;
}
diff --git a/src/com/android/settings/DeviceAdminSettings.java b/src/com/android/settings/DeviceAdminSettings.java
index 9391439..bb53018 100644
--- a/src/com/android/settings/DeviceAdminSettings.java
+++ b/src/com/android/settings/DeviceAdminSettings.java
@@ -49,8 +49,9 @@
import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.core.instrumentation.Instrumentable;
-import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.Instrumentable;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import org.xmlpull.v1.XmlPullParserException;
@@ -63,8 +64,7 @@
public class DeviceAdminSettings extends ListFragment implements Instrumentable {
static final String TAG = "DeviceAdminSettings";
- private final VisibilityLoggerMixin mVisibilityLoggerMixin =
- new VisibilityLoggerMixin(getMetricsCategory());
+ private VisibilityLoggerMixin mVisibilityLoggerMixin;
private DevicePolicyManager mDPM;
private UserManager mUm;
@@ -85,12 +85,6 @@
}
}
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- mVisibilityLoggerMixin.onAttach(context);
- }
-
/**
* Internal collection of device admin info objects for all profiles associated with the current
* user.
@@ -121,6 +115,8 @@
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory(),
+ FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider());
}
@Override
diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index 0e337f6..687e645 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -75,7 +75,7 @@
public class MasterClear extends InstrumentedPreferenceFragment {
private static final String TAG = "MasterClear";
- private static final int KEYGUARD_REQUEST = 55;
+ @VisibleForTesting static final int KEYGUARD_REQUEST = 55;
@VisibleForTesting static final int CREDENTIAL_CONFIRM_REQUEST = 56;
private static final String KEY_SHOW_ESIM_RESET_CHECKBOX
@@ -118,17 +118,26 @@
request, res.getText(R.string.master_clear_title));
}
+ @VisibleForTesting
+ boolean isValidRequestCode(int requestCode) {
+ return !((requestCode != KEYGUARD_REQUEST) && (requestCode != CREDENTIAL_CONFIRM_REQUEST));
+ }
+
+ @VisibleForTesting
+ boolean isShowFinalConfirmation(int requestCode, int resultCode) {
+ return (resultCode == Activity.RESULT_OK) || (requestCode == CREDENTIAL_CONFIRM_REQUEST);
+ }
+
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
-
- if (requestCode != KEYGUARD_REQUEST || requestCode != CREDENTIAL_CONFIRM_REQUEST) {
+ if (!isValidRequestCode(requestCode)) {
return;
}
// If the user entered a valid keyguard trace, present the final
// confirmation prompt; otherwise, go back to the initial state.
- if (resultCode == Activity.RESULT_OK) {
+ if (isShowFinalConfirmation(requestCode, resultCode)) {
showFinalConfirmation();
} else {
establishInitialState();
@@ -150,7 +159,10 @@
final Context context = getActivity();
final String accountType = context.getString(R.string.account_type);
final String packageName = context.getString(R.string.account_confirmation_package);
- if (TextUtils.isEmpty(accountType) || TextUtils.isEmpty(packageName)) {
+ final String className = context.getString(R.string.account_confirmation_class);
+ if (TextUtils.isEmpty(accountType)
+ || TextUtils.isEmpty(packageName)
+ || TextUtils.isEmpty(className)) {
return false;
}
final AccountManager am = AccountManager.get(context);
@@ -158,7 +170,7 @@
if (accounts != null && accounts.length > 0) {
final Intent requestAccountConfirmation = new Intent()
.setPackage(packageName)
- .setAction("android.accounts.action.PRE_FACTORY_RESET");
+ .setComponent(new ComponentName(packageName, className));
// Check to make sure that the intent is supported.
final PackageManager pm = context.getPackageManager();
final ResolveInfo resolution = pm.resolveActivity(requestAccountConfirmation, 0);
@@ -167,7 +179,7 @@
&& packageName.equals(resolution.activityInfo.packageName)) {
// Note that we need to check the packagename to make sure that an Activity resolver
// wasn't returned.
- getActivity().startActivityForResult(
+ startActivityForResult(
requestAccountConfirmation, CREDENTIAL_CONFIRM_REQUEST);
return true;
}
diff --git a/src/com/android/settings/MeCardFragment.java b/src/com/android/settings/MeCardFragment.java
deleted file mode 100644
index 9790fd5..0000000
--- a/src/com/android/settings/MeCardFragment.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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 android.app.Activity;
-import android.app.Fragment;
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.os.Bundle;
-import android.os.UserManager;
-import android.provider.SearchIndexableResource;
-import android.view.View;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.applications.LayoutPreference;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.deviceinfo.BrandedAccountPreferenceController;
-import com.android.settings.deviceinfo.PhoneNumberPreferenceController;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Indexable;
-import com.android.settings.widget.EntityHeaderController;
-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;
-
-public class MeCardFragment extends DashboardFragment implements Indexable {
- private static final String LOG_TAG = "MeCardFragment";
-
- private static final String KEY_ME_CARD_HEADER = "me_card_header";
-
- @Override
- public int getMetricsCategory() {
- return MetricsEvent.DEVICEINFO;
- }
-
- @Override
- public int getHelpResource() {
- return R.string.help_uri_about;
- }
-
- @Override
- public void onResume() {
- super.onResume();
- initHeader();
- }
-
- @Override
- protected String getLogTag() {
- return LOG_TAG;
- }
-
- @Override
- protected int getPreferenceScreenResId() {
- return R.xml.me_card;
- }
-
- @Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
- return buildPreferenceControllers(context, getActivity(), this /* fragment */,
- getLifecycle());
- }
-
- private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
- Activity activity, Fragment fragment, Lifecycle lifecycle) {
- final List<AbstractPreferenceController> controllers = new ArrayList<>();
- controllers.add(new PhoneNumberPreferenceController(context));
- controllers.add(new BrandedAccountPreferenceController(context));
- // TODO: Add preference controller for getting the device name.
- return controllers;
- }
-
- private void initHeader() {
- // TODO: Migrate into its own controller.
- final LayoutPreference headerPreference =
- (LayoutPreference) getPreferenceScreen().findPreference(KEY_ME_CARD_HEADER);
- final View appSnippet = headerPreference.findViewById(R.id.entity_header);
- final Activity context = getActivity();
- final Bundle bundle = getArguments();
- EntityHeaderController controller = EntityHeaderController
- .newInstance(context, this, appSnippet)
- .setRecyclerView(getListView(), getLifecycle())
- .setButtonActions(EntityHeaderController.ActionType.ACTION_NONE,
- EntityHeaderController.ActionType.ACTION_NONE);
-
- // TODO: There may be an avatar setting action we can use here.
- final int iconId = bundle.getInt("icon_id", 0);
- if (iconId == 0) {
- UserManager userManager = (UserManager) getActivity().getSystemService(
- Context.USER_SERVICE);
- UserInfo info = Utils.getExistingUser(userManager, android.os.Process.myUserHandle());
- controller.setLabel(info.name);
- controller.setIcon(
- com.android.settingslib.Utils.getUserIcon(getActivity(), userManager, info));
- }
-
- controller.done(context, true /* rebindActions */);
- }
-
- /**
- * For Search.
- */
- public static final 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.me_card;
- return Arrays.asList(sir);
- }
-
- @Override
- public List<AbstractPreferenceController> getPreferenceControllers(
- Context context) {
- return buildPreferenceControllers(context, null /*activity */,
- null /* fragment */, null /* lifecycle */);
- }
- };
-}
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 4503b64..dcf7ed5 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -16,7 +16,6 @@
package com.android.settings;
-import static com.android.settings.core.FeatureFlags.BATTERY_SETTINGS_V2;
import static com.android.settings.core.FeatureFlags.CONNECTED_DEVICE_V2;
import android.os.Bundle;
@@ -134,16 +133,8 @@
public static class AppWriteSettingsActivity extends SettingsActivity { /* empty */ }
public static class AdvancedAppsActivity extends SettingsActivity { /* empty */ }
- public static class ManageExternalSourcesActivity extends SettingsActivity {
- /* empty */ }
+ public static class ManageExternalSourcesActivity extends SettingsActivity {/* empty */ }
public static class ManageAppExternalSourcesActivity extends SettingsActivity { /* empty */ }
- public static class DoubleTapPowerSuggestionActivity extends SettingsActivity { /* empty */ }
- public static class DoubleTwistSuggestionActivity extends SettingsActivity { /* empty */ }
- public static class AmbientDisplaySuggestionActivity extends SettingsActivity { /* empty */ }
- public static class AmbientDisplayPickupSuggestionActivity extends SettingsActivity {
- /* empty */ }
- public static class SwipeToNotificationSuggestionActivity extends SettingsActivity {
- /* empty */ }
public static class WallpaperSettingsActivity extends SettingsActivity { /* empty */ }
public static class ManagedProfileSettingsActivity extends SettingsActivity { /* empty */ }
public static class DeletionHelperActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 3ac268a..cc90619 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -56,13 +56,13 @@
import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.backup.BackupSettingsActivity;
import com.android.settings.core.gateway.SettingsGateway;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.core.instrumentation.SharedPreferencesLogger;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.DashboardSummary;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wfd.WifiDisplaySettings;
import com.android.settings.widget.SwitchBar;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.instrumentation.SharedPreferencesLogger;
import com.android.settingslib.development.DevelopmentSettingsEnabler;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.SettingsDrawerActivity;
@@ -93,11 +93,6 @@
public static final String EXTRA_SHOW_FRAGMENT = ":settings:show_fragment";
/**
- * The metrics category constant for logging source when a setting fragment is opened.
- */
- public static final String EXTRA_SOURCE_METRICS_CATEGORY = ":settings:source_metrics";
-
- /**
* When starting this activity and using {@link #EXTRA_SHOW_FRAGMENT},
* this extra can also be specified to supply a Bundle of arguments to pass
* to that fragment when it is instantiated during the initial creation
@@ -220,7 +215,8 @@
@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
if (name.equals(getPackageName() + "_preferences")) {
- return new SharedPreferencesLogger(this, getMetricsTag());
+ return new SharedPreferencesLogger(this, getMetricsTag(),
+ FeatureFactory.getFactory(this).getMetricsFeatureProvider());
}
return super.getSharedPreferences(name, mode);
}
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index d9e264b..c5d477a 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -45,7 +45,6 @@
import com.android.settings.applications.LayoutPreference;
import com.android.settings.core.InstrumentedPreferenceFragment;
-import com.android.settings.core.instrumentation.Instrumentable;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.search.actionbar.SearchMenuController;
import com.android.settings.support.actionbar.HelpMenuController;
@@ -53,6 +52,7 @@
import com.android.settings.widget.LoadingViewController;
import com.android.settingslib.CustomDialogPreference;
import com.android.settingslib.CustomEditTextPreference;
+import com.android.settingslib.core.instrumentation.Instrumentable;
import com.android.settingslib.widget.FooterPreferenceMixin;
import java.util.UUID;
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index ae10ffe..f45ac5e 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -110,6 +110,7 @@
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
import com.android.settings.wrapper.FingerprintManagerWrapper;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import java.net.InetAddress;
import java.util.ArrayList;
@@ -577,7 +578,7 @@
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, titleResId);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, title);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, isShortcut);
- intent.putExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY, sourceMetricsCategory);
+ intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, sourceMetricsCategory);
return intent;
}
diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java
index c0bf7d2..6127ab9 100644
--- a/src/com/android/settings/accounts/AccountPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountPreferenceController.java
@@ -51,12 +51,12 @@
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.SearchIndexableRaw;
import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.accounts.AuthenticatorHelper;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
diff --git a/src/com/android/settings/accounts/ManagedProfileSettings.java b/src/com/android/settings/accounts/ManagedProfileSettings.java
index 3ea7cf7..0933042 100644
--- a/src/com/android/settings/accounts/ManagedProfileSettings.java
+++ b/src/com/android/settings/accounts/ManagedProfileSettings.java
@@ -104,8 +104,7 @@
private void loadDataAndPopulateUi() {
if (mWorkModePreference != null) {
- mWorkModePreference.setChecked(
- !mUserManager.isQuietModeEnabled(mManagedUser));
+ updateWorkModePreference();
}
if (mContactPrefrence != null) {
@@ -124,6 +123,14 @@
return MetricsProto.MetricsEvent.ACCOUNTS_WORK_PROFILE_SETTINGS;
}
+ private void updateWorkModePreference() {
+ boolean isWorkModeOn = !mUserManager.isQuietModeEnabled(mManagedUser);
+ mWorkModePreference.setChecked(isWorkModeOn);
+ mWorkModePreference.setSummary(isWorkModeOn
+ ? R.string.work_mode_on_summary
+ : R.string.work_mode_off_summary);
+ }
+
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
@@ -159,8 +166,7 @@
|| action.equals(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)) {
if (intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
UserHandle.USER_NULL) == mManagedUser.getIdentifier()) {
- mWorkModePreference.setChecked(
- !mUserManager.isQuietModeEnabled(mManagedUser));
+ updateWorkModePreference();
}
return;
}
diff --git a/src/com/android/settings/applications/UsageAccessDetails.java b/src/com/android/settings/applications/UsageAccessDetails.java
index c10fb55..c172137 100644
--- a/src/com/android/settings/applications/UsageAccessDetails.java
+++ b/src/com/android/settings/applications/UsageAccessDetails.java
@@ -37,8 +37,8 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.applications.AppStateUsageBridge.UsageState;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenceChangeListener,
OnPreferenceClickListener {
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index a0ce733..3fd7ced 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -33,10 +33,10 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.GearPreference;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java b/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
index a12d1a8..cea0147 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
@@ -23,9 +23,9 @@
import android.text.TextUtils;
import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
public class BluetoothDeviceRenamePreferenceController extends
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java
index 87fa43d..0f294bd 100644
--- a/src/com/android/settings/bluetooth/BluetoothEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java
@@ -27,12 +27,12 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.widget.SwitchWidgetController;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.WirelessUtils;
import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/**
* BluetoothEnabler is a helper to manage the Bluetooth on/off checkbox
diff --git a/src/com/android/settings/bluetooth/BluetoothFilesPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothFilesPreferenceController.java
index 450c7b2..1ecfed4 100644
--- a/src/com/android/settings/bluetooth/BluetoothFilesPreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothFilesPreferenceController.java
@@ -23,9 +23,9 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/**
* Controller that shows received files
diff --git a/src/com/android/settings/bluetooth/BluetoothLengthDeviceNameFilter.java b/src/com/android/settings/bluetooth/BluetoothLengthDeviceNameFilter.java
new file mode 100644
index 0000000..cdf5310
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothLengthDeviceNameFilter.java
@@ -0,0 +1,28 @@
+/*
+ * 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.bluetooth;
+
+/**
+ * Filter to max the length of a Bluetotoh device name to 248 bytes, as defined by the spec.
+ */
+public class BluetoothLengthDeviceNameFilter extends Utf8ByteLengthFilter {
+ private static final int BLUETOOTH_NAME_MAX_LENGTH_BYTES = 248;
+
+ public BluetoothLengthDeviceNameFilter() {
+ super(BLUETOOTH_NAME_MAX_LENGTH_BYTES);
+ }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
index 576e656..134bb97 100644
--- a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
@@ -43,8 +43,6 @@
*/
abstract class BluetoothNameDialogFragment extends InstrumentedDialogFragment
implements TextWatcher {
- private static final int BLUETOOTH_NAME_MAX_LENGTH_BYTES = 248;
-
private AlertDialog mAlertDialog;
private Button mOkButton;
@@ -109,7 +107,7 @@
View view = layoutInflater.inflate(R.layout.dialog_edittext, null);
mDeviceNameView = (EditText) view.findViewById(R.id.edittext);
mDeviceNameView.setFilters(new InputFilter[] {
- new Utf8ByteLengthFilter(BLUETOOTH_NAME_MAX_LENGTH_BYTES)
+ new BluetoothLengthDeviceNameFilter()
});
mDeviceNameView.setText(deviceName); // set initial value before adding listener
if (!TextUtils.isEmpty(deviceName)) {
diff --git a/src/com/android/settings/bluetooth/Utf8ByteLengthFilter.java b/src/com/android/settings/bluetooth/Utf8ByteLengthFilter.java
index bae6e56..ab49818 100644
--- a/src/com/android/settings/bluetooth/Utf8ByteLengthFilter.java
+++ b/src/com/android/settings/bluetooth/Utf8ByteLengthFilter.java
@@ -37,7 +37,7 @@
* pairs are encoded as 4 bytes, with the caveat that the maximum
* length will be constrained more conservatively than necessary.
*/
-class Utf8ByteLengthFilter implements InputFilter {
+public class Utf8ByteLengthFilter implements InputFilter {
private final int mMaxBytes;
Utf8ByteLengthFilter(int maxBytes) {
diff --git a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
index 02b1012..2a136bc 100644
--- a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
@@ -21,11 +21,9 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.SettingsActivity;
import com.android.settings.bluetooth.BluetoothFilesPreferenceController;
import com.android.settings.bluetooth.BluetoothMasterSwitchPreferenceController;
import com.android.settings.bluetooth.BluetoothSwitchPreferenceController;
-import com.android.settings.bluetooth.Utils;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.deviceinfo.UsbBackend;
import com.android.settings.nfc.NfcPreferenceController;
@@ -33,7 +31,6 @@
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.drawer.CategoryKey;
import java.util.ArrayList;
import java.util.Arrays;
@@ -89,6 +86,7 @@
smsMirroringFeatureProvider.getController(context);
controllers.add(smsMirroringController);
controllers.add(new BluetoothFilesPreferenceController(context));
+ controllers.add(new BluetoothOnWhileDrivingPreferenceController(context));
return controllers;
}
diff --git a/src/com/android/settings/connecteddevice/BluetoothOnWhileDrivingPreferenceController.java b/src/com/android/settings/connecteddevice/BluetoothOnWhileDrivingPreferenceController.java
new file mode 100644
index 0000000..072de75
--- /dev/null
+++ b/src/com/android/settings/connecteddevice/BluetoothOnWhileDrivingPreferenceController.java
@@ -0,0 +1,59 @@
+/*
+ * 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.connecteddevice;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.util.FeatureFlagUtils;
+
+import com.android.settings.core.FeatureFlags;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.TogglePreferenceController;
+
+/** Handles a toggle for a setting to turn on Bluetooth while driving. * */
+public class BluetoothOnWhileDrivingPreferenceController extends TogglePreferenceController
+ implements PreferenceControllerMixin {
+ static final String KEY_BLUETOOTH_ON_DRIVING = "bluetooth_on_while_driving";
+
+ public BluetoothOnWhileDrivingPreferenceController(Context context) {
+ super(context, KEY_BLUETOOTH_ON_DRIVING);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.BLUETOOTH_WHILE_DRIVING)) {
+ return AVAILABLE;
+ }
+ return DISABLED_UNSUPPORTED;
+ }
+
+ @Override
+ public boolean isChecked() {
+ return Settings.Secure.getInt(
+ mContext.getContentResolver(),
+ Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING,
+ 0)
+ != 0;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ final int value = isChecked ? 1 : 0;
+ return Settings.Secure.putInt(
+ mContext.getContentResolver(), Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING, value);
+ }
+}
diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java
index 4b8ccd1..e1636b4 100644
--- a/src/com/android/settings/core/FeatureFlags.java
+++ b/src/com/android/settings/core/FeatureFlags.java
@@ -28,4 +28,5 @@
public static final String ZONE_PICKER_V2 = "settings_zone_picker_v2";
public static final String SUGGESTION_UI_V2 = "settings_suggestion_ui_v2";
public static final String ABOUT_PHONE_V2 = "settings_about_phone_v2";
+ public static final String BLUETOOTH_WHILE_DRIVING = "settings_bluetooth_while_driving";
}
diff --git a/src/com/android/settings/core/InstrumentedActivity.java b/src/com/android/settings/core/InstrumentedActivity.java
index 9b24756..5ec8505 100644
--- a/src/com/android/settings/core/InstrumentedActivity.java
+++ b/src/com/android/settings/core/InstrumentedActivity.java
@@ -16,8 +16,11 @@
package com.android.settings.core;
-import com.android.settings.core.instrumentation.Instrumentable;
-import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
+import android.os.Bundle;
+
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.Instrumentable;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.core.lifecycle.ObservableActivity;
/**
@@ -25,9 +28,11 @@
*/
public abstract class InstrumentedActivity extends ObservableActivity implements Instrumentable {
- public InstrumentedActivity() {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
// Mixin that logs visibility change for activity.
- getLifecycle().addObserver(new VisibilityLoggerMixin(getMetricsCategory()));
+ getLifecycle().addObserver(new VisibilityLoggerMixin(getMetricsCategory(),
+ FeatureFactory.getFactory(this).getMetricsFeatureProvider()));
}
-
}
diff --git a/src/com/android/settings/core/InstrumentedFragment.java b/src/com/android/settings/core/InstrumentedFragment.java
index 45db836..b1215b9 100644
--- a/src/com/android/settings/core/InstrumentedFragment.java
+++ b/src/com/android/settings/core/InstrumentedFragment.java
@@ -18,30 +18,28 @@
import android.content.Context;
-import com.android.settings.core.instrumentation.Instrumentable;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.survey.SurveyMixin;
+import com.android.settingslib.core.instrumentation.Instrumentable;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.core.lifecycle.ObservableFragment;
public abstract class InstrumentedFragment extends ObservableFragment implements Instrumentable {
protected MetricsFeatureProvider mMetricsFeatureProvider;
- private final VisibilityLoggerMixin mVisibilityLoggerMixin;
-
- public InstrumentedFragment() {
- // Mixin that logs visibility change for activity.
- mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory());
- getLifecycle().addObserver(mVisibilityLoggerMixin);
- getLifecycle().addObserver(new SurveyMixin(this, getClass().getSimpleName()));
- }
+ private VisibilityLoggerMixin mVisibilityLoggerMixin;
@Override
public void onAttach(Context context) {
- super.onAttach(context);
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+ mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory(),
+ mMetricsFeatureProvider);
+ // Mixin that logs visibility change for activity.
+ getLifecycle().addObserver(mVisibilityLoggerMixin);
+ getLifecycle().addObserver(new SurveyMixin(this, getClass().getSimpleName()));
+ super.onAttach(context);
}
@Override
diff --git a/src/com/android/settings/core/InstrumentedPreferenceFragment.java b/src/com/android/settings/core/InstrumentedPreferenceFragment.java
index 7e37115..278676c 100644
--- a/src/com/android/settings/core/InstrumentedPreferenceFragment.java
+++ b/src/com/android/settings/core/InstrumentedPreferenceFragment.java
@@ -23,11 +23,11 @@
import android.text.TextUtils;
import android.util.Log;
-import com.android.settings.core.instrumentation.Instrumentable;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.survey.SurveyMixin;
+import com.android.settingslib.core.instrumentation.Instrumentable;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.core.lifecycle.ObservablePreferenceFragment;
/**
@@ -44,19 +44,17 @@
// metrics placeholder value. Only use this for development.
protected final int PLACEHOLDER_METRIC = 10000;
- private final VisibilityLoggerMixin mVisibilityLoggerMixin;
-
- public InstrumentedPreferenceFragment() {
- // Mixin that logs visibility change for activity.
- mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory());
- getLifecycle().addObserver(mVisibilityLoggerMixin);
- getLifecycle().addObserver(new SurveyMixin(this, getClass().getSimpleName()));
- }
+ private VisibilityLoggerMixin mVisibilityLoggerMixin;
@Override
public void onAttach(Context context) {
- super.onAttach(context);
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+ // Mixin that logs visibility change for activity.
+ mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory(),
+ mMetricsFeatureProvider);
+ getLifecycle().addObserver(mVisibilityLoggerMixin);
+ getLifecycle().addObserver(new SurveyMixin(this, getClass().getSimpleName()));
+ super.onAttach(context);
}
@Override
diff --git a/src/com/android/settings/core/instrumentation/EventLogWriter.java b/src/com/android/settings/core/instrumentation/EventLogWriter.java
deleted file mode 100644
index 3196f76..0000000
--- a/src/com/android/settings/core/instrumentation/EventLogWriter.java
+++ /dev/null
@@ -1,110 +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.core.instrumentation;
-
-import android.content.Context;
-import android.metrics.LogMaker;
-import android.util.Log;
-import android.util.Pair;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto;
-
-/**
- * {@link LogWriter} that writes data to eventlog.
- */
-public class EventLogWriter implements LogWriter {
-
- private final MetricsLogger mMetricsLogger = new MetricsLogger();
-
- public void visible(Context context, int source, int category) {
- final LogMaker logMaker = new LogMaker(category)
- .setType(MetricsProto.MetricsEvent.TYPE_OPEN)
- .addTaggedData(MetricsProto.MetricsEvent.FIELD_CONTEXT, source);
- MetricsLogger.action(logMaker);
- }
-
- public void hidden(Context context, int category) {
- MetricsLogger.hidden(context, category);
- }
-
- public void action(int category, int value, Pair<Integer, Object>... taggedData) {
- if (taggedData == null || taggedData.length == 0) {
- mMetricsLogger.action(category, value);
- } else {
- final LogMaker logMaker = new LogMaker(category)
- .setType(MetricsProto.MetricsEvent.TYPE_ACTION)
- .setSubtype(value);
- for (Pair<Integer, Object> pair : taggedData) {
- logMaker.addTaggedData(pair.first, pair.second);
- }
- mMetricsLogger.write(logMaker);
- }
- }
-
- public void action(int category, boolean value, Pair<Integer, Object>... taggedData) {
- action(category, value ? 1 : 0, taggedData);
- }
-
- public void action(Context context, int category, Pair<Integer, Object>... taggedData) {
- action(context, category, "", taggedData);
- }
-
- public void actionWithSource(Context context, int source, int category) {
- final LogMaker logMaker = new LogMaker(category)
- .setType(MetricsProto.MetricsEvent.TYPE_ACTION);
- if (source != MetricsProto.MetricsEvent.VIEW_UNKNOWN) {
- logMaker.addTaggedData(MetricsProto.MetricsEvent.FIELD_CONTEXT, source);
- }
- MetricsLogger.action(logMaker);
- }
-
- /** @deprecated use {@link #action(int, int, Pair[])} */
- @Deprecated
- public void action(Context context, int category, int value) {
- MetricsLogger.action(context, category, value);
- }
-
- /** @deprecated use {@link #action(int, boolean, Pair[])} */
- @Deprecated
- public void action(Context context, int category, boolean value) {
- MetricsLogger.action(context, category, value);
- }
-
- public void action(Context context, int category, String pkg,
- Pair<Integer, Object>... taggedData) {
- if (taggedData == null || taggedData.length == 0) {
- MetricsLogger.action(context, category, pkg);
- } else {
- final LogMaker logMaker = new LogMaker(category)
- .setType(MetricsProto.MetricsEvent.TYPE_ACTION)
- .setPackageName(pkg);
- for (Pair<Integer, Object> pair : taggedData) {
- logMaker.addTaggedData(pair.first, pair.second);
- }
- MetricsLogger.action(logMaker);
- }
- }
-
- public void count(Context context, String name, int value) {
- MetricsLogger.count(context, name, value);
- }
-
- public void histogram(Context context, String name, int bucket) {
- MetricsLogger.histogram(context, name, bucket);
- }
-}
diff --git a/src/com/android/settings/core/instrumentation/Instrumentable.java b/src/com/android/settings/core/instrumentation/Instrumentable.java
deleted file mode 100644
index f58e140..0000000
--- a/src/com/android/settings/core/instrumentation/Instrumentable.java
+++ /dev/null
@@ -1,28 +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.core.instrumentation;
-
-public interface Instrumentable {
-
- int METRICS_CATEGORY_UNKNOWN = 0;
-
- /**
- * Instrumented name for a view as defined in
- * {@link com.android.internal.logging.nano.MetricsProto.MetricsEvent}.
- */
- int getMetricsCategory();
-}
diff --git a/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java b/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java
index 5a9ab56..0a214f1 100644
--- a/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java
+++ b/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java
@@ -19,6 +19,9 @@
import com.android.settings.DialogCreatable;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.Instrumentable;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.core.lifecycle.ObservableDialogFragment;
public abstract class InstrumentedDialogFragment extends ObservableDialogFragment
@@ -38,13 +41,15 @@
public InstrumentedDialogFragment(DialogCreatable dialogCreatable, int dialogId) {
mDialogCreatable = dialogCreatable;
mDialogId = dialogId;
- mLifecycle.addObserver(new VisibilityLoggerMixin(getMetricsCategory()));
}
-
@Override
public void onAttach(Context context) {
super.onAttach(context);
- mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+ mMetricsFeatureProvider = FeatureFactory.getFactory(context)
+ .getMetricsFeatureProvider();
+ mLifecycle.addObserver(new VisibilityLoggerMixin(getMetricsCategory(),
+ mMetricsFeatureProvider));
+ mLifecycle.onAttach(context);
}
}
diff --git a/src/com/android/settings/core/instrumentation/LogWriter.java b/src/com/android/settings/core/instrumentation/LogWriter.java
deleted file mode 100644
index 062d46f..0000000
--- a/src/com/android/settings/core/instrumentation/LogWriter.java
+++ /dev/null
@@ -1,84 +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.core.instrumentation;
-
-import android.content.Context;
-import android.util.Pair;
-
-/**
- * Generic log writer interface.
- */
-public interface LogWriter {
-
- /**
- * Logs a visibility event when view becomes visible.
- */
- void visible(Context context, int source, int category);
-
- /**
- * Logs a visibility event when view becomes hidden.
- */
- void hidden(Context context, int category);
-
- /**
- * Logs a user action.
- */
- void action(int category, int value, Pair<Integer, Object>... taggedData);
-
- /**
- * Logs a user action.
- */
- void action(int category, boolean value, Pair<Integer, Object>... taggedData);
-
- /**
- * Logs an user action.
- */
- void action(Context context, int category, Pair<Integer, Object>... taggedData);
-
- /**
- * Logs an user action.
- */
- void actionWithSource(Context context, int source, int category);
-
- /**
- * Logs an user action.
- * @deprecated use {@link #action(int, int, Pair[])}
- */
- @Deprecated
- void action(Context context, int category, int value);
-
- /**
- * Logs an user action.
- * @deprecated use {@link #action(int, boolean, Pair[])}
- */
- @Deprecated
- void action(Context context, int category, boolean value);
-
- /**
- * Logs an user action.
- */
- void action(Context context, int category, String pkg, Pair<Integer, Object>... taggedData);
-
- /**
- * Logs a count.
- */
- void count(Context context, String name, int value);
-
- /**
- * Logs a histogram event.
- */
- void histogram(Context context, String name, int bucket);
-}
diff --git a/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java b/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java
deleted file mode 100644
index 166cbb8..0000000
--- a/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java
+++ /dev/null
@@ -1,159 +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.core.instrumentation;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.text.TextUtils;
-import android.util.Pair;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * FeatureProvider for metrics.
- */
-public class MetricsFeatureProvider {
- private List<LogWriter> mLoggerWriters;
-
- public MetricsFeatureProvider() {
- mLoggerWriters = new ArrayList<>();
- installLogWriters();
- }
-
- protected void installLogWriters() {
- mLoggerWriters.add(new EventLogWriter());
- }
-
- public void visible(Context context, int source, int category) {
- for (LogWriter writer : mLoggerWriters) {
- writer.visible(context, source, category);
- }
- }
-
- public void hidden(Context context, int category) {
- for (LogWriter writer : mLoggerWriters) {
- writer.hidden(context, category);
- }
- }
-
- public void actionWithSource(Context context, int source, int category) {
- for (LogWriter writer : mLoggerWriters) {
- writer.actionWithSource(context, source, category);
- }
- }
-
- /**
- * Logs a user action. Includes the elapsed time since the containing
- * fragment has been visible.
- */
- public void action(VisibilityLoggerMixin visibilityLogger, int category, int value) {
- for (LogWriter writer : mLoggerWriters) {
- writer.action(category, value,
- sinceVisibleTaggedData(visibilityLogger.elapsedTimeSinceVisible()));
- }
- }
-
- /**
- * Logs a user action. Includes the elapsed time since the containing
- * fragment has been visible.
- */
- public void action(VisibilityLoggerMixin visibilityLogger, int category, boolean value) {
- for (LogWriter writer : mLoggerWriters) {
- writer.action(category, value,
- sinceVisibleTaggedData(visibilityLogger.elapsedTimeSinceVisible()));
- }
- }
-
- public void action(Context context, int category, Pair<Integer, Object>... taggedData) {
- for (LogWriter writer : mLoggerWriters) {
- writer.action(context, category, taggedData);
- }
- }
-
- /** @deprecated use {@link #action(VisibilityLoggerMixin, int, int)} */
- @Deprecated
- public void action(Context context, int category, int value) {
- for (LogWriter writer : mLoggerWriters) {
- writer.action(context, category, value);
- }
- }
-
- /** @deprecated use {@link #action(VisibilityLoggerMixin, int, boolean)} */
- @Deprecated
- public void action(Context context, int category, boolean value) {
- for (LogWriter writer : mLoggerWriters) {
- writer.action(context, category, value);
- }
- }
-
- public void action(Context context, int category, String pkg,
- Pair<Integer, Object>... taggedData) {
- for (LogWriter writer : mLoggerWriters) {
- writer.action(context, category, pkg, taggedData);
- }
- }
-
- public void count(Context context, String name, int value) {
- for (LogWriter writer : mLoggerWriters) {
- writer.count(context, name, value);
- }
- }
-
- public void histogram(Context context, String name, int bucket) {
- for (LogWriter writer : mLoggerWriters) {
- writer.histogram(context, name, bucket);
- }
- }
-
- public int getMetricsCategory(Object object) {
- if (object == null || !(object instanceof Instrumentable)) {
- return MetricsEvent.VIEW_UNKNOWN;
- }
- return ((Instrumentable) object).getMetricsCategory();
- }
-
- public void logDashboardStartIntent(Context context, Intent intent,
- int sourceMetricsCategory) {
- if (intent == null) {
- return;
- }
- final ComponentName cn = intent.getComponent();
- if (cn == null) {
- final String action = intent.getAction();
- if (TextUtils.isEmpty(action)) {
- // Not loggable
- return;
- }
- action(context, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, action,
- Pair.create(MetricsEvent.FIELD_CONTEXT, sourceMetricsCategory));
- return;
- } else if (TextUtils.equals(cn.getPackageName(), context.getPackageName())) {
- // Going to a Setting internal page, skip click logging in favor of page's own
- // visibility logging.
- return;
- }
- action(context, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, cn.flattenToString(),
- Pair.create(MetricsEvent.FIELD_CONTEXT, sourceMetricsCategory));
- }
-
- private Pair<Integer, Object> sinceVisibleTaggedData(long timestamp) {
- return Pair.create(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS, timestamp);
- }
-}
diff --git a/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java b/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
deleted file mode 100644
index dee40c0..0000000
--- a/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
+++ /dev/null
@@ -1,259 +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.core.instrumentation;
-
-import android.annotation.Nullable;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.os.AsyncTask;
-import android.support.annotation.VisibleForTesting;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.Pair;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.overlay.FeatureFactory;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentSkipListSet;
-
-public class SharedPreferencesLogger implements SharedPreferences {
-
- private static final String LOG_TAG = "SharedPreferencesLogger";
-
- private final String mTag;
- private final Context mContext;
- private final MetricsFeatureProvider mMetricsFeature;
- private final Set<String> mPreferenceKeySet;
-
- public SharedPreferencesLogger(Context context, String tag) {
- mContext = context;
- mTag = tag;
- mMetricsFeature = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
- mPreferenceKeySet = new ConcurrentSkipListSet<>();
- }
-
- @Override
- public Map<String, ?> getAll() {
- return null;
- }
-
- @Override
- public String getString(String key, @Nullable String defValue) {
- return defValue;
- }
-
- @Override
- public Set<String> getStringSet(String key, @Nullable Set<String> defValues) {
- return defValues;
- }
-
- @Override
- public int getInt(String key, int defValue) {
- return defValue;
- }
-
- @Override
- public long getLong(String key, long defValue) {
- return defValue;
- }
-
- @Override
- public float getFloat(String key, float defValue) {
- return defValue;
- }
-
- @Override
- public boolean getBoolean(String key, boolean defValue) {
- return defValue;
- }
-
- @Override
- public boolean contains(String key) {
- return false;
- }
-
- @Override
- public Editor edit() {
- return new EditorLogger();
- }
-
- @Override
- public void registerOnSharedPreferenceChangeListener(
- OnSharedPreferenceChangeListener listener) {
- }
-
- @Override
- public void unregisterOnSharedPreferenceChangeListener(
- OnSharedPreferenceChangeListener listener) {
- }
-
- private void logValue(String key, Object value) {
- logValue(key, value, false /* forceLog */);
- }
-
- private void logValue(String key, Object value, boolean forceLog) {
- final String prefKey = buildPrefKey(mTag, key);
- if (!forceLog && !mPreferenceKeySet.contains(prefKey)) {
- // Pref key doesn't exist in set, this is initial display so we skip metrics but
- // keeps track of this key.
- mPreferenceKeySet.add(prefKey);
- return;
- }
- // TODO: Remove count logging to save some resource.
- mMetricsFeature.count(mContext, buildCountName(prefKey, value), 1);
-
- final Pair<Integer, Object> valueData;
- if (value instanceof Long) {
- final Long longVal = (Long) value;
- final int intVal;
- if (longVal > Integer.MAX_VALUE) {
- intVal = Integer.MAX_VALUE;
- } else if (longVal < Integer.MIN_VALUE) {
- intVal = Integer.MIN_VALUE;
- } else {
- intVal = longVal.intValue();
- }
- valueData = Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE,
- intVal);
- } else if (value instanceof Integer) {
- valueData = Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE,
- value);
- } else if (value instanceof Boolean) {
- valueData = Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE,
- (Boolean) value ? 1 : 0);
- } else if (value instanceof Float) {
- valueData = Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_FLOAT_VALUE,
- value);
- } else if (value instanceof String) {
- Log.d(LOG_TAG, "Tried to log string preference " + prefKey + " = " + value);
- valueData = null;
- } else {
- Log.w(LOG_TAG, "Tried to log unloggable object" + value);
- valueData = null;
- }
- if (valueData != null) {
- // Pref key exists in set, log it's change in metrics.
- mMetricsFeature.action(mContext, MetricsEvent.ACTION_SETTINGS_PREFERENCE_CHANGE,
- Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, prefKey),
- valueData);
- }
- }
-
- @VisibleForTesting
- void logPackageName(String key, String value) {
- final String prefKey = mTag + "/" + key;
- mMetricsFeature.action(mContext, MetricsEvent.ACTION_SETTINGS_PREFERENCE_CHANGE, value,
- Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, prefKey));
- }
-
- private void safeLogValue(String key, String value) {
- new AsyncPackageCheck().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, key, value);
- }
-
- public static String buildCountName(String prefKey, Object value) {
- return prefKey + "|" + value;
- }
-
- public static String buildPrefKey(String tag, String key) {
- return tag + "/" + key;
- }
-
- private class AsyncPackageCheck extends AsyncTask<String, Void, Void> {
- @Override
- protected Void doInBackground(String... params) {
- String key = params[0];
- String value = params[1];
- PackageManager pm = mContext.getPackageManager();
- try {
- // Check if this might be a component.
- ComponentName name = ComponentName.unflattenFromString(value);
- if (value != null) {
- value = name.getPackageName();
- }
- } catch (Exception e) {
- }
- try {
- pm.getPackageInfo(value, PackageManager.MATCH_ANY_USER);
- logPackageName(key, value);
- } catch (PackageManager.NameNotFoundException e) {
- // Clearly not a package, and it's unlikely this preference is in prefSet, so
- // lets force log it.
- logValue(key, value, true /* forceLog */);
- }
- return null;
- }
- }
-
- public class EditorLogger implements Editor {
- @Override
- public Editor putString(String key, @Nullable String value) {
- safeLogValue(key, value);
- return this;
- }
-
- @Override
- public Editor putStringSet(String key, @Nullable Set<String> values) {
- safeLogValue(key, TextUtils.join(",", values));
- return this;
- }
-
- @Override
- public Editor putInt(String key, int value) {
- logValue(key, value);
- return this;
- }
-
- @Override
- public Editor putLong(String key, long value) {
- logValue(key, value);
- return this;
- }
-
- @Override
- public Editor putFloat(String key, float value) {
- logValue(key, value);
- return this;
- }
-
- @Override
- public Editor putBoolean(String key, boolean value) {
- logValue(key, value);
- return this;
- }
-
- @Override
- public Editor remove(String key) {
- return this;
- }
-
- @Override
- public Editor clear() {
- return this;
- }
-
- @Override
- public boolean commit() {
- return true;
- }
-
- @Override
- public void apply() {
- }
- }
-}
diff --git a/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java b/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java
deleted file mode 100644
index 2fe2a3b..0000000
--- a/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java
+++ /dev/null
@@ -1,100 +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.core.instrumentation;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-
-import android.os.SystemClock;
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.SettingsActivity;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnAttach;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
-
-import static com.android.settings.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
-
-/**
- * Logs visibility change of a fragment.
- */
-public class VisibilityLoggerMixin implements LifecycleObserver, OnResume, OnPause, OnAttach {
-
- private static final String TAG = "VisibilityLoggerMixin";
-
- private final int mMetricsCategory;
-
- private MetricsFeatureProvider mMetricsFeature;
- private int mSourceMetricsCategory = MetricsProto.MetricsEvent.VIEW_UNKNOWN;
- private long mVisibleTimestamp;
-
- public VisibilityLoggerMixin(int metricsCategory) {
- // MetricsFeature will be set during onAttach.
- this(metricsCategory, null /* metricsFeature */);
- }
-
- public VisibilityLoggerMixin(int metricsCategory, MetricsFeatureProvider metricsFeature) {
- mMetricsCategory = metricsCategory;
- mMetricsFeature = metricsFeature;
- }
-
- @Override
- public void onAttach(Context context) {
- mMetricsFeature = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
- }
-
- @Override
- public void onResume() {
- mVisibleTimestamp = SystemClock.elapsedRealtime();
- if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) {
- mMetricsFeature.visible(null /* context */, mSourceMetricsCategory, mMetricsCategory);
- }
- }
-
- @Override
- public void onPause() {
- mVisibleTimestamp = 0;
- if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) {
- mMetricsFeature.hidden(null /* context */, mMetricsCategory);
- }
- }
-
- /**
- * Sets source metrics category for this logger. Source is the caller that opened this UI.
- */
- public void setSourceMetricsCategory(Activity activity) {
- if (mSourceMetricsCategory != MetricsProto.MetricsEvent.VIEW_UNKNOWN || activity == null) {
- return;
- }
- final Intent intent = activity.getIntent();
- if (intent == null) {
- return;
- }
- mSourceMetricsCategory = intent.getIntExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY,
- MetricsProto.MetricsEvent.VIEW_UNKNOWN);
- }
-
- /** Returns elapsed time since onResume() */
- public long elapsedTimeSinceVisible() {
- if (mVisibleTimestamp == 0) {
- return 0;
- }
- return SystemClock.elapsedRealtime() - mVisibleTimestamp;
- }
-}
diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index 97eef13..2d35ea7 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -41,7 +41,6 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.R.id;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardData.SuggestionConditionHeaderData;
import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.dashboard.conditional.ConditionAdapter;
@@ -50,6 +49,7 @@
import com.android.settings.dashboard.suggestions.SuggestionDismissController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.Utils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
diff --git a/src/com/android/settings/dashboard/DashboardAdapterV2.java b/src/com/android/settings/dashboard/DashboardAdapterV2.java
index a422ae4..ad93e4c 100644
--- a/src/com/android/settings/dashboard/DashboardAdapterV2.java
+++ b/src/com/android/settings/dashboard/DashboardAdapterV2.java
@@ -39,13 +39,13 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.R.id;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardDataV2.ConditionHeaderData;
import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.dashboard.conditional.ConditionAdapterV2;
import com.android.settings.dashboard.suggestions.SuggestionAdapterV2;
import com.android.settings.dashboard.suggestions.SuggestionControllerMixin;
import com.android.settings.overlay.FeatureFactory;
+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.OnSaveInstanceState;
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index a06fee9..a14d9e9 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -41,8 +41,9 @@
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.core.FeatureFlags;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
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;
@@ -159,7 +160,8 @@
pref.setFragment(clsName);
} else if (tile.intent != null) {
final Intent intent = new Intent(tile.intent);
- intent.putExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY, sourceMetricsCategory);
+ intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
+ sourceMetricsCategory);
if (action != null) {
intent.setAction(action);
}
@@ -208,7 +210,7 @@
return;
}
final Intent intent = new Intent(tile.intent)
- .putExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY,
+ .putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
MetricsEvent.DASHBOARD_SUMMARY)
.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
diff --git a/src/com/android/settings/dashboard/conditional/Condition.java b/src/com/android/settings/dashboard/conditional/Condition.java
index 05783bd..d66440e 100644
--- a/src/com/android/settings/dashboard/conditional/Condition.java
+++ b/src/com/android/settings/dashboard/conditional/Condition.java
@@ -24,8 +24,8 @@
import android.support.annotation.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public abstract class Condition {
diff --git a/src/com/android/settings/dashboard/conditional/ConditionAdapter.java b/src/com/android/settings/dashboard/conditional/ConditionAdapter.java
index eb768e5..d84aa7c 100644
--- a/src/com/android/settings/dashboard/conditional/ConditionAdapter.java
+++ b/src/com/android/settings/dashboard/conditional/ConditionAdapter.java
@@ -27,13 +27,13 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardAdapter;
import com.android.settings.dashboard.DashboardAdapter.DashboardItemHolder;
import com.android.settings.dashboard.DashboardData;
import com.android.settings.dashboard.DashboardData.HeaderMode;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.WirelessUtils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.List;
import java.util.Objects;
diff --git a/src/com/android/settings/dashboard/conditional/ConditionAdapterV2.java b/src/com/android/settings/dashboard/conditional/ConditionAdapterV2.java
index 3f3e5c9..8db57f7 100644
--- a/src/com/android/settings/dashboard/conditional/ConditionAdapterV2.java
+++ b/src/com/android/settings/dashboard/conditional/ConditionAdapterV2.java
@@ -27,10 +27,10 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardAdapterV2.DashboardItemHolder;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.WirelessUtils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.List;
import java.util.Objects;
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
index fc11029..2b79a9b 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
@@ -27,10 +27,10 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardAdapter.DashboardItemHolder;
import com.android.settings.dashboard.DashboardAdapter.IconCache;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.List;
import java.util.Objects;
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapterV2.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapterV2.java
index afd0e08..e04ae93 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionAdapterV2.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionAdapterV2.java
@@ -31,10 +31,10 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardAdapterV2.DashboardItemHolder;
import com.android.settings.dashboard.DashboardAdapterV2.IconCache;
import com.android.settings.overlay.FeatureFactory;
+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.OnSaveInstanceState;
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
index fe19b95..60b20e0 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
@@ -30,25 +30,15 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.Settings.AmbientDisplayPickupSuggestionActivity;
-import com.android.settings.Settings.AmbientDisplaySuggestionActivity;
-import com.android.settings.Settings.DoubleTapPowerSuggestionActivity;
-import com.android.settings.Settings.DoubleTwistSuggestionActivity;
import com.android.settings.Settings.NightDisplaySuggestionActivity;
-import com.android.settings.Settings.SwipeToNotificationSuggestionActivity;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.fingerprint.FingerprintEnrollSuggestionActivity;
import com.android.settings.fingerprint.FingerprintSuggestionActivity;
-import com.android.settings.gestures.DoubleTapPowerPreferenceController;
-import com.android.settings.gestures.DoubleTapScreenPreferenceController;
-import com.android.settings.gestures.DoubleTwistPreferenceController;
-import com.android.settings.gestures.PickupGesturePreferenceController;
-import com.android.settings.gestures.SwipeToNotificationPreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ScreenLockSuggestionActivity;
import com.android.settings.support.NewDeviceIntroSuggestionActivity;
import com.android.settings.wallpaper.WallpaperSuggestionActivity;
import com.android.settings.wifi.WifiCallingSuggestionActivity;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.drawer.Tile;
import java.util.List;
@@ -98,21 +88,6 @@
return hasUsedNightDisplay(context);
} else if (className.equals(NewDeviceIntroSuggestionActivity.class.getName())) {
return NewDeviceIntroSuggestionActivity.isSuggestionComplete(context);
- } else if (className.equals(DoubleTapPowerSuggestionActivity.class.getName())) {
- return DoubleTapPowerPreferenceController
- .isSuggestionComplete(context, getSharedPrefs(context));
- } else if (className.equals(DoubleTwistSuggestionActivity.class.getName())) {
- return DoubleTwistPreferenceController
- .isSuggestionComplete(context, getSharedPrefs(context));
- } else if (className.equals(AmbientDisplaySuggestionActivity.class.getName())) {
- return DoubleTapScreenPreferenceController
- .isSuggestionComplete(context, getSharedPrefs(context));
- } else if (className.equals(AmbientDisplayPickupSuggestionActivity.class.getName())) {
- return PickupGesturePreferenceController
- .isSuggestionComplete(context, getSharedPrefs(context));
- } else if (className.equals(SwipeToNotificationSuggestionActivity.class.getName())) {
- return SwipeToNotificationPreferenceController
- .isSuggestionComplete(context, getSharedPrefs(context));
}
return false;
}
diff --git a/src/com/android/settings/datausage/DataSaverBackend.java b/src/com/android/settings/datausage/DataSaverBackend.java
index ff568c7..b59da9d 100644
--- a/src/com/android/settings/datausage/DataSaverBackend.java
+++ b/src/com/android/settings/datausage/DataSaverBackend.java
@@ -25,8 +25,8 @@
import android.util.SparseIntArray;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList;
diff --git a/src/com/android/settings/datetime/ZonePicker.java b/src/com/android/settings/datetime/ZonePicker.java
index 57c340c..dc69127 100644
--- a/src/com/android/settings/datetime/ZonePicker.java
+++ b/src/com/android/settings/datetime/ZonePicker.java
@@ -35,8 +35,9 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.Instrumentable;
-import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.Instrumentable;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.datetime.ZoneGetter;
import java.text.Collator;
@@ -57,8 +58,7 @@
private static final int MENU_TIMEZONE = Menu.FIRST+1;
private static final int MENU_ALPHABETICAL = Menu.FIRST;
- private final VisibilityLoggerMixin mVisibilityLoggerMixin =
- new VisibilityLoggerMixin(getMetricsCategory());
+ private VisibilityLoggerMixin mVisibilityLoggerMixin;
private boolean mSortedByTimezone;
@@ -145,12 +145,6 @@
}
@Override
- public void onAttach(Context context) {
- super.onAttach(context);
- mVisibilityLoggerMixin.onAttach(context);
- }
-
- @Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.ZONE_PICKER;
}
@@ -170,6 +164,13 @@
}
@Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory(),
+ FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider());
+ }
+
+ @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = super.onCreateView(inflater, container, savedInstanceState);
diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
index 8ab1a07..a20afa1 100644
--- a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
+++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
@@ -23,10 +23,10 @@
import android.support.v7.preference.Preference;
import android.widget.Switch;
-import com.android.internal.util.Preconditions;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.widget.SwitchBar;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.util.Preconditions;
+import com.android.settings.widget.SwitchBar;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/** Handles the logic for flipping the storage management toggle on a {@link SwitchBar}. */
public class AutomaticStorageManagerSwitchBarController
diff --git a/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java b/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java
index 5565e3d..c968d25 100644
--- a/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java
@@ -31,7 +31,7 @@
import com.android.settings.overlay.FeatureFactory;
public class BrandedAccountPreferenceController extends BasePreferenceController {
- private static final String KEY_PREFERENCE_TITLE = "account";
+ private static final String KEY_PREFERENCE_TITLE = "branded_account";
private final Account[] mAccounts;
public BrandedAccountPreferenceController(Context context) {
diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
index 2641f5d..0f3bfb8 100644
--- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
@@ -34,11 +34,11 @@
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settingslib.RestrictedLockUtils;
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.OnResume;
diff --git a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
new file mode 100644
index 0000000..0f1dea1
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
@@ -0,0 +1,151 @@
+/*
+ * 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.deviceinfo;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.os.Build;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.SpannedString;
+
+import com.android.settings.bluetooth.BluetoothLengthDeviceNameFilter;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.widget.ValidatedEditTextPreference;
+import com.android.settings.wifi.tether.WifiDeviceNameTextValidator;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+public class DeviceNamePreferenceController extends BasePreferenceController
+ implements ValidatedEditTextPreference.Validator, Preference.OnPreferenceChangeListener {
+ private static final String PREF_KEY = "device_name";
+ private String mDeviceName;
+ protected WifiManager mWifiManager;
+ private final WifiDeviceNameTextValidator mWifiDeviceNameTextValidator;
+ private ValidatedEditTextPreference mPreference;
+ @Nullable
+ private LocalBluetoothManager mBluetoothManager;
+
+ public DeviceNamePreferenceController(Context context) {
+ super(context, PREF_KEY);
+ mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ mWifiDeviceNameTextValidator = new WifiDeviceNameTextValidator();
+ initializeDeviceName();
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = (ValidatedEditTextPreference) screen.findPreference(PREF_KEY);
+ mPreference.setSummary(getSummary());
+ mPreference.setValidator(this);
+ }
+
+ private void initializeDeviceName() {
+ mDeviceName = Settings.Global.getString(mContext.getContentResolver(),
+ Settings.Global.DEVICE_NAME);
+ if (mDeviceName == null) {
+ mDeviceName = Build.MODEL;
+ }
+ }
+
+ @Override
+ public String getSummary() {
+ return mDeviceName;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return PREF_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ mDeviceName = (String) newValue;
+ setDeviceName(mDeviceName);
+ preference.setSummary(getSummary());
+ return true;
+ }
+
+ @Override
+ public boolean isTextValid(String deviceName) {
+ // BluetoothNameDialogFragment describes BT name filter as a 248 bytes long cap.
+ // Given the restrictions presented by the SSID name filter (32 char), I don't believe it is
+ // possible to construct an SSID that is not a valid Bluetooth name.
+ return mWifiDeviceNameTextValidator.isTextValid(deviceName);
+ }
+
+ public void setLocalBluetoothManager(LocalBluetoothManager localBluetoothManager) {
+ mBluetoothManager = localBluetoothManager;
+ }
+
+ /**
+ * This method presumes that security/validity checks have already been passed.
+ */
+ private void setDeviceName(String deviceName) {
+ setSettingsGlobalDeviceName(deviceName);
+ setBluetoothDeviceName(deviceName);
+ setTetherSsidName(deviceName);
+ }
+
+ private void setSettingsGlobalDeviceName(String deviceName) {
+ Settings.Global.putString(mContext.getContentResolver(), Settings.Global.DEVICE_NAME,
+ deviceName);
+ }
+
+ private void setBluetoothDeviceName(String deviceName) {
+ // Bluetooth manager doesn't exist for certain devices.
+ if (mBluetoothManager == null) {
+ return;
+ }
+
+ final LocalBluetoothAdapter localBluetoothAdapter = mBluetoothManager.getBluetoothAdapter();
+ if (localBluetoothAdapter != null) {
+ localBluetoothAdapter.setName(getFilteredBluetoothString(deviceName));
+ }
+ }
+
+ /**
+ * Using a UTF8ByteLengthFilter, we can filter a string to be compliant with the Bluetooth spec.
+ * For more information, see {@link com.android.settings.bluetooth.BluetoothNameDialogFragment}.
+ */
+ private static final String getFilteredBluetoothString(final String deviceName) {
+ CharSequence filteredSequence = new BluetoothLengthDeviceNameFilter().filter(deviceName, 0, deviceName.length(),
+ new SpannedString(""),
+ 0, 0);
+ // null -> use the original
+ if (filteredSequence == null) {
+ return deviceName;
+ }
+ return filteredSequence.toString();
+ }
+
+ private void setTetherSsidName(String deviceName) {
+ final WifiConfiguration config = mWifiManager.getWifiApConfiguration();
+ config.SSID = deviceName;
+ // TODO: If tether is running, turn off the AP and restart it after setting config.
+ mWifiManager.setWifiApConfiguration(config);
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
index a061f82..2806275 100644
--- a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
@@ -47,7 +47,8 @@
@Override
public int getAvailabilityStatus() {
- return mUm.isAdminUser()
+ return mContext.getResources().getBoolean(R.bool.config_show_system_update_settings)
+ && mUm.isAdminUser()
? AVAILABLE
: DISABLED_UNSUPPORTED;
}
diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
new file mode 100644
index 0000000..04e7fde
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -0,0 +1,186 @@
+/*
+ * 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.deviceinfo.aboutphone;
+
+import static com.android.settings.bluetooth.Utils.getLocalBtManager;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.Bundle;
+import android.os.UserManager;
+import android.provider.SearchIndexableResource;
+import android.telephony.TelephonyManager;
+import android.view.View;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.SettingsActivity;
+import com.android.settings.Utils;
+import com.android.settings.applications.LayoutPreference;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.deviceinfo.BluetoothAddressPreferenceController;
+import com.android.settings.deviceinfo.BrandedAccountPreferenceController;
+import com.android.settings.deviceinfo.BuildNumberPreferenceController;
+import com.android.settings.deviceinfo.DeviceModelPreferenceController;
+import com.android.settings.deviceinfo.FccEquipmentIdPreferenceController;
+import com.android.settings.deviceinfo.FeedbackPreferenceController;
+import com.android.settings.deviceinfo.ImsStatusPreferenceController;
+import com.android.settings.deviceinfo.IpAddressPreferenceController;
+import com.android.settings.deviceinfo.ManualPreferenceController;
+import com.android.settings.deviceinfo.PhoneNumberPreferenceController;
+import com.android.settings.deviceinfo.RegulatoryInfoPreferenceController;
+import com.android.settings.deviceinfo.SafetyInfoPreferenceController;
+import com.android.settings.deviceinfo.WifiMacAddressPreferenceController;
+import com.android.settings.deviceinfo.firmwareversion.FirmwareVersionPreferenceController;
+import com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController;
+import com.android.settings.deviceinfo.simstatus.SimStatusPreferenceController;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.widget.EntityHeaderController;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settings.deviceinfo.DeviceNamePreferenceController;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class MyDeviceInfoFragment extends DashboardFragment {
+ private static final String LOG_TAG = "MeCardFragment";
+
+ private static final String KEY_MY_DEVICE_INFO_HEADER = "my_device_info_header";
+ private static final String KEY_LEGAL_CONTAINER = "legal_container";
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsEvent.DEVICEINFO;
+ }
+
+ @Override
+ public int getHelpResource() {
+ return R.string.help_uri_about;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ initHeader();
+ }
+
+ @Override
+ protected String getLogTag() {
+ return LOG_TAG;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.my_device_info;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ return buildPreferenceControllers(context, getActivity(), this /* fragment */,
+ getLifecycle());
+ }
+
+ private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
+ Activity activity, Fragment fragment, Lifecycle lifecycle) {
+ final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ controllers.add(new PhoneNumberPreferenceController(context));
+ controllers.add(new BrandedAccountPreferenceController(context));
+ DeviceNamePreferenceController deviceNamePreferenceController =
+ new DeviceNamePreferenceController(context);
+ deviceNamePreferenceController.setLocalBluetoothManager(getLocalBtManager(context));
+ controllers.add(deviceNamePreferenceController);
+ controllers.add(new SimStatusPreferenceController(context, fragment));
+ controllers.add(new DeviceModelPreferenceController(context, fragment));
+ controllers.add(new ImeiInfoPreferenceController(context, fragment));
+ controllers.add(new FirmwareVersionPreferenceController(context, fragment));
+ controllers.add(new ImsStatusPreferenceController(context, lifecycle));
+ controllers.add(new IpAddressPreferenceController(context, lifecycle));
+ controllers.add(new WifiMacAddressPreferenceController(context, lifecycle));
+ controllers.add(new BluetoothAddressPreferenceController(context, lifecycle));
+ controllers.add(new RegulatoryInfoPreferenceController(context));
+ controllers.add(new SafetyInfoPreferenceController(context));
+ controllers.add(new ManualPreferenceController(context));
+ controllers.add(new FeedbackPreferenceController(fragment, context));
+ controllers.add(new FccEquipmentIdPreferenceController(context));
+ controllers.add(
+ new BuildNumberPreferenceController(context, activity, fragment, lifecycle));
+ return controllers;
+ }
+
+ private void initHeader() {
+ // TODO: Migrate into its own controller.
+ final LayoutPreference headerPreference =
+ (LayoutPreference) getPreferenceScreen().findPreference(KEY_MY_DEVICE_INFO_HEADER);
+ final View appSnippet = headerPreference.findViewById(R.id.entity_header);
+ final Activity context = getActivity();
+ final Bundle bundle = getArguments();
+ EntityHeaderController controller = EntityHeaderController
+ .newInstance(context, this, appSnippet)
+ .setRecyclerView(getListView(), getLifecycle())
+ .setButtonActions(EntityHeaderController.ActionType.ACTION_NONE,
+ EntityHeaderController.ActionType.ACTION_NONE);
+
+ // TODO: There may be an avatar setting action we can use here.
+ final int iconId = bundle.getInt("icon_id", 0);
+ if (iconId == 0) {
+ UserManager userManager = (UserManager) getActivity().getSystemService(
+ Context.USER_SERVICE);
+ UserInfo info = Utils.getExistingUser(userManager, android.os.Process.myUserHandle());
+ controller.setLabel(info.name);
+ controller.setIcon(
+ com.android.settingslib.Utils.getUserIcon(getActivity(), userManager, info));
+ }
+
+ controller.done(context, true /* rebindActions */);
+ }
+
+ /**
+ * For Search.
+ */
+ public static final 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.my_device_info;
+ return Arrays.asList(sir);
+ }
+
+ @Override
+ public List<AbstractPreferenceController> getPreferenceControllers(
+ Context context) {
+ return buildPreferenceControllers(context, null /*activity */,
+ null /* fragment */, null /* lifecycle */);
+ }
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+ // The legal container is duplicated, so we ignore it here.
+ keys.add(KEY_LEGAL_CONTAINER);
+ return keys;
+ }
+ };
+}
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
index 91440f7..af898d5 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
@@ -26,6 +26,7 @@
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.res.Resources;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.os.UserHandle;
@@ -41,10 +42,12 @@
import android.telephony.TelephonyManager;
import android.text.BidiFormatter;
import android.text.TextDirectionHeuristics;
+import android.telephony.euicc.EuiccManager;
import android.text.TextUtils;
import android.util.Log;
import com.android.settings.R;
+import com.android.settings.wrapper.EuiccManagerWrapper;
import com.android.settingslib.DeviceInfoUtils;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -81,6 +84,8 @@
final static int ICCID_INFO_LABEL_ID = R.id.icc_id_label;
@VisibleForTesting
final static int ICCID_INFO_VALUE_ID = R.id.icc_id_value;
+ @VisibleForTesting
+ final static int EID_INFO_VALUE_ID = R.id.esim_id_value;
private final static String CB_AREA_INFO_RECEIVED_ACTION =
"com.android.cellbroadcastreceiver.CB_AREA_INFO_RECEIVED";
@@ -92,6 +97,7 @@
private final SubscriptionInfo mSubscriptionInfo;
private final TelephonyManager mTelephonyManager;
private final CarrierConfigManager mCarrierConfigManager;
+ private final EuiccManagerWrapper mEuiccManager;
private final Resources mRes;
private final Context mContext;
@@ -116,7 +122,6 @@
}
};
-
private PhoneStateListener mPhoneStateListener;
public SimStatusDialogController(@NonNull SimStatusDialogFragment dialog, Lifecycle lifecycle,
@@ -128,6 +133,7 @@
TELEPHONY_SERVICE);
mCarrierConfigManager = (CarrierConfigManager) mContext.getSystemService(
CARRIER_CONFIG_SERVICE);
+ mEuiccManager = new EuiccManagerWrapper(mContext);
mRes = mContext.getResources();
@@ -137,6 +143,8 @@
}
public void initialize() {
+ updateEid();
+
if (mSubscriptionInfo == null) {
return;
}
@@ -363,6 +371,10 @@
}
}
+ private void updateEid() {
+ mDialog.setText(EID_INFO_VALUE_ID, mEuiccManager.getEid());
+ }
+
private SubscriptionInfo getPhoneSubscriptionInfo(int slotId) {
final List<SubscriptionInfo> subscriptionInfoList = SubscriptionManager.from(
mContext).getActiveSubscriptionInfoList();
diff --git a/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceController.java b/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceController.java
index 717d765..8ab21b3 100644
--- a/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceController.java
@@ -25,12 +25,12 @@
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.MetricsFeatureProvider;
import com.android.settings.deletionhelper.ActivationWarningFragment;
import com.android.settings.widget.MasterSwitchController;
import com.android.settings.widget.MasterSwitchPreference;
import com.android.settings.widget.SwitchWidgetController;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnResume;
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index 1149b99..3623298 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -38,11 +38,11 @@
import com.android.settings.Utils;
import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.deviceinfo.PrivateVolumeSettings.SystemInfoFragment;
import com.android.settings.deviceinfo.StorageItemPreference;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.deviceinfo.StorageMeasurement;
import com.android.settingslib.deviceinfo.StorageVolumeProvider;
diff --git a/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceController.java b/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceController.java
index 68a21ce..f3d17d5 100644
--- a/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceController.java
+++ b/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceController.java
@@ -27,11 +27,11 @@
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.InlineSwitchPayload;
import com.android.settings.search.ResultPayload;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class AmbientDisplayNotificationsPreferenceController extends
AbstractPreferenceController implements PreferenceControllerMixin,
diff --git a/src/com/android/settings/display/AmbientDisplaySettings.java b/src/com/android/settings/display/AmbientDisplaySettings.java
index 24aede0..187325c 100644
--- a/src/com/android/settings/display/AmbientDisplaySettings.java
+++ b/src/com/android/settings/display/AmbientDisplaySettings.java
@@ -23,13 +23,13 @@
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.gestures.DoubleTapScreenPreferenceController;
import com.android.settings.gestures.PickupGesturePreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.ArrayList;
diff --git a/src/com/android/settings/display/AutoRotatePreferenceController.java b/src/com/android/settings/display/AutoRotatePreferenceController.java
index c7f6af1..2134b88 100644
--- a/src/com/android/settings/display/AutoRotatePreferenceController.java
+++ b/src/com/android/settings/display/AutoRotatePreferenceController.java
@@ -20,9 +20,9 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.view.RotationPolicy;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
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.OnPause;
diff --git a/src/com/android/settings/display/ThemePreferenceController.java b/src/com/android/settings/display/ThemePreferenceController.java
index d1341dd74..9c1314e 100644
--- a/src/com/android/settings/display/ThemePreferenceController.java
+++ b/src/com/android/settings/display/ThemePreferenceController.java
@@ -29,9 +29,9 @@
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import libcore.util.Objects;
diff --git a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
index c034746..a52433b 100644
--- a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
@@ -48,7 +48,6 @@
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.ActionButtonPreference;
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
@@ -56,6 +55,7 @@
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
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;
diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
index 5d95dd2..91f35e2 100644
--- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
@@ -49,10 +49,10 @@
import com.android.settings.core.FeatureFlags;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.Utils;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
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;
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index ec54291..e0954e5 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -47,7 +47,6 @@
import com.android.settings.Utils;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.applications.manageapplications.ManageApplications;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.display.AmbientDisplayPreferenceController;
import com.android.settings.display.AutoBrightnessPreferenceController;
@@ -61,6 +60,7 @@
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.ArrayList;
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
index c50d580..605591d 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
@@ -54,7 +54,6 @@
import com.android.settings.Utils;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.applications.manageapplications.ManageApplications;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.display.AmbientDisplayPreferenceController;
import com.android.settings.display.AutoBrightnessPreferenceController;
@@ -67,6 +66,7 @@
import com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController;
import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import java.util.ArrayList;
diff --git a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
index bdaaa3a..e09a8a3 100644
--- a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
+++ b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
@@ -20,11 +20,9 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;
import android.support.v14.preference.PreferenceFragment;
-import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.CheckBoxPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
@@ -36,9 +34,7 @@
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
-import com.android.settings.fuelgauge.anomaly.AnomalyPreference;
+import com.android.settings.widget.AppCheckBoxPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import java.util.List;
@@ -120,7 +116,7 @@
final Context context = getPrefContext();
for (int i = 0, size = mPackageOpsList.size(); i < size; i++) {
- final CheckBoxPreference checkBoxPreference = new CheckBoxPreference(context);
+ final CheckBoxPreference checkBoxPreference = new AppCheckBoxPreference(context);
final AppOpsManager.PackageOps packageOps = mPackageOpsList.get(i);
try {
final ApplicationInfo applicationInfo = mPackageManager.getApplicationInfo(
@@ -128,6 +124,10 @@
checkBoxPreference.setChecked(true);
checkBoxPreference.setTitle(mPackageManager.getApplicationLabel(applicationInfo));
checkBoxPreference.setKey(packageOps.getPackageName());
+ checkBoxPreference.setIcon(
+ Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager,
+ packageOps.getPackageName(),
+ UserHandle.getUserId(packageOps.getUid())));
checkBoxPreference.setOnPreferenceChangeListener((pref, value) -> {
// change the toggle
final int mode = (Boolean) value ? AppOpsManager.MODE_IGNORED
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
index 39d51dc0..3dde95e 100644
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
+++ b/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
@@ -24,7 +24,6 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
import com.android.settings.fuelgauge.anomaly.action.ForceStopAction;
import com.android.settings.fuelgauge.anomaly.action.LocationCheckAction;
@@ -33,6 +32,7 @@
import com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector;
import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
import com.android.settings.fuelgauge.anomaly.checker.WakeupAlarmAnomalyDetector;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/settings/fuelgauge/anomaly/action/AnomalyAction.java b/src/com/android/settings/fuelgauge/anomaly/action/AnomalyAction.java
index 3ee89d1..d7de5a7 100644
--- a/src/com/android/settings/fuelgauge/anomaly/action/AnomalyAction.java
+++ b/src/com/android/settings/fuelgauge/anomaly/action/AnomalyAction.java
@@ -20,9 +20,9 @@
import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/**
* Abstract class for anomaly action, which is triggered if we need to handle the anomaly
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java
index 9fa69fd..1bf08b7 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java
@@ -18,7 +18,7 @@
import android.content.Context;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/**
* Abstract class for battery tip action, which is triggered if we need to handle the battery tip
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
index a19471e..cbd1581 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
@@ -22,8 +22,8 @@
import com.android.settings.R;
import com.android.settings.SettingsActivity;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.fuelgauge.SmartBatterySettings;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class SmartBatteryAction extends BatteryTipAction {
private SettingsActivity mSettingsActivity;
diff --git a/src/com/android/settings/inputmethod/UserDictionarySettings.java b/src/com/android/settings/inputmethod/UserDictionarySettings.java
index 9680af1..3bbc581 100644
--- a/src/com/android/settings/inputmethod/UserDictionarySettings.java
+++ b/src/com/android/settings/inputmethod/UserDictionarySettings.java
@@ -42,10 +42,11 @@
import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
-import com.android.settings.core.instrumentation.Instrumentable;
-import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
+import com.android.settingslib.core.instrumentation.Instrumentable;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
public class UserDictionarySettings extends ListFragment implements Instrumentable,
LoaderManager.LoaderCallbacks<Cursor> {
@@ -59,8 +60,7 @@
private static final int OPTIONS_MENU_ADD = Menu.FIRST;
private static final int LOADER_ID = 1;
- private final VisibilityLoggerMixin mVisibilityLoggerMixin =
- new VisibilityLoggerMixin(getMetricsCategory());
+ private VisibilityLoggerMixin mVisibilityLoggerMixin;
private Cursor mCursor;
private String mLocale;
@@ -71,15 +71,12 @@
}
@Override
- public void onAttach(Context context) {
- super.onAttach(context);
- mVisibilityLoggerMixin.onAttach(context);
- }
-
- @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory(),
+ FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider());
+
final Intent intent = getActivity().getIntent();
final String localeFromIntent =
null == intent ? null : intent.getStringExtra("locale");
diff --git a/src/com/android/settings/location/LocationEnabler.java b/src/com/android/settings/location/LocationEnabler.java
index 4dcdac0..28ee213 100644
--- a/src/com/android/settings/location/LocationEnabler.java
+++ b/src/com/android/settings/location/LocationEnabler.java
@@ -34,8 +34,10 @@
import com.android.settingslib.core.lifecycle.events.OnResume;
import static com.android.settingslib.Utils.updateLocationMode;
+import static com.android.settingslib.Utils.updateLocationEnabled;
import static com.android.settingslib.RestrictedLockUtils.checkIfRestrictionEnforced;
+
/**
* A class that listens to location settings change and modifies location settings
* settings.
@@ -106,6 +108,25 @@
}
}
+ void setLocationEnabled(boolean enabled) {
+ final int currentMode = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
+
+ if (isRestricted()) {
+ // Location toggling disabled by user restriction. Read the current location mode to
+ // update the location master switch.
+ if (Log.isLoggable(TAG, Log.INFO)) {
+ Log.i(TAG, "Restricted user, not setting location mode");
+ }
+ if (mListener != null) {
+ mListener.onLocationModeChanged(currentMode, true);
+ }
+ return;
+ }
+ updateLocationEnabled(mContext, enabled, UserHandle.myUserId());
+ refreshLocationMode();
+ }
+
void setLocationMode(int mode) {
final int currentMode = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
diff --git a/src/com/android/settings/location/LocationMode.java b/src/com/android/settings/location/LocationMode.java
deleted file mode 100644
index 5931f9e..0000000
--- a/src/com/android/settings/location/LocationMode.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2013 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.location;
-
-import android.content.Context;
-import android.provider.SearchIndexableResource;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-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;
-
-/**
- * A page with 3 radio buttons to choose the location mode.
- *
- * There are 3 location modes when location access is enabled:
- *
- * High accuracy: use both GPS and network location.
- *
- * Battery saving: use network location only to reduce the power consumption.
- *
- * Sensors only: use GPS location only.
- */
-public class LocationMode extends DashboardFragment {
-
- private static final String TAG = "LocationMode";
-
- @Override
- public int getMetricsCategory() {
- return MetricsEvent.LOCATION_MODE;
- }
-
- @Override
- protected int getPreferenceScreenResId() {
- return R.xml.location_mode;
- }
-
- @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_location_access;
- }
-
- private static List<AbstractPreferenceController> buildPreferenceControllers(
- Context context, Lifecycle lifecycle) {
- final List<AbstractPreferenceController> controllers = new ArrayList<>();
- controllers.add(new LocationModeHighAccuracyPreferenceController(context, lifecycle));
- controllers.add(
- new LocationModeBatterySavingPreferenceController(context, lifecycle));
- controllers.add(new LocationModeSensorsOnlyPreferenceController(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.location_mode;
- return Arrays.asList(sir);
- }
-
- @Override
- protected boolean isPageSearchEnabled(Context context) {
- return context.getResources().getBoolean(R.bool.config_location_mode_available);
- }
-
- @Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context
- context) {
- return buildPreferenceControllers(context, null /* lifecycle */);
- }
- };
-}
diff --git a/src/com/android/settings/location/LocationModeBatterySavingPreferenceController.java b/src/com/android/settings/location/LocationModeBatterySavingPreferenceController.java
deleted file mode 100644
index 70c7013..0000000
--- a/src/com/android/settings/location/LocationModeBatterySavingPreferenceController.java
+++ /dev/null
@@ -1,40 +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.location;
-
-import android.content.Context;
-import android.provider.Settings;
-
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-public class LocationModeBatterySavingPreferenceController
- extends LocationModeRadioButtonPreferenceController {
-
- private static final String KEY_BATTERY_SAVING = "battery_saving";
-
- public LocationModeBatterySavingPreferenceController(Context context,
- Lifecycle lifecycle) {
- super(context, lifecycle);
- }
-
- @Override
- public String getPreferenceKey() {
- return KEY_BATTERY_SAVING;
- }
-
- @Override
- protected int getLocationMode() {
- return Settings.Secure.LOCATION_MODE_BATTERY_SAVING;
- }
-}
diff --git a/src/com/android/settings/location/LocationModeHighAccuracyPreferenceController.java b/src/com/android/settings/location/LocationModeHighAccuracyPreferenceController.java
deleted file mode 100644
index bd2d07e..0000000
--- a/src/com/android/settings/location/LocationModeHighAccuracyPreferenceController.java
+++ /dev/null
@@ -1,40 +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.location;
-
-import android.content.Context;
-import android.provider.Settings;
-
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-public class LocationModeHighAccuracyPreferenceController
- extends LocationModeRadioButtonPreferenceController {
-
- private static final String KEY_HIGH_ACCURACY = "high_accuracy";
-
- public LocationModeHighAccuracyPreferenceController(Context context,
- Lifecycle lifecycle) {
- super(context, lifecycle);
- }
-
- @Override
- public String getPreferenceKey() {
- return KEY_HIGH_ACCURACY;
- }
-
- @Override
- protected int getLocationMode() {
- return Settings.Secure.LOCATION_MODE_HIGH_ACCURACY;
- }
-}
diff --git a/src/com/android/settings/location/LocationModePreferenceController.java b/src/com/android/settings/location/LocationModePreferenceController.java
deleted file mode 100644
index 265a9df..0000000
--- a/src/com/android/settings/location/LocationModePreferenceController.java
+++ /dev/null
@@ -1,76 +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.location;
-
-import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-public class LocationModePreferenceController extends LocationBasePreferenceController {
-
- /** Key for preference screen "Mode" */
- private static final String KEY_LOCATION_MODE = "location_mode";
-
- private final LocationSettings mParentFragment;
- private Preference mPreference;
-
- public LocationModePreferenceController(Context context, LocationSettings parent,
- Lifecycle lifecycle) {
- super(context, lifecycle);
- mParentFragment = parent;
- }
-
- @Override
- public String getPreferenceKey() {
- return KEY_LOCATION_MODE;
- }
-
- @Override
- public boolean isAvailable() {
- return mContext.getResources().getBoolean(R.bool.config_location_mode_available);
- }
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mPreference = screen.findPreference(KEY_LOCATION_MODE);
- }
-
- @Override
- public boolean handlePreferenceTreeClick(Preference preference) {
- if (KEY_LOCATION_MODE.equals(preference.getKey())) {
- final SettingsActivity activity = (SettingsActivity) mParentFragment.getActivity();
- activity.startPreferencePanel(mParentFragment, LocationMode.class.getName(), null,
- R.string.location_mode_screen_title, null, mParentFragment, 0);
- return true;
- }
- return false;
- }
-
- @Override
- public void onLocationModeChanged(int mode, boolean restricted) {
- final int modeDescription = LocationPreferenceController.getLocationString(mode);
- if (modeDescription != 0) {
- mPreference.setSummary(modeDescription);
- }
- // Restricted user can't change the location mode, so disable the master switch. But in some
- // corner cases, the location might still be enabled. In such case the master switch should
- // be disabled but checked.
- mPreference.setEnabled(mLocationEnabler.isEnabled(mode));
- }
-}
diff --git a/src/com/android/settings/location/LocationModeRadioButtonPreferenceController.java b/src/com/android/settings/location/LocationModeRadioButtonPreferenceController.java
deleted file mode 100644
index bdf7c8f..0000000
--- a/src/com/android/settings/location/LocationModeRadioButtonPreferenceController.java
+++ /dev/null
@@ -1,53 +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.location;
-
-import android.content.Context;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.settings.widget.RadioButtonPreference;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-public abstract class LocationModeRadioButtonPreferenceController
- extends LocationBasePreferenceController
- implements RadioButtonPreference.OnClickListener {
-
- protected RadioButtonPreference mPreference;
-
- public LocationModeRadioButtonPreferenceController(Context context, Lifecycle lifecycle) {
- super(context, lifecycle);
- }
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mPreference = (RadioButtonPreference) screen.findPreference(getPreferenceKey());
- mPreference.setOnClickListener(this);
- }
-
- @Override
- public void onRadioButtonClicked(RadioButtonPreference emiter) {
- mLocationEnabler.setLocationMode(getLocationMode());
- }
-
- @Override
- public void onLocationModeChanged(int mode, boolean restricted) {
- mPreference.setChecked(mode == getLocationMode());
- mPreference.setEnabled(mLocationEnabler.isEnabled(mode));
- }
-
- /** Gets the location mode that this controller monitors. */
- protected abstract int getLocationMode();
-
-}
diff --git a/src/com/android/settings/location/LocationModeSensorsOnlyPreferenceController.java b/src/com/android/settings/location/LocationModeSensorsOnlyPreferenceController.java
deleted file mode 100644
index b79dbf2..0000000
--- a/src/com/android/settings/location/LocationModeSensorsOnlyPreferenceController.java
+++ /dev/null
@@ -1,40 +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.location;
-
-import android.content.Context;
-import android.provider.Settings;
-
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-public class LocationModeSensorsOnlyPreferenceController
- extends LocationModeRadioButtonPreferenceController {
-
- private static final String KEY_SENSORS_ONLY = "sensors_only";
-
- public LocationModeSensorsOnlyPreferenceController(Context context,
- Lifecycle lifecycle) {
- super(context, lifecycle);
- }
-
- @Override
- public String getPreferenceKey() {
- return KEY_SENSORS_ONLY;
- }
-
- @Override
- protected int getLocationMode() {
- return Settings.Secure.LOCATION_MODE_SENSORS_ONLY;
- }
-}
diff --git a/src/com/android/settings/location/LocationPreferenceController.java b/src/com/android/settings/location/LocationPreferenceController.java
index 9b68848..5760ab7 100644
--- a/src/com/android/settings/location/LocationPreferenceController.java
+++ b/src/com/android/settings/location/LocationPreferenceController.java
@@ -105,26 +105,11 @@
int mode = Secure.getInt(context.getContentResolver(),
Secure.LOCATION_MODE, Secure.LOCATION_MODE_OFF);
if (mode != Secure.LOCATION_MODE_OFF) {
- return context.getString(R.string.location_on_summary,
- context.getString(getLocationString(mode)));
+ return context.getString(R.string.location_on_summary);
}
return context.getString(R.string.location_off_summary);
}
- public static int getLocationString(int mode) {
- switch (mode) {
- case Secure.LOCATION_MODE_OFF:
- return R.string.location_mode_location_off_title;
- case Secure.LOCATION_MODE_SENSORS_ONLY:
- return R.string.location_mode_sensors_only_title;
- case Secure.LOCATION_MODE_BATTERY_SAVING:
- return R.string.location_mode_battery_saving_title;
- case Secure.LOCATION_MODE_HIGH_ACCURACY:
- return R.string.location_mode_high_accuracy_title;
- }
- return 0;
- }
-
@Override
public ResultPayload getResultPayload() {
final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(mContext,
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index d0fca16..3cc5b84 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -47,15 +47,8 @@
* <ul>
* <li>Platform location controls</li>
* <ul>
- * <li>In switch bar: location master switch. Used to toggle
- * {@link android.provider.Settings.Secure#LOCATION_MODE} between
- * {@link android.provider.Settings.Secure#LOCATION_MODE_OFF} and another location mode.
+ * <li>In switch bar: location master switch. Used to toggle location on and off.
* </li>
- * <li>Mode preference: only available if the master switch is on, selects between
- * {@link android.provider.Settings.Secure#LOCATION_MODE} of
- * {@link android.provider.Settings.Secure#LOCATION_MODE_HIGH_ACCURACY},
- * {@link android.provider.Settings.Secure#LOCATION_MODE_BATTERY_SAVING}, or
- * {@link android.provider.Settings.Secure#LOCATION_MODE_SENSORS_ONLY}.</li>
* </ul>
* <li>Recent location requests: automatically populated by {@link RecentLocationApps}</li>
* <li>Location services: multi-app settings provided from outside the Android framework. Each
@@ -134,7 +127,6 @@
private static List<AbstractPreferenceController> buildPreferenceControllers(
Context context, LocationSettings fragment, Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
- controllers.add(new LocationModePreferenceController(context, fragment, lifecycle));
controllers.add(new AppLocationPermissionPreferenceController(context));
controllers.add(new LocationForWorkPreferenceController(context, lifecycle));
controllers.add(
diff --git a/src/com/android/settings/location/LocationSwitchBarController.java b/src/com/android/settings/location/LocationSwitchBarController.java
index 6522dc7..ca1932f 100644
--- a/src/com/android/settings/location/LocationSwitchBarController.java
+++ b/src/com/android/settings/location/LocationSwitchBarController.java
@@ -96,9 +96,6 @@
*/
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
- mLocationEnabler.setLocationMode(isChecked
- ? android.provider.Settings.Secure.LOCATION_MODE_PREVIOUS
- : android.provider.Settings.Secure.LOCATION_MODE_OFF);
+ mLocationEnabler.setLocationEnabled(isChecked);
}
-
}
diff --git a/src/com/android/settings/network/AirplaneModePreferenceController.java b/src/com/android/settings/network/AirplaneModePreferenceController.java
index 17cf211..0b77179 100644
--- a/src/com/android/settings/network/AirplaneModePreferenceController.java
+++ b/src/com/android/settings/network/AirplaneModePreferenceController.java
@@ -28,10 +28,10 @@
import com.android.internal.telephony.TelephonyProperties;
import com.android.settings.AirplaneModeEnabler;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.R;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java
index 4b1da31..74c1910 100644
--- a/src/com/android/settings/network/NetworkDashboardFragment.java
+++ b/src/com/android/settings/network/NetworkDashboardFragment.java
@@ -31,13 +31,13 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.network.MobilePlanPreferenceController.MobilePlanPreferenceHost;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.wifi.WifiMasterSwitchPreferenceController;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.ArrayList;
diff --git a/src/com/android/settings/notification/AbstractZenModePreferenceController.java b/src/com/android/settings/notification/AbstractZenModePreferenceController.java
index 81ceca1..9180791 100644
--- a/src/com/android/settings/notification/AbstractZenModePreferenceController.java
+++ b/src/com/android/settings/notification/AbstractZenModePreferenceController.java
@@ -34,9 +34,9 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
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.OnPause;
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index ef0f40b..333e060 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -176,15 +176,6 @@
} else {
groupCategory.setTitle(group.getName());
groupCategory.setKey(group.getId());
- Bundle groupArgs = new Bundle();
- groupArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid);
- groupArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg);
- groupArgs.putString(Settings.EXTRA_CHANNEL_GROUP_ID, group.getId());
- Intent channelIntent = Utils.onBuildStartFragmentIntent(getActivity(),
- ChannelGroupNotificationSettings.class.getName(),
- groupArgs, null, R.string.notification_group_title,
- null, false, getMetricsCategory());
- groupCategory.setIntent(channelIntent);
populateGroupToggle(groupCategory, group);
}
diff --git a/src/com/android/settings/notification/EnableZenModeDialog.java b/src/com/android/settings/notification/EnableZenModeDialog.java
new file mode 100644
index 0000000..f683a21
--- /dev/null
+++ b/src/com/android/settings/notification/EnableZenModeDialog.java
@@ -0,0 +1,467 @@
+package com.android.settings.notification;
+
+/*
+ * 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.
+ */
+
+import static android.util.Log.wtf;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.AlarmManager;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.service.notification.Condition;
+import android.service.notification.ZenModeConfig;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Objects;
+
+public class EnableZenModeDialog extends InstrumentedDialogFragment {
+
+ private static final String TAG = "EnableZenModeDialog";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+ private static final int[] MINUTE_BUCKETS = ZenModeConfig.MINUTE_BUCKETS;
+ private static final int MIN_BUCKET_MINUTES = MINUTE_BUCKETS[0];
+ private static final int MAX_BUCKET_MINUTES = MINUTE_BUCKETS[MINUTE_BUCKETS.length - 1];
+ private static final int DEFAULT_BUCKET_INDEX = Arrays.binarySearch(MINUTE_BUCKETS, 60);
+
+ @VisibleForTesting
+ public static final int FOREVER_CONDITION_INDEX = 0;
+ @VisibleForTesting
+ public static final int COUNTDOWN_CONDITION_INDEX = 1;
+ @VisibleForTesting
+ public static final int COUNTDOWN_ALARM_CONDITION_INDEX = 2;
+ @VisibleForTesting
+ protected Activity mActivity;
+
+ private static final int SECONDS_MS = 1000;
+ private static final int MINUTES_MS = 60 * SECONDS_MS;
+
+ @VisibleForTesting
+ protected Uri mForeverId;
+ private int mBucketIndex = -1;
+
+ private AlarmManager mAlarmManager;
+ private int mUserId;
+ private boolean mAttached;
+
+ @VisibleForTesting
+ protected Context mContext;
+
+ private RadioGroup mZenRadioGroup;
+ @VisibleForTesting
+ protected LinearLayout mZenRadioGroupContent;
+ private int MAX_MANUAL_DND_OPTIONS = 3;
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ NotificationManager noMan = (NotificationManager) getContext().
+ getSystemService(Context.NOTIFICATION_SERVICE);
+ mContext = getContext();
+ mForeverId = Condition.newId(mContext).appendPath("forever").build();
+ mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
+ mUserId = mContext.getUserId();
+ mAttached = false;
+
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
+ .setTitle(R.string.zen_mode_settings_turn_on_dialog_title)
+ .setNegativeButton(R.string.cancel, null)
+ .setPositiveButton(R.string.zen_mode_enable_dialog_turn_on,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ int checkedId = mZenRadioGroup.getCheckedRadioButtonId();
+ ConditionTag tag = getConditionTagAt(checkedId);
+
+ if (isForever(tag.condition)) {
+ MetricsLogger.action(getContext(),
+ MetricsProto.MetricsEvent.
+ NOTIFICATION_ZEN_MODE_TOGGLE_ON_FOREVER);
+ } else if (isAlarm(tag.condition)) {
+ MetricsLogger.action(getContext(),
+ MetricsProto.MetricsEvent.
+ NOTIFICATION_ZEN_MODE_TOGGLE_ON_ALARM);
+ } else if (isCountdown(tag.condition)) {
+ MetricsLogger.action(getContext(),
+ MetricsProto.MetricsEvent.
+ NOTIFICATION_ZEN_MODE_TOGGLE_ON_COUNTDOWN);
+ } else {
+ wtf(TAG, "Invalid manual condition: " + tag.condition);
+ }
+ // always triggers priority-only dnd with chosen condition
+ noMan.setZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+ getRealConditionId(tag.condition), TAG);
+ }
+ });
+
+ View contentView = getContentView();
+ bindConditions(forever());
+ builder.setView(contentView);
+ return builder.create();
+ }
+
+ private void hideAllConditions() {
+ final int N = mZenRadioGroupContent.getChildCount();
+ for (int i = 0; i < N; i++) {
+ mZenRadioGroupContent.getChildAt(i).setVisibility(View.GONE);
+ }
+ }
+
+ protected View getContentView() {
+ if (mActivity == null) {
+ mActivity = getActivity();
+ }
+ final LayoutInflater inflater = mActivity.getLayoutInflater();
+ View contentView = inflater.inflate(R.layout.zen_mode_turn_on_dialog_container, null);
+ ScrollView container = (ScrollView) contentView.findViewById(R.id.container);
+
+ mZenRadioGroup = container.findViewById(R.id.zen_radio_buttons);
+ mZenRadioGroupContent = container.findViewById(R.id.zen_radio_buttons_content);
+
+ for (int i = 0; i < MAX_MANUAL_DND_OPTIONS; i++) {
+ final View radioButton = inflater.inflate(R.layout.zen_mode_radio_button,
+ mZenRadioGroup, false);
+ mZenRadioGroup.addView(radioButton);
+ radioButton.setId(i);
+
+ final View radioButtonContent = inflater.inflate(R.layout.zen_mode_condition,
+ mZenRadioGroupContent, false);
+ radioButtonContent.setId(i + MAX_MANUAL_DND_OPTIONS);
+ mZenRadioGroupContent.addView(radioButtonContent);
+ }
+ hideAllConditions();
+ return contentView;
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsProto.MetricsEvent.NOTIFICATION_ZEN_MODE_ENABLE_DIALOG;
+ }
+
+ @VisibleForTesting
+ protected void bind(final Condition condition, final View row, final int rowId) {
+ if (condition == null) throw new IllegalArgumentException("condition must not be null");
+ final boolean enabled = condition.state == Condition.STATE_TRUE;
+ final ConditionTag tag = row.getTag() != null ? (ConditionTag) row.getTag() :
+ new ConditionTag();
+ row.setTag(tag);
+ final boolean first = tag.rb == null;
+ if (tag.rb == null) {
+ tag.rb = (RadioButton) mZenRadioGroup.getChildAt(rowId);
+ }
+ tag.condition = condition;
+ final Uri conditionId = getConditionId(tag.condition);
+ if (DEBUG) Log.d(TAG, "bind i=" + mZenRadioGroupContent.indexOfChild(row) + " first="
+ + first + " condition=" + conditionId);
+ tag.rb.setEnabled(enabled);
+ tag.rb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked) {
+ tag.rb.setChecked(true);
+ if (DEBUG) Log.d(TAG, "onCheckedChanged " + conditionId);
+ MetricsLogger.action(mContext,
+ MetricsProto.MetricsEvent.QS_DND_CONDITION_SELECT);
+ announceConditionSelection(tag);
+ }
+ }
+ });
+
+ updateUi(tag, row, condition, enabled, rowId, conditionId);
+ row.setVisibility(View.VISIBLE);
+ }
+
+ @VisibleForTesting
+ protected ConditionTag getConditionTagAt(int index) {
+ return (ConditionTag) mZenRadioGroupContent.getChildAt(index).getTag();
+ }
+
+ @VisibleForTesting
+ protected void bindConditions(Condition c) {
+ // forever
+ bind(forever(), mZenRadioGroupContent.getChildAt(FOREVER_CONDITION_INDEX),
+ FOREVER_CONDITION_INDEX);
+ if (c == null) {
+ bindGenericCountdown();
+ bindNextAlarm(getTimeUntilNextAlarmCondition());
+ } else if (isForever(c)) {
+ getConditionTagAt(FOREVER_CONDITION_INDEX).rb.setChecked(true);
+ bindGenericCountdown();
+ bindNextAlarm(getTimeUntilNextAlarmCondition());
+ } else {
+ if (isAlarm(c)) {
+ bindGenericCountdown();
+ bindNextAlarm(c);
+ getConditionTagAt(COUNTDOWN_ALARM_CONDITION_INDEX).rb.setChecked(true);
+ } else if (isCountdown(c)) {
+ bindNextAlarm(getTimeUntilNextAlarmCondition());
+ bind(c, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
+ COUNTDOWN_CONDITION_INDEX);
+ getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true);
+ } else {
+ wtf(TAG, "Invalid manual condition: " + c);
+ }
+ }
+ }
+
+ public static Uri getConditionId(Condition condition) {
+ return condition != null ? condition.id : null;
+ }
+
+ public Condition forever() {
+ Uri foreverId = Condition.newId(mContext).appendPath("forever").build();
+ return new Condition(foreverId, foreverSummary(mContext), "", "", 0 /*icon*/,
+ Condition.STATE_TRUE, 0 /*flags*/);
+ }
+
+ public long getNextAlarm() {
+ final AlarmManager.AlarmClockInfo info = mAlarmManager.getNextAlarmClock(mUserId);
+ return info != null ? info.getTriggerTime() : 0;
+ }
+
+ @VisibleForTesting
+ protected boolean isAlarm(Condition c) {
+ return c != null && ZenModeConfig.isValidCountdownToAlarmConditionId(c.id);
+ }
+
+ @VisibleForTesting
+ protected boolean isCountdown(Condition c) {
+ return c != null && ZenModeConfig.isValidCountdownConditionId(c.id);
+ }
+
+ private boolean isForever(Condition c) {
+ return c != null && mForeverId.equals(c.id);
+ }
+
+ private Uri getRealConditionId(Condition condition) {
+ return isForever(condition) ? null : getConditionId(condition);
+ }
+
+ private String foreverSummary(Context context) {
+ return context.getString(com.android.internal.R.string.zen_mode_forever);
+ }
+
+ private static void setToMidnight(Calendar calendar) {
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ }
+
+ // Returns a time condition if the next alarm is within the next week.
+ @VisibleForTesting
+ protected Condition getTimeUntilNextAlarmCondition() {
+ GregorianCalendar weekRange = new GregorianCalendar();
+ setToMidnight(weekRange);
+ weekRange.add(Calendar.DATE, 6);
+ final long nextAlarmMs = getNextAlarm();
+ if (nextAlarmMs > 0) {
+ GregorianCalendar nextAlarm = new GregorianCalendar();
+ nextAlarm.setTimeInMillis(nextAlarmMs);
+ setToMidnight(nextAlarm);
+
+ if (weekRange.compareTo(nextAlarm) >= 0) {
+ return ZenModeConfig.toNextAlarmCondition(mContext, nextAlarmMs,
+ ActivityManager.getCurrentUser());
+ }
+ }
+ return null;
+ }
+
+ @VisibleForTesting
+ protected void bindGenericCountdown() {
+ mBucketIndex = DEFAULT_BUCKET_INDEX;
+ Condition countdown = ZenModeConfig.toTimeCondition(mContext,
+ MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
+ if (!mAttached || getConditionTagAt(COUNTDOWN_CONDITION_INDEX).condition == null) {
+ bind(countdown, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
+ COUNTDOWN_CONDITION_INDEX);
+ }
+ }
+
+ private void updateUi(ConditionTag tag, View row, Condition condition,
+ boolean enabled, int rowId, Uri conditionId) {
+ if (tag.lines == null) {
+ tag.lines = row.findViewById(android.R.id.content);
+ }
+ if (tag.line1 == null) {
+ tag.line1 = (TextView) row.findViewById(android.R.id.text1);
+ }
+
+ if (tag.line2 == null) {
+ tag.line2 = (TextView) row.findViewById(android.R.id.text2);
+ }
+
+ final String line1 = !TextUtils.isEmpty(condition.line1) ? condition.line1
+ : condition.summary;
+ final String line2 = condition.line2;
+ tag.line1.setText(line1);
+ if (TextUtils.isEmpty(line2)) {
+ tag.line2.setVisibility(View.GONE);
+ } else {
+ tag.line2.setVisibility(View.VISIBLE);
+ tag.line2.setText(line2);
+ }
+ tag.lines.setEnabled(enabled);
+ tag.lines.setAlpha(enabled ? 1 : .4f);
+
+ tag.lines.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ tag.rb.setChecked(true);
+ }
+ });
+
+ // minus button
+ final ImageView button1 = (ImageView) row.findViewById(android.R.id.button1);
+ button1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onClickTimeButton(row, tag, false /*down*/, rowId);
+ }
+ });
+
+ // plus button
+ final ImageView button2 = (ImageView) row.findViewById(android.R.id.button2);
+ button2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onClickTimeButton(row, tag, true /*up*/, rowId);
+ }
+ });
+
+ final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId);
+ if (rowId == COUNTDOWN_CONDITION_INDEX && time > 0) {
+ button1.setVisibility(View.VISIBLE);
+ button2.setVisibility(View.VISIBLE);
+ if (mBucketIndex > -1) {
+ button1.setEnabled(mBucketIndex > 0);
+ button2.setEnabled(mBucketIndex < MINUTE_BUCKETS.length - 1);
+ } else {
+ final long span = time - System.currentTimeMillis();
+ button1.setEnabled(span > MIN_BUCKET_MINUTES * MINUTES_MS);
+ final Condition maxCondition = ZenModeConfig.toTimeCondition(mContext,
+ MAX_BUCKET_MINUTES, ActivityManager.getCurrentUser());
+ button2.setEnabled(!Objects.equals(condition.summary, maxCondition.summary));
+ }
+
+ button1.setAlpha(button1.isEnabled() ? 1f : .5f);
+ button2.setAlpha(button2.isEnabled() ? 1f : .5f);
+ } else {
+ button1.setVisibility(View.GONE);
+ button2.setVisibility(View.GONE);
+ }
+ }
+
+ @VisibleForTesting
+ protected void bindNextAlarm(Condition c) {
+ View alarmContent = mZenRadioGroupContent.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX);
+ ConditionTag tag = (ConditionTag) alarmContent.getTag();
+
+ if (c != null && (!mAttached || tag == null || tag.condition == null)) {
+ bind(c, alarmContent, COUNTDOWN_ALARM_CONDITION_INDEX);
+ }
+
+ // hide the alarm radio button if there isn't a "next alarm condition"
+ tag = (ConditionTag) alarmContent.getTag();
+ boolean showAlarm = tag != null && tag.condition != null;
+ mZenRadioGroup.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(
+ showAlarm ? View.VISIBLE : View.GONE);
+ alarmContent.setVisibility(showAlarm ? View.VISIBLE : View.GONE);
+ }
+
+ private void onClickTimeButton(View row, ConditionTag tag, boolean up, int rowId) {
+ MetricsLogger.action(mContext, MetricsProto.MetricsEvent.QS_DND_TIME, up);
+ Condition newCondition = null;
+ final int N = MINUTE_BUCKETS.length;
+ if (mBucketIndex == -1) {
+ // not on a known index, search for the next or prev bucket by time
+ final Uri conditionId = getConditionId(tag.condition);
+ final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId);
+ final long now = System.currentTimeMillis();
+ for (int i = 0; i < N; i++) {
+ int j = up ? i : N - 1 - i;
+ final int bucketMinutes = MINUTE_BUCKETS[j];
+ final long bucketTime = now + bucketMinutes * MINUTES_MS;
+ if (up && bucketTime > time || !up && bucketTime < time) {
+ mBucketIndex = j;
+ newCondition = ZenModeConfig.toTimeCondition(mContext,
+ bucketTime, bucketMinutes, ActivityManager.getCurrentUser(),
+ false /*shortVersion*/);
+ break;
+ }
+ }
+ if (newCondition == null) {
+ mBucketIndex = DEFAULT_BUCKET_INDEX;
+ newCondition = ZenModeConfig.toTimeCondition(mContext,
+ MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
+ }
+ } else {
+ // on a known index, simply increment or decrement
+ mBucketIndex = Math.max(0, Math.min(N - 1, mBucketIndex + (up ? 1 : -1)));
+ newCondition = ZenModeConfig.toTimeCondition(mContext,
+ MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
+ }
+ bind(newCondition, row, rowId);
+ tag.rb.setChecked(true);
+ announceConditionSelection(tag);
+ }
+
+ private void announceConditionSelection(ConditionTag tag) {
+ // condition will always be priority-only
+ String modeText = mContext.getString(R.string.zen_interruption_level_priority);
+ if (tag.line1 != null) {
+ mZenRadioGroupContent.announceForAccessibility(mContext.getString(
+ R.string.zen_mode_and_condition, modeText, tag.line1.getText()));
+ }
+ }
+
+ // used as the view tag on condition rows
+ @VisibleForTesting
+ protected static class ConditionTag {
+ public RadioButton rb;
+ public View lines;
+ public TextView line1;
+ public TextView line2;
+ public Condition condition;
+ }
+}
diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java
index 2a7e7d5..8b0ed46 100644
--- a/src/com/android/settings/notification/NotificationSettingsBase.java
+++ b/src/com/android/settings/notification/NotificationSettingsBase.java
@@ -168,14 +168,7 @@
mChannel = (args != null && args.containsKey(Settings.EXTRA_CHANNEL_ID)) ?
mBackend.getChannel(mPkg, mUid, args.getString(Settings.EXTRA_CHANNEL_ID)) : null;
- NotificationChannelGroup group =
- (args != null && args.containsKey(Settings.EXTRA_CHANNEL_GROUP_ID))
- ? mBackend.getGroupWithChannels(mPkg, mUid,
- args.getString(Settings.EXTRA_CHANNEL_GROUP_ID))
- : null;
- if (group != null) {
- mChannelGroup = new NotificationChannelGroupWrapper(group);
- }
+ NotificationChannelGroup group = null;
mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended(
mContext, mPkg, mUserId);
diff --git a/src/com/android/settings/notification/ZenModeButtonPreferenceController.java b/src/com/android/settings/notification/ZenModeButtonPreferenceController.java
index f5169f0..da540f4 100644
--- a/src/com/android/settings/notification/ZenModeButtonPreferenceController.java
+++ b/src/com/android/settings/notification/ZenModeButtonPreferenceController.java
@@ -16,6 +16,7 @@
package com.android.settings.notification;
+import android.app.FragmentManager;
import android.content.Context;
import android.provider.Settings;
import android.support.v7.preference.Preference;
@@ -31,12 +32,16 @@
public class ZenModeButtonPreferenceController extends AbstractZenModePreferenceController
implements PreferenceControllerMixin {
+ private static final String TAG = "EnableZenModeButton";
protected static final String KEY = "zen_mode_settings_button_container";
private Button mZenButtonOn;
private Button mZenButtonOff;
+ private FragmentManager mFragment;
- public ZenModeButtonPreferenceController(Context context, Lifecycle lifecycle) {
+ public ZenModeButtonPreferenceController(Context context, Lifecycle lifecycle, FragmentManager
+ fragment) {
super(context, KEY, lifecycle);
+ mFragment = fragment;
}
@Override
@@ -56,11 +61,8 @@
if (null == mZenButtonOn) {
mZenButtonOn = (Button) ((LayoutPreference) preference)
.findViewById(R.id.zen_mode_settings_turn_on_button);
- mZenButtonOn.setOnClickListener(v -> {
- mMetricsFeatureProvider.action(mContext,
- MetricsProto.MetricsEvent.ACTION_ZEN_TOGGLE_DND_BUTTON, true);
- mBackend.setZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
- });
+ mZenButtonOn.setOnClickListener(v ->
+ new EnableZenModeDialog().show(mFragment, TAG));
}
if (null == mZenButtonOff) {
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index 1ee20d3..a6145c4 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -17,6 +17,7 @@
package com.android.settings.notification;
import android.app.AutomaticZenRule;
+import android.app.FragmentManager;
import android.app.NotificationManager;
import android.app.NotificationManager.Policy;
import android.content.Context;
@@ -50,7 +51,7 @@
@Override
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
- return buildPreferenceControllers(context, getLifecycle());
+ return buildPreferenceControllers(context, getLifecycle(), getFragmentManager());
}
@Override
@@ -59,11 +60,11 @@
}
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
- Lifecycle lifecycle) {
+ Lifecycle lifecycle, FragmentManager fragmentManager) {
List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new ZenModeBehaviorPreferenceController(context, lifecycle));
controllers.add(new ZenModeAutomationPreferenceController(context));
- controllers.add(new ZenModeButtonPreferenceController(context, lifecycle));
+ controllers.add(new ZenModeButtonPreferenceController(context, lifecycle, fragmentManager));
controllers.add(new ZenModeSettingsFooterPreferenceController(context, lifecycle));
return controllers;
}
@@ -211,7 +212,7 @@
@Override
public List<AbstractPreferenceController> getPreferenceControllers(Context
context) {
- return buildPreferenceControllers(context, null);
+ return buildPreferenceControllers(context, null, null);
}
};
}
diff --git a/src/com/android/settings/notification/ZenRulePreference.java b/src/com/android/settings/notification/ZenRulePreference.java
index 7193873..fee390f 100644
--- a/src/com/android/settings/notification/ZenRulePreference.java
+++ b/src/com/android/settings/notification/ZenRulePreference.java
@@ -30,10 +30,10 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.utils.ManagedServiceSettings;
import com.android.settings.utils.ZenServiceListing;
import com.android.settingslib.TwoTargetPreference;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.Map;
@@ -145,4 +145,4 @@
? mContext.getResources().getString(R.string.switch_off_text)
: mContext.getResources().getString(R.string.switch_on_text);
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java
index 71fbaa4..80d435f 100644
--- a/src/com/android/settings/overlay/FeatureFactory.java
+++ b/src/com/android/settings/overlay/FeatureFactory.java
@@ -25,7 +25,6 @@
import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.bluetooth.BluetoothFeatureProvider;
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.datausage.DataPlanFeatureProvider;
@@ -37,6 +36,7 @@
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.slices.SlicesFeatureProvider;
import com.android.settings.users.UserFeatureProvider;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/**
* Abstract class for creating feature controllers. Allows OEM implementations to define their own
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java
index 45dc238..55f408d 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.java
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java
@@ -31,7 +31,6 @@
import com.android.settings.bluetooth.BluetoothFeatureProviderImpl;
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
import com.android.settings.connecteddevice.SmsMirroringFeatureProviderImpl;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProviderImpl;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
@@ -57,6 +56,7 @@
import com.android.settings.wrapper.ConnectivityManagerWrapper;
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
import com.android.settings.wrapper.IPackageManagerWrapper;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.wrapper.PackageManagerWrapper;
/**
diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java
index 4067e6b..75f64d3 100644
--- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java
+++ b/src/com/android/settings/search/SearchIndexableResourcesImpl.java
@@ -21,7 +21,7 @@
import com.android.settings.DateTimeSettings;
import com.android.settings.DisplaySettings;
import com.android.settings.LegalSettings;
-import com.android.settings.MeCardFragment;
+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;
@@ -62,7 +62,6 @@
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
import com.android.settings.inputmethod.VirtualKeyboardFragment;
import com.android.settings.language.LanguageAndInputSettings;
-import com.android.settings.location.LocationMode;
import com.android.settings.location.LocationSettings;
import com.android.settings.location.ScanningSettings;
import com.android.settings.network.NetworkDashboardFragment;
@@ -132,7 +131,6 @@
addIndex(GestureSettings.class);
addIndex(LanguageAndInputSettings.class);
addIndex(LocationSettings.class);
- addIndex(LocationMode.class);
addIndex(ScanningSettings.class);
addIndex(SecuritySettingsV2.class);
addIndex(ScreenLockSettings.class);
@@ -174,7 +172,7 @@
addIndex(ZenModeAutomationSettings.class);
addIndex(NightDisplaySettings.class);
addIndex(SmartBatterySettings.class);
- addIndex(MeCardFragment.class);
+ addIndex(MyDeviceInfoFragment.class);
}
@Override
diff --git a/src/com/android/settings/security/LockdownButtonPreferenceController.java b/src/com/android/settings/security/LockdownButtonPreferenceController.java
new file mode 100644
index 0000000..8960502
--- /dev/null
+++ b/src/com/android/settings/security/LockdownButtonPreferenceController.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.security;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.TwoStatePreference;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.TogglePreferenceController;
+
+public class LockdownButtonPreferenceController extends TogglePreferenceController {
+
+ private static final String KEY_LOCKDOWN_ENALBED = "security_setting_lockdown_enabled";
+
+ private final LockPatternUtils mLockPatternUtils;
+
+ public LockdownButtonPreferenceController(Context context) {
+ super(context, KEY_LOCKDOWN_ENALBED);
+ mLockPatternUtils = new LockPatternUtils(context);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ if (mLockPatternUtils.isSecure(UserHandle.myUserId())) {
+ return BasePreferenceController.AVAILABLE;
+ } else {
+ return BasePreferenceController.DISABLED_FOR_USER;
+ }
+ }
+
+ @Override
+ public boolean isChecked() {
+ return Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0) != 0;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.LOCKDOWN_IN_POWER_MENU, isChecked ? 1 : 0);
+ return true;
+ }
+}
diff --git a/src/com/android/settings/security/LockscreenDashboardFragment.java b/src/com/android/settings/security/LockscreenDashboardFragment.java
index df4ca30..7054181 100644
--- a/src/com/android/settings/security/LockscreenDashboardFragment.java
+++ b/src/com/android/settings/security/LockscreenDashboardFragment.java
@@ -93,6 +93,8 @@
mOwnerInfoPreferenceController =
new OwnerInfoPreferenceController(context, this, lifecycle);
controllers.add(mOwnerInfoPreferenceController);
+ controllers.add(new LockdownButtonPreferenceController(context));
+
return controllers;
}
@@ -122,6 +124,7 @@
KEY_ADD_USER_FROM_LOCK_SCREEN));
controllers.add(new OwnerInfoPreferenceController(
context, null /* fragment */, null /* lifecycle */));
+ controllers.add(new LockdownButtonPreferenceController(context));
return controllers;
}
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index e068b2f..433bdf3 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -30,7 +30,6 @@
import com.android.settings.R;
import com.android.settingslib.utils.ThreadUtils;
-import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index e9152ba..11ff1c1 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -23,6 +23,7 @@
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.text.TextUtils;
+import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
@@ -85,17 +86,46 @@
*/
public static BasePreferenceController getPreferenceController(Context context,
SliceData sliceData) {
- // TODO check for context-only controller first.
+ try {
+ return getController(context, sliceData, true /* isContextOnly */);
+ } catch (IllegalStateException e) {
+ // Do nothing
+ Log.d(TAG, "Could not find Context-only controller for preference controller: "
+ + sliceData.getKey());
+ }
+
+ return getController(context, sliceData, false /* isContextOnly */);
+ }
+
+ /**
+ * Attempts to build a {@link BasePreferenceController} from {@param SliceData}.
+ *
+ * @param sliceData Backing data for the Slice.
+ * @param contextOnlyCtor {@code true} when the constructor for the
+ * {@link BasePreferenceController}
+ * only takes a {@link Context}. Else the constructor will be ({@link
+ * Context}, {@code String}.
+ */
+ private static BasePreferenceController getController(Context context, SliceData sliceData,
+ boolean contextOnlyCtor) {
try {
Class<?> clazz = Class.forName(sliceData.getPreferenceController());
- Constructor<?> preferenceConstructor = clazz.getConstructor(Context.class,
- String.class);
- return (BasePreferenceController) preferenceConstructor.newInstance(
- new Object[]{context, sliceData.getKey()});
+ Constructor<?> preferenceConstructor;
+ Object[] params;
+
+ if (contextOnlyCtor) {
+ preferenceConstructor = clazz.getConstructor(Context.class);
+ params = new Object[]{context};
+ } else {
+ preferenceConstructor = clazz.getConstructor(Context.class, String.class);
+ params = new Object[]{context, sliceData.getKey()};
+ }
+
+ return (BasePreferenceController) preferenceConstructor.newInstance(params);
} catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |
IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
throw new IllegalStateException(
- "Invalid preference controller: " + sliceData.getPreferenceController());
+ "Invalid preference controller: " + sliceData.getPreferenceController(), e);
}
}
diff --git a/src/com/android/settings/support/SupportDashboardActivity.java b/src/com/android/settings/support/SupportDashboardActivity.java
index 3b5d623..e829577 100644
--- a/src/com/android/settings/support/SupportDashboardActivity.java
+++ b/src/com/android/settings/support/SupportDashboardActivity.java
@@ -66,7 +66,7 @@
data.title = context.getString(R.string.page_tab_title_support);
data.screenTitle = context.getString(R.string.settings_label);
data.summaryOn = context.getString(R.string.support_summary);
- data.iconResId = R.drawable.ic_help;
+ data.iconResId = R.drawable.ic_homepage_support;
data.intentTargetPackage = context.getPackageName();
data.intentTargetClass = SupportDashboardActivity.class.getName();
data.intentAction = Intent.ACTION_MAIN;
diff --git a/src/com/android/settings/wfd/WifiDisplaySettings.java b/src/com/android/settings/wfd/WifiDisplaySettings.java
index 7a9fc39..8f42389 100755
--- a/src/com/android/settings/wfd/WifiDisplaySettings.java
+++ b/src/com/android/settings/wfd/WifiDisplaySettings.java
@@ -22,6 +22,7 @@
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.hardware.display.DisplayManager;
import android.hardware.display.WifiDisplay;
@@ -218,13 +219,9 @@
}
public static boolean isAvailable(Context context) {
- try {
- return context.getSystemService(Context.DISPLAY_SERVICE) != null
- && context.getSystemService(Context.WIFI_P2P_SERVICE) != null;
- } catch (Exception e) {
- // Service is not registered, so this is definitely not available.
- return false;
- }
+ return context.getSystemService(Context.DISPLAY_SERVICE) != null
+ && context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT)
+ && context.getSystemService(Context.WIFI_P2P_SERVICE) != null;
}
private void scheduleUpdate(int changes) {
diff --git a/src/com/android/settings/widget/AppCheckBoxPreference.java b/src/com/android/settings/widget/AppCheckBoxPreference.java
new file mode 100644
index 0000000..9cb1d78
--- /dev/null
+++ b/src/com/android/settings/widget/AppCheckBoxPreference.java
@@ -0,0 +1,38 @@
+/*
+ * 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 android.content.Context;
+import android.support.v7.preference.CheckBoxPreference;
+import android.util.AttributeSet;
+
+import com.android.settings.R;
+
+/**
+ * {@link CheckBoxPreference} that used only to display app
+ */
+public class AppCheckBoxPreference extends CheckBoxPreference {
+ public AppCheckBoxPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setLayoutResource(R.layout.preference_app);
+ }
+
+ public AppCheckBoxPreference(Context context) {
+ super(context);
+ setLayoutResource(R.layout.preference_app);
+ }
+}
diff --git a/src/com/android/settings/widget/SettingsAppWidgetProvider.java b/src/com/android/settings/widget/SettingsAppWidgetProvider.java
index 7dacaf5..adc386a 100644
--- a/src/com/android/settings/widget/SettingsAppWidgetProvider.java
+++ b/src/com/android/settings/widget/SettingsAppWidgetProvider.java
@@ -16,6 +16,7 @@
package com.android.settings.widget;
+import android.app.ActivityManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
@@ -25,6 +26,7 @@
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
+import android.hardware.display.DisplayManager;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.Uri;
@@ -33,10 +35,12 @@
import android.os.Handler;
import android.os.IPowerManager;
import android.os.PowerManager;
+import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserManager;
import android.provider.Settings;
+import android.provider.Settings.Secure;
import android.util.Log;
import android.widget.RemoteViews;
@@ -561,27 +565,14 @@
final UserManager um =
(UserManager) context.getSystemService(Context.USER_SERVICE);
if (!um.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION)) {
- int currentMode = Settings.Secure.getInt(resolver,
- Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
- int mode = Settings.Secure.LOCATION_MODE_HIGH_ACCURACY;
- switch (currentMode) {
- case Settings.Secure.LOCATION_MODE_HIGH_ACCURACY:
- mode = Settings.Secure.LOCATION_MODE_BATTERY_SAVING;
- break;
- case Settings.Secure.LOCATION_MODE_BATTERY_SAVING:
- mode = Settings.Secure.LOCATION_MODE_HIGH_ACCURACY;
- break;
- case Settings.Secure.LOCATION_MODE_SENSORS_ONLY:
- mode = Settings.Secure.LOCATION_MODE_OFF;
- break;
- case Settings.Secure.LOCATION_MODE_OFF:
- mode = Settings.Secure.LOCATION_MODE_PREVIOUS;
- break;
- }
- Settings.Secure.putInt(resolver, Settings.Secure.LOCATION_MODE, mode);
- return mode != Settings.Secure.LOCATION_MODE_OFF;
+ LocationManager lm =
+ (LocationManager) context.getSystemService(
+ Context.LOCATION_SERVICE);
+ boolean currentLocationEnabled = lm.isLocationEnabled();
+ lm.setLocationEnabledForUser(
+ !currentLocationEnabled, Process.myUserHandle());
+ return lm.isLocationEnabled();
}
-
return getActualState(context) == STATE_ENABLED;
}
@@ -746,7 +737,7 @@
R.drawable.appwidget_settings_ind_on_r_holo);
} else {
final int brightness = getBrightness(context);
- final PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
+ final PowerManager pm = context.getSystemService(PowerManager.class);
// Set the icon
final int full = (int)(pm.getMaximumScreenBrightnessSetting()
* FULL_BRIGHTNESS_THRESHOLD);
@@ -882,53 +873,48 @@
*/
private void toggleBrightness(Context context) {
try {
- IPowerManager power = IPowerManager.Stub.asInterface(
- ServiceManager.getService("power"));
- if (power != null) {
- PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
+ DisplayManager dm = context.getSystemService(DisplayManager.class);
+ PowerManager pm = context.getSystemService(PowerManager.class);
- ContentResolver cr = context.getContentResolver();
- int brightness = Settings.System.getInt(cr,
- Settings.System.SCREEN_BRIGHTNESS);
- int brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
- //Only get brightness setting if available
- if (context.getResources().getBoolean(
- com.android.internal.R.bool.config_automatic_brightness_available)) {
- brightnessMode = Settings.System.getInt(cr,
- Settings.System.SCREEN_BRIGHTNESS_MODE);
- }
-
- // Rotate AUTO -> MINIMUM -> DEFAULT -> MAXIMUM
- // Technically, not a toggle...
- if (brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
- brightness = pm.getMinimumScreenBrightnessSetting();
- brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
- } else if (brightness < pm.getDefaultScreenBrightnessSetting()) {
- brightness = pm.getDefaultScreenBrightnessSetting();
- } else if (brightness < pm.getMaximumScreenBrightnessSetting()) {
- brightness = pm.getMaximumScreenBrightnessSetting();
- } else {
- brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
- brightness = pm.getMinimumScreenBrightnessSetting();
- }
-
- if (context.getResources().getBoolean(
- com.android.internal.R.bool.config_automatic_brightness_available)) {
- // Set screen brightness mode (automatic or manual)
- Settings.System.putInt(context.getContentResolver(),
- Settings.System.SCREEN_BRIGHTNESS_MODE,
- brightnessMode);
- } else {
- // Make sure we set the brightness if automatic mode isn't available
- brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
- }
- if (brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL) {
- power.setTemporaryScreenBrightnessSettingOverride(brightness);
- Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS, brightness);
- }
+ ContentResolver cr = context.getContentResolver();
+ int brightness = Settings.System.getInt(cr,
+ Settings.System.SCREEN_BRIGHTNESS);
+ int brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
+ //Only get brightness setting if available
+ if (context.getResources().getBoolean(
+ com.android.internal.R.bool.config_automatic_brightness_available)) {
+ brightnessMode = Settings.System.getInt(cr,
+ Settings.System.SCREEN_BRIGHTNESS_MODE);
}
- } catch (RemoteException e) {
- Log.d(TAG, "toggleBrightness: " + e);
+
+ // Rotate AUTO -> MINIMUM -> DEFAULT -> MAXIMUM
+ // Technically, not a toggle...
+ if (brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
+ brightness = pm.getMinimumScreenBrightnessSetting();
+ brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
+ } else if (brightness < pm.getDefaultScreenBrightnessSetting()) {
+ brightness = pm.getDefaultScreenBrightnessSetting();
+ } else if (brightness < pm.getMaximumScreenBrightnessSetting()) {
+ brightness = pm.getMaximumScreenBrightnessSetting();
+ } else {
+ brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
+ brightness = pm.getMinimumScreenBrightnessSetting();
+ }
+
+ if (context.getResources().getBoolean(
+ com.android.internal.R.bool.config_automatic_brightness_available)) {
+ // Set screen brightness mode (automatic or manual)
+ Settings.System.putInt(context.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ brightnessMode);
+ } else {
+ // Make sure we set the brightness if automatic mode isn't available
+ brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
+ }
+ if (brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL) {
+ dm.setTemporaryBrightness(brightness);
+ Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS, brightness);
+ }
} catch (Settings.SettingNotFoundException e) {
Log.d(TAG, "toggleBrightness: " + e);
}
diff --git a/src/com/android/settings/widget/SwitchBar.java b/src/com/android/settings/widget/SwitchBar.java
index 749ec0a..3be5eca 100644
--- a/src/com/android/settings/widget/SwitchBar.java
+++ b/src/com/android/settings/widget/SwitchBar.java
@@ -39,9 +39,9 @@
import android.widget.TextView;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java
index 9c43142..c5e79b2 100644
--- a/src/com/android/settings/wifi/WifiEnabler.java
+++ b/src/com/android/settings/wifi/WifiEnabler.java
@@ -33,9 +33,9 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.widget.SwitchWidgetController;
import com.android.settings.wrapper.ConnectivityManagerWrapper;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.WirelessUtils;
diff --git a/src/com/android/settings/wifi/WifiMasterSwitchPreferenceController.java b/src/com/android/settings/wifi/WifiMasterSwitchPreferenceController.java
index de1b030..8843d93 100644
--- a/src/com/android/settings/wifi/WifiMasterSwitchPreferenceController.java
+++ b/src/com/android/settings/wifi/WifiMasterSwitchPreferenceController.java
@@ -19,12 +19,12 @@
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.R;
import com.android.settings.widget.SummaryUpdater;
import com.android.settings.widget.MasterSwitchPreference;
import com.android.settings.widget.MasterSwitchController;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 82ffc38..4d9ad27 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -54,7 +54,6 @@
import com.android.settings.Utils;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.widget.ActionButtonPreference;
import com.android.settings.widget.EntityHeaderController;
import com.android.settings.wifi.WifiDetailPreference;
@@ -63,6 +62,7 @@
import com.android.settings.wifi.WifiUtils;
import com.android.settings.wrapper.ConnectivityManagerWrapper;
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.OnPause;
diff --git a/src/com/android/settings/wifi/tether/WifiDeviceNameTextValidator.java b/src/com/android/settings/wifi/tether/WifiDeviceNameTextValidator.java
new file mode 100644
index 0000000..e766e32
--- /dev/null
+++ b/src/com/android/settings/wifi/tether/WifiDeviceNameTextValidator.java
@@ -0,0 +1,30 @@
+/*
+ * 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.wifi.tether;
+
+import com.android.settings.widget.ValidatedEditTextPreference;
+import com.android.settings.wifi.WifiUtils;
+
+/**
+ * Validates a text field for a valid Wi-Fi SSID name.
+ */
+public class WifiDeviceNameTextValidator implements ValidatedEditTextPreference.Validator {
+ @Override
+ public boolean isTextValid(String value) {
+ return !WifiUtils.isSSIDTooLong(value) && !WifiUtils.isSSIDTooShort(value);
+ }
+}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
index 1e299ab..4c47a0d 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
@@ -18,6 +18,7 @@
import static android.net.wifi.WifiConfiguration.AP_BAND_2GHZ;
import static android.net.wifi.WifiConfiguration.AP_BAND_5GHZ;
+import static android.net.wifi.WifiConfiguration.AP_BAND_ANY;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
@@ -32,7 +33,8 @@
private static final String TAG = "WifiTetherApBandPref";
private static final String PREF_KEY = "wifi_tether_network_ap_band";
private static final String[] BAND_VALUES =
- {String.valueOf(AP_BAND_2GHZ), String.valueOf(AP_BAND_5GHZ)};
+ {String.valueOf(AP_BAND_ANY), String.valueOf(AP_BAND_2GHZ),
+ String.valueOf(AP_BAND_5GHZ)};
private final String[] mBandEntries;
private int mBandIndex;
@@ -65,7 +67,7 @@
} else {
preference.setEntries(mBandEntries);
preference.setEntryValues(BAND_VALUES);
- preference.setSummary(mBandEntries[mBandIndex]);
+ preference.setSummary(mBandEntries[mBandIndex + 1]);
preference.setValue(String.valueOf(mBandIndex));
}
}
@@ -78,7 +80,8 @@
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
mBandIndex = Integer.parseInt((String) newValue);
- preference.setSummary(mBandEntries[mBandIndex]);
+ Log.d(TAG, "Band preference changed, updating band index to " + mBandIndex);
+ preference.setSummary(mBandEntries[mBandIndex + 1]);
mListener.onTetherConfigUpdated();
return true;
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java
index b563e53..d7cb441 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java
@@ -35,10 +35,12 @@
static final String DEFAULT_SSID = "AndroidAP";
private String mSSID;
+ private WifiDeviceNameTextValidator mWifiDeviceNameTextValidator;
public WifiTetherSSIDPreferenceController(Context context,
OnTetherConfigUpdateListener listener) {
super(context, listener);
+ mWifiDeviceNameTextValidator = new WifiDeviceNameTextValidator();
}
@Override
@@ -70,7 +72,7 @@
@Override
public boolean isTextValid(String value) {
- return !WifiUtils.isSSIDTooLong(value) && !WifiUtils.isSSIDTooShort(value);
+ return mWifiDeviceNameTextValidator.isTextValid(value);
}
public String getSSID() {
diff --git a/src/com/android/settings/wrapper/EuiccManagerWrapper.java b/src/com/android/settings/wrapper/EuiccManagerWrapper.java
new file mode 100644
index 0000000..2a51526
--- /dev/null
+++ b/src/com/android/settings/wrapper/EuiccManagerWrapper.java
@@ -0,0 +1,49 @@
+/*
+ * 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.wrapper;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.telephony.euicc.EuiccManager;
+
+/**
+ * This class replicates a subset of the {@link android.telephony.euicc.EuiccManager}.
+ * The interface exists so that we can use a thin wrapper around the EuiccManager in
+ * production code and a mock in tests.
+ */
+public class EuiccManagerWrapper {
+
+ private final EuiccManager mEuiccManager;
+
+ public EuiccManagerWrapper(Context context) {
+ mEuiccManager = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);
+ }
+
+ /**
+ * Returns the EID identifying the eUICC hardware.
+ *
+ * <p>Requires that the calling app has carrier privileges on the active subscription on the
+ * eUICC.
+ *
+ * @return the EID. May be null if {@link EuiccManager#isEnabled()} is false or the eUICC is not
+ * ready.
+ */
+ @Nullable
+ public String getEid() {
+ return mEuiccManager.getEid();
+ }
+}
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index f437f96..e755f27 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -20,6 +20,7 @@
<bool name="config_show_camera_laser_sensor">false</bool>
<bool name="config_show_connectivity_monitor">false</bool>
<bool name="config_display_recent_apps">false</bool>
+ <bool name="config_additional_system_update_setting_enable">true</bool>
<bool name="config_show_wifi_settings">false</bool>
<bool name="config_show_toggle_airplane">false</bool>
<bool name="config_show_high_power_apps">false</bool>
@@ -54,5 +55,6 @@
<bool name="config_show_vibrate_input_devices">false</bool>
<bool name="config_show_color_correction_preference">false</bool>
<bool name="config_show_color_inversion_preference">false</bool>
+ <bool name="config_show_system_update_settings">false</bool>
<bool name="config_wifi_support_connected_mac_randomization">false</bool>
</resources>
diff --git a/tests/robotests/src/com/android/settings/MasterClearTest.java b/tests/robotests/src/com/android/settings/MasterClearTest.java
index ac753c1..776025f 100644
--- a/tests/robotests/src/com/android/settings/MasterClearTest.java
+++ b/tests/robotests/src/com/android/settings/MasterClearTest.java
@@ -66,7 +66,8 @@
)
public class MasterClearTest {
private static final String TEST_ACCOUNT_TYPE = "android.test.account.type";
- private static final String TEST_CONFIRMATION_PACKAGE = "android.test.confirmation.pkg";
+ private static final String TEST_CONFIRMATION_PACKAGE = "android.test.conf.pkg";
+ private static final String TEST_CONFIRMATION_CLASS = "android.test.conf.pkg.ConfActivity";
private static final String TEST_ACCOUNT_NAME = "test@example.com";
@Mock
@@ -223,6 +224,7 @@
when(mMasterClear.getActivity()).thenReturn(mMockActivity);
when(mMockActivity.getString(R.string.account_type)).thenReturn(TEST_ACCOUNT_TYPE);
when(mMockActivity.getString(R.string.account_confirmation_package)).thenReturn(TEST_CONFIRMATION_PACKAGE);
+ when(mMockActivity.getString(R.string.account_confirmation_class)).thenReturn(TEST_CONFIRMATION_CLASS);
Account[] accounts = new Account[0];
when(mMockActivity.getSystemService(Context.ACCOUNT_SERVICE)).thenReturn(mAccountManager);
@@ -235,6 +237,7 @@
when(mMasterClear.getActivity()).thenReturn(mMockActivity);
when(mMockActivity.getString(R.string.account_type)).thenReturn(TEST_ACCOUNT_TYPE);
when(mMockActivity.getString(R.string.account_confirmation_package)).thenReturn(TEST_CONFIRMATION_PACKAGE);
+ when(mMockActivity.getString(R.string.account_confirmation_class)).thenReturn(TEST_CONFIRMATION_CLASS);
Account[] accounts = new Account[] { new Account(TEST_ACCOUNT_NAME, TEST_ACCOUNT_TYPE) };
when(mMockActivity.getSystemService(Context.ACCOUNT_SERVICE)).thenReturn(mAccountManager);
when(mAccountManager.getAccountsByType(TEST_ACCOUNT_TYPE)).thenReturn(accounts);
@@ -250,6 +253,7 @@
// Only try to show account confirmation if the appropriate resource overlays are available.
when(mMockActivity.getString(R.string.account_type)).thenReturn(TEST_ACCOUNT_TYPE);
when(mMockActivity.getString(R.string.account_confirmation_package)).thenReturn(TEST_CONFIRMATION_PACKAGE);
+ when(mMockActivity.getString(R.string.account_confirmation_class)).thenReturn(TEST_CONFIRMATION_CLASS);
// Add accounts to trigger the search for a resolving intent.
Account[] accounts = new Account[] { new Account(TEST_ACCOUNT_NAME, TEST_ACCOUNT_TYPE) };
when(mMockActivity.getSystemService(Context.ACCOUNT_SERVICE)).thenReturn(mAccountManager);
@@ -265,11 +269,18 @@
when(mPackageManager.resolveActivity(any(), eq(0))).thenReturn(resolveInfo);
// Finally mock out the startActivityForResultCall
- doNothing().when(mMockActivity).startActivityForResult(any(), eq(MasterClear.CREDENTIAL_CONFIRM_REQUEST));
+ doNothing().when(mMasterClear).startActivityForResult(any(), eq(MasterClear.CREDENTIAL_CONFIRM_REQUEST));
assertThat(mMasterClear.tryShowAccountConfirmation()).isTrue();
}
+ @Test
+ public void testIsValidRequestCode() {
+ assertThat(mMasterClear.isValidRequestCode(MasterClear.KEYGUARD_REQUEST)).isTrue();
+ assertThat(mMasterClear.isValidRequestCode(MasterClear.CREDENTIAL_CONFIRM_REQUEST)).isTrue();
+ assertThat(mMasterClear.isValidRequestCode(0)).isFalse();
+ }
+
private void initScrollView(int height, int scrollY, int childBottom) {
when(mScrollView.getHeight()).thenReturn(height);
when(mScrollView.getScrollY()).thenReturn(scrollY);
diff --git a/tests/robotests/src/com/android/settings/SettingsDialogFragmentTest.java b/tests/robotests/src/com/android/settings/SettingsDialogFragmentTest.java
index 942634a..3a7d094 100644
--- a/tests/robotests/src/com/android/settings/SettingsDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsDialogFragmentTest.java
@@ -17,6 +17,7 @@
import android.app.Dialog;
import android.app.Fragment;
+import android.content.Context;
import org.junit.Before;
import org.junit.Test;
@@ -39,6 +40,8 @@
private static final int DIALOG_ID = 15;
@Mock
+ private Context mContext;
+ @Mock
private DialogCreatableFragment mDialogCreatable;
private SettingsPreferenceFragment.SettingsDialogFragment mDialogFragment;
@@ -53,9 +56,10 @@
mDialogFragment =
new SettingsPreferenceFragment.SettingsDialogFragment(mDialogCreatable, DIALOG_ID);
+ mDialogFragment.onAttach(mContext);
mDialogFragment.getMetricsCategory();
- // getDialogMetricsCategory called in constructor, and explicitly in test.
+ // getDialogMetricsCategory called in onAttach, and explicitly in test.
verify(mDialogCreatable, times(2)).getDialogMetricsCategory(DIALOG_ID);
}
@@ -66,6 +70,7 @@
try {
mDialogFragment = new SettingsPreferenceFragment.SettingsDialogFragment(
mDialogCreatable, DIALOG_ID);
+ mDialogFragment.onAttach(mContext);
} catch (IllegalStateException e) {
// getDialogMetricsCategory called in constructor
verify(mDialogCreatable).getDialogMetricsCategory(DIALOG_ID);
diff --git a/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java b/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java
index 5c0badc..f85d43a 100644
--- a/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java
@@ -42,9 +42,9 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
index e9d37f6..71020be 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
@@ -32,11 +32,11 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
index b973edb..828b5a1 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
@@ -29,13 +29,13 @@
import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.widget.MasterSwitchController;
import com.android.settings.widget.MasterSwitchPreference;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.BeforeClass;
diff --git a/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java b/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
index 8666ce3..c3b22b3 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
@@ -26,11 +26,11 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/BluetoothOnWhileDrivingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/BluetoothOnWhileDrivingPreferenceControllerTest.java
new file mode 100644
index 0000000..3e60ca6
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/connecteddevice/BluetoothOnWhileDrivingPreferenceControllerTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.connecteddevice;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.util.FeatureFlagUtils;
+
+import com.android.settings.TestConfig;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.FeatureFlags;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+
+import org.junit.After;
+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, shadows =
+ SettingsShadowSystemProperties.class)
+public class BluetoothOnWhileDrivingPreferenceControllerTest {
+ private BluetoothOnWhileDrivingPreferenceController mController;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mController = new BluetoothOnWhileDrivingPreferenceController(mContext);
+ }
+
+ @After
+ public void teardown() {
+ SettingsShadowSystemProperties.clear();
+ }
+
+ @Test
+ public void getAvailabilityStatus_onWhenEnabled() {
+ FeatureFlagUtils.setEnabled(mContext, FeatureFlags.BLUETOOTH_WHILE_DRIVING, true);
+
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_offWhenDisabled() {
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.DISABLED_UNSUPPORTED);
+ }
+
+ @Test
+ public void setChecked_togglesSettingSecure() {
+ mController.setChecked(true);
+
+ assertThat(
+ Settings.Secure.getInt(
+ mContext.getContentResolver(),
+ Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING,
+ 0))
+ .isEqualTo(1);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java b/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java
new file mode 100644
index 0000000..ecd756a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.core;
+
+import android.content.res.Resources;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class InstrumentedActivityTest {
+
+ /**
+ * Verifies that the {@link InstrumentedActivity} class can be instantiated successfully.
+ * Code added to the activity constructor had resulted in an NPE if resources are accessed
+ * before onCreate().
+ */
+ @Test
+ public void canInstantiate() {
+ Robolectric.buildActivity(InstrumentedActivityTestable.class).setup().get();
+ }
+
+ public static class InstrumentedActivityTestable extends InstrumentedActivity {
+
+ @Override
+ public int getMetricsCategory() {
+ return 0;
+ }
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java b/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
index 8ded9d6..e6ca59b 100644
--- a/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
+++ b/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
@@ -80,11 +80,6 @@
private static final String BAD_CLASSNAME_ERROR =
"The following controllers set in the XML did not have valid class names:\n";
- private static final String BAD_CONSTRUCTOR_ERROR =
- "The constructor provided by the following classes were insufficient to instantiate "
- + "the object. It could be due to being an interface, abstract, or an "
- + "IllegalAccessException. Please fix the following classes:\n";
-
Context mContext;
SearchFeatureProvider mSearchProvider;
private FakeFeatureFactory mFakeFeatureFactory;
@@ -112,7 +107,6 @@
Set<String> invalidConstructors = new HashSet<>();
Set<String> invalidClassHierarchy = new HashSet<>();
Set<String> badClassNameControllers = new HashSet<>();
- Set<String> badConstructorControllers = new HashSet<>();
for (int resId : xmlSet) {
xmlControllers.addAll(getXmlControllers(resId));
@@ -133,13 +127,7 @@
continue;
}
- Object controller = getObjectFromConstructor(constructor);
- if (controller == null) {
- badConstructorControllers.add(controllerClassName);
- continue;
- }
-
- if (!(controller instanceof BasePreferenceController)) {
+ if (!isBasePreferenceController(clazz)) {
invalidClassHierarchy.add(controllerClassName);
}
}
@@ -150,13 +138,10 @@
invalidClassHierarchy);
final String badClassNameError = buildErrorMessage(BAD_CLASSNAME_ERROR,
badClassNameControllers);
- final String badConstructorError = buildErrorMessage(BAD_CONSTRUCTOR_ERROR,
- badConstructorControllers);
assertWithMessage(invalidConstructorError).that(invalidConstructors).isEmpty();
assertWithMessage(invalidClassHierarchyError).that(invalidClassHierarchy).isEmpty();
assertWithMessage(badClassNameError).that(badClassNameControllers).isEmpty();
- assertWithMessage(badConstructorError).that(badConstructorControllers).isEmpty();
}
private Set<Integer> getIndexableXml() {
@@ -260,25 +245,16 @@
return constructor;
}
- private Object getObjectFromConstructor(Constructor<?> constructor) {
- Object controller = null;
-
- try {
- controller = constructor.newInstance(mContext);
- } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
- IllegalArgumentException e) {
+ /**
+ * Make sure that {@link BasePreferenceController} is in the class hierarchy.
+ */
+ private boolean isBasePreferenceController(Class<?> clazz) {
+ while (clazz != null) {
+ clazz = clazz.getSuperclass();
+ if (BasePreferenceController.class.equals(clazz)) {
+ return true;
+ }
}
-
- if (controller != null) {
- return controller;
- }
-
- try {
- controller = constructor.newInstance(mContext, "key");
- } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
- IllegalArgumentException e) {
- }
-
- return controller;
+ return false;
}
-}
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentableFragmentCodeInspector.java b/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentableFragmentCodeInspector.java
index 4455549..867b5df 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentableFragmentCodeInspector.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentableFragmentCodeInspector.java
@@ -20,6 +20,7 @@
import android.util.ArraySet;
import com.android.settings.core.codeinspection.CodeInspector;
+import com.android.settingslib.core.instrumentation.Instrumentable;
import java.util.ArrayList;
import java.util.List;
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java
index 9e37896..8ad2d69 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java
@@ -21,6 +21,7 @@
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/MetricsFeatureProviderTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/MetricsFeatureProviderTest.java
index da48f15..2950c07 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/MetricsFeatureProviderTest.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/MetricsFeatureProviderTest.java
@@ -31,6 +31,9 @@
import com.android.settings.TestConfig;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.instrumentation.LogWriter;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import org.junit.Before;
import org.junit.Test;
@@ -58,7 +61,6 @@
@Mock private VisibilityLoggerMixin mockVisibilityLogger;
private Context mContext;
- private MetricsFeatureProvider mProvider;
@Captor
private ArgumentCaptor<Pair> mPairCaptor;
@@ -67,12 +69,6 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
- mProvider = new MetricsFeatureProvider();
- List<LogWriter> writers = new ArrayList<>();
- writers.add(mockLogWriter);
- ReflectionHelpers.setField(mProvider, "mLoggerWriters", writers);
-
- when(mockVisibilityLogger.elapsedTimeSinceVisible()).thenReturn(ELAPSED_TIME);
}
@Test
@@ -84,60 +80,4 @@
assertThat(feature1 == feature2).isTrue();
}
-
- @Test
- public void logDashboardStartIntent_intentEmpty_shouldNotLog() {
- mProvider.logDashboardStartIntent(mContext, null /* intent */,
- MetricsEvent.SETTINGS_GESTURES);
-
- verifyNoMoreInteractions(mockLogWriter);
- }
-
- @Test
- public void logDashboardStartIntent_intentHasNoComponent_shouldLog() {
- final Intent intent = new Intent(Intent.ACTION_ASSIST);
-
- mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES);
-
- verify(mockLogWriter).action(
- eq(mContext),
- eq(MetricsEvent.ACTION_SETTINGS_TILE_CLICK),
- anyString(),
- eq(Pair.create(MetricsEvent.FIELD_CONTEXT, MetricsEvent.SETTINGS_GESTURES)));
- }
-
- @Test
- public void logDashboardStartIntent_intentIsExternal_shouldLog() {
- final Intent intent = new Intent().setComponent(new ComponentName("pkg", "cls"));
-
- mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES);
-
- verify(mockLogWriter).action(
- eq(mContext),
- eq(MetricsEvent.ACTION_SETTINGS_TILE_CLICK),
- anyString(),
- eq(Pair.create(MetricsEvent.FIELD_CONTEXT, MetricsEvent.SETTINGS_GESTURES)));
- }
-
- @Test
- public void action_BooleanLogsElapsedTime() {
- mProvider.action(mockVisibilityLogger, CATEGORY, SUBTYPE_BOOLEAN);
- verify(mockLogWriter).action(eq(CATEGORY), eq(SUBTYPE_BOOLEAN), mPairCaptor.capture());
-
- Pair value = mPairCaptor.getValue();
- assertThat(value.first instanceof Integer).isTrue();
- assertThat((int) value.first).isEqualTo(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS);
- assertThat(value.second).isEqualTo(ELAPSED_TIME);
- }
-
- @Test
- public void action_IntegerLogsElapsedTime() {
- mProvider.action(mockVisibilityLogger, CATEGORY, SUBTYPE_INTEGER);
- verify(mockLogWriter).action(eq(CATEGORY), eq(SUBTYPE_INTEGER), mPairCaptor.capture());
-
- Pair value = mPairCaptor.getValue();
- assertThat(value.first instanceof Integer).isTrue();
- assertThat((int) value.first).isEqualTo(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS);
- assertThat(value.second).isEqualTo(ELAPSED_TIME);
- }
}
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
deleted file mode 100644
index c80e3a8..0000000
--- a/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
+++ /dev/null
@@ -1,185 +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.core.instrumentation;
-
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_SETTINGS_PREFERENCE_CHANGE;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_FLOAT_VALUE;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.argThat;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.util.Pair;
-
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import com.google.common.truth.Platform;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.ArgumentMatcher;
-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 SharedPreferenceLoggerTest {
-
- private static final String TEST_TAG = "tag";
- private static final String TEST_KEY = "key";
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Context mContext;
-
- private ArgumentMatcher<Pair<Integer, Object>> mNamePairMatcher;
- private FakeFeatureFactory mFactory;
- private MetricsFeatureProvider mMetricsFeature;
- private SharedPreferencesLogger mSharedPrefLogger;
-
- @Before
- public void init() {
- MockitoAnnotations.initMocks(this);
- mFactory = FakeFeatureFactory.setupForTest();
- mMetricsFeature = mFactory.metricsFeatureProvider;
-
- mSharedPrefLogger = new SharedPreferencesLogger(mContext, TEST_TAG);
- mNamePairMatcher = pairMatches(FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, String.class);
- }
-
- @Test
- public void putInt_shouldNotLogInitialPut() {
- final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
- editor.putInt(TEST_KEY, 1);
- editor.putInt(TEST_KEY, 1);
- editor.putInt(TEST_KEY, 1);
- editor.putInt(TEST_KEY, 2);
- editor.putInt(TEST_KEY, 2);
- editor.putInt(TEST_KEY, 2);
- editor.putInt(TEST_KEY, 2);
-
- verify(mMetricsFeature, times(6)).action(any(Context.class), anyInt(),
- argThat(mNamePairMatcher),
- argThat(pairMatches(FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, Integer.class)));
- }
-
- @Test
- public void putBoolean_shouldNotLogInitialPut() {
- final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
- editor.putBoolean(TEST_KEY, true);
- editor.putBoolean(TEST_KEY, true);
- editor.putBoolean(TEST_KEY, false);
- editor.putBoolean(TEST_KEY, false);
- editor.putBoolean(TEST_KEY, false);
-
-
- verify(mMetricsFeature).action(any(Context.class), anyInt(),
- argThat(mNamePairMatcher),
- argThat(pairMatches(FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, true)));
- verify(mMetricsFeature, times(3)).action(any(Context.class), anyInt(),
- argThat(mNamePairMatcher),
- argThat(pairMatches(FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, false)));
- }
-
- @Test
- public void putLong_shouldNotLogInitialPut() {
- final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
- editor.putLong(TEST_KEY, 1);
- editor.putLong(TEST_KEY, 1);
- editor.putLong(TEST_KEY, 1);
- editor.putLong(TEST_KEY, 1);
- editor.putLong(TEST_KEY, 2);
-
- verify(mMetricsFeature, times(4)).action(any(Context.class), anyInt(),
- argThat(mNamePairMatcher),
- argThat(pairMatches(FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, Integer.class)));
- }
-
- @Test
- public void putLong_biggerThanIntMax_shouldLogIntMax() {
- final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
- final long veryBigNumber = 500L + Integer.MAX_VALUE;
- editor.putLong(TEST_KEY, 1);
- editor.putLong(TEST_KEY, veryBigNumber);
-
- verify(mMetricsFeature).action(any(Context.class), anyInt(),
- argThat(mNamePairMatcher),
- argThat(pairMatches(
- FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, Integer.MAX_VALUE)));
- }
-
- @Test
- public void putLong_smallerThanIntMin_shouldLogIntMin() {
- final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
- final long veryNegativeNumber = -500L + Integer.MIN_VALUE;
- editor.putLong(TEST_KEY, 1);
- editor.putLong(TEST_KEY, veryNegativeNumber);
-
- verify(mMetricsFeature).action(any(Context.class), anyInt(),
- argThat(mNamePairMatcher),
- argThat(pairMatches(
- FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, Integer.MIN_VALUE)));
- }
-
- @Test
- public void putFloat_shouldNotLogInitialPut() {
- final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
- editor.putFloat(TEST_KEY, 1);
- editor.putFloat(TEST_KEY, 1);
- editor.putFloat(TEST_KEY, 1);
- editor.putFloat(TEST_KEY, 1);
- editor.putFloat(TEST_KEY, 2);
-
- verify(mMetricsFeature, times(4)).action(any(Context.class), anyInt(),
- argThat(mNamePairMatcher),
- argThat(pairMatches(FIELD_SETTINGS_PREFERENCE_CHANGE_FLOAT_VALUE, Float.class)));
- }
-
- @Test
- public void logPackage_shouldUseLogPackageApi() {
- mSharedPrefLogger.logPackageName("key", "com.android.settings");
- verify(mMetricsFeature).action(any(Context.class),
- eq(ACTION_SETTINGS_PREFERENCE_CHANGE),
- eq("com.android.settings"),
- any(Pair.class));
- }
-
- private ArgumentMatcher<Pair<Integer, Object>> pairMatches(int tag, Class clazz) {
- return pair -> pair.first == tag && Platform.isInstanceOfType(pair.second, clazz);
- }
-
- private ArgumentMatcher<Pair<Integer, Object>> pairMatches(int tag, boolean bool) {
- return pair -> pair.first == tag
- && Platform.isInstanceOfType(pair.second, Integer.class)
- && pair.second.equals((bool ? 1 : 0));
- }
-
- private ArgumentMatcher<Pair<Integer, Object>> pairMatches(int tag, int val) {
- return pair -> pair.first == tag
- && Platform.isInstanceOfType(pair.second, Integer.class)
- && pair.second.equals(val);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java
deleted file mode 100644
index 1a47a66..0000000
--- a/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java
+++ /dev/null
@@ -1,123 +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.core.instrumentation;
-
-import static com.android.settings.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
-
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.SettingsActivity;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-
-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;
-
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class VisibilityLoggerMixinTest {
-
- @Mock
- private MetricsFeatureProvider mMetricsFeature;
-
- private VisibilityLoggerMixin mMixin;
-
- @Before
- public void init() {
- MockitoAnnotations.initMocks(this);
- mMixin = new VisibilityLoggerMixin(TestInstrumentable.TEST_METRIC, mMetricsFeature);
- }
-
- @Test
- public void shouldLogVisibleOnResume() {
- mMixin.onResume();
-
- verify(mMetricsFeature, times(1))
- .visible(nullable(Context.class), eq(MetricsProto.MetricsEvent.VIEW_UNKNOWN),
- eq(TestInstrumentable.TEST_METRIC));
- }
-
- @Test
- public void shouldLogVisibleWithSource() {
- final Intent sourceIntent = new Intent()
- .putExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY,
- MetricsProto.MetricsEvent.SETTINGS_GESTURES);
- final Activity activity = mock(Activity.class);
- when(activity.getIntent()).thenReturn(sourceIntent);
- mMixin.setSourceMetricsCategory(activity);
- mMixin.onResume();
-
- verify(mMetricsFeature, times(1))
- .visible(nullable(Context.class), eq(MetricsProto.MetricsEvent.SETTINGS_GESTURES),
- eq(TestInstrumentable.TEST_METRIC));
- }
-
- @Test
- public void shouldLogHideOnPause() {
- mMixin.onPause();
-
- verify(mMetricsFeature, times(1))
- .hidden(nullable(Context.class), eq(TestInstrumentable.TEST_METRIC));
- }
-
- @Test
- public void shouldNotLogIfMetricsFeatureIsNull() {
- mMixin = new VisibilityLoggerMixin(TestInstrumentable.TEST_METRIC);
- mMixin.onResume();
- mMixin.onPause();
-
- verify(mMetricsFeature, never())
- .hidden(nullable(Context.class), anyInt());
- }
-
- @Test
- public void shouldNotLogIfMetricsCategoryIsUnknown() {
- mMixin = new VisibilityLoggerMixin(METRICS_CATEGORY_UNKNOWN, mMetricsFeature);
-
- mMixin.onResume();
- mMixin.onPause();
-
- verify(mMetricsFeature, never())
- .hidden(nullable(Context.class), anyInt());
- }
-
- private final class TestInstrumentable implements Instrumentable {
-
- public static final int TEST_METRIC = 12345;
-
- @Override
- public int getMetricsCategory() {
- return TEST_METRIC;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 741f2bc..afa914c 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -51,6 +51,7 @@
import com.android.settings.testutils.shadow.ShadowThreadUtils;
import com.android.settings.testutils.shadow.ShadowTileUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.drawer.CategoryKey;
import com.android.settingslib.drawer.CategoryManager;
import com.android.settingslib.drawer.DashboardCategory;
@@ -372,7 +373,7 @@
final Intent launchIntent = shadowActivity.getNextStartedActivityForResult().intent;
assertThat(launchIntent.getAction())
.isEqualTo("TestAction");
- assertThat(launchIntent.getIntExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY, 0))
+ assertThat(launchIntent.getIntExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, 0))
.isEqualTo(MetricsProto.MetricsEvent.SETTINGS_GESTURES);
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
index 6c663ab..40e590a 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
@@ -33,10 +33,10 @@
import com.android.settings.TestConfig;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.drawer.TileUtils;
diff --git a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java
index d077e6f..1a3fa5e 100644
--- a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java
@@ -22,7 +22,7 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
index 9ab88d3..8b3c770 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
@@ -60,6 +60,7 @@
@Test
public void resumePause_shouldListenUnlistenDataStateChange() {
+ mDataUsageList.onAttach(mContext);
mDataUsageList.onResume();
verify(mListener).setListener(true, 0, mContext);
diff --git a/tests/robotests/src/com/android/settings/datetime/ZonePickerTest.java b/tests/robotests/src/com/android/settings/datetime/ZonePickerTest.java
index 92807e9..9f6d0ef 100644
--- a/tests/robotests/src/com/android/settings/datetime/ZonePickerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/ZonePickerTest.java
@@ -28,8 +28,8 @@
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.testutils.shadow.ShadowZoneGetter;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
index 66ccc6e..ab32fa2 100644
--- a/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
@@ -31,11 +31,11 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
import com.android.settings.widget.SwitchBar;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceControllerTest.java
new file mode 100644
index 0000000..e5708ba
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceControllerTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.deviceinfo;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+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.mockito.Mock;
+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 AdditionalSystemUpdatePreferenceControllerTest {
+
+ private Context mContext;
+ private AdditionalSystemUpdatePreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = RuntimeEnvironment.application;
+ mController = new AdditionalSystemUpdatePreferenceController(mContext);
+ }
+
+ @Test
+ public void displayPrefs_ifNotAvailable_shouldNotDisplay() {
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ @Config(qualifiers = "mcc999")
+ public void displayPrefs_ifAvailable_shouldDisplay() {
+ assertThat(mController.isAvailable()).isTrue();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java
new file mode 100644
index 0000000..4ff79ca
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.deviceinfo;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+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.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.os.Build;
+import android.provider.Settings;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.widget.ValidatedEditTextPreference;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DeviceNamePreferenceControllerTest {
+ private static final String TESTING_STRING = "Testing";
+
+ @Mock
+ private LocalBluetoothAdapter mBluetoothAdapter;
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private LocalBluetoothManager mBluetoothManager;
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private PreferenceScreen mScreen;
+ private ValidatedEditTextPreference mPreference;
+ private DeviceNamePreferenceController mController;
+ private Context mContext;
+
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ ShadowApplication shadowApplication = ShadowApplication.getInstance();
+ shadowApplication.setSystemService(Context.WIFI_SERVICE, mWifiManager);
+ mContext = shadowApplication.getApplicationContext();
+ mPreference = new ValidatedEditTextPreference(mContext);
+ when(mBluetoothManager.getBluetoothAdapter()).thenReturn(mBluetoothAdapter);
+ when(mScreen.findPreference(anyString())).thenReturn(mPreference);
+ final WifiConfiguration configuration = new WifiConfiguration();
+ configuration.SSID = "test-ap";
+ when(mWifiManager.getWifiApConfiguration()).thenReturn(configuration);
+
+ mController = new DeviceNamePreferenceController(mContext);
+ mController.setLocalBluetoothManager(mBluetoothManager);
+ }
+
+ @Test
+ public void constructor_defaultDeviceNameIsModelName() {
+ assertThat(mController.getSummary()).isEqualTo(Build.MODEL);
+ }
+
+ @Test
+ public void constructor_deviceNameLoadedIfSet() {
+ Settings.Global.putString(mContext.getContentResolver(), Settings.Global.DEVICE_NAME,
+ "Test");
+ mController = new DeviceNamePreferenceController(mContext);
+ mController.setLocalBluetoothManager(mBluetoothManager);
+ assertThat(mController.getSummary()).isEqualTo("Test");
+ }
+
+ @Test
+ public void isTextValid_nameUnder33CharactersIsValid() {
+ assertThat(mController.isTextValid("12345678901234567890123456789012")).isTrue();
+ }
+
+ @Test
+ public void isTextValid_nameTooLongIsInvalid() {
+ assertThat(mController.isTextValid("123456789012345678901234567890123")).isFalse();
+ }
+
+ @Test
+ public void setDeviceName_preferenceUpdatedWhenDeviceNameUpdated() {
+ mController.onPreferenceChange(mPreference, TESTING_STRING);
+
+ assertThat(mPreference.getSummary()).isEqualTo(TESTING_STRING);
+ }
+
+ @Test
+ public void setDeviceName_bluetoothNameUpdatedWhenDeviceNameUpdated() {
+ mController.onPreferenceChange(mPreference, TESTING_STRING);
+
+ verify(mBluetoothAdapter).setName(eq(TESTING_STRING));
+ }
+
+ @Test
+ public void setDeviceName_wifiTetherNameUpdatedWhenDeviceNameUpdated() {
+ mController.onPreferenceChange(mPreference, TESTING_STRING);
+
+ ArgumentCaptor<WifiConfiguration> captor = ArgumentCaptor.forClass(WifiConfiguration.class);
+ verify(mWifiManager).setWifiApConfiguration(captor.capture());
+ assertThat(captor.getValue().SSID).isEqualTo(TESTING_STRING);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java b/tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java
new file mode 100644
index 0000000..36f0662
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.deviceinfo;
+
+import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v7.preference.PreferenceScreen;
+import android.telephony.TelephonyManager;
+
+import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+import com.android.settings.testutils.shadow.ShadowConnectivityManager;
+import com.android.settings.testutils.shadow.ShadowUserManager;
+
+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 org.robolectric.shadows.ShadowApplication;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(
+ manifest = TestConfig.MANIFEST_PATH,
+ sdk = TestConfig.SDK_VERSION,
+ shadows = {ShadowConnectivityManager.class, ShadowUserManager.class}
+)
+public class MyDeviceInfoFragmentTest {
+ @Mock
+ private Activity mActivity;
+ @Mock
+ private PreferenceScreen mScreen;
+ @Mock
+ private TelephonyManager mTelephonyManager;
+
+ private Context mContext;
+ private MyDeviceInfoFragment mSettings;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ FakeFeatureFactory.setupForTest();
+ mContext = RuntimeEnvironment.application;
+ mSettings = spy(new MyDeviceInfoFragment());
+
+ when(mSettings.getActivity()).thenReturn(mActivity);
+ when(mSettings.getContext()).thenReturn(mContext);
+ when(mActivity.getTheme()).thenReturn(mContext.getTheme());
+ when(mActivity.getResources()).thenReturn(mContext.getResources());
+ doNothing().when(mSettings).onCreatePreferences(any(), any());
+
+ doReturn(mScreen).when(mSettings).getPreferenceScreen();
+ when(mSettings.getPreferenceScreen()).thenReturn(mScreen);
+ ShadowApplication.getInstance().setSystemService(Context.TELEPHONY_SERVICE,
+ mTelephonyManager);
+ }
+
+ @Test
+ @Config(shadows = {SettingsShadowResources.SettingsShadowTheme.class,
+ SettingsShadowSystemProperties.class})
+ public void onCreate_fromSearch_shouldNotOverrideInitialExpandedCount() {
+ final Bundle args = new Bundle();
+ args.putString(EXTRA_FRAGMENT_ARG_KEY, "search_key");
+ mSettings.setArguments(args);
+
+ mSettings.onCreate(null /* icicle */);
+
+ verify(mScreen).setInitialExpandedChildrenCount(Integer.MAX_VALUE);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java
index 1fd5430..b5b84da 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java
@@ -16,7 +16,9 @@
package com.android.settings.deviceinfo;
import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -28,6 +30,7 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowUserManager;
import org.junit.Before;
import org.junit.Test;
@@ -36,29 +39,32 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
import java.util.ArrayList;
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 SystemUpdatePreferenceControllerTest {
- @Mock(answer = RETURNS_DEEP_STUBS)
- private Context mContext;
- @Mock
- private UserManager mUserManager;
@Mock
private PreferenceScreen mScreen;
+ private Context mContext;
private SystemUpdatePreferenceController mController;
private Preference mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
- when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
mController = new SystemUpdatePreferenceController(mContext);
mPreference = new Preference(RuntimeEnvironment.application);
mPreference.setKey(mController.getPreferenceKey());
@@ -66,12 +72,9 @@
}
@Test
- public void updateNonIndexable_bothAvailable_shouldNotUpdate() {
+ public void updateNonIndexable_ifAvailable_shouldNotUpdate() {
final List<String> keys = new ArrayList<>();
- when(mUserManager.isAdminUser()).thenReturn(true);
- when(mContext.getResources().getBoolean(
- R.bool.config_additional_system_update_setting_enable))
- .thenReturn(true);
+ ShadowUserManager.getShadow().setIsAdminUser(true);
mController.updateNonIndexableKeys(keys);
@@ -79,7 +82,8 @@
}
@Test
- public void updateNonIndexable_nothingAvailable_shouldUpdateWith2Prefs() {
+ public void updateNonIndexable_ifNotAvailable_shouldUpdate() {
+ ShadowUserManager.getShadow().setIsAdminUser(false);
final List<String> keys = new ArrayList<>();
mController.updateNonIndexableKeys(keys);
@@ -88,31 +92,37 @@
}
@Test
- public void displayPrefs_nothingAvailable_shouldNotDisplay() {
+ public void displayPrefs_ifVisible_butNotAdminUser_shouldNotDisplay() {
+ ShadowUserManager.getShadow().setIsAdminUser(false);
mController.displayPreference(mScreen);
assertThat(mPreference.isVisible()).isFalse();
}
@Test
- public void updateState_shouldSetToAndroidVersion() {
- mController = new SystemUpdatePreferenceController(RuntimeEnvironment.application);
+ @Config(qualifiers = "mcc999")
+ public void displayPrefs_ifAdminUser_butNotVisible_shouldNotDisplay() {
+ ShadowUserManager.getShadow().setIsAdminUser(true);
+ mController.displayPreference(mScreen);
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void displayPrefs_ifAvailable_shouldDisplay() {
+ ShadowUserManager.getShadow().setIsAdminUser(true);
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.isVisible()).isTrue();
+ }
+
+ @Test
+ public void updateState_shouldSetToAndroidVersion() {
mController.updateState(mPreference);
assertThat(mPreference.getSummary())
.isEqualTo(RuntimeEnvironment.application.getString(R.string.about_summary,
Build.VERSION.RELEASE));
}
-
- @Test
- public void displayPrefs_oneAvailable_shouldDisplayOne() {
- when(mContext.getResources().getBoolean(
- R.bool.config_additional_system_update_setting_enable))
- .thenReturn(true);
-
- mController.displayPreference(mScreen);
-
- assertThat(mPreference.isVisible()).isFalse();
- }
-}
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
index cea4580..b10de63 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
@@ -18,6 +18,7 @@
import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController
.CELLULAR_NETWORK_TYPE_VALUE_ID;
+import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.EID_INFO_VALUE_ID;
import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController
.ICCID_INFO_LABEL_ID;
import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController
@@ -60,6 +61,7 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.wrapper.EuiccManagerWrapper;
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
@@ -91,7 +93,8 @@
private CarrierConfigManager mCarrierConfigManager;
@Mock
private PersistableBundle mPersistableBundle;
-
+ @Mock
+ private EuiccManagerWrapper mEuiccManager;
private SimStatusDialogController mController;
private Context mContext;
@@ -107,15 +110,18 @@
mLifecycle = new Lifecycle(mLifecycleOwner);
mController = spy(
new SimStatusDialogController(mDialog, mLifecycle, 0 /* phone id */));
+ mEuiccManager = spy(new EuiccManagerWrapper(mContext));
doReturn(mServiceState).when(mController).getCurrentServiceState();
doReturn(0).when(mController).getDbm(any());
doReturn(0).when(mController).getAsuLevel(any());
doReturn(mPhoneStateListener).when(mController).getPhoneStateListener();
doReturn("").when(mController).getPhoneNumber();
doReturn(mSignalStrength).when(mController).getSignalStrength();
+ doReturn("").when(mEuiccManager).getEid();
ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager);
ReflectionHelpers.setField(mController, "mCarrierConfigManager", mCarrierConfigManager);
ReflectionHelpers.setField(mController, "mSubscriptionInfo", mSubscriptionInfo);
+ ReflectionHelpers.setField(mController, "mEuiccManager", mEuiccManager);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mPersistableBundle);
}
@@ -273,4 +279,14 @@
verify(mDialog).setText(ICCID_INFO_VALUE_ID, iccid);
}
+
+ @Test
+ public void initialize_showEid_shouldSetEidToSetting() {
+ final String eid = "12351351231241";
+ doReturn(eid).when(mEuiccManager).getEid();
+
+ mController.initialize();
+
+ verify(mDialog).setText(EID_INFO_VALUE_ID, eid);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceControllerTest.java
index 90ce395..9c56611 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceControllerTest.java
@@ -37,13 +37,13 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.os.RoSystemProperties;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.deletionhelper.ActivationWarningFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
import com.android.settings.widget.MasterSwitchPreference;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.After;
import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
index 1a3139d..2da756f 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
@@ -50,13 +50,13 @@
import com.android.settings.SubSettings;
import com.android.settings.TestConfig;
import com.android.settings.applications.manageapplications.ManageApplications;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.deviceinfo.PrivateVolumeSettings;
import com.android.settings.deviceinfo.StorageItemPreference;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settingslib.applications.StorageStatsSource;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.deviceinfo.StorageVolumeProvider;
import org.junit.After;
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
index 6ad37ce..e251be0 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
@@ -38,10 +38,10 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.deviceinfo.StorageVolumeProvider;
import org.junit.After;
diff --git a/tests/robotests/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceControllerTest.java
index e1ce694..c003f17 100644
--- a/tests/robotests/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/AmbientDisplayNotificationsPreferenceControllerTest.java
@@ -32,11 +32,11 @@
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.search.InlinePayload;
import com.android.settings.search.InlineSwitchPayload;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollEnrollingTest.java
index c590fd3..5418ead 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollEnrollingTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollEnrollingTest.java
@@ -36,6 +36,7 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.password.ChooseLockSettingsHelper;
+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.ShadowVibrator;
@@ -69,12 +70,15 @@
private FingerprintEnrollEnrolling mActivity;
+ private FakeFeatureFactory mFactory;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ShadowUtils.setFingerprintManager(mFingerprintManager);
ShadowVibrator.addToServiceMap();
+ mFactory = FakeFeatureFactory.setupForTest();
mActivity = Robolectric.buildActivity(
FingerprintEnrollEnrolling.class,
new Intent()
diff --git a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java
index d495b74..be53aa5 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java
@@ -33,6 +33,7 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
@@ -69,10 +70,13 @@
private FingerprintEnrollFindSensor mActivity;
+ private FakeFeatureFactory mFactory;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ShadowUtils.setFingerprintManager(mFingerprintManager);
+ mFactory = FakeFeatureFactory.setupForTest();
mActivity = Robolectric.buildActivity(
FingerprintEnrollFindSensor.class,
diff --git a/tests/robotests/src/com/android/settings/fingerprint/FingerprintSuggestionActivityTest.java b/tests/robotests/src/com/android/settings/fingerprint/FingerprintSuggestionActivityTest.java
index 0254bcb..f52f437 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/FingerprintSuggestionActivityTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/FingerprintSuggestionActivityTest.java
@@ -30,6 +30,7 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
@@ -63,9 +64,12 @@
private ActivityController<FingerprintSuggestionActivity> mController;
+ private FakeFeatureFactory mFactory;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mFactory = FakeFeatureFactory.setupForTest();
final Intent intent = new Intent();
mController = Robolectric.buildActivity(FingerprintSuggestionActivity.class, intent);
diff --git a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java
index c3899e9..c786608 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java
@@ -27,6 +27,7 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
@@ -61,10 +62,13 @@
private SetupFingerprintEnrollFindSensor mActivity;
+ private FakeFeatureFactory mFactory;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ShadowUtils.setFingerprintManager(mFingerprintManager);
+ mFactory = FakeFeatureFactory.setupForTest();
}
private void createActivity(Intent intent) {
diff --git a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
index 2d98bf4..f5b0c8a 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
@@ -35,6 +35,7 @@
import com.android.settings.password.SetupChooseLockGeneric.SetupChooseLockGenericFragment;
import com.android.settings.password.SetupSkipDialog;
import com.android.settings.password.StorageManagerWrapper;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
import com.android.settings.testutils.shadow.ShadowFingerprintManager;
@@ -72,6 +73,7 @@
@Mock
private UserInfo mUserInfo;
+ private FakeFeatureFactory mFactory;
private ActivityController<SetupFingerprintEnrollIntroduction> mController;
@@ -83,6 +85,8 @@
.setSystemFeature(PackageManager.FEATURE_FINGERPRINT, true);
ShadowFingerprintManager.addToServiceMap();
+ mFactory = FakeFeatureFactory.setupForTest();
+
final Intent intent = new Intent();
mController = Robolectric.buildActivity(SetupFingerprintEnrollIntroduction.class, intent);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
index a9de061..521ead4 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
@@ -28,6 +28,7 @@
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceManager;
+import android.util.IconDrawableFactory;
import com.android.settings.TestConfig;
@@ -53,6 +54,8 @@
private PackageManager mPackageManager;
@Mock
private ApplicationInfo mApplicationInfo;
+ @Mock
+ private IconDrawableFactory mIconDrawableFactory;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceManager mPreferenceManager;
private RestrictedAppDetails mFragment;
@@ -68,6 +71,7 @@
doReturn(mPreferenceManager).when(mFragment).getPreferenceManager();
doReturn(mContext).when(mPreferenceManager).getContext();
mFragment.mPackageManager = mPackageManager;
+ mFragment.mIconDrawableFactory = mIconDrawableFactory;
mFragment.mPackageOpsList = new ArrayList<>();
mFragment.mPackageOpsList.add(
new AppOpsManager.PackageOps(PACKAGE_NAME, UID, null /* entries */));
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
index 38391c9..3e33823 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
@@ -24,7 +24,6 @@
import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.fuelgauge.anomaly.action.StopAndBackgroundCheckAction;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
@@ -32,6 +31,7 @@
import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
import com.android.settings.testutils.shadow.ShadowKeyValueListParserWrapperImpl;
import com.android.settings.fuelgauge.anomaly.checker.WakeupAlarmAnomalyDetector;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
index 1ee52ca..737c16d 100644
--- a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
+++ b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
@@ -20,6 +20,7 @@
import android.view.View;
import android.widget.TextView;
import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowSettingsPreferenceFragment;
@@ -27,6 +28,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
@@ -39,6 +41,11 @@
private LocaleListEditor mLocaleListEditor;
+ @Mock
+ private Context mContext;
+
+ private FakeFeatureFactory mFactory;
+
@Before
public void setUp() {
mLocaleListEditor = new LocaleListEditor();
@@ -48,11 +55,13 @@
RuntimeEnvironment.application.getSystemService(Context.RESTRICTIONS_SERVICE));
ReflectionHelpers.setField(mLocaleListEditor, "mUserManager",
RuntimeEnvironment.application.getSystemService(Context.USER_SERVICE));
+ mFactory = FakeFeatureFactory.setupForTest();
}
@Test
public void testDisallowConfigLocale_unrestrict() {
ReflectionHelpers.setField(mLocaleListEditor, "mIsUiRestricted", true);
+ mLocaleListEditor.onAttach(mContext);
mLocaleListEditor.onResume();
Assert.assertEquals(View.GONE, mLocaleListEditor.getEmptyTextView().getVisibility());
}
@@ -60,6 +69,7 @@
@Test
public void testDisallowConfigLocale_restrict() {
ReflectionHelpers.setField(mLocaleListEditor, "mIsUiRestricted", false);
+ mLocaleListEditor.onAttach(mContext);
mLocaleListEditor.onResume();
Assert.assertEquals(View.VISIBLE, mLocaleListEditor.getEmptyTextView().getVisibility());
}
diff --git a/tests/robotests/src/com/android/settings/location/LocationEnablerTest.java b/tests/robotests/src/com/android/settings/location/LocationEnablerTest.java
index f456f41..8cc92cd 100644
--- a/tests/robotests/src/com/android/settings/location/LocationEnablerTest.java
+++ b/tests/robotests/src/com/android/settings/location/LocationEnablerTest.java
@@ -43,6 +43,7 @@
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.wrapper.LocationManagerWrapper;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
@@ -53,11 +54,15 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH,
sdk = TestConfig.SDK_VERSION,
- shadows = {ShadowSecureSettings.class})
+ shadows = {
+ ShadowSecureSettings.class,
+ LocationEnablerTest.ShadowLocationManagerWrapper.class})
public class LocationEnablerTest {
@Mock
@@ -124,7 +129,7 @@
}
@Test
- public void isEnabled_locationONotRestricted_shouldReturnTrue() {
+ public void isEnabled_locationNotRestricted_shouldReturnTrue() {
when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);
assertThat(mEnabler.isEnabled(Settings.Secure.LOCATION_MODE_BATTERY_SAVING)).isTrue();
@@ -178,14 +183,35 @@
when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_BATTERY_SAVING);
-
mEnabler.setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY);
verify(mContext).sendBroadcastAsUser(
argThat(actionMatches(LocationManager.MODE_CHANGING_ACTION)),
eq(UserHandle.of(ActivityManager.getCurrentUser())),
eq(WRITE_SECURE_SETTINGS));
+ }
+ @Test
+ public void setLocationEnabled_notRestricted_shouldRefreshLocation() {
+ when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
+ mEnabler.setLocationEnabled(true);
+
+ verify(mEnabler).refreshLocationMode();
+ }
+
+ @Test
+ public void setLocationEnabled_notRestricted_shouldBroadcastUpdate() {
+ when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
+ mEnabler.setLocationEnabled(true);
+
+ verify(mContext).sendBroadcastAsUser(
+ argThat(actionMatches(LocationManager.MODE_CHANGING_ACTION)),
+ eq(UserHandle.of(ActivityManager.getCurrentUser())),
+ eq(WRITE_SECURE_SETTINGS));
}
@Test
@@ -241,5 +267,12 @@
return intent -> TextUtils.equals(expected, intent.getAction());
}
+ @Implements(value = LocationManagerWrapper.class)
+ public static class ShadowLocationManagerWrapper {
+ @Implementation
+ public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
+ // Do nothing
+ }
+ }
}
diff --git a/tests/robotests/src/com/android/settings/location/LocationModeBatterySavingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationModeBatterySavingPreferenceControllerTest.java
deleted file mode 100644
index 41e9f1e..0000000
--- a/tests/robotests/src/com/android/settings/location/LocationModeBatterySavingPreferenceControllerTest.java
+++ /dev/null
@@ -1,57 +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.location;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-
-import android.arch.lifecycle.LifecycleOwner;
-import android.content.Context;
-import android.provider.Settings;
-
-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.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class LocationModeBatterySavingPreferenceControllerTest {
-
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
-
- @Before
- public void setUp() {
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- }
-
- @Test
- public void getLocationMode_shouldReturnModeBatterySaving() {
- final LocationModeBatterySavingPreferenceController controller =
- new LocationModeBatterySavingPreferenceController(mock(Context.class), mLifecycle);
-
- assertThat(controller.getLocationMode())
- .isEqualTo(Settings.Secure.LOCATION_MODE_BATTERY_SAVING);
- }
-
-}
diff --git a/tests/robotests/src/com/android/settings/location/LocationModeHighAccuracyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationModeHighAccuracyPreferenceControllerTest.java
deleted file mode 100644
index 9c8bac6..0000000
--- a/tests/robotests/src/com/android/settings/location/LocationModeHighAccuracyPreferenceControllerTest.java
+++ /dev/null
@@ -1,57 +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.location;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-
-import android.arch.lifecycle.LifecycleOwner;
-import android.content.Context;
-import android.provider.Settings;
-
-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.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class LocationModeHighAccuracyPreferenceControllerTest {
-
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
-
- @Before
- public void setUp() {
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- }
-
- @Test
- public void getLocationMode_shouldReturnModeHighAccuracy() {
- final LocationModeHighAccuracyPreferenceController controller =
- new LocationModeHighAccuracyPreferenceController(mock(Context.class), mLifecycle);
-
- assertThat(controller.getLocationMode())
- .isEqualTo(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY);
- }
-
-}
diff --git a/tests/robotests/src/com/android/settings/location/LocationModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationModePreferenceControllerTest.java
deleted file mode 100644
index a28cb20..0000000
--- a/tests/robotests/src/com/android/settings/location/LocationModePreferenceControllerTest.java
+++ /dev/null
@@ -1,141 +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.location;
-
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.arch.lifecycle.LifecycleOwner;
-import android.content.Context;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-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.Mock;
-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 LocationModePreferenceControllerTest {
-
- @Mock
- private LocationSettings mFragment;
- @Mock
- private SettingsActivity mActivity;
- @Mock
- private Preference mPreference;
- @Mock
- private PreferenceScreen mScreen;
- @Mock
- private UserManager mUserManager;
-
- private Context mContext;
- private LocationModePreferenceController mController;
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- mController = new LocationModePreferenceController(mContext, mFragment, mLifecycle);
- when(mFragment.getActivity()).thenReturn(mActivity);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
- }
-
- @Test
- @Config(qualifiers = "mcc999")
- public void locationModePreference_ifXmlSetToFalse_shouldNotBeAvailable() {
- assertFalse(mController.isAvailable());
- }
-
- @Test
- public void locationModePreference_ifXmlSetToTrue_shouldBeAvailable() {
- assertTrue(mController.isAvailable());
- }
-
- @Test
- public void onLocationModeChanged_locationOff_shouldDisablePreference() {
- when(mUserManager.hasUserRestriction(any())).thenReturn(false);
- mController.displayPreference(mScreen);
-
- mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_OFF, false);
-
- verify(mPreference).setEnabled(false);
- }
-
- @Test
- public void onLocationModeChanged_restricted_shouldDisablePreference() {
- when(mUserManager.hasUserRestriction(any())).thenReturn(true);
- mController.displayPreference(mScreen);
-
- mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
-
- verify(mPreference).setEnabled(false);
- }
-
- @Test
- public void onLocationModeChanged_locationOnNotRestricted_shouldEnablePreference() {
- when(mUserManager.hasUserRestriction(any())).thenReturn(false);
- mController.displayPreference(mScreen);
-
- mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
-
- verify(mPreference).setEnabled(true);
- }
-
- @Test
- public void onLocationModeChanged_shouldUpdateSummary() {
- mController.displayPreference(mScreen);
-
- mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
-
- verify(mPreference).setSummary(anyInt());
- }
-
- @Test
- public void handlePreferenceTreeClick_shouldStartLocationModeFragment() {
- final Preference preference = new Preference(mContext);
- preference.setKey(mController.getPreferenceKey());
-
- mController.handlePreferenceTreeClick(preference);
-
- verify(mActivity).startPreferencePanel(any(), eq(LocationMode.class.getName()), any(),
- eq(R.string.location_mode_screen_title), any(), any(), anyInt());
- }
-
-}
diff --git a/tests/robotests/src/com/android/settings/location/LocationModeRadioButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationModeRadioButtonPreferenceControllerTest.java
deleted file mode 100644
index 2766788..0000000
--- a/tests/robotests/src/com/android/settings/location/LocationModeRadioButtonPreferenceControllerTest.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.location;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.arch.lifecycle.LifecycleOwner;
-import android.content.Context;
-import android.provider.Settings;
-import android.support.v7.preference.PreferenceScreen;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.ShadowSecureSettings;
-import com.android.settings.widget.RadioButtonPreference;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-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;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(
- manifest = TestConfig.MANIFEST_PATH,
- sdk = TestConfig.SDK_VERSION,
- shadows = {ShadowSecureSettings.class})
-public class LocationModeRadioButtonPreferenceControllerTest {
-
- @Mock
- private RadioButtonPreference mPreference;
- @Mock
- private PreferenceScreen mScreen;
-
- private Context mContext;
- private LocationModeRadioButtonPreferenceController mController;
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- mController = new LocationModeRadioButtonPreferenceControllerTestable(mContext, mLifecycle);
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
- }
-
- @Test
- public void displayPreference_shouldAddClickListener() {
- mController.displayPreference(mScreen);
-
- verify(mPreference).setOnClickListener(mController);
- }
-
- @Test
- public void onRadioButtonClicked_shouldSetLocationModeToOwnMode() {
- mController.displayPreference(mScreen);
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
-
- mController.onRadioButtonClicked(mPreference);
-
- assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF))
- .isEqualTo(mController.getLocationMode());
- }
-
- @Test
- public void onLocationModeChanged_otherModeSelected_shouldUncheckPreference() {
- mController.displayPreference(mScreen);
-
- mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
-
- verify(mPreference).setChecked(false);
- }
-
- @Test
- public void onLocationModeChanged_ownModeSelected_shouldCheckPreference() {
- mController.displayPreference(mScreen);
-
- mController.onLocationModeChanged(mController.getLocationMode(), false);
-
- verify(mPreference).setChecked(true);
- }
-
- @Test
- public void onLocationModeChanged_locationOff_shouldDisablePreference() {
- mController.displayPreference(mScreen);
-
- mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_OFF, false);
-
- verify(mPreference).setEnabled(false);
- }
-
- @Test
- public void onLocationModeChanged_locationOn_shouldDisablePreference() {
- mController.displayPreference(mScreen);
-
- mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
-
- verify(mPreference).setEnabled(true);
- }
-
- private class LocationModeRadioButtonPreferenceControllerTestable
- extends LocationModeRadioButtonPreferenceController {
-
- public LocationModeRadioButtonPreferenceControllerTestable(Context context,
- Lifecycle lifecycle) {
- super(context, lifecycle);
- }
-
- @Override
- public String getPreferenceKey() {
- return "test";
- }
-
- @Override
- protected int getLocationMode() {
- return Settings.Secure.LOCATION_MODE_HIGH_ACCURACY;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/settings/location/LocationModeSensorsOnlyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationModeSensorsOnlyPreferenceControllerTest.java
deleted file mode 100644
index 4ed75d2..0000000
--- a/tests/robotests/src/com/android/settings/location/LocationModeSensorsOnlyPreferenceControllerTest.java
+++ /dev/null
@@ -1,57 +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.location;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-
-import android.arch.lifecycle.LifecycleOwner;
-import android.content.Context;
-import android.provider.Settings;
-
-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.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class LocationModeSensorsOnlyPreferenceControllerTest {
-
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
-
- @Before
- public void setUp() {
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- }
-
- @Test
- public void getLocationMode_shouldReturnModeSensorsOnly() {
- final LocationModeSensorsOnlyPreferenceController controller =
- new LocationModeSensorsOnlyPreferenceController(mock(Context.class), mLifecycle);
-
- assertThat(controller.getLocationMode())
- .isEqualTo(Settings.Secure.LOCATION_MODE_SENSORS_ONLY);
- }
-
-}
diff --git a/tests/robotests/src/com/android/settings/location/LocationModeTest.java b/tests/robotests/src/com/android/settings/location/LocationModeTest.java
deleted file mode 100644
index 0e7a9d7..0000000
--- a/tests/robotests/src/com/android/settings/location/LocationModeTest.java
+++ /dev/null
@@ -1,73 +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.location;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.spy;
-
-import android.content.Context;
-import android.provider.SearchIndexableResource;
-
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.XmlTestUtils;
-
-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.HashSet;
-import java.util.List;
-import java.util.Set;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class LocationModeTest {
-
- private Context mContext;
- private LocationMode mFragment;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- mFragment = new LocationMode();
- }
-
- @Test
- public void testSearchIndexProvider_shouldIndexResource() {
- final List<SearchIndexableResource> indexRes =
- mFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(mContext,
- true /* enabled */);
-
- assertThat(indexRes).isNotNull();
- assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId());
- }
-
- @Test
- @Config(qualifiers = "mcc999")
- public void testSearchIndexProvider_ifPageDisabled_shouldNotIndexResource() {
- final List<String> niks = LocationMode.SEARCH_INDEX_DATA_PROVIDER
- .getNonIndexableKeys(mContext);
- final int xmlId = mFragment.getPreferenceScreenResId();
-
- final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(mContext, xmlId);
- assertThat(niks).containsAllIn(keys);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/location/LocationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationPreferenceControllerTest.java
index 2c92b44..e4aa075 100644
--- a/tests/robotests/src/com/android/settings/location/LocationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/LocationPreferenceControllerTest.java
@@ -109,45 +109,30 @@
}
@Test
- public void getLocationSummary_sensorsOnly_shouldSetSummarySensorsOnly() {
+ public void getLocationSummary_sensorsOnly_shouldSetSummaryOn() {
Secure.putInt(mContext.getContentResolver(),
Secure.LOCATION_MODE, Secure.LOCATION_MODE_SENSORS_ONLY);
assertThat(mController.getLocationSummary(mContext)).isEqualTo(
- mContext.getString(R.string.location_on_summary,
- mContext.getString(R.string.location_mode_sensors_only_title)));
+ mContext.getString(R.string.location_on_summary));
}
@Test
- public void getLocationSummary_highAccuracy_shouldSetSummarHighAccuracy() {
+ public void getLocationSummary_highAccuracy_shouldSetSummaryOn() {
Secure.putInt(mContext.getContentResolver(),
Secure.LOCATION_MODE, Secure.LOCATION_MODE_HIGH_ACCURACY);
assertThat(mController.getLocationSummary(mContext)).isEqualTo(
- mContext.getString(R.string.location_on_summary,
- mContext.getString(R.string.location_mode_high_accuracy_title)));
+ mContext.getString(R.string.location_on_summary));
}
@Test
- public void getLocationSummary_batterySaving_shouldSetSummaryBatterySaving() {
+ public void getLocationSummary_batterySaving_shouldSetSummaryOn() {
Secure.putInt(mContext.getContentResolver(),
Secure.LOCATION_MODE, Secure.LOCATION_MODE_BATTERY_SAVING);
assertThat(mController.getLocationSummary(mContext)).isEqualTo(
- mContext.getString(R.string.location_on_summary,
- mContext.getString(R.string.location_mode_battery_saving_title)));
- }
-
- @Test
- public void getLocationString_shouldCorrectString() {
- assertThat(mController.getLocationString(Secure.LOCATION_MODE_OFF)).isEqualTo(
- R.string.location_mode_location_off_title);
- assertThat(mController.getLocationString(Secure.LOCATION_MODE_SENSORS_ONLY)).isEqualTo(
- R.string.location_mode_sensors_only_title);
- assertThat(mController.getLocationString(Secure.LOCATION_MODE_BATTERY_SAVING)).isEqualTo(
- R.string.location_mode_battery_saving_title);
- assertThat(mController.getLocationString(Secure.LOCATION_MODE_HIGH_ACCURACY)).isEqualTo(
- R.string.location_mode_high_accuracy_title);
+ mContext.getString(R.string.location_on_summary));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/location/LocationSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationSwitchBarControllerTest.java
index 6d824ac..4410d6f 100644
--- a/tests/robotests/src/com/android/settings/location/LocationSwitchBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/LocationSwitchBarControllerTest.java
@@ -88,18 +88,17 @@
}
@Test
- public void onSwitchChanged_switchChecked_shouldSetPreviousLocationMode() {
+ public void onSwitchChanged_switchChecked_shouldSetLocationEnabled() {
mController.onSwitchChanged(mSwitch, true);
- verify(mEnabler).setLocationMode(
- android.provider.Settings.Secure.LOCATION_MODE_PREVIOUS);
+ verify(mEnabler).setLocationEnabled(true);
}
@Test
- public void onSwitchChanged_switchUnchecked_shouldSetLocationModeOff() {
+ public void onSwitchChanged_switchUnchecked_shouldSetLocationDisabled() {
mController.onSwitchChanged(mSwitch, false);
- verify(mEnabler).setLocationMode(android.provider.Settings.Secure.LOCATION_MODE_OFF);
+ verify(mEnabler).setLocationEnabled(false);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/notification/EnableZenModeDialogTest.java b/tests/robotests/src/com/android/settings/notification/EnableZenModeDialogTest.java
new file mode 100644
index 0000000..8b5ef79
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/EnableZenModeDialogTest.java
@@ -0,0 +1,152 @@
+/*
+ * 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.notification;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+import android.net.Uri;
+import android.service.notification.Condition;
+import android.view.LayoutInflater;
+
+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.Mock;
+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 EnableZenModeDialogTest {
+ private EnableZenModeDialog mController;
+
+ @Mock
+ private Context mContext;
+ @Mock
+ private Activity mActivity;
+ @Mock
+ private Fragment mFragment;
+
+ private Context mShadowContext;
+ private LayoutInflater mLayoutInflater;
+ private Condition mCountdownCondition;
+ private Condition mAlarmCondition;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mShadowContext = RuntimeEnvironment.application;
+ when(mActivity.getApplicationContext()).thenReturn(mShadowContext);
+ when(mContext.getApplicationContext()).thenReturn(mContext);
+ when(mFragment.getContext()).thenReturn(mShadowContext);
+ mLayoutInflater = LayoutInflater.from(mShadowContext);
+ when(mActivity.getLayoutInflater()).thenReturn(mLayoutInflater);
+
+ mController = spy(new EnableZenModeDialog());
+ mController.mContext = mContext;
+ mController.mActivity = mActivity;
+ mController.mForeverId = Condition.newId(mContext).appendPath("forever").build();
+ when(mContext.getString(com.android.internal.R.string.zen_mode_forever))
+ .thenReturn("testSummary");
+ mController.getContentView();
+
+ // these methods use static calls to ZenModeConfig which would normally fail in robotests,
+ // so instead do nothing:
+ doNothing().when(mController).bindGenericCountdown();
+ doReturn(null).when(mController).getTimeUntilNextAlarmCondition();
+ doNothing().when(mController).bindNextAlarm(any());
+
+ // as a result of doing nothing above, must bind manually:
+ Uri alarm = Condition.newId(mContext).appendPath("alarm").build();
+ mAlarmCondition = new Condition(alarm, "alarm", "", "", 0, 0, 0);
+ Uri countdown = Condition.newId(mContext).appendPath("countdown").build();
+ mCountdownCondition = new Condition(countdown, "countdown", "", "", 0, 0, 0);
+ mController.bind(mCountdownCondition,
+ mController.mZenRadioGroupContent.getChildAt(
+ EnableZenModeDialog.COUNTDOWN_CONDITION_INDEX),
+ EnableZenModeDialog.COUNTDOWN_CONDITION_INDEX);
+ mController.bind(mAlarmCondition,
+ mController.mZenRadioGroupContent.getChildAt(
+ EnableZenModeDialog.COUNTDOWN_ALARM_CONDITION_INDEX),
+ EnableZenModeDialog.COUNTDOWN_ALARM_CONDITION_INDEX);
+ }
+
+ @Test
+ public void testForeverChecked() {
+ mController.bindConditions(mController.forever());
+
+ assertTrue(mController.getConditionTagAt(EnableZenModeDialog.FOREVER_CONDITION_INDEX).rb
+ .isChecked());
+ assertFalse(mController.getConditionTagAt(EnableZenModeDialog.COUNTDOWN_CONDITION_INDEX).rb
+ .isChecked());
+ assertFalse(mController.getConditionTagAt(
+ EnableZenModeDialog.COUNTDOWN_ALARM_CONDITION_INDEX).rb.isChecked());
+ }
+
+ @Test
+ public void testNoneChecked() {
+ mController.bindConditions(null);
+ assertFalse(mController.getConditionTagAt(EnableZenModeDialog.FOREVER_CONDITION_INDEX).rb
+ .isChecked());
+ assertFalse(mController.getConditionTagAt(EnableZenModeDialog.COUNTDOWN_CONDITION_INDEX).rb
+ .isChecked());
+ assertFalse(mController.getConditionTagAt(
+ EnableZenModeDialog.COUNTDOWN_ALARM_CONDITION_INDEX).rb.isChecked());
+ }
+
+ @Test
+ public void testAlarmChecked() {
+ doReturn(false).when(mController).isCountdown(mAlarmCondition);
+ doReturn(true).when(mController).isAlarm(mAlarmCondition);
+
+ mController.bindConditions(mAlarmCondition);
+ assertFalse(mController.getConditionTagAt(EnableZenModeDialog.FOREVER_CONDITION_INDEX).rb
+ .isChecked());
+ assertFalse(mController.getConditionTagAt(EnableZenModeDialog.COUNTDOWN_CONDITION_INDEX).rb
+ .isChecked());
+ assertTrue(mController.getConditionTagAt(
+ EnableZenModeDialog.COUNTDOWN_ALARM_CONDITION_INDEX).rb.isChecked());
+ }
+
+ @Test
+ public void testCountdownChecked() {
+ doReturn(false).when(mController).isAlarm(mCountdownCondition);
+ doReturn(true).when(mController).isCountdown(mCountdownCondition);
+
+ mController.bindConditions(mCountdownCondition);
+ assertFalse(mController.getConditionTagAt(EnableZenModeDialog.FOREVER_CONDITION_INDEX).rb
+ .isChecked());
+ assertTrue(mController.getConditionTagAt(EnableZenModeDialog.COUNTDOWN_CONDITION_INDEX).rb
+ .isChecked());
+ assertFalse(mController.getConditionTagAt(
+ EnableZenModeDialog.COUNTDOWN_ALARM_CONDITION_INDEX).rb.isChecked());
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeButtonPreferenceControllerTest.java
index 862b8d0..ed42890 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModeButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeButtonPreferenceControllerTest.java
@@ -26,6 +26,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.FragmentManager;
import android.app.NotificationManager;
import android.content.ContentResolver;
import android.content.Context;
@@ -79,7 +80,8 @@
mContext = shadowApplication.getApplicationContext();
mContentResolver = RuntimeEnvironment.application.getContentResolver();
- mController = new ZenModeButtonPreferenceController(mContext, mock(Lifecycle.class));
+ mController = new ZenModeButtonPreferenceController(mContext, mock(Lifecycle.class),
+ mock(FragmentManager.class));
when(mNotificationManager.getNotificationPolicy()).thenReturn(mPolicy);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
ReflectionHelpers.setField(mController, "mZenButtonOn", mZenButtonOn);
diff --git a/tests/robotests/src/com/android/settings/security/LockdownButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/LockdownButtonPreferenceControllerTest.java
new file mode 100644
index 0000000..7738f86
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/LockdownButtonPreferenceControllerTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.security;
+
+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.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+
+import com.android.internal.widget.LockPatternUtils;
+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.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class LockdownButtonPreferenceControllerTest {
+ @Mock
+ private LockPatternUtils mLockPatternUtils;
+ private SwitchPreference mPreference;
+
+ private Context mContext;
+ private LockdownButtonPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mPreference = new SwitchPreference(mContext);
+
+ mController = spy(new LockdownButtonPreferenceController(mContext));
+ ReflectionHelpers.setField(mController, "mLockPatternUtils", mLockPatternUtils);
+ }
+
+ @Test
+ public void isAvailable_lockSet_shouldReturnTrue() throws Exception {
+ when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_lockUnset_shouldReturnFalse() throws Exception {
+ when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void onPreferenceChange_settingIsUpdated() throws Exception {
+ boolean state = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0) != 0;
+ assertThat(mController.onPreferenceChange(mPreference, !state)).isTrue();
+ boolean newState = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0) != 0;
+ assertThat(newState).isEqualTo(!state);
+ }
+
+ @Test
+ public void onSettingChange_preferenceIsUpdated() throws Exception {
+ boolean state = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0) != 0;
+ mController.updateState(mPreference);
+ assertThat(mPreference.isChecked()).isEqualTo(state);
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.LOCKDOWN_IN_POWER_MENU, state ? 0 : 1);
+
+ mController.updateState(mPreference);
+ assertThat(mPreference.isChecked()).isEqualTo(!state);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/slices/FakeContextOnlyPreferenceController.java b/tests/robotests/src/com/android/settings/slices/FakeContextOnlyPreferenceController.java
new file mode 100644
index 0000000..214607b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/slices/FakeContextOnlyPreferenceController.java
@@ -0,0 +1,19 @@
+package com.android.settings.slices;
+
+import android.content.Context;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class FakeContextOnlyPreferenceController extends BasePreferenceController {
+
+ public static final String KEY = "fakeController2";
+
+ public FakeContextOnlyPreferenceController(Context context) {
+ super(context, KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index 10e4b76..0923571 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -50,8 +50,8 @@
private final String FRAGMENT_NAME = "fragment name";
private final int ICON = 1234; // I declare a thumb war
private final Uri URI = Uri.parse("content://com.android.settings.slices/test");
- private final String PREF_CONTROLLER = FakeToggleController.class.getName();
- ;
+ private final Class PREF_CONTROLLER = FakeToggleController.class;
+ private final Class PREF_CONTROLLER2 = FakeContextOnlyPreferenceController.class;
private Context mContext;
@@ -76,6 +76,14 @@
}
@Test
+ public void testGetPreferenceController_contextOnly_buildsMatchingController() {
+ BasePreferenceController controller = SliceBuilderUtils.getPreferenceController(mContext,
+ getDummyData(PREF_CONTROLLER2));
+
+ assertThat(controller).isInstanceOf(FakeContextOnlyPreferenceController.class);
+ }
+
+ @Test
public void testDynamicSummary_returnsSliceSummary() {
SliceData data = getDummyData();
FakePreferenceController controller = new FakePreferenceController(mContext, KEY);
@@ -87,7 +95,7 @@
@Test
public void testDynamicSummary_returnsFragmentSummary() {
- SliceData data = getDummyData(null);
+ SliceData data = getDummyData((String) null);
FakePreferenceController controller = spy(new FakePreferenceController(mContext, KEY));
String controllerSummary = "new_Summary";
doReturn(controllerSummary).when(controller).getSummary();
@@ -99,7 +107,7 @@
@Test
public void testDynamicSummary_returnsSliceScreenTitle() {
- SliceData data = getDummyData(null);
+ SliceData data = getDummyData((String) null);
FakePreferenceController controller = new FakePreferenceController(mContext, KEY);
String summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
@@ -129,10 +137,18 @@
}
private SliceData getDummyData() {
- return getDummyData(SUMMARY);
+ return getDummyData(PREF_CONTROLLER, SUMMARY);
}
private SliceData getDummyData(String summary) {
+ return getDummyData(PREF_CONTROLLER, summary);
+ }
+
+ private SliceData getDummyData(Class prefController) {
+ return getDummyData(prefController, SUMMARY);
+ }
+
+ private SliceData getDummyData(Class prefController, String summary) {
return new SliceData.Builder()
.setKey(KEY)
.setTitle(TITLE)
@@ -141,7 +157,7 @@
.setIcon(ICON)
.setFragmentName(FRAGMENT_NAME)
.setUri(URI)
- .setPreferenceControllerClassName(PREF_CONTROLLER)
+ .setPreferenceControllerClassName(prefController.getName())
.build();
}
}
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
index ad51f79..ad72e6b 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -25,7 +25,6 @@
import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.bluetooth.BluetoothFeatureProvider;
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.datausage.DataPlanFeatureProvider;
@@ -40,6 +39,7 @@
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;
import org.mockito.Answers;
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowEventLogWriter.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowEventLogWriter.java
index dcced4e..9caf09f 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowEventLogWriter.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowEventLogWriter.java
@@ -19,7 +19,7 @@
import android.content.Context;
-import com.android.settings.core.instrumentation.EventLogWriter;
+import com.android.settingslib.core.instrumentation.EventLogWriter;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
diff --git a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
index e44be0e..59a08ae 100644
--- a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
+++ b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
@@ -44,10 +44,10 @@
import com.android.settings.TestConfig;
import com.android.settings.applications.defaultapps.DefaultAppInfo;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.widget.RadioButtonPreference;
import com.android.settings.wrapper.UserPackageWrapper;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/wfd/WifiDisplaySettingsTest.java b/tests/robotests/src/com/android/settings/wfd/WifiDisplaySettingsTest.java
index 1cf85fb..fc634d2 100644
--- a/tests/robotests/src/com/android/settings/wfd/WifiDisplaySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wfd/WifiDisplaySettingsTest.java
@@ -24,6 +24,7 @@
import android.app.Activity;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.hardware.display.DisplayManager;
import android.media.MediaRouter;
import android.net.wifi.p2p.WifiP2pManager;
@@ -50,6 +51,8 @@
private SummaryLoader mSummaryLoader;
@Mock
private MediaRouter mMediaRouter;
+ @Mock
+ private PackageManager mPackageManager;
private SummaryLoader.SummaryProvider mSummaryProvider;
@@ -58,6 +61,8 @@
MockitoAnnotations.initMocks(this);
when(mActivity.getSystemService(Context.MEDIA_ROUTER_SERVICE))
.thenReturn(mMediaRouter);
+ when(mActivity.getPackageManager()).thenReturn(mPackageManager);
+ when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT)).thenReturn(true);
mSummaryProvider = WifiDisplaySettings.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(
mActivity, mSummaryLoader);
@@ -86,15 +91,15 @@
}
@Test
- public void isAvailable_noService_shouldReturnFalse() {
+ public void isAvailable_nullService_shouldReturnFalse() {
assertThat(WifiDisplaySettings.isAvailable(mActivity))
.isFalse();
}
@Test
- public void isAvailable_throwException_shouldReturnFalse() {
- when(mActivity.getSystemService(Context.WIFI_P2P_SERVICE))
- .thenThrow(new IllegalStateException());
+ public void isAvailable_noWifiDirectFeature_shouldReturnFalse() {
+ when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT))
+ .thenReturn(false);
assertThat(WifiDisplaySettings.isAvailable(mActivity))
.isFalse();
diff --git a/tests/robotests/src/com/android/settings/widget/AppCheckBoxPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/AppCheckBoxPreferenceTest.java
new file mode 100644
index 0000000..d540a62
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/widget/AppCheckBoxPreferenceTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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 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 class AppCheckBoxPreferenceTest {
+
+ private Context mContext;
+ private AppCheckBoxPreference mPreference;
+ private AppCheckBoxPreference mAttrPreference;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mPreference = new AppCheckBoxPreference(mContext);
+ mAttrPreference = new AppCheckBoxPreference(mContext, null /* attrs */);
+ }
+
+ @Test
+ public void testGetLayoutResource() {
+ assertThat(mPreference.getLayoutResource()).isEqualTo(R.layout.preference_app);
+ assertThat(mAttrPreference.getLayoutResource()).isEqualTo(R.layout.preference_app);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java
index 63f89e6..84549a6 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java
@@ -22,9 +22,9 @@
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.widget.SwitchWidgetController;
import com.android.settings.wrapper.ConnectivityManagerWrapper;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiMasterSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiMasterSwitchPreferenceControllerTest.java
index 1708e36..82569c7 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiMasterSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiMasterSwitchPreferenceControllerTest.java
@@ -30,10 +30,10 @@
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.widget.MasterSwitchPreference;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 4f77435..ca2cac0 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -65,7 +65,6 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.applications.LayoutPreference;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowBidiFormatter;
import com.android.settings.testutils.shadow.ShadowDevicePolicyManagerWrapper;
@@ -76,6 +75,7 @@
import com.android.settings.widget.EntityHeaderController;
import com.android.settings.wifi.WifiDetailPreference;
import com.android.settings.wrapper.ConnectivityManagerWrapper;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.wifi.AccessPoint;
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java
index 6832ca8..2a633d9 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java
@@ -80,7 +80,7 @@
mController.displayPreference(mScreen);
- assertThat(mListPreference.getEntries().length).isEqualTo(2);
+ assertThat(mListPreference.getEntries().length).isEqualTo(3);
}
@Test
@@ -113,13 +113,18 @@
when(mWifiManager.is5GHzBandSupported()).thenReturn(true);
mController.displayPreference(mScreen);
+
+ // -1 is WifiConfiguration.AP_BAND_ANY, for 'Auto' option.
+ mController.onPreferenceChange(mListPreference, "-1");
+ assertThat(mController.getBandIndex()).isEqualTo(-1);
+
mController.onPreferenceChange(mListPreference, "1");
assertThat(mController.getBandIndex()).isEqualTo(1);
mController.onPreferenceChange(mListPreference, "0");
assertThat(mController.getBandIndex()).isEqualTo(0);
- verify(mListener, times(2)).onTetherConfigUpdated();
+ verify(mListener, times(3)).onTetherConfigUpdated();
}
@Test
diff --git a/tests/unit/src/com/android/settings/applications/AppOpsSettingsTest.java b/tests/unit/src/com/android/settings/applications/AppOpsSettingsTest.java
index d89d4a3..17a1889 100644
--- a/tests/unit/src/com/android/settings/applications/AppOpsSettingsTest.java
+++ b/tests/unit/src/com/android/settings/applications/AppOpsSettingsTest.java
@@ -15,6 +15,9 @@
*/
package com.android.settings.applications;
+import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+
import android.app.AppOpsManager;
import android.content.Context;
import android.content.Intent;
@@ -95,7 +98,9 @@
* Creates an intent for showing the permission settings for all apps.
*/
private Intent createManageAllAppsIntent() {
- return new Intent(mActivityAction);
+ final Intent intent = new Intent(mActivityAction);
+ intent.addFlags(FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK);
+ return intent;
}
/**
diff --git a/tests/unit/src/com/android/settings/notification/ChannelGroupNotificationSettingsTest.java b/tests/unit/src/com/android/settings/notification/ChannelGroupNotificationSettingsTest.java
deleted file mode 100644
index ce2c408..0000000
--- a/tests/unit/src/com/android/settings/notification/ChannelGroupNotificationSettingsTest.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.notification;
-
-import static android.app.NotificationManager.IMPORTANCE_HIGH;
-import static android.app.NotificationManager.IMPORTANCE_MIN;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-
-import static org.hamcrest.Matchers.allOf;
-import static org.junit.Assert.fail;
-
-import android.app.INotificationManager;
-import android.app.Instrumentation;
-import android.app.NotificationChannel;
-import android.app.NotificationChannelGroup;
-import android.app.NotificationManager;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Process;
-import android.os.ServiceManager;
-import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class ChannelGroupNotificationSettingsTest {
-
- private Context mTargetContext;
- private Instrumentation mInstrumentation;
- private NotificationManager mNm;
-
- @Before
- public void setUp() {
- mInstrumentation = InstrumentationRegistry.getInstrumentation();
- mTargetContext = mInstrumentation.getTargetContext();
- mNm = (NotificationManager) mTargetContext.getSystemService(Context.NOTIFICATION_SERVICE);
- }
-
- @Test
- public void launchNotificationSetting_displaysChannels() {
- NotificationChannelGroup group =
- new NotificationChannelGroup(this.getClass().getName(), this.getClass().getName());
- group.setDescription("description");
- NotificationChannel channel = new NotificationChannel(this.getClass().getName(),
- "channel" + this.getClass().getName(), IMPORTANCE_MIN);
- channel.setGroup(this.getClass().getName());
- NotificationChannel channel2 = new NotificationChannel("2"+this.getClass().getName(),
- "2channel" + this.getClass().getName(), IMPORTANCE_MIN);
- channel2.setGroup(this.getClass().getName());
-
- mNm.createNotificationChannelGroup(group);
- mNm.createNotificationChannel(channel);
- mNm.createNotificationChannel(channel2);
-
- final Intent intent = new Intent(Settings.ACTION_CHANNEL_GROUP_NOTIFICATION_SETTINGS)
- .putExtra(Settings.EXTRA_APP_PACKAGE, mTargetContext.getPackageName())
- .putExtra(Settings.EXTRA_CHANNEL_GROUP_ID, group.getId());
-
- mInstrumentation.startActivitySync(intent);
-
- onView(allOf(withText(group.getName().toString()))).check(matches(isDisplayed()));
- onView(allOf(withText(channel.getName().toString()))).check(
- matches(isDisplayed()));
- onView(allOf(withText(group.getDescription().toString()))).check(
- matches(isDisplayed()));
- onView(allOf(withText(channel2.getName().toString()))).check(
- matches(isDisplayed()));
- try {
- onView(allOf(withText("Android is blocking this group of notifications from"
- + " appearing on this device"))).check(matches(isDisplayed()));
- fail("Blocking footer erroneously appearing");
- } catch (Exception e) {
- // expected
- }
- }
-
- @Test
- public void launchNotificationSettings_blockedGroup() throws Exception {
- NotificationChannelGroup blocked =
- new NotificationChannelGroup("blocked", "blocked");
- NotificationChannel channel =
- new NotificationChannel("channel", "channel", IMPORTANCE_HIGH);
- channel.setGroup(blocked.getId());
- mNm.createNotificationChannelGroup(blocked);
- mNm.createNotificationChannel(channel);
-
- INotificationManager sINM = INotificationManager.Stub.asInterface(
- ServiceManager.getService(Context.NOTIFICATION_SERVICE));
- blocked.setBlocked(true);
- sINM.updateNotificationChannelGroupForPackage(
- mTargetContext.getPackageName(), Process.myUid(), blocked);
-
- final Intent intent = new Intent(Settings.ACTION_CHANNEL_GROUP_NOTIFICATION_SETTINGS)
- .putExtra(Settings.EXTRA_APP_PACKAGE, mTargetContext.getPackageName())
- .putExtra(Settings.EXTRA_CHANNEL_GROUP_ID, blocked.getId());
- mInstrumentation.startActivitySync(intent);
-
- onView(allOf(withText("Off"), isDisplayed())).check(matches(isDisplayed()));
- onView(allOf(withText("Android is blocking this group of notifications from"
- + " appearing on this device"))).check(matches(isDisplayed()));
-
- try {
- onView(allOf(withText(channel.getName().toString()))).check(matches(isDisplayed()));
- fail("settings appearing for blocked group");
- } catch (Exception e) {
- // expected
- }
- }
-}