Snap for 4593582 from c9f1d89dd3 to pi-release
Change-Id: I8f11907bf7f34440a90661b266ed79829392f436
@@ -2383,33 +2383,11 @@
|
|||||||
android:value="com.android.settings.security.CryptKeeperSettings" />
|
android:value="com.android.settings.security.CryptKeeperSettings" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name="Settings$DataPlanUsageSummaryActivity"
|
|
||||||
android:label="@string/data_usage_summary_title"
|
|
||||||
android:icon="@drawable/ic_settings_data_usage"
|
|
||||||
android:taskAffinity="">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN" />
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
<category android:name="com.android.settings.SHORTCUT" />
|
|
||||||
</intent-filter>
|
|
||||||
<intent-filter android:priority="10">
|
|
||||||
<action android:name="com.android.settings.action.SETTINGS" />
|
|
||||||
</intent-filter>
|
|
||||||
<meta-data android:name="com.android.settings.category"
|
|
||||||
android:value="com.android.settings.category.ia.wireless" />
|
|
||||||
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
|
||||||
android:value="com.android.settings.datausage.DataPlanUsageSummary" />
|
|
||||||
</activity>
|
|
||||||
|
|
||||||
<activity android:name="Settings$DataUsageSummaryActivity"
|
<activity android:name="Settings$DataUsageSummaryActivity"
|
||||||
android:label="@string/data_usage_summary_title"
|
android:label="@string/data_usage_summary_title"
|
||||||
android:icon="@drawable/ic_settings_data_usage"
|
android:icon="@drawable/ic_settings_data_usage"
|
||||||
android:taskAffinity="">
|
android:enabled="false">
|
||||||
<intent-filter>
|
<!-- TODO(b/70950124): add shortcut intent-filter -->
|
||||||
<action android:name="android.intent.action.MAIN" />
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
<category android:name="com.android.settings.SHORTCUT" />
|
|
||||||
</intent-filter>
|
|
||||||
<intent-filter android:priority="10">
|
<intent-filter android:priority="10">
|
||||||
<action android:name="com.android.settings.action.SETTINGS" />
|
<action android:name="com.android.settings.action.SETTINGS" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@@ -2419,6 +2397,24 @@
|
|||||||
android:value="com.android.settings.datausage.DataUsageSummary" />
|
android:value="com.android.settings.datausage.DataUsageSummary" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity android:name="Settings$DataUsageSummaryLegacyActivity"
|
||||||
|
android:label="@string/data_usage_summary_title"
|
||||||
|
android:icon="@drawable/ic_settings_data_usage"
|
||||||
|
android:taskAffinity="">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="com.android.settings.SHORTCUT" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter android:priority="10">
|
||||||
|
<action android:name="com.android.settings.action.SETTINGS" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data android:name="com.android.settings.category"
|
||||||
|
android:value="com.android.settings.category.ia.wireless" />
|
||||||
|
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
||||||
|
android:value="com.android.settings.datausage.DataUsageSummaryLegacy" />
|
||||||
|
</activity>
|
||||||
|
|
||||||
<activity android:name="Settings$MobileDataUsageListActivity"
|
<activity android:name="Settings$MobileDataUsageListActivity"
|
||||||
android:label="@string/cellular_data_usage"
|
android:label="@string/cellular_data_usage"
|
||||||
android:taskAffinity="">
|
android:taskAffinity="">
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
@@ -1,26 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
Copyright (C) 2017 The Android Open Source Project
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at"+
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- Shows the data plans sync time -->
|
|
||||||
<TextView
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:id="@android:id/title"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingStart="@dimen/preference_no_icon_padding_start"
|
|
||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
|
||||||
android:gravity="end"
|
|
||||||
android:textColor="?android:attr/textColorSecondary"/>
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
Copyright (C) 2017 The Android Open Source Project
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at"+
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingStart="@dimen/preference_no_icon_padding_start"
|
|
||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
|
||||||
android:paddingTop="8dp"
|
|
||||||
android:paddingBottom="16dp">
|
|
||||||
<Button
|
|
||||||
android:id="@+id/manage_data_plans"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/data_plan_usage_manage_plans_button_text"
|
|
||||||
android:textAllCaps="true"
|
|
||||||
style="@style/ActionPrimaryButton" />
|
|
||||||
</FrameLayout>
|
|
||||||
@@ -16,13 +16,13 @@
|
|||||||
|
|
||||||
<!-- For use in a LayoutPreference -->
|
<!-- For use in a LayoutPreference -->
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_height="0px"
|
android:layout_height="wrap_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent" >
|
||||||
android:layout_weight="1" >
|
|
||||||
|
|
||||||
<com.android.settings.widget.SwitchBar
|
<com.android.settings.widget.SwitchBar
|
||||||
android:id="@+id/switch_bar"
|
android:id="@+id/switch_bar"
|
||||||
android:layout_height="?android:attr/actionBarSize"
|
android:minHeight="?android:attr/actionBarSize"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:paddingStart="0dp"
|
android:paddingStart="0dp"
|
||||||
android:theme="?attr/switchBarTheme" />
|
android:theme="?attr/switchBarTheme" />
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (C) 2012 The Android Open Source Project
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="300sp"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:padding="8dip"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/wps_dialog_txt"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="8dip" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:layout_marginTop="8dip"
|
|
||||||
android:src="?attr/ic_wps" />
|
|
||||||
|
|
||||||
<ProgressBar
|
|
||||||
android:id="@+id/wps_timeout_bar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="20dip"
|
|
||||||
style="?android:attr/progressBarStyleHorizontal" />
|
|
||||||
|
|
||||||
<ProgressBar
|
|
||||||
android:id="@+id/wps_progress_bar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="20dip"
|
|
||||||
style="?android:attr/progressBarStyle" />
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:gravity="center"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/wps_dialog_btn"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/cancel" />
|
|
||||||
</RelativeLayout>
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
|
||||||
@@ -1845,12 +1845,8 @@
|
|||||||
<string name="wifi_configure_settings_preference_summary_wakeup_off">Wi\u2011Fi doesn\u0027t turn back on automatically</string>
|
<string name="wifi_configure_settings_preference_summary_wakeup_off">Wi\u2011Fi doesn\u0027t turn back on automatically</string>
|
||||||
<!-- Header for the list of wifi networks-->
|
<!-- Header for the list of wifi networks-->
|
||||||
<string name="wifi_access_points">Wi\u2011Fi networks</string>
|
<string name="wifi_access_points">Wi\u2011Fi networks</string>
|
||||||
<!-- Menu option to do WPS Push Button [CHAR LIMIT=25]-->
|
|
||||||
<string name="wifi_menu_wps_pbc">WPS Push Button</string>
|
|
||||||
<!-- Content description for menu button in Wifi setup. Not shown on the screen. [CHAR LIMIT=NONE] -->
|
<!-- Content description for menu button in Wifi setup. Not shown on the screen. [CHAR LIMIT=NONE] -->
|
||||||
<string name="wifi_menu_more_options">More options</string>
|
<string name="wifi_menu_more_options">More options</string>
|
||||||
<!-- Menu option to do WPS Pin Entry [CHAR LIMIT=25]-->
|
|
||||||
<string name="wifi_menu_wps_pin">WPS Pin Entry</string>
|
|
||||||
<!-- Menu option to launch Wi-Fi Direct settings [CHAR LIMIT=20]-->
|
<!-- Menu option to launch Wi-Fi Direct settings [CHAR LIMIT=20]-->
|
||||||
<string name="wifi_menu_p2p">Wi\u2011Fi Direct</string>
|
<string name="wifi_menu_p2p">Wi\u2011Fi Direct</string>
|
||||||
<!-- Menu option to scan Wi-Fi networks -->
|
<!-- Menu option to scan Wi-Fi networks -->
|
||||||
@@ -1887,32 +1883,6 @@
|
|||||||
<string name="wifi_advanced_toggle_description_expanded">Drop down list Advanced Options. Double-tap to collapse.</string>
|
<string name="wifi_advanced_toggle_description_expanded">Drop down list Advanced Options. Double-tap to collapse.</string>
|
||||||
<!-- Message for talkback to say when Advanced Options is collapsed [CHAR LIMIT=NONE] -->
|
<!-- Message for talkback to say when Advanced Options is collapsed [CHAR LIMIT=NONE] -->
|
||||||
<string name="wifi_advanced_toggle_description_collapsed">Drop down list Advanced Options. Double-tap to expand.</string>
|
<string name="wifi_advanced_toggle_description_collapsed">Drop down list Advanced Options. Double-tap to expand.</string>
|
||||||
<!-- Title for the WPS setup dialog [CHAR LIMIT=50] -->
|
|
||||||
<string name="wifi_wps_setup_title">Wi\u2011Fi Protected Setup</string>
|
|
||||||
<!-- Message in WPS dialog at start up [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_setup_msg">Starting WPS\u2026</string>
|
|
||||||
<!-- Message in WPS dialog for PBC after start up [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_onstart_pbc">Press the Wi\u2011Fi Protected Setup button on your router. It may be called \u201cWPS\u201d or marked with this symbol:</string>
|
|
||||||
<!-- Message in WPS dialog for PIN after start up [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_onstart_pin">Enter pin <xliff:g id="number">%1$s</xliff:g> on your Wi\u2011Fi router. The setup can take up to two minutes to complete.</string>
|
|
||||||
<!-- Text displayed when WPS succeeds [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_complete">WPS succeeded. Connecting to the network\u2026</string>
|
|
||||||
<!-- Text displayed when Wi-Fi is connected through WPS [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_connected">Connected to Wi\u2011Fi network <xliff:g id="network_name">%s</xliff:g></string>
|
|
||||||
<!-- Text displayed when WPS setup is in progress [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_in_progress">WPS is already in progress and can take up to two minutes to complete</string>
|
|
||||||
<!-- Text displayed when WPS fails to start [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_failed_generic">WPS failed. Please try again in a few minutes.</string>
|
|
||||||
<!-- Text displayed when WPS fails due to WEP [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_failed_wep">The wireless router security setting (WEP) is not supported</string>
|
|
||||||
<!-- Text displayed when WPS fails to TKIP [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_failed_tkip">The wireless router security setting (TKIP) is not supported</string>
|
|
||||||
<!-- Text displayed when WPS fails due to authentication issues [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_failed_auth">Authentication failure. Please try again.</string>
|
|
||||||
<!-- Text displayed when WPS fails due to another session [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_failed_overlap">Another WPS session was detected. Please try again in a few minutes.</string>
|
|
||||||
<!-- Text displayed when WPS fails due to wifi disconnected [CHAR LIMIT=150] -->
|
|
||||||
<string name="wifi_wps_failed_wifi_disconnected">Wi\u2011Fi disconnected. WPS setup canceled.</string>
|
|
||||||
<!-- Label for the SSID of the network -->
|
<!-- Label for the SSID of the network -->
|
||||||
<string name="wifi_ssid">Network name</string>
|
<string name="wifi_ssid">Network name</string>
|
||||||
<!-- Hint for a text field to enter the SSID of a hidden wifi network. [CHAR LIMIT=35] -->
|
<!-- Hint for a text field to enter the SSID of a hidden wifi network. [CHAR LIMIT=35] -->
|
||||||
@@ -5133,6 +5103,9 @@
|
|||||||
<!-- Title for the battery management group [CHAR LIMIT=40] -->
|
<!-- Title for the battery management group [CHAR LIMIT=40] -->
|
||||||
<string name ="battery_detail_manage_title">Manage battery usage</string>
|
<string name ="battery_detail_manage_title">Manage battery usage</string>
|
||||||
|
|
||||||
|
<!-- Graph subtext displayed to user when enhanced battery estimate is being used [CHAR LIMIT=120] -->
|
||||||
|
<string name="advanced_battery_graph_subtext">Battery left estimate is based on your device usage</string>
|
||||||
|
|
||||||
<!-- Description for battery time left, i.e. 50min Estimated time left. [CHAR LIMIT=80]-->
|
<!-- Description for battery time left, i.e. 50min Estimated time left. [CHAR LIMIT=80]-->
|
||||||
<string name="estimated_time_left">Estimated time left</string>
|
<string name="estimated_time_left">Estimated time left</string>
|
||||||
|
|
||||||
@@ -5772,9 +5745,6 @@
|
|||||||
<!-- action to select all [CHAR LIMIT=30] -->
|
<!-- action to select all [CHAR LIMIT=30] -->
|
||||||
<string name="select_all">Select all</string>
|
<string name="select_all">Select all</string>
|
||||||
|
|
||||||
<!-- A button that gets displayed in data plan usage preference in settings page to manage data plans [CHAR LIMIT=25] -->
|
|
||||||
<string name="data_plan_usage_manage_plans_button_text">Manage plans</string>
|
|
||||||
|
|
||||||
<!-- Activity title for network data usage summary. [CHAR LIMIT=25] -->
|
<!-- Activity title for network data usage summary. [CHAR LIMIT=25] -->
|
||||||
<string name="data_usage_summary_title">Data usage</string>
|
<string name="data_usage_summary_title">Data usage</string>
|
||||||
<!-- Activity title for Appk data usage summary. [CHAR LIMIT=25] -->
|
<!-- Activity title for Appk data usage summary. [CHAR LIMIT=25] -->
|
||||||
@@ -7083,7 +7053,7 @@
|
|||||||
<string name="notification_pulse_title">Blink light</string>
|
<string name="notification_pulse_title">Blink light</string>
|
||||||
|
|
||||||
<!-- Configure Notifications: Title for the option controlling notifications on the lockscreen. [CHAR LIMIT=30] -->
|
<!-- Configure Notifications: Title for the option controlling notifications on the lockscreen. [CHAR LIMIT=30] -->
|
||||||
<string name="lock_screen_notifications_title">On the lock screen</string>
|
<string name="lock_screen_notifications_title">On lock screen</string>
|
||||||
|
|
||||||
<!-- Configure Notifications: Value for lockscreen notifications: all information will be
|
<!-- Configure Notifications: Value for lockscreen notifications: all information will be
|
||||||
shown in notifications shown on a secure lock screen
|
shown in notifications shown on a secure lock screen
|
||||||
@@ -7093,7 +7063,7 @@
|
|||||||
<!-- Configure Notifications: Value for lockscreen notifications: sensitive information will be
|
<!-- Configure Notifications: Value for lockscreen notifications: sensitive information will be
|
||||||
hidden or redacted from notifications shown on a secure lock screen
|
hidden or redacted from notifications shown on a secure lock screen
|
||||||
[CHAR LIMIT=50] -->
|
[CHAR LIMIT=50] -->
|
||||||
<string name="lock_screen_notifications_summary_hide">Hide sensitive notification content</string>
|
<string name="lock_screen_notifications_summary_hide">Hide sensitive content</string>
|
||||||
|
|
||||||
<!-- Configure Notifications: Value for lockscreen notifications: notifications will not appear on a secure lock screen
|
<!-- Configure Notifications: Value for lockscreen notifications: notifications will not appear on a secure lock screen
|
||||||
[CHAR LIMIT=50] -->
|
[CHAR LIMIT=50] -->
|
||||||
@@ -7113,7 +7083,7 @@
|
|||||||
<!-- Configure Notifications: Value for lockscreen notifications: sensitive information will be
|
<!-- Configure Notifications: Value for lockscreen notifications: sensitive information will be
|
||||||
hidden or redacted from work notifications shown on a secure lock screen
|
hidden or redacted from work notifications shown on a secure lock screen
|
||||||
[CHAR LIMIT=50] -->
|
[CHAR LIMIT=50] -->
|
||||||
<string name="lock_screen_notifications_summary_hide_profile">Hide sensitive work notification content</string>
|
<string name="lock_screen_notifications_summary_hide_profile">Hide sensitive work content</string>
|
||||||
|
|
||||||
<!-- Configure Notifications: Value for lockscreen notifications: work notifications will not appear on a secure lock screen
|
<!-- Configure Notifications: Value for lockscreen notifications: work notifications will not appear on a secure lock screen
|
||||||
[CHAR LIMIT=50] -->
|
[CHAR LIMIT=50] -->
|
||||||
@@ -7373,7 +7343,7 @@
|
|||||||
<string name="app_notification_override_dnd_summary">Let these notifications continue to interrupt when Do Not Disturb is set to Priority Only</string>
|
<string name="app_notification_override_dnd_summary">Let these notifications continue to interrupt when Do Not Disturb is set to Priority Only</string>
|
||||||
|
|
||||||
<!-- [CHAR LIMIT=NONE] App notification settings: Visibility override option title -->
|
<!-- [CHAR LIMIT=NONE] App notification settings: Visibility override option title -->
|
||||||
<string name="app_notification_visibility_override_title">On the lock screen</string>
|
<string name="app_notification_visibility_override_title">On lock screen</string>
|
||||||
|
|
||||||
<!-- [CHAR LIMIT=20] Notification settings: App notifications row summary when allowed -->
|
<!-- [CHAR LIMIT=20] Notification settings: App notifications row summary when allowed -->
|
||||||
<string name="app_notification_row_banned">Blocked</string>
|
<string name="app_notification_row_banned">Blocked</string>
|
||||||
@@ -8510,7 +8480,7 @@
|
|||||||
<!-- Summary of condition that airplane mode is on [CHAR LIMIT=NONE] -->
|
<!-- Summary of condition that airplane mode is on [CHAR LIMIT=NONE] -->
|
||||||
<string name="condition_airplane_summary">Wi-Fi, Bluetooth, and mobile network are turned off. You can\'t make phone calls or connect to the internet.</string>
|
<string name="condition_airplane_summary">Wi-Fi, Bluetooth, and mobile network are turned off. You can\'t make phone calls or connect to the internet.</string>
|
||||||
|
|
||||||
<!-- Title of condition that do not disturb is on [CHAR LIMIT=30] -->
|
<!-- Title of condition that do not disturb is on [CHAR LIMIT=36] -->
|
||||||
<string name="condition_zen_title">Do Not Disturb is on</string>
|
<string name="condition_zen_title">Do Not Disturb is on</string>
|
||||||
|
|
||||||
<!-- Title of condition that battery saver is on [CHAR LIMIT=30] -->
|
<!-- Title of condition that battery saver is on [CHAR LIMIT=30] -->
|
||||||
@@ -9369,4 +9339,6 @@
|
|||||||
<!-- Settings item summary for automatic Bluetooth on while driving preference [CHAR LIMIT=100] -->
|
<!-- 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>
|
<string name="bluetooth_on_while_driving_summary">Turn on Bluetooth automatically when driving</string>
|
||||||
|
|
||||||
|
<!-- Title for item to go to old battery settings page when clicking [CHAR LIMIT=100] -->
|
||||||
|
<string name="dev_android_o_battery_settings_title">See Android 8.0 battery settings</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<attr name="fingerprint_layout_theme" format="reference" />
|
<attr name="fingerprint_layout_theme" format="reference" />
|
||||||
<attr name="ic_menu_moreoverflow" format="reference" />
|
<attr name="ic_menu_moreoverflow" format="reference" />
|
||||||
<attr name="ic_wps" format="reference" />
|
|
||||||
<attr name="side_margin" format="reference|dimension" />
|
<attr name="side_margin" format="reference|dimension" />
|
||||||
<attr name="wifi_signal_color" format="reference" />
|
<attr name="wifi_signal_color" format="reference" />
|
||||||
|
|
||||||
@@ -28,7 +27,6 @@
|
|||||||
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
||||||
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
||||||
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
||||||
<item name="ic_wps">@drawable/ic_wps_dark</item>
|
|
||||||
<item name="side_margin">0dip</item>
|
<item name="side_margin">0dip</item>
|
||||||
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
|
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
|
||||||
<item name="wifi_signal">@drawable/wifi_signal</item>
|
<item name="wifi_signal">@drawable/wifi_signal</item>
|
||||||
@@ -47,7 +45,6 @@
|
|||||||
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
||||||
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
||||||
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
||||||
<item name="ic_wps">@drawable/ic_wps_light</item>
|
|
||||||
<item name="side_margin">0dip</item>
|
<item name="side_margin">0dip</item>
|
||||||
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
|
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
|
||||||
<item name="wifi_signal">@drawable/wifi_signal</item>
|
<item name="wifi_signal">@drawable/wifi_signal</item>
|
||||||
@@ -65,7 +62,6 @@
|
|||||||
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
||||||
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
||||||
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
||||||
<item name="ic_wps">@drawable/ic_wps_dark</item>
|
|
||||||
<item name="side_margin">0dip</item>
|
<item name="side_margin">0dip</item>
|
||||||
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
|
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
|
||||||
<item name="wifi_signal">@drawable/wifi_signal</item>
|
<item name="wifi_signal">@drawable/wifi_signal</item>
|
||||||
@@ -84,7 +80,6 @@
|
|||||||
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
||||||
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
||||||
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
||||||
<item name="ic_wps">@drawable/ic_wps_light</item>
|
|
||||||
<item name="side_margin">0dip</item>
|
<item name="side_margin">0dip</item>
|
||||||
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
|
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
|
||||||
<item name="wifi_signal">@drawable/wifi_signal</item>
|
<item name="wifi_signal">@drawable/wifi_signal</item>
|
||||||
@@ -102,7 +97,6 @@
|
|||||||
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
||||||
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
||||||
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
||||||
<item name="ic_wps">@drawable/ic_wps_dark</item>
|
|
||||||
<item name="side_margin">0dip</item>
|
<item name="side_margin">0dip</item>
|
||||||
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
|
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
|
||||||
<item name="wifi_signal">@drawable/wifi_signal</item>
|
<item name="wifi_signal">@drawable/wifi_signal</item>
|
||||||
@@ -121,7 +115,6 @@
|
|||||||
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
<item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
|
||||||
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
||||||
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
|
||||||
<item name="ic_wps">@drawable/ic_wps_light</item>
|
|
||||||
<item name="side_margin">0dip</item>
|
<item name="side_margin">0dip</item>
|
||||||
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
|
<item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
|
||||||
<item name="wifi_signal">@drawable/wifi_signal</item>
|
<item name="wifi_signal">@drawable/wifi_signal</item>
|
||||||
@@ -221,7 +214,6 @@
|
|||||||
|
|
||||||
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
<item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
|
||||||
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_holo_dark</item>
|
<item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_holo_dark</item>
|
||||||
<item name="ic_wps">@drawable/ic_wps_light</item>
|
|
||||||
<item name="wifi_signal">@drawable/wifi_signal</item>
|
<item name="wifi_signal">@drawable/wifi_signal</item>
|
||||||
<item name="wifi_signal_color">?android:attr/colorAccent</item>
|
<item name="wifi_signal_color">?android:attr/colorAccent</item>
|
||||||
<item name="wifi_friction">@drawable/wifi_friction</item>
|
<item name="wifi_friction">@drawable/wifi_friction</item>
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (C) 2017 The Android Open Source Project
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:title="@string/data_usage_summary_title">
|
|
||||||
|
|
||||||
<PreferenceCategory
|
|
||||||
android:key="data_plan_usage"
|
|
||||||
android:title="@string/usage">
|
|
||||||
|
|
||||||
</PreferenceCategory>
|
|
||||||
</PreferenceScreen>
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (C) 2017 The Android Open Source Project
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<PreferenceScreen
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:title="@string/data_usage_summary_title">
|
|
||||||
|
|
||||||
<com.android.settings.datausage.TemplatePreferenceCategory
|
|
||||||
android:key="data_usage_mobile_category"
|
|
||||||
android:title="@string/data_usage_tab_mobile">
|
|
||||||
|
|
||||||
<com.android.settings.datausage.CellDataPreference
|
|
||||||
android:key="data_usage_enable"
|
|
||||||
android:title="@string/data_usage_enable_mobile" />
|
|
||||||
</com.android.settings.datausage.TemplatePreferenceCategory>
|
|
||||||
|
|
||||||
</PreferenceScreen>
|
|
||||||
43
res/xml/data_usage_legacy.xml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2016 The Android Open Source Project
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<PreferenceScreen
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:key="data_usage_screen"
|
||||||
|
android:title="@string/data_usage_summary_title">
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="data_usage_category"
|
||||||
|
android:title="@string/usage">
|
||||||
|
|
||||||
|
<com.android.settings.SummaryPreference
|
||||||
|
android:key="status_header"
|
||||||
|
android:selectable="false" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:key="limit_summary"
|
||||||
|
android:selectable="false"
|
||||||
|
settings:allowDividerBelow="true" />
|
||||||
|
|
||||||
|
<com.android.settings.datausage.DataSaverPreference
|
||||||
|
android:key="restrict_background"
|
||||||
|
android:title="@string/data_saver_title"
|
||||||
|
android:fragment="com.android.settings.datausage.DataSaverSummary" />
|
||||||
|
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -76,6 +76,11 @@
|
|||||||
android:summary="@string/runningservices_settings_summary"
|
android:summary="@string/runningservices_settings_summary"
|
||||||
android:fragment="com.android.settings.applications.RunningServices" />
|
android:fragment="com.android.settings.applications.RunningServices" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:key="android_o_battery_settings"
|
||||||
|
android:fragment="com.android.settings.fuelgauge.PowerUsageSummaryLegacy"
|
||||||
|
android:title="@string/dev_android_o_battery_settings_title" />
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="convert_to_file_encryption"
|
android:key="convert_to_file_encryption"
|
||||||
android:title="@string/convert_to_file_encryption"
|
android:title="@string/convert_to_file_encryption"
|
||||||
@@ -471,7 +476,6 @@
|
|||||||
android:entries="@array/app_process_limit_entries"
|
android:entries="@array/app_process_limit_entries"
|
||||||
android:entryValues="@array/app_process_limit_values" />
|
android:entryValues="@array/app_process_limit_values" />
|
||||||
|
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="background_check"
|
android:key="background_check"
|
||||||
android:fragment="com.android.settings.applications.appops.BackgroundCheckSummary"
|
android:fragment="com.android.settings.applications.appops.BackgroundCheckSummary"
|
||||||
|
|||||||
@@ -63,14 +63,6 @@
|
|||||||
android:title="@string/wifi_menu_p2p"
|
android:title="@string/wifi_menu_p2p"
|
||||||
android:fragment="com.android.settings.wifi.p2p.WifiP2pSettings"/>
|
android:fragment="com.android.settings.wifi.p2p.WifiP2pSettings"/>
|
||||||
|
|
||||||
<Preference
|
|
||||||
android:key="wps_push_button"
|
|
||||||
android:title="@string/wifi_menu_wps_pbc" />
|
|
||||||
|
|
||||||
<Preference
|
|
||||||
android:key="wps_pin_entry"
|
|
||||||
android:title="@string/wifi_menu_wps_pin" />
|
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="mac_address"
|
android:key="mac_address"
|
||||||
android:title="@string/wifi_advanced_mac_address_title"/>
|
android:title="@string/wifi_advanced_mac_address_title"/>
|
||||||
|
|||||||
@@ -225,6 +225,7 @@ public class ResetNetworkConfirm extends InstrumentedFragment {
|
|||||||
mEraseEsimTask.cancel(true /* mayInterruptIfRunning */);
|
mEraseEsimTask.cancel(true /* mayInterruptIfRunning */);
|
||||||
mEraseEsimTask = null;
|
mEraseEsimTask = null;
|
||||||
}
|
}
|
||||||
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -78,8 +78,8 @@ public class Settings extends SettingsActivity {
|
|||||||
public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
|
public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }
|
public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ }
|
public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class DataPlanUsageSummaryActivity extends SettingsActivity { /* empty */ }
|
|
||||||
public static class DataUsageSummaryActivity extends SettingsActivity { /* empty */ }
|
public static class DataUsageSummaryActivity extends SettingsActivity { /* empty */ }
|
||||||
|
public static class DataUsageSummaryLegacyActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class MobileDataUsageListActivity extends SettingsActivity { /* empty */ }
|
public static class MobileDataUsageListActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class ConfigureWifiSettingsActivity extends SettingsActivity { /* empty */ }
|
public static class ConfigureWifiSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class SavedAccessPointsSettingsActivity extends SettingsActivity { /* empty */ }
|
public static class SavedAccessPointsSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import android.support.v7.preference.Preference;
|
|||||||
import android.support.v7.preference.PreferenceManager;
|
import android.support.v7.preference.PreferenceManager;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.transition.TransitionManager;
|
import android.transition.TransitionManager;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
@@ -57,6 +58,7 @@ import com.android.internal.util.ArrayUtils;
|
|||||||
import com.android.settings.Settings.WifiSettingsActivity;
|
import com.android.settings.Settings.WifiSettingsActivity;
|
||||||
import com.android.settings.applications.manageapplications.ManageApplications;
|
import com.android.settings.applications.manageapplications.ManageApplications;
|
||||||
import com.android.settings.backup.BackupSettingsActivity;
|
import com.android.settings.backup.BackupSettingsActivity;
|
||||||
|
import com.android.settings.core.FeatureFlags;
|
||||||
import com.android.settings.core.gateway.SettingsGateway;
|
import com.android.settings.core.gateway.SettingsGateway;
|
||||||
import com.android.settings.dashboard.DashboardFeatureProvider;
|
import com.android.settings.dashboard.DashboardFeatureProvider;
|
||||||
import com.android.settings.dashboard.DashboardSummary;
|
import com.android.settings.dashboard.DashboardSummary;
|
||||||
@@ -82,8 +84,6 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
|
|
||||||
// Constants for state save/restore
|
// Constants for state save/restore
|
||||||
private static final String SAVE_KEY_CATEGORIES = ":settings:categories";
|
private static final String SAVE_KEY_CATEGORIES = ":settings:categories";
|
||||||
@VisibleForTesting
|
|
||||||
static final String SAVE_KEY_SHOW_HOME_AS_UP = ":settings:show_home_as_up";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When starting this activity, the invoking Intent can contain this extra
|
* When starting this activity, the invoking Intent can contain this extra
|
||||||
@@ -150,8 +150,6 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
|
|
||||||
private static final String EXTRA_UI_OPTIONS = "settings:ui_options";
|
private static final String EXTRA_UI_OPTIONS = "settings:ui_options";
|
||||||
|
|
||||||
private static final int REQUEST_SUGGESTION = 42;
|
|
||||||
|
|
||||||
private String mFragmentClass;
|
private String mFragmentClass;
|
||||||
|
|
||||||
private CharSequence mInitialTitle;
|
private CharSequence mInitialTitle;
|
||||||
@@ -183,9 +181,6 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
|
|
||||||
private Button mNextButton;
|
private Button mNextButton;
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
boolean mDisplayHomeAsUpEnabled;
|
|
||||||
|
|
||||||
private boolean mIsShowingDashboard;
|
private boolean mIsShowingDashboard;
|
||||||
private boolean mIsShortcut;
|
private boolean mIsShortcut;
|
||||||
|
|
||||||
@@ -197,7 +192,6 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
private ArrayList<DashboardCategory> mCategories = new ArrayList<>();
|
private ArrayList<DashboardCategory> mCategories = new ArrayList<>();
|
||||||
|
|
||||||
private DashboardFeatureProvider mDashboardFeatureProvider;
|
private DashboardFeatureProvider mDashboardFeatureProvider;
|
||||||
private ComponentName mCurrentSuggestion;
|
|
||||||
|
|
||||||
public SwitchBar getSwitchBar() {
|
public SwitchBar getSwitchBar() {
|
||||||
return mSwitchBar;
|
return mSwitchBar;
|
||||||
@@ -310,9 +304,6 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
mCategories.addAll(categories);
|
mCategories.addAll(categories);
|
||||||
setTitleFromBackStack();
|
setTitleFromBackStack();
|
||||||
}
|
}
|
||||||
|
|
||||||
mDisplayHomeAsUpEnabled = savedState.getBoolean(SAVE_KEY_SHOW_HOME_AS_UP);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
launchSettingFragment(initialFragmentName, isSubSettings, intent);
|
launchSettingFragment(initialFragmentName, isSubSettings, intent);
|
||||||
}
|
}
|
||||||
@@ -337,8 +328,8 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
|
|
||||||
ActionBar actionBar = getActionBar();
|
ActionBar actionBar = getActionBar();
|
||||||
if (actionBar != null) {
|
if (actionBar != null) {
|
||||||
actionBar.setDisplayHomeAsUpEnabled(mDisplayHomeAsUpEnabled);
|
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||||
actionBar.setHomeButtonEnabled(mDisplayHomeAsUpEnabled);
|
actionBar.setHomeButtonEnabled(true);
|
||||||
actionBar.setDisplayShowTitleEnabled(!mIsShowingDashboard);
|
actionBar.setDisplayShowTitleEnabled(!mIsShowingDashboard);
|
||||||
}
|
}
|
||||||
mSwitchBar = findViewById(R.id.switch_bar);
|
mSwitchBar = findViewById(R.id.switch_bar);
|
||||||
@@ -353,21 +344,21 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
if (buttonBar != null) {
|
if (buttonBar != null) {
|
||||||
buttonBar.setVisibility(View.VISIBLE);
|
buttonBar.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
Button backButton = (Button)findViewById(R.id.back_button);
|
Button backButton = (Button) findViewById(R.id.back_button);
|
||||||
backButton.setOnClickListener(new OnClickListener() {
|
backButton.setOnClickListener(new OnClickListener() {
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
setResult(RESULT_CANCELED, null);
|
setResult(RESULT_CANCELED, null);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Button skipButton = (Button)findViewById(R.id.skip_button);
|
Button skipButton = (Button) findViewById(R.id.skip_button);
|
||||||
skipButton.setOnClickListener(new OnClickListener() {
|
skipButton.setOnClickListener(new OnClickListener() {
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
setResult(RESULT_OK, null);
|
setResult(RESULT_OK, null);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mNextButton = (Button)findViewById(R.id.next_button);
|
mNextButton = (Button) findViewById(R.id.next_button);
|
||||||
mNextButton.setOnClickListener(new OnClickListener() {
|
mNextButton.setOnClickListener(new OnClickListener() {
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
setResult(RESULT_OK, null);
|
setResult(RESULT_OK, null);
|
||||||
@@ -380,8 +371,7 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_NEXT_TEXT);
|
String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_NEXT_TEXT);
|
||||||
if (TextUtils.isEmpty(buttonText)) {
|
if (TextUtils.isEmpty(buttonText)) {
|
||||||
mNextButton.setVisibility(View.GONE);
|
mNextButton.setVisibility(View.GONE);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
mNextButton.setText(buttonText);
|
mNextButton.setText(buttonText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -389,8 +379,7 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_BACK_TEXT);
|
String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_BACK_TEXT);
|
||||||
if (TextUtils.isEmpty(buttonText)) {
|
if (TextUtils.isEmpty(buttonText)) {
|
||||||
backButton.setVisibility(View.GONE);
|
backButton.setVisibility(View.GONE);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
backButton.setText(buttonText);
|
backButton.setText(buttonText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -408,14 +397,6 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
void launchSettingFragment(String initialFragmentName, boolean isSubSettings, Intent intent) {
|
void launchSettingFragment(String initialFragmentName, boolean isSubSettings, Intent intent) {
|
||||||
if (!mIsShowingDashboard && initialFragmentName != null) {
|
if (!mIsShowingDashboard && initialFragmentName != null) {
|
||||||
// UP will be shown only if it is a sub settings
|
|
||||||
if (mIsShortcut) {
|
|
||||||
mDisplayHomeAsUpEnabled = isSubSettings;
|
|
||||||
} else if (isSubSettings) {
|
|
||||||
mDisplayHomeAsUpEnabled = true;
|
|
||||||
} else {
|
|
||||||
mDisplayHomeAsUpEnabled = false;
|
|
||||||
}
|
|
||||||
setTitleFromIntent(intent);
|
setTitleFromIntent(intent);
|
||||||
|
|
||||||
Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
|
Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
|
||||||
@@ -423,7 +404,6 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
mInitialTitleResId, mInitialTitle, false);
|
mInitialTitleResId, mInitialTitle, false);
|
||||||
} else {
|
} else {
|
||||||
// Show search icon as up affordance if we are displaying the main Dashboard
|
// Show search icon as up affordance if we are displaying the main Dashboard
|
||||||
mDisplayHomeAsUpEnabled = true;
|
|
||||||
mInitialTitleResId = R.string.dashboard_title;
|
mInitialTitleResId = R.string.dashboard_title;
|
||||||
|
|
||||||
switchToFragment(DashboardSummary.class.getName(), null /* args */, false, false,
|
switchToFragment(DashboardSummary.class.getName(), null /* args */, false, false,
|
||||||
@@ -509,15 +489,6 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
if (mCategories.size() > 0) {
|
if (mCategories.size() > 0) {
|
||||||
outState.putParcelableArrayList(SAVE_KEY_CATEGORIES, mCategories);
|
outState.putParcelableArrayList(SAVE_KEY_CATEGORIES, mCategories);
|
||||||
}
|
}
|
||||||
|
|
||||||
outState.putBoolean(SAVE_KEY_SHOW_HOME_AS_UP, mDisplayHomeAsUpEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onRestoreInstanceState(Bundle savedInstanceState) {
|
|
||||||
super.onRestoreInstanceState(savedInstanceState);
|
|
||||||
|
|
||||||
mDisplayHomeAsUpEnabled = savedInstanceState.getBoolean(SAVE_KEY_SHOW_HOME_AS_UP);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -762,31 +733,11 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH), isAdmin)
|
pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH), isAdmin)
|
||||||
|| somethingChanged;
|
|| somethingChanged;
|
||||||
|
|
||||||
boolean isDataPlanFeatureEnabled = FeatureFactory.getFactory(this)
|
|
||||||
.getDataPlanFeatureProvider()
|
|
||||||
.isEnabled();
|
|
||||||
|
|
||||||
// When the data plan feature flag is turned on we disable DataUsageSummaryActivity
|
|
||||||
// and enable DataPlanUsageSummaryActivity. When the feature flag is turned off we do the
|
|
||||||
// reverse.
|
|
||||||
|
|
||||||
// Disable DataUsageSummaryActivity if the data plan feature flag is turned on otherwise
|
|
||||||
// disable DataPlanUsageSummaryActivity.
|
|
||||||
somethingChanged = setTileEnabled(
|
|
||||||
new ComponentName(packageName,
|
|
||||||
isDataPlanFeatureEnabled
|
|
||||||
? Settings.DataUsageSummaryActivity.class.getName()
|
|
||||||
: Settings.DataPlanUsageSummaryActivity.class.getName()),
|
|
||||||
false /* enabled */,
|
|
||||||
isAdmin) || somethingChanged;
|
|
||||||
|
|
||||||
// Enable DataUsageSummaryActivity if the data plan feature flag is turned on otherwise
|
// Enable DataUsageSummaryActivity if the data plan feature flag is turned on otherwise
|
||||||
// enable DataPlanUsageSummaryActivity.
|
// enable DataPlanUsageSummaryActivity.
|
||||||
somethingChanged = setTileEnabled(
|
somethingChanged = setTileEnabled(
|
||||||
new ComponentName(packageName,
|
new ComponentName(packageName, Settings.DataUsageSummaryActivity.class.getName()),
|
||||||
isDataPlanFeatureEnabled
|
|
||||||
? Settings.DataPlanUsageSummaryActivity.class.getName()
|
|
||||||
: Settings.DataUsageSummaryActivity.class.getName()),
|
|
||||||
Utils.isBandwidthControlEnabled() /* enabled */,
|
Utils.isBandwidthControlEnabled() /* enabled */,
|
||||||
isAdmin) || somethingChanged;
|
isAdmin) || somethingChanged;
|
||||||
|
|
||||||
@@ -822,6 +773,19 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
Settings.PowerUsageSummaryLegacyActivity.class.getName()),
|
Settings.PowerUsageSummaryLegacyActivity.class.getName()),
|
||||||
mBatteryPresent && !isBatterySettingsV2Enabled, isAdmin) || somethingChanged;
|
mBatteryPresent && !isBatterySettingsV2Enabled, isAdmin) || somethingChanged;
|
||||||
|
|
||||||
|
final boolean isDataUsageSettingsV2Enabled =
|
||||||
|
FeatureFlagUtils.isEnabled(this, FeatureFlags.DATA_USAGE_SETTINGS_V2);
|
||||||
|
// Enable new data usage page if v2 enabled
|
||||||
|
somethingChanged = setTileEnabled(new ComponentName(packageName,
|
||||||
|
Settings.DataUsageSummaryActivity.class.getName()),
|
||||||
|
Utils.isBandwidthControlEnabled() && isDataUsageSettingsV2Enabled, isAdmin)
|
||||||
|
|| somethingChanged;
|
||||||
|
// Enable legacy data usage page if v2 disabled
|
||||||
|
somethingChanged = setTileEnabled(new ComponentName(packageName,
|
||||||
|
Settings.DataUsageSummaryLegacyActivity.class.getName()),
|
||||||
|
Utils.isBandwidthControlEnabled() && !isDataUsageSettingsV2Enabled, isAdmin)
|
||||||
|
|| somethingChanged;
|
||||||
|
|
||||||
somethingChanged = setTileEnabled(new ComponentName(packageName,
|
somethingChanged = setTileEnabled(new ComponentName(packageName,
|
||||||
Settings.UserSettingsActivity.class.getName()),
|
Settings.UserSettingsActivity.class.getName()),
|
||||||
UserHandle.MU_ENABLED && UserManager.supportsMultipleUsers()
|
UserHandle.MU_ENABLED && UserManager.supportsMultipleUsers()
|
||||||
@@ -940,29 +904,6 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
return mNextButton;
|
return mNextButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean shouldUpRecreateTask(Intent targetIntent) {
|
|
||||||
return super.shouldUpRecreateTask(new Intent(this, SettingsActivity.class));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void startSuggestion(Intent intent) {
|
|
||||||
if (intent == null || ActivityManager.isUserAMonkey()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mCurrentSuggestion = intent.getComponent();
|
|
||||||
startActivityForResult(intent, REQUEST_SUGGESTION);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
||||||
if (requestCode == REQUEST_SUGGESTION && mCurrentSuggestion != null
|
|
||||||
&& resultCode != RESULT_CANCELED) {
|
|
||||||
getPackageManager().setComponentEnabledSetting(mCurrentSuggestion,
|
|
||||||
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
|
|
||||||
}
|
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
Bitmap getBitmapFromXmlResource(int drawableRes) {
|
Bitmap getBitmapFromXmlResource(int drawableRes) {
|
||||||
Drawable drawable = getResources().getDrawable(drawableRes, getTheme());
|
Drawable drawable = getResources().getDrawable(drawableRes, getTheme());
|
||||||
|
|||||||
@@ -52,11 +52,8 @@ import android.graphics.Canvas;
|
|||||||
import android.graphics.drawable.BitmapDrawable;
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.hardware.fingerprint.FingerprintManager;
|
import android.hardware.fingerprint.FingerprintManager;
|
||||||
import android.icu.text.MeasureFormat;
|
|
||||||
import android.icu.text.RelativeDateTimeFormatter;
|
import android.icu.text.RelativeDateTimeFormatter;
|
||||||
import android.icu.text.RelativeDateTimeFormatter.RelativeUnit;
|
import android.icu.text.RelativeDateTimeFormatter.RelativeUnit;
|
||||||
import android.icu.util.Measure;
|
|
||||||
import android.icu.util.MeasureUnit;
|
|
||||||
import android.icu.util.ULocale;
|
import android.icu.util.ULocale;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.LinkProperties;
|
import android.net.LinkProperties;
|
||||||
@@ -88,8 +85,6 @@ import android.support.v7.preference.PreferenceScreen;
|
|||||||
import android.telephony.TelephonyManager;
|
import android.telephony.TelephonyManager;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
import android.text.SpannableString;
|
import android.text.SpannableString;
|
||||||
import android.text.SpannableStringBuilder;
|
|
||||||
import android.text.Spanned;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import android.text.style.TtsSpan;
|
import android.text.style.TtsSpan;
|
||||||
@@ -112,6 +107,7 @@ import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
|||||||
import com.android.settings.wrapper.FingerprintManagerWrapper;
|
import com.android.settings.wrapper.FingerprintManagerWrapper;
|
||||||
import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
|
import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@@ -138,10 +134,6 @@ public final class Utils extends com.android.settingslib.Utils {
|
|||||||
|
|
||||||
private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
|
private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
|
||||||
|
|
||||||
private static final int SECONDS_PER_MINUTE = 60;
|
|
||||||
private static final int SECONDS_PER_HOUR = 60 * 60;
|
|
||||||
private static final int SECONDS_PER_DAY = 24 * 60 * 60;
|
|
||||||
|
|
||||||
public static final String OS_PKG = "os";
|
public static final String OS_PKG = "os";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -771,113 +763,6 @@ public final class Utils extends com.android.settingslib.Utils {
|
|||||||
return tm.getSimCount() > 1;
|
return tm.getSimCount() > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns elapsed time for the given millis, in the following format:
|
|
||||||
* 2d 5h 40m 29s
|
|
||||||
* @param context the application context
|
|
||||||
* @param millis the elapsed time in milli seconds
|
|
||||||
* @param withSeconds include seconds?
|
|
||||||
* @return the formatted elapsed time
|
|
||||||
*/
|
|
||||||
public static CharSequence formatElapsedTime(Context context, double millis,
|
|
||||||
boolean withSeconds) {
|
|
||||||
SpannableStringBuilder sb = new SpannableStringBuilder();
|
|
||||||
int seconds = (int) Math.floor(millis / 1000);
|
|
||||||
if (!withSeconds) {
|
|
||||||
// Round up.
|
|
||||||
seconds += 30;
|
|
||||||
}
|
|
||||||
|
|
||||||
int days = 0, hours = 0, minutes = 0;
|
|
||||||
if (seconds >= SECONDS_PER_DAY) {
|
|
||||||
days = seconds / SECONDS_PER_DAY;
|
|
||||||
seconds -= days * SECONDS_PER_DAY;
|
|
||||||
}
|
|
||||||
if (seconds >= SECONDS_PER_HOUR) {
|
|
||||||
hours = seconds / SECONDS_PER_HOUR;
|
|
||||||
seconds -= hours * SECONDS_PER_HOUR;
|
|
||||||
}
|
|
||||||
if (seconds >= SECONDS_PER_MINUTE) {
|
|
||||||
minutes = seconds / SECONDS_PER_MINUTE;
|
|
||||||
seconds -= minutes * SECONDS_PER_MINUTE;
|
|
||||||
}
|
|
||||||
|
|
||||||
final ArrayList<Measure> measureList = new ArrayList(4);
|
|
||||||
if (days > 0) {
|
|
||||||
measureList.add(new Measure(days, MeasureUnit.DAY));
|
|
||||||
}
|
|
||||||
if (hours > 0) {
|
|
||||||
measureList.add(new Measure(hours, MeasureUnit.HOUR));
|
|
||||||
}
|
|
||||||
if (minutes > 0) {
|
|
||||||
measureList.add(new Measure(minutes, MeasureUnit.MINUTE));
|
|
||||||
}
|
|
||||||
if (withSeconds && seconds > 0) {
|
|
||||||
measureList.add(new Measure(seconds, MeasureUnit.SECOND));
|
|
||||||
}
|
|
||||||
if (measureList.size() == 0) {
|
|
||||||
// Everything addable was zero, so nothing was added. We add a zero.
|
|
||||||
measureList.add(new Measure(0, withSeconds ? MeasureUnit.SECOND : MeasureUnit.MINUTE));
|
|
||||||
}
|
|
||||||
final Measure[] measureArray = measureList.toArray(new Measure[measureList.size()]);
|
|
||||||
|
|
||||||
final Locale locale = context.getResources().getConfiguration().locale;
|
|
||||||
final MeasureFormat measureFormat = MeasureFormat.getInstance(
|
|
||||||
locale, MeasureFormat.FormatWidth.NARROW);
|
|
||||||
sb.append(measureFormat.formatMeasures(measureArray));
|
|
||||||
|
|
||||||
if (measureArray.length == 1 && MeasureUnit.MINUTE.equals(measureArray[0].getUnit())) {
|
|
||||||
// Add ttsSpan if it only have minute value, because it will be read as "meters"
|
|
||||||
final TtsSpan ttsSpan = new TtsSpan.MeasureBuilder().setNumber(minutes)
|
|
||||||
.setUnit("minute").build();
|
|
||||||
sb.setSpan(ttsSpan, 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return sb;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns relative time for the given millis in the past, in a short format such as "2 days
|
|
||||||
* ago", "5 hr. ago", "40 min. ago", or "29 sec. ago".
|
|
||||||
*
|
|
||||||
* <p>The unit is chosen to have good information value while only using one unit. So 27 hours
|
|
||||||
* and 50 minutes would be formatted as "28 hr. ago", while 50 hours would be formatted as
|
|
||||||
* "2 days ago".
|
|
||||||
*
|
|
||||||
* @param context the application context
|
|
||||||
* @param millis the elapsed time in milli seconds
|
|
||||||
* @param withSeconds include seconds?
|
|
||||||
* @return the formatted elapsed time
|
|
||||||
*/
|
|
||||||
public static CharSequence formatRelativeTime(Context context, double millis,
|
|
||||||
boolean withSeconds) {
|
|
||||||
final int seconds = (int) Math.floor(millis / 1000);
|
|
||||||
final RelativeUnit unit;
|
|
||||||
final int value;
|
|
||||||
if (withSeconds && seconds < 2 * SECONDS_PER_MINUTE) {
|
|
||||||
unit = RelativeUnit.SECONDS;
|
|
||||||
value = seconds;
|
|
||||||
} else if (seconds < 2 * SECONDS_PER_HOUR) {
|
|
||||||
unit = RelativeUnit.MINUTES;
|
|
||||||
value = (seconds + SECONDS_PER_MINUTE / 2) / SECONDS_PER_MINUTE;
|
|
||||||
} else if (seconds < 2 * SECONDS_PER_DAY) {
|
|
||||||
unit = RelativeUnit.HOURS;
|
|
||||||
value = (seconds + SECONDS_PER_HOUR / 2) / SECONDS_PER_HOUR;
|
|
||||||
} else {
|
|
||||||
unit = RelativeUnit.DAYS;
|
|
||||||
value = (seconds + SECONDS_PER_DAY / 2) / SECONDS_PER_DAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Locale locale = context.getResources().getConfiguration().locale;
|
|
||||||
final RelativeDateTimeFormatter formatter = RelativeDateTimeFormatter.getInstance(
|
|
||||||
ULocale.forLocale(locale),
|
|
||||||
null /* default NumberFormat */,
|
|
||||||
RelativeDateTimeFormatter.Style.SHORT,
|
|
||||||
android.icu.text.DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE);
|
|
||||||
|
|
||||||
return formatter.format(value, RelativeDateTimeFormatter.Direction.LAST, unit);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Queries for the UserInfo of a user. Returns null if the user doesn't exist (was removed).
|
* Queries for the UserInfo of a user. Returns null if the user doesn't exist (was removed).
|
||||||
* @param userManager Instance of UserManager
|
* @param userManager Instance of UserManager
|
||||||
|
|||||||
@@ -38,13 +38,13 @@ import android.util.IconDrawableFactory;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Utils;
|
|
||||||
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
|
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
|
||||||
import com.android.settings.core.PreferenceControllerMixin;
|
import com.android.settings.core.PreferenceControllerMixin;
|
||||||
import com.android.settings.widget.AppPreference;
|
import com.android.settings.widget.AppPreference;
|
||||||
import com.android.settingslib.applications.AppUtils;
|
import com.android.settingslib.applications.AppUtils;
|
||||||
import com.android.settingslib.applications.ApplicationsState;
|
import com.android.settingslib.applications.ApplicationsState;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -239,7 +239,7 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController
|
|||||||
pref.setKey(pkgName);
|
pref.setKey(pkgName);
|
||||||
pref.setTitle(appEntry.label);
|
pref.setTitle(appEntry.label);
|
||||||
pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info));
|
pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info));
|
||||||
pref.setSummary(Utils.formatRelativeTime(mContext,
|
pref.setSummary(StringUtil.formatRelativeTime(mContext,
|
||||||
System.currentTimeMillis() - stat.getLastTimeUsed(), false));
|
System.currentTimeMillis() - stat.getLastTimeUsed(), false));
|
||||||
pref.setOrder(i);
|
pref.setOrder(i);
|
||||||
pref.setOnPreferenceClickListener(preference -> {
|
pref.setOnPreferenceClickListener(preference -> {
|
||||||
|
|||||||
@@ -24,13 +24,12 @@ import android.content.Intent;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import android.support.annotation.VisibleForTesting;
|
import android.support.annotation.VisibleForTesting;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Settings.PrivacySettingsActivity;
|
import com.android.settings.Settings.PrivacySettingsActivity;
|
||||||
import com.android.settingslib.drawer.SettingsDrawerActivity;
|
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -153,8 +152,7 @@ public class BackupSettingsHelper {
|
|||||||
|
|
||||||
private Intent getIntentForDefaultBackupSettings() {
|
private Intent getIntentForDefaultBackupSettings() {
|
||||||
// Extra needed by {@link SettingsDrawerActivity} to show the back button navigation.
|
// Extra needed by {@link SettingsDrawerActivity} to show the back button navigation.
|
||||||
return new Intent(mContext, PrivacySettingsActivity.class)
|
return new Intent(mContext, PrivacySettingsActivity.class);
|
||||||
.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -26,4 +26,5 @@ public class FeatureFlags {
|
|||||||
public static final String ZONE_PICKER_V2 = "settings_zone_picker_v2";
|
public static final String ZONE_PICKER_V2 = "settings_zone_picker_v2";
|
||||||
public static final String ABOUT_PHONE_V2 = "settings_about_phone_v2";
|
public static final String ABOUT_PHONE_V2 = "settings_about_phone_v2";
|
||||||
public static final String BLUETOOTH_WHILE_DRIVING = "settings_bluetooth_while_driving";
|
public static final String BLUETOOTH_WHILE_DRIVING = "settings_bluetooth_while_driving";
|
||||||
|
public static final String DATA_USAGE_SETTINGS_V2 = "settings_data_usage_v2";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,16 +33,16 @@ import com.android.settings.accessibility.AccessibilitySettings;
|
|||||||
import com.android.settings.accessibility.AccessibilitySettingsForSetupWizard;
|
import com.android.settings.accessibility.AccessibilitySettingsForSetupWizard;
|
||||||
import com.android.settings.accessibility.CaptionPropertiesFragment;
|
import com.android.settings.accessibility.CaptionPropertiesFragment;
|
||||||
import com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment;
|
import com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment;
|
||||||
|
import com.android.settings.accounts.AccountDashboardFragment;
|
||||||
import com.android.settings.accounts.AccountSyncSettings;
|
import com.android.settings.accounts.AccountSyncSettings;
|
||||||
import com.android.settings.accounts.ChooseAccountActivity;
|
import com.android.settings.accounts.ChooseAccountActivity;
|
||||||
import com.android.settings.accounts.ManagedProfileSettings;
|
import com.android.settings.accounts.ManagedProfileSettings;
|
||||||
import com.android.settings.accounts.AccountDashboardFragment;
|
|
||||||
import com.android.settings.applications.AppAndNotificationDashboardFragment;
|
import com.android.settings.applications.AppAndNotificationDashboardFragment;
|
||||||
import com.android.settings.applications.DefaultAppSettings;
|
import com.android.settings.applications.DefaultAppSettings;
|
||||||
|
import com.android.settings.applications.DirectoryAccessDetails;
|
||||||
import com.android.settings.applications.ManageDomainUrls;
|
import com.android.settings.applications.ManageDomainUrls;
|
||||||
import com.android.settings.applications.ProcessStatsSummary;
|
import com.android.settings.applications.ProcessStatsSummary;
|
||||||
import com.android.settings.applications.ProcessStatsUi;
|
import com.android.settings.applications.ProcessStatsUi;
|
||||||
import com.android.settings.applications.DirectoryAccessDetails;
|
|
||||||
import com.android.settings.applications.UsageAccessDetails;
|
import com.android.settings.applications.UsageAccessDetails;
|
||||||
import com.android.settings.applications.VrListenerSettings;
|
import com.android.settings.applications.VrListenerSettings;
|
||||||
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
|
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
|
||||||
@@ -59,9 +59,9 @@ import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFrag
|
|||||||
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
|
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
|
||||||
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
|
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
|
||||||
import com.android.settings.connecteddevice.usb.UsbDetailsFragment;
|
import com.android.settings.connecteddevice.usb.UsbDetailsFragment;
|
||||||
import com.android.settings.datausage.DataPlanUsageSummary;
|
|
||||||
import com.android.settings.datausage.DataUsageList;
|
import com.android.settings.datausage.DataUsageList;
|
||||||
import com.android.settings.datausage.DataUsageSummary;
|
import com.android.settings.datausage.DataUsageSummary;
|
||||||
|
import com.android.settings.datausage.DataUsageSummaryLegacy;
|
||||||
import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
|
import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
|
||||||
import com.android.settings.development.DevelopmentSettingsDashboardFragment;
|
import com.android.settings.development.DevelopmentSettingsDashboardFragment;
|
||||||
import com.android.settings.deviceinfo.DeviceInfoSettings;
|
import com.android.settings.deviceinfo.DeviceInfoSettings;
|
||||||
@@ -187,8 +187,8 @@ public class SettingsGateway {
|
|||||||
PickupGestureSettings.class.getName(),
|
PickupGestureSettings.class.getName(),
|
||||||
DoubleTwistGestureSettings.class.getName(),
|
DoubleTwistGestureSettings.class.getName(),
|
||||||
CryptKeeperSettings.class.getName(),
|
CryptKeeperSettings.class.getName(),
|
||||||
DataPlanUsageSummary.class.getName(),
|
|
||||||
DataUsageSummary.class.getName(),
|
DataUsageSummary.class.getName(),
|
||||||
|
DataUsageSummaryLegacy.class.getName(),
|
||||||
DreamSettings.class.getName(),
|
DreamSettings.class.getName(),
|
||||||
UserSettings.class.getName(),
|
UserSettings.class.getName(),
|
||||||
NotificationAccessSettings.class.getName(),
|
NotificationAccessSettings.class.getName(),
|
||||||
@@ -273,7 +273,6 @@ public class SettingsGateway {
|
|||||||
SupportDashboardActivity.class.getName(),
|
SupportDashboardActivity.class.getName(),
|
||||||
// Home page > Network & Internet
|
// Home page > Network & Internet
|
||||||
Settings.WifiSettingsActivity.class.getName(),
|
Settings.WifiSettingsActivity.class.getName(),
|
||||||
Settings.DataPlanUsageSummaryActivity.class.getName(),
|
|
||||||
Settings.DataUsageSummaryActivity.class.getName(),
|
Settings.DataUsageSummaryActivity.class.getName(),
|
||||||
Settings.SimSettingsActivity.class.getName(),
|
Settings.SimSettingsActivity.class.getName(),
|
||||||
// Home page > Connected devices
|
// Home page > Connected devices
|
||||||
|
|||||||
@@ -33,21 +33,18 @@ import android.support.annotation.VisibleForTesting;
|
|||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.FeatureFlagUtils;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.core.FeatureFlags;
|
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
|
import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
|
||||||
import com.android.settingslib.drawer.CategoryManager;
|
import com.android.settingslib.drawer.CategoryManager;
|
||||||
import com.android.settingslib.drawer.DashboardCategory;
|
import com.android.settingslib.drawer.DashboardCategory;
|
||||||
import com.android.settingslib.drawer.ProfileSelectDialog;
|
import com.android.settingslib.drawer.ProfileSelectDialog;
|
||||||
import com.android.settingslib.drawer.SettingsDrawerActivity;
|
|
||||||
import com.android.settingslib.drawer.Tile;
|
import com.android.settingslib.drawer.Tile;
|
||||||
import com.android.settingslib.drawer.TileUtils;
|
import com.android.settingslib.drawer.TileUtils;
|
||||||
import com.android.settingslib.utils.ThreadUtils;
|
import com.android.settingslib.utils.ThreadUtils;
|
||||||
@@ -212,7 +209,6 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
|||||||
final Intent intent = new Intent(tile.intent)
|
final Intent intent = new Intent(tile.intent)
|
||||||
.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
|
.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
|
||||||
MetricsEvent.DASHBOARD_SUMMARY)
|
MetricsEvent.DASHBOARD_SUMMARY)
|
||||||
.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true)
|
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||||
launchIntentOrSelectProfile(activity, tile, intent, MetricsEvent.DASHBOARD_SUMMARY);
|
launchIntentOrSelectProfile(activity, tile, intent, MetricsEvent.DASHBOARD_SUMMARY);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.datausage;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Feature provider for data plan feature.
|
|
||||||
*/
|
|
||||||
public interface DataPlanFeatureProvider {
|
|
||||||
/**
|
|
||||||
* @return whether data plan feature is enabled.
|
|
||||||
*/
|
|
||||||
boolean isEnabled();
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.datausage;
|
|
||||||
|
|
||||||
import android.os.SystemProperties;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Impl for data plan feature provider.
|
|
||||||
*/
|
|
||||||
public final class DataPlanFeatureProviderImpl implements DataPlanFeatureProvider {
|
|
||||||
private static final String ENABLE_SETTINGS_DATA_PLAN = "enable.settings.data.plan";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled() {
|
|
||||||
return SystemProperties.getBoolean(ENABLE_SETTINGS_DATA_PLAN, false /* default */);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
|
|
||||||
* except in compliance with the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the
|
|
||||||
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the specific language governing
|
|
||||||
* permissions and limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.datausage;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.support.annotation.ColorRes;
|
|
||||||
import android.support.v7.preference.Preference;
|
|
||||||
import android.support.v7.preference.PreferenceViewHolder;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.widget.DonutView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides a summary of data plans as preferences on settings page.
|
|
||||||
*/
|
|
||||||
public final class DataPlanSummaryPreference extends Preference {
|
|
||||||
private String mName;
|
|
||||||
private String mDescription;
|
|
||||||
private double mPercentageUsage;
|
|
||||||
private int mUsageTextColor;
|
|
||||||
private int mMeterBackgroundColor;
|
|
||||||
private int mMeterConsumedColor;
|
|
||||||
|
|
||||||
public DataPlanSummaryPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
setLayoutResource(R.layout.settings_data_plan_summary_preference);
|
|
||||||
}
|
|
||||||
|
|
||||||
public DataPlanSummaryPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
setLayoutResource(R.layout.settings_data_plan_summary_preference);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String planName) {
|
|
||||||
mName = planName;
|
|
||||||
notifyChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDescription(String planDescription) {
|
|
||||||
mDescription = planDescription;
|
|
||||||
notifyChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPercentageUsage(double percentageUsage) {
|
|
||||||
mPercentageUsage = percentageUsage;
|
|
||||||
notifyChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUsageTextColor(@ColorRes int planUsageTextColor) {
|
|
||||||
mUsageTextColor = planUsageTextColor;
|
|
||||||
notifyChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMeterBackgroundColor(@ColorRes int meterBackgroundColor) {
|
|
||||||
mMeterBackgroundColor = meterBackgroundColor;
|
|
||||||
notifyChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMeterConsumedColor(@ColorRes int meterConsumedColor) {
|
|
||||||
mMeterConsumedColor = meterConsumedColor;
|
|
||||||
notifyChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(PreferenceViewHolder holder) {
|
|
||||||
super.onBindViewHolder(holder);
|
|
||||||
holder.setDividerAllowedAbove(false);
|
|
||||||
TextView titleView = (TextView) holder.findViewById(android.R.id.title);
|
|
||||||
titleView.setTextColor(mUsageTextColor);
|
|
||||||
((TextView) holder.findViewById(android.R.id.text1)).setText(mName);
|
|
||||||
((TextView) holder.findViewById(android.R.id.text2)).setText(mDescription);
|
|
||||||
DonutView donutView = (DonutView) holder.findViewById(R.id.donut);
|
|
||||||
donutView.setPercentage(mPercentageUsage);
|
|
||||||
donutView.setMeterBackgroundColor(mMeterBackgroundColor);
|
|
||||||
donutView.setMeterConsumedColor(mMeterConsumedColor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
* Copyright (C) 2016 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
|
* 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
|
* except in compliance with the License. You may obtain a copy of the License at
|
||||||
@@ -14,68 +14,75 @@
|
|||||||
|
|
||||||
package com.android.settings.datausage;
|
package com.android.settings.datausage;
|
||||||
|
|
||||||
import static android.net.NetworkPolicy.LIMIT_DISABLED;
|
|
||||||
|
|
||||||
import android.annotation.IdRes;
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.NetworkPolicy;
|
|
||||||
import android.net.NetworkPolicyManager;
|
import android.net.NetworkPolicyManager;
|
||||||
import android.net.NetworkTemplate;
|
import android.net.NetworkTemplate;
|
||||||
import android.net.wifi.WifiConfiguration;
|
|
||||||
import android.net.wifi.WifiManager;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
import android.provider.Settings;
|
import android.provider.SearchIndexableResource;
|
||||||
import android.support.annotation.VisibleForTesting;
|
import android.support.annotation.VisibleForTesting;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.support.v7.preference.PreferenceCategory;
|
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
import android.telephony.SubscriptionInfo;
|
import android.telephony.SubscriptionInfo;
|
||||||
import android.telephony.SubscriptionManager;
|
import android.telephony.SubscriptionManager;
|
||||||
|
import android.text.BidiFormatter;
|
||||||
|
import android.text.Spannable;
|
||||||
|
import android.text.SpannableString;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.format.Formatter;
|
import android.text.format.Formatter;
|
||||||
|
import android.text.style.RelativeSizeSpan;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.SummaryPreference;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.dashboard.SummaryLoader;
|
import com.android.settings.dashboard.SummaryLoader;
|
||||||
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
|
import com.android.settings.search.Indexable;
|
||||||
import com.android.settingslib.NetworkPolicyEditor;
|
import com.android.settingslib.NetworkPolicyEditor;
|
||||||
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
import com.android.settingslib.net.DataUsageController;
|
import com.android.settingslib.net.DataUsageController;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated This fragment was supposed to be new version of {@link DataUsageSummary} however
|
* Legacy {@link DataUsageSummary} fragment.
|
||||||
* unfinished and used nowhere. Keep it in case we may bring it back someday.
|
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
public class DataUsageSummaryLegacy extends DataUsageBaseFragment implements Indexable,
|
||||||
public class DataPlanUsageSummary extends DataUsageBase {
|
DataUsageEditController {
|
||||||
|
|
||||||
public static final String KEY_DATA_PLAN_USAGE = "data_plan_usage";
|
private static final String TAG = "DataUsageSummaryLegacy";
|
||||||
|
|
||||||
public static final String KEY_STATUS_HEADER = "status_header";
|
static final boolean LOGD = false;
|
||||||
public static final String KEY_LIMIT_SUMMARY = "plan_summary";
|
|
||||||
|
public static final String KEY_RESTRICT_BACKGROUND = "restrict_background";
|
||||||
|
|
||||||
|
private static final String KEY_STATUS_HEADER = "status_header";
|
||||||
|
private static final String KEY_LIMIT_SUMMARY = "limit_summary";
|
||||||
|
|
||||||
// Mobile data keys
|
// Mobile data keys
|
||||||
public static final String KEY_MOBILE_USAGE_TITLE = "data_usage_mobile_category";
|
public static final String KEY_MOBILE_USAGE_TITLE = "mobile_category";
|
||||||
public static final String KEY_MOBILE_DATA_USAGE_TOGGLE = "data_usage_enable";
|
public static final String KEY_MOBILE_DATA_USAGE_TOGGLE = "data_usage_enable";
|
||||||
|
public static final String KEY_MOBILE_DATA_USAGE = "cellular_data_usage";
|
||||||
|
public static final String KEY_MOBILE_BILLING_CYCLE = "billing_preference";
|
||||||
|
|
||||||
// Wifi keys
|
// Wifi keys
|
||||||
public static final String KEY_WIFI_USAGE_TITLE = "wifi_category";
|
public static final String KEY_WIFI_USAGE_TITLE = "wifi_category";
|
||||||
public static final String KEY_WIFI_DATA_USAGE = "wifi_data_usage";
|
public static final String KEY_WIFI_DATA_USAGE = "wifi_data_usage";
|
||||||
public static final String KEY_NETWORK_RESTRICTIONS = "network_restrictions";
|
|
||||||
|
|
||||||
private DataUsageController mDataUsageController;
|
private DataUsageController mDataUsageController;
|
||||||
private DataUsageInfoController mDataInfoController;
|
private DataUsageInfoController mDataInfoController;
|
||||||
private List<DataPlanSummaryPreference> mDataPlanSummaryPreferenceList;
|
private SummaryPreference mSummaryPreference;
|
||||||
private Preference mLimitPreference;
|
private Preference mLimitPreference;
|
||||||
private NetworkTemplate mDefaultTemplate;
|
private NetworkTemplate mDefaultTemplate;
|
||||||
private NetworkRestrictionsPreference mNetworkRestrictionPreference;
|
private int mDataUsageTemplate;
|
||||||
private WifiManager mWifiManager;
|
|
||||||
private NetworkPolicyEditor mPolicyEditor;
|
private NetworkPolicyEditor mPolicyEditor;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -84,34 +91,58 @@ public class DataPlanUsageSummary extends DataUsageBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle bundle) {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onCreate(bundle);
|
super.onCreate(icicle);
|
||||||
|
|
||||||
final Context context = getContext();
|
final Context context = getContext();
|
||||||
NetworkPolicyManager policyManager = NetworkPolicyManager.from(context);
|
NetworkPolicyManager policyManager = NetworkPolicyManager.from(context);
|
||||||
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
|
||||||
mPolicyEditor = new NetworkPolicyEditor(policyManager);
|
mPolicyEditor = new NetworkPolicyEditor(policyManager);
|
||||||
|
|
||||||
|
boolean hasMobileData = DataUsageUtils.hasMobileData(context);
|
||||||
mDataUsageController = new DataUsageController(context);
|
mDataUsageController = new DataUsageController(context);
|
||||||
mDataInfoController = new DataUsageInfoController();
|
mDataInfoController = new DataUsageInfoController();
|
||||||
|
|
||||||
int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(context);
|
int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(context);
|
||||||
boolean hasMobileData = DataUsageUtils.hasMobileData(context);
|
|
||||||
if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
|
if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
|
||||||
hasMobileData = false;
|
hasMobileData = false;
|
||||||
}
|
}
|
||||||
mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, defaultSubId);
|
mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, defaultSubId);
|
||||||
|
mSummaryPreference = (SummaryPreference) findPreference(KEY_STATUS_HEADER);
|
||||||
|
|
||||||
if (hasMobileData) {
|
if (!hasMobileData || !isAdmin()) {
|
||||||
addDataPlanSection(defaultSubId);
|
removePreference(KEY_RESTRICT_BACKGROUND);
|
||||||
}
|
}
|
||||||
|
if (hasMobileData) {
|
||||||
if (DataUsageUtils.hasWifiRadio(context)) {
|
mLimitPreference = findPreference(KEY_LIMIT_SUMMARY);
|
||||||
|
List<SubscriptionInfo> subscriptions =
|
||||||
|
services.mSubscriptionManager.getActiveSubscriptionInfoList();
|
||||||
|
if (subscriptions == null || subscriptions.size() == 0) {
|
||||||
|
addMobileSection(defaultSubId);
|
||||||
|
}
|
||||||
|
for (int i = 0; subscriptions != null && i < subscriptions.size(); i++) {
|
||||||
|
SubscriptionInfo subInfo = subscriptions.get(i);
|
||||||
|
if (subscriptions.size() > 1) {
|
||||||
|
addMobileSection(subInfo.getSubscriptionId(), subInfo);
|
||||||
|
} else {
|
||||||
|
addMobileSection(subInfo.getSubscriptionId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mSummaryPreference.setSelectable(true);
|
||||||
|
} else {
|
||||||
|
removePreference(KEY_LIMIT_SUMMARY);
|
||||||
|
mSummaryPreference.setSelectable(false);
|
||||||
|
}
|
||||||
|
boolean hasWifiRadio = DataUsageUtils.hasWifiRadio(context);
|
||||||
|
if (hasWifiRadio) {
|
||||||
addWifiSection();
|
addWifiSection();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasEthernet(context)) {
|
if (hasEthernet(context)) {
|
||||||
addEthernetSection();
|
addEthernetSection();
|
||||||
}
|
}
|
||||||
|
mDataUsageTemplate = hasMobileData ? R.string.cell_data_template
|
||||||
|
: hasWifiRadio ? R.string.wifi_data_template
|
||||||
|
: R.string.ethernet_data_template;
|
||||||
|
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +158,9 @@ public class DataPlanUsageSummary extends DataUsageBase {
|
|||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case R.id.data_usage_menu_cellular_networks: {
|
case R.id.data_usage_menu_cellular_networks: {
|
||||||
final Intent intent = new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS);
|
final Intent intent = new Intent(Intent.ACTION_MAIN);
|
||||||
|
intent.setComponent(new ComponentName("com.android.phone",
|
||||||
|
"com.android.phone.MobileNetworkSettings"));
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -135,52 +168,28 @@ public class DataPlanUsageSummary extends DataUsageBase {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addDataPlanSection(int defaultSubId) {
|
@Override
|
||||||
Context context = getPrefContext();
|
public boolean onPreferenceTreeClick(Preference preference) {
|
||||||
addPreferencesFromResource(R.xml.data_plan_usage);
|
if (preference == findPreference(KEY_STATUS_HEADER)) {
|
||||||
PreferenceScreen screen = getPreferenceScreen();
|
BillingCycleSettings.BytesEditorFragment.show(this, false);
|
||||||
screen.setTitle(context.getString(R.string.data_usage_summary_title));
|
return false;
|
||||||
|
}
|
||||||
PreferenceCategory preferenceCategory =
|
return super.onPreferenceTreeClick(preference);
|
||||||
(PreferenceCategory) findPreference(KEY_DATA_PLAN_USAGE);
|
|
||||||
screen.addPreference(preferenceCategory);
|
|
||||||
|
|
||||||
Preference dataPlansSyncTimePreference = new Preference(context);
|
|
||||||
dataPlansSyncTimePreference.setLayoutResource(R.layout.data_plans_sync_time_preference);
|
|
||||||
dataPlansSyncTimePreference.setTitle(MockDataPlanUsage.SYNC_TIME);
|
|
||||||
preferenceCategory.addPreference(dataPlansSyncTimePreference);
|
|
||||||
|
|
||||||
mDataPlanSummaryPreferenceList = new ArrayList<>(MockDataPlanUsage.DATA_PLAN_USAGES.length);
|
|
||||||
for (int i = 0; i < MockDataPlanUsage.DATA_PLAN_USAGES.length; i++) {
|
|
||||||
DataPlanSummaryPreference dataPlanSummaryPreference =
|
|
||||||
new DataPlanSummaryPreference(context);
|
|
||||||
dataPlanSummaryPreference.setKey(KEY_STATUS_HEADER + (i + 1));
|
|
||||||
mDataPlanSummaryPreferenceList.add(dataPlanSummaryPreference);
|
|
||||||
preferenceCategory.addPreference(dataPlanSummaryPreference);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Preference preference = new Preference(context);
|
@Override
|
||||||
preference.setLayoutResource(R.layout.manage_data_plans_preference);
|
protected int getPreferenceScreenResId() {
|
||||||
preferenceCategory.addPreference(preference);
|
return R.xml.data_usage_legacy;
|
||||||
setPreferenceScreen(screen);
|
|
||||||
|
|
||||||
mLimitPreference = findPreference(KEY_LIMIT_SUMMARY);
|
|
||||||
List<SubscriptionInfo> subscriptions =
|
|
||||||
services.mSubscriptionManager.getActiveSubscriptionInfoList();
|
|
||||||
|
|
||||||
if (subscriptions == null || subscriptions.isEmpty()) {
|
|
||||||
addMobileSection(defaultSubId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0, subscriptionsSize = subscriptions != null ? subscriptions.size() : 0;
|
@Override
|
||||||
i < subscriptionsSize; i++) {
|
protected String getLogTag() {
|
||||||
SubscriptionInfo subInfo = subscriptions.get(i);
|
return TAG;
|
||||||
if (subscriptionsSize > 1) {
|
|
||||||
addMobileSection(subInfo.getSubscriptionId(), subInfo);
|
|
||||||
} else {
|
|
||||||
addMobileSection(subInfo.getSubscriptionId());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addMobileSection(int subId) {
|
private void addMobileSection(int subId) {
|
||||||
@@ -189,7 +198,7 @@ public class DataPlanUsageSummary extends DataUsageBase {
|
|||||||
|
|
||||||
private void addMobileSection(int subId, SubscriptionInfo subInfo) {
|
private void addMobileSection(int subId, SubscriptionInfo subInfo) {
|
||||||
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
|
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
|
||||||
inflatePreferences(R.xml.data_plan_usage_cell_data_preference_screen);
|
inflatePreferences(R.xml.data_usage_cellular);
|
||||||
category.setTemplate(getNetworkTemplate(subId), subId, services);
|
category.setTemplate(getNetworkTemplate(subId), subId, services);
|
||||||
category.pushTemplates(services);
|
category.pushTemplates(services);
|
||||||
if (subInfo != null && !TextUtils.isEmpty(subInfo.getDisplayName())) {
|
if (subInfo != null && !TextUtils.isEmpty(subInfo.getDisplayName())) {
|
||||||
@@ -201,18 +210,16 @@ public class DataPlanUsageSummary extends DataUsageBase {
|
|||||||
private void addWifiSection() {
|
private void addWifiSection() {
|
||||||
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
|
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
|
||||||
inflatePreferences(R.xml.data_usage_wifi);
|
inflatePreferences(R.xml.data_usage_wifi);
|
||||||
category.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(), 0 /* subId */, services);
|
category.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(), 0, services);
|
||||||
mNetworkRestrictionPreference =
|
|
||||||
(NetworkRestrictionsPreference) category.findPreference(KEY_NETWORK_RESTRICTIONS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addEthernetSection() {
|
private void addEthernetSection() {
|
||||||
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
|
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
|
||||||
inflatePreferences(R.xml.data_usage_ethernet);
|
inflatePreferences(R.xml.data_usage_ethernet);
|
||||||
category.setTemplate(NetworkTemplate.buildTemplateEthernet(), 0 /* subId */, services);
|
category.setTemplate(NetworkTemplate.buildTemplateEthernet(), 0, services);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Preference inflatePreferences(@IdRes int resId) {
|
private Preference inflatePreferences(int resId) {
|
||||||
PreferenceScreen rootPreferences = getPreferenceManager().inflateFromResource(
|
PreferenceScreen rootPreferences = getPreferenceManager().inflateFromResource(
|
||||||
getPrefContext(), resId, null);
|
getPrefContext(), resId, null);
|
||||||
Preference pref = rootPreferences.getPreference(0);
|
Preference pref = rootPreferences.getPreference(0);
|
||||||
@@ -238,32 +245,51 @@ public class DataPlanUsageSummary extends DataUsageBase {
|
|||||||
updateState();
|
updateState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
static CharSequence formatUsage(Context context, String template, long usageLevel) {
|
||||||
|
final float LARGER_SIZE = 1.25f * 1.25f; // (1/0.8)^2
|
||||||
|
final float SMALLER_SIZE = 1.0f / LARGER_SIZE; // 0.8^2
|
||||||
|
final int FLAGS = Spannable.SPAN_INCLUSIVE_INCLUSIVE;
|
||||||
|
|
||||||
|
final Formatter.BytesResult usedResult = Formatter.formatBytes(context.getResources(),
|
||||||
|
usageLevel, Formatter.FLAG_CALCULATE_ROUNDED);
|
||||||
|
final SpannableString enlargedValue = new SpannableString(usedResult.value);
|
||||||
|
enlargedValue.setSpan(new RelativeSizeSpan(LARGER_SIZE), 0, enlargedValue.length(), FLAGS);
|
||||||
|
|
||||||
|
final SpannableString amountTemplate = new SpannableString(
|
||||||
|
context.getString(com.android.internal.R.string.fileSizeSuffix)
|
||||||
|
.replace("%1$s", "^1").replace("%2$s", "^2"));
|
||||||
|
final CharSequence formattedUsage = TextUtils.expandTemplate(amountTemplate,
|
||||||
|
enlargedValue, usedResult.units);
|
||||||
|
|
||||||
|
final SpannableString fullTemplate = new SpannableString(template);
|
||||||
|
fullTemplate.setSpan(new RelativeSizeSpan(SMALLER_SIZE), 0, fullTemplate.length(), FLAGS);
|
||||||
|
return TextUtils.expandTemplate(fullTemplate,
|
||||||
|
BidiFormatter.getInstance().unicodeWrap(formattedUsage.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
private void updateState() {
|
private void updateState() {
|
||||||
DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
|
DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
|
||||||
mDefaultTemplate);
|
mDefaultTemplate);
|
||||||
|
|
||||||
Context context = getContext();
|
Context context = getContext();
|
||||||
mDataInfoController.updateDataLimit(info,
|
mDataInfoController.updateDataLimit(info,
|
||||||
services.mPolicyEditor.getPolicy(mDefaultTemplate));
|
services.mPolicyEditor.getPolicy(mDefaultTemplate));
|
||||||
|
|
||||||
// TODO(b/63391323): Get rid of MockDataPlanUsage once we integrate with data plan APIs
|
if (mSummaryPreference != null) {
|
||||||
if (mDataPlanSummaryPreferenceList != null && !mDataPlanSummaryPreferenceList.isEmpty()) {
|
mSummaryPreference.setTitle(
|
||||||
MockDataPlanUsage[] dataPlanUsages = MockDataPlanUsage.getDataPlanUsage();
|
formatUsage(context, getString(mDataUsageTemplate), info.usageLevel));
|
||||||
for (int i = 0; i < dataPlanUsages.length; i++) {
|
final long limit = mDataInfoController.getSummaryLimit(info);
|
||||||
DataPlanSummaryPreference dataPlanSummaryPreference =
|
mSummaryPreference.setSummary(info.period);
|
||||||
mDataPlanSummaryPreferenceList.get(i);
|
if (limit <= 0) {
|
||||||
MockDataPlanUsage dataPlanUsage = dataPlanUsages[i];
|
mSummaryPreference.setChartEnabled(false);
|
||||||
dataPlanSummaryPreference.setTitle(dataPlanUsage.mUsage);
|
} else {
|
||||||
dataPlanSummaryPreference.setUsageTextColor(dataPlanUsage.mUsageTextColor);
|
mSummaryPreference.setChartEnabled(true);
|
||||||
dataPlanSummaryPreference.setName(dataPlanUsage.mName);
|
mSummaryPreference.setLabels(Formatter.formatFileSize(context, 0),
|
||||||
dataPlanSummaryPreference.setPercentageUsage(dataPlanUsage.mPercentageUsage);
|
Formatter.formatFileSize(context, limit));
|
||||||
dataPlanSummaryPreference
|
mSummaryPreference.setRatios(info.usageLevel / (float) limit, 0,
|
||||||
.setMeterBackgroundColor(dataPlanUsage.mMeterBackgroundColor);
|
(limit - info.usageLevel) / (float) limit);
|
||||||
dataPlanSummaryPreference.setMeterConsumedColor(dataPlanUsage.mMeterConsumedColor);
|
|
||||||
dataPlanSummaryPreference.setDescription(dataPlanUsage.mDescription);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mLimitPreference != null && (info.warningLevel > 0 || info.limitLevel > 0)) {
|
if (mLimitPreference != null && (info.warningLevel > 0 || info.limitLevel > 0)) {
|
||||||
String warning = Formatter.formatFileSize(context, info.warningLevel);
|
String warning = Formatter.formatFileSize(context, info.warningLevel);
|
||||||
String limit = Formatter.formatFileSize(context, info.limitLevel);
|
String limit = Formatter.formatFileSize(context, info.limitLevel);
|
||||||
@@ -273,10 +299,8 @@ public class DataPlanUsageSummary extends DataUsageBase {
|
|||||||
mLimitPreference.setSummary(null);
|
mLimitPreference.setSummary(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateNetworkRestrictionSummary(mNetworkRestrictionPreference);
|
|
||||||
|
|
||||||
PreferenceScreen screen = getPreferenceScreen();
|
PreferenceScreen screen = getPreferenceScreen();
|
||||||
for (int i = 1, preferenceCount = screen.getPreferenceCount(); i < preferenceCount; i++) {
|
for (int i = 1; i < screen.getPreferenceCount(); i++) {
|
||||||
((TemplatePreferenceCategory) screen.getPreference(i)).pushTemplates(services);
|
((TemplatePreferenceCategory) screen.getPreference(i)).pushTemplates(services);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -286,40 +310,19 @@ public class DataPlanUsageSummary extends DataUsageBase {
|
|||||||
return MetricsEvent.DATA_USAGE_SUMMARY;
|
return MetricsEvent.DATA_USAGE_SUMMARY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@Override
|
||||||
void updateNetworkRestrictionSummary(NetworkRestrictionsPreference preference) {
|
public NetworkPolicyEditor getNetworkPolicyEditor() {
|
||||||
if (preference == null) {
|
return services.mPolicyEditor;
|
||||||
return;
|
|
||||||
}
|
|
||||||
mPolicyEditor.read();
|
|
||||||
int count = 0;
|
|
||||||
List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
|
|
||||||
for (int i = 0, configuredNetworksSize = configuredNetworks.size();
|
|
||||||
i < configuredNetworksSize; i++) {
|
|
||||||
WifiConfiguration config = configuredNetworks.get(i);
|
|
||||||
if (isMetered(config)) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
preference.setSummary(getResources().getQuantityString(
|
|
||||||
R.plurals.network_restrictions_summary, count, count));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@Override
|
||||||
boolean isMetered(WifiConfiguration config) {
|
public NetworkTemplate getNetworkTemplate() {
|
||||||
if (config.SSID == null) {
|
return mDefaultTemplate;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
final String networkId = config.isPasspoint() ? config.providerFriendlyName : config.SSID;
|
|
||||||
final NetworkPolicy policy =
|
@Override
|
||||||
mPolicyEditor.getPolicyMaybeUnquoted(NetworkTemplate.buildTemplateWifi(networkId));
|
public void updateDataUsage() {
|
||||||
if (policy == null) {
|
updateState();
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (policy.limitBytes != LIMIT_DISABLED) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return policy.metered;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class SummaryProvider
|
private static class SummaryProvider
|
||||||
@@ -355,5 +358,51 @@ public class DataPlanUsageSummary extends DataUsageBase {
|
|||||||
|
|
||||||
public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
|
public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
|
||||||
= SummaryProvider::new;
|
= SummaryProvider::new;
|
||||||
}
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For search
|
||||||
|
*/
|
||||||
|
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||||
|
new BaseSearchIndexProvider() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
|
||||||
|
boolean enabled) {
|
||||||
|
List<SearchIndexableResource> resources = new ArrayList<>();
|
||||||
|
SearchIndexableResource resource = new SearchIndexableResource(context);
|
||||||
|
resource.xmlResId = R.xml.data_usage;
|
||||||
|
resources.add(resource);
|
||||||
|
|
||||||
|
resource = new SearchIndexableResource(context);
|
||||||
|
resource.xmlResId = R.xml.data_usage_cellular;
|
||||||
|
resources.add(resource);
|
||||||
|
|
||||||
|
resource = new SearchIndexableResource(context);
|
||||||
|
resource.xmlResId = R.xml.data_usage_wifi;
|
||||||
|
resources.add(resource);
|
||||||
|
|
||||||
|
return resources;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getNonIndexableKeys(Context context) {
|
||||||
|
List<String> keys = super.getNonIndexableKeys(context);
|
||||||
|
|
||||||
|
if (!DataUsageUtils.hasMobileData(context)) {
|
||||||
|
keys.add(KEY_MOBILE_USAGE_TITLE);
|
||||||
|
keys.add(KEY_MOBILE_DATA_USAGE_TOGGLE);
|
||||||
|
keys.add(KEY_MOBILE_DATA_USAGE);
|
||||||
|
keys.add(KEY_MOBILE_BILLING_CYCLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!DataUsageUtils.hasWifiRadio(context)) {
|
||||||
|
keys.add(KEY_WIFI_DATA_USAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This title is named Wifi, and will confuse users.
|
||||||
|
keys.add(KEY_WIFI_USAGE_TITLE);
|
||||||
|
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
|
|
||||||
* except in compliance with the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the
|
|
||||||
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the specific language governing
|
|
||||||
* permissions and limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.datausage;
|
|
||||||
|
|
||||||
import android.graphics.Color;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mock data plan usage data.
|
|
||||||
*/
|
|
||||||
@Deprecated // This class is only needed because we don't have working API yet.
|
|
||||||
final class MockDataPlanUsage {
|
|
||||||
static final MockDataPlanUsage[] DATA_PLAN_USAGES = new MockDataPlanUsage[3];
|
|
||||||
static final String SYNC_TIME = "Today 12:24pm";
|
|
||||||
final String mUsage;
|
|
||||||
final int mUsageTextColor;
|
|
||||||
final String mName;
|
|
||||||
final double mPercentageUsage;
|
|
||||||
final int mMeterBackgroundColor;
|
|
||||||
final int mMeterConsumedColor;
|
|
||||||
final String mDescription;
|
|
||||||
|
|
||||||
private MockDataPlanUsage(String usage, int usageTextColor, String name,
|
|
||||||
double percentageUsage, int meterBackgroundColor, int meterConsumedColor,
|
|
||||||
String description) {
|
|
||||||
mUsage = usage;
|
|
||||||
mUsageTextColor = usageTextColor;
|
|
||||||
mName = name;
|
|
||||||
mPercentageUsage = percentageUsage;
|
|
||||||
mMeterBackgroundColor = meterBackgroundColor;
|
|
||||||
mMeterConsumedColor = meterConsumedColor;
|
|
||||||
mDescription = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
static MockDataPlanUsage[] getDataPlanUsage() {
|
|
||||||
DATA_PLAN_USAGES[0] = new MockDataPlanUsage("100 MB and 14 days left",
|
|
||||||
Color.parseColor("#FF5C94F1"), "GigaMaxLite / 1GB", 0.27D,
|
|
||||||
Color.parseColor("#FFDBDCDC"), Color.parseColor("#FF5C94F1"),
|
|
||||||
"Premium plan from Telekomsel");
|
|
||||||
|
|
||||||
DATA_PLAN_USAGES[1] = new MockDataPlanUsage("1.25 GB and 14 days left",
|
|
||||||
Color.parseColor("#FF673AB7"), "GigaMaxLite 4G / 5GB", 0.47D,
|
|
||||||
Color.parseColor("#FFDBDCDC"), Color.parseColor("#FF673AB7"),
|
|
||||||
"Plenty of 4G data");
|
|
||||||
|
|
||||||
DATA_PLAN_USAGES[2] = new MockDataPlanUsage("700 MB and 14 days left",
|
|
||||||
Color.parseColor("#FF4CAF50"), "GigaMaxLite Video / 7GB", 0.67D,
|
|
||||||
Color.parseColor("#FFDBDCDC"), Color.parseColor("#FF4CAF50"),
|
|
||||||
"Use certain video apps for free");
|
|
||||||
return DATA_PLAN_USAGES;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -236,7 +236,6 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index
|
|||||||
Intent intent = Utils.onBuildStartFragmentIntent(getActivity(),
|
Intent intent = Utils.onBuildStartFragmentIntent(getActivity(),
|
||||||
StorageDashboardFragment.class.getName(), args, null,
|
StorageDashboardFragment.class.getName(), args, null,
|
||||||
R.string.storage_settings, null, false, getMetricsCategory());
|
R.string.storage_settings, null, false, getMetricsCategory());
|
||||||
intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
|
|
||||||
getActivity().startActivity(intent);
|
getActivity().startActivity(intent);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,6 @@ public class UserProfileController extends AbstractPreferenceController implemen
|
|||||||
Intent intent = Utils.onBuildStartFragmentIntent(mContext,
|
Intent intent = Utils.onBuildStartFragmentIntent(mContext,
|
||||||
StorageProfileFragment.class.getName(), args, null, 0,
|
StorageProfileFragment.class.getName(), args, null, 0,
|
||||||
mUser.name, false, MetricsProto.MetricsEvent.DEVICEINFO_STORAGE);
|
mUser.name, false, MetricsProto.MetricsEvent.DEVICEINFO_STORAGE);
|
||||||
intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
|
|
||||||
mContext.startActivity(intent);
|
mContext.startActivity(intent);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ import com.android.settingslib.applications.AppUtils;
|
|||||||
import com.android.settingslib.applications.ApplicationsState;
|
import com.android.settingslib.applications.ApplicationsState;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -284,10 +285,10 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
|
|||||||
final int powerMah = bundle.getInt(EXTRA_POWER_USAGE_AMOUNT);
|
final int powerMah = bundle.getInt(EXTRA_POWER_USAGE_AMOUNT);
|
||||||
mForegroundPreference.setSummary(
|
mForegroundPreference.setSummary(
|
||||||
TextUtils.expandTemplate(getText(R.string.battery_used_for),
|
TextUtils.expandTemplate(getText(R.string.battery_used_for),
|
||||||
Utils.formatElapsedTime(context, foregroundTimeMs, false)));
|
StringUtil.formatElapsedTime(context, foregroundTimeMs, false)));
|
||||||
mBackgroundPreference.setSummary(
|
mBackgroundPreference.setSummary(
|
||||||
TextUtils.expandTemplate(getText(R.string.battery_active_for),
|
TextUtils.expandTemplate(getText(R.string.battery_active_for),
|
||||||
Utils.formatElapsedTime(context, backgroundTimeMs, false)));
|
StringUtil.formatElapsedTime(context, backgroundTimeMs, false)));
|
||||||
mPowerUsagePreference.setSummary(
|
mPowerUsagePreference.setSummary(
|
||||||
getString(R.string.battery_detail_power_percentage, usagePercent, powerMah));
|
getString(R.string.battery_detail_power_percentage, usagePercent, powerMah));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
package com.android.settings.fuelgauge;
|
package com.android.settings.fuelgauge;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Fragment;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.BatteryStats;
|
import android.os.BatteryStats;
|
||||||
@@ -31,7 +30,6 @@ import android.support.annotation.VisibleForTesting;
|
|||||||
import android.support.v14.preference.PreferenceFragment;
|
import android.support.v14.preference.PreferenceFragment;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.support.v7.preference.PreferenceGroup;
|
import android.support.v7.preference.PreferenceGroup;
|
||||||
import android.support.v7.preference.PreferenceManager;
|
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
@@ -48,16 +46,14 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.core.FeatureFlags;
|
import com.android.settings.core.FeatureFlags;
|
||||||
import com.android.settings.core.PreferenceControllerMixin;
|
import com.android.settings.core.PreferenceControllerMixin;
|
||||||
import com.android.settings.Utils;
|
|
||||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
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.Lifecycle;
|
||||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||||
import com.android.settingslib.core.lifecycle.events.OnDestroy;
|
import com.android.settingslib.core.lifecycle.events.OnDestroy;
|
||||||
import com.android.settingslib.core.lifecycle.events.OnPause;
|
import com.android.settingslib.core.lifecycle.events.OnPause;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -362,8 +358,8 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro
|
|||||||
// Only show summary when usage time is longer than one minute
|
// Only show summary when usage time is longer than one minute
|
||||||
final long usageTimeMs = sipper.usageTimeMs;
|
final long usageTimeMs = sipper.usageTimeMs;
|
||||||
if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) {
|
if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) {
|
||||||
final CharSequence timeSequence = Utils.formatElapsedTime(mContext, usageTimeMs,
|
final CharSequence timeSequence =
|
||||||
false);
|
StringUtil.formatElapsedTime(mContext, usageTimeMs, false);
|
||||||
preference.setSummary(
|
preference.setSummary(
|
||||||
(sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper))
|
(sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper))
|
||||||
? timeSequence
|
? timeSequence
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import android.os.BatteryStats.HistoryItem;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.support.annotation.WorkerThread;
|
import android.support.annotation.WorkerThread;
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.text.format.Formatter;
|
import android.text.format.Formatter;
|
||||||
import android.util.SparseIntArray;
|
import android.util.SparseIntArray;
|
||||||
|
|
||||||
@@ -34,8 +33,14 @@ import com.android.settings.Utils;
|
|||||||
import com.android.settings.graph.UsageView;
|
import com.android.settings.graph.UsageView;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settingslib.R;
|
import com.android.settingslib.R;
|
||||||
|
import com.android.settingslib.utils.PowerUtil;
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class BatteryInfo {
|
public class BatteryInfo {
|
||||||
|
private static final long SEVEN_MINUTES_MICROS = TimeUnit.MINUTES.toMicros(7);
|
||||||
|
private static final long FIFTEEN_MINUTES_MICROS = TimeUnit.MINUTES.toMicros(15);
|
||||||
|
private static final long ONE_DAY_MICROS = TimeUnit.DAYS.toMicros(1);
|
||||||
|
|
||||||
public CharSequence chargeLabel;
|
public CharSequence chargeLabel;
|
||||||
public CharSequence remainingLabel;
|
public CharSequence remainingLabel;
|
||||||
@@ -100,7 +105,7 @@ public class BatteryInfo {
|
|||||||
if (lastTime >= 0) {
|
if (lastTime >= 0) {
|
||||||
points.put(lastTime, lastLevel);
|
points.put(lastTime, lastLevel);
|
||||||
points.put((int) (timePeriod +
|
points.put((int) (timePeriod +
|
||||||
BatteryUtils.convertUsToMs(remainingTimeUs)),
|
PowerUtil.convertUsToMs(remainingTimeUs)),
|
||||||
mCharging ? 100 : 0);
|
mCharging ? 100 : 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -160,7 +165,7 @@ public class BatteryInfo {
|
|||||||
PowerUsageFeatureProvider provider =
|
PowerUsageFeatureProvider provider =
|
||||||
FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
|
FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
|
||||||
final long elapsedRealtimeUs =
|
final long elapsedRealtimeUs =
|
||||||
BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
|
PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
|
||||||
|
|
||||||
Intent batteryBroadcast = context.registerReceiver(null,
|
Intent batteryBroadcast = context.registerReceiver(null,
|
||||||
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||||
@@ -176,7 +181,7 @@ public class BatteryInfo {
|
|||||||
.logRuntime(LOG_TAG, "time for enhanced BatteryInfo", startTime);
|
.logRuntime(LOG_TAG, "time for enhanced BatteryInfo", startTime);
|
||||||
return BatteryInfo.getBatteryInfo(context, batteryBroadcast, stats,
|
return BatteryInfo.getBatteryInfo(context, batteryBroadcast, stats,
|
||||||
elapsedRealtimeUs, shortString,
|
elapsedRealtimeUs, shortString,
|
||||||
BatteryUtils.convertMsToUs(estimate.estimateMillis),
|
PowerUtil.convertMsToUs(estimate.estimateMillis),
|
||||||
estimate.isBasedOnUsage);
|
estimate.isBasedOnUsage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -217,40 +222,29 @@ public class BatteryInfo {
|
|||||||
|
|
||||||
info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast);
|
info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast);
|
||||||
if (!info.mCharging) {
|
if (!info.mCharging) {
|
||||||
if (drainTimeUs > 0) {
|
updateBatteryInfoDischarging(context, shortString, drainTimeUs, basedOnUsage, info);
|
||||||
info.remainingTimeUs = drainTimeUs;
|
|
||||||
CharSequence timeString = Utils.formatElapsedTime(context,
|
|
||||||
BatteryUtils.convertUsToMs(drainTimeUs), false /* withSeconds */);
|
|
||||||
info.remainingLabel = TextUtils.expandTemplate(context.getText(shortString ?
|
|
||||||
R.string.power_remaining_duration_only_short :
|
|
||||||
(basedOnUsage ?
|
|
||||||
R.string.power_remaining_duration_only_enhanced :
|
|
||||||
R.string.power_remaining_duration_only)), timeString);
|
|
||||||
info.chargeLabel = TextUtils.expandTemplate(context.getText(
|
|
||||||
shortString ?
|
|
||||||
R.string.power_discharging_duration_short :
|
|
||||||
basedOnUsage ?
|
|
||||||
R.string.power_discharging_duration_enhanced :
|
|
||||||
R.string.power_discharging_duration),
|
|
||||||
info.batteryPercentString, timeString);
|
|
||||||
} else {
|
} else {
|
||||||
info.remainingLabel = null;
|
updateBatteryInfoCharging(context, batteryBroadcast, stats, elapsedRealtimeUs, info);
|
||||||
info.chargeLabel = info.batteryPercentString;
|
|
||||||
}
|
}
|
||||||
} else {
|
BatteryUtils.logRuntime(LOG_TAG, "time for getBatteryInfo", startTime);
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void updateBatteryInfoCharging(Context context, Intent batteryBroadcast,
|
||||||
|
BatteryStats stats, long elapsedRealtimeUs, BatteryInfo info) {
|
||||||
|
final Resources resources = context.getResources();
|
||||||
final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs);
|
final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs);
|
||||||
final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
|
final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
|
||||||
BatteryManager.BATTERY_STATUS_UNKNOWN);
|
BatteryManager.BATTERY_STATUS_UNKNOWN);
|
||||||
info.discharging = false;
|
info.discharging = false;
|
||||||
if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) {
|
if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) {
|
||||||
info.remainingTimeUs = chargeTime;
|
info.remainingTimeUs = chargeTime;
|
||||||
CharSequence timeString = Utils.formatElapsedTime(context,
|
CharSequence timeString = StringUtil.formatElapsedTime(context,
|
||||||
BatteryUtils.convertUsToMs(chargeTime), false /* withSeconds */);
|
PowerUtil.convertUsToMs(info.remainingTimeUs), false /* withSeconds */);
|
||||||
int resId = R.string.power_charging_duration;
|
int resId = R.string.power_charging_duration;
|
||||||
info.remainingLabel = TextUtils.expandTemplate(context.getText(
|
info.remainingLabel = context.getString(
|
||||||
R.string.power_remaining_charging_duration_only), timeString);
|
R.string.power_remaining_charging_duration_only, timeString);
|
||||||
info.chargeLabel = TextUtils.expandTemplate(context.getText(resId),
|
info.chargeLabel = context.getString(resId, info.batteryPercentString, timeString);
|
||||||
info.batteryPercentString, timeString);
|
|
||||||
} else {
|
} else {
|
||||||
final String chargeStatusLabel = resources.getString(
|
final String chargeStatusLabel = resources.getString(
|
||||||
R.string.battery_info_status_charging_lower);
|
R.string.battery_info_status_charging_lower);
|
||||||
@@ -260,8 +254,27 @@ public class BatteryInfo {
|
|||||||
chargeStatusLabel);
|
chargeStatusLabel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BatteryUtils.logRuntime(LOG_TAG, "time for getBatteryInfo", startTime);
|
|
||||||
return info;
|
private static void updateBatteryInfoDischarging(Context context, boolean shortString,
|
||||||
|
long drainTimeUs, boolean basedOnUsage, BatteryInfo info) {
|
||||||
|
if (drainTimeUs > 0) {
|
||||||
|
info.remainingTimeUs = drainTimeUs;
|
||||||
|
info.remainingLabel = PowerUtil.getBatteryRemainingStringFormatted(
|
||||||
|
context,
|
||||||
|
PowerUtil.convertUsToMs(drainTimeUs),
|
||||||
|
null /* percentageString */,
|
||||||
|
basedOnUsage && !shortString
|
||||||
|
);
|
||||||
|
info.chargeLabel = PowerUtil.getBatteryRemainingStringFormatted(
|
||||||
|
context,
|
||||||
|
PowerUtil.convertUsToMs(drainTimeUs),
|
||||||
|
info.batteryPercentString,
|
||||||
|
basedOnUsage && !shortString
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
info.remainingLabel = null;
|
||||||
|
info.chargeLabel = info.batteryPercentString;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface BatteryDataParser {
|
public interface BatteryDataParser {
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.PowerUtil;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -68,19 +69,18 @@ public class BatteryUtils {
|
|||||||
int BACKGROUND = 2;
|
int BACKGROUND = 2;
|
||||||
int ALL = 3;
|
int ALL = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String TAG = "BatteryUtils";
|
private static final String TAG = "BatteryUtils";
|
||||||
|
|
||||||
private static final int MIN_POWER_THRESHOLD_MILLI_AMP = 5;
|
private static final int MIN_POWER_THRESHOLD_MILLI_AMP = 5;
|
||||||
|
|
||||||
private static final int SECONDS_IN_HOUR = 60 * 60;
|
private static final int SECONDS_IN_HOUR = 60 * 60;
|
||||||
private static BatteryUtils sInstance;
|
private static BatteryUtils sInstance;
|
||||||
|
|
||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
|
|
||||||
private AppOpsManager mAppOpsManager;
|
private AppOpsManager mAppOpsManager;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
PowerUsageFeatureProvider mPowerUsageFeatureProvider;
|
PowerUsageFeatureProvider mPowerUsageFeatureProvider;
|
||||||
|
|
||||||
public static BatteryUtils getInstance(Context context) {
|
public static BatteryUtils getInstance(Context context) {
|
||||||
if (sInstance == null || sInstance.isDataCorrupted()) {
|
if (sInstance == null || sInstance.isDataCorrupted()) {
|
||||||
sInstance = new BatteryUtils(context);
|
sInstance = new BatteryUtils(context);
|
||||||
@@ -131,29 +131,30 @@ public class BatteryUtils {
|
|||||||
|
|
||||||
// Return the min value of STATE_TOP time and foreground activity time, since both of these
|
// Return the min value of STATE_TOP time and foreground activity time, since both of these
|
||||||
// time have some errors
|
// time have some errors
|
||||||
return convertUsToMs(
|
return PowerUtil.convertUsToMs(
|
||||||
Math.min(timeUs, getForegroundActivityTotalTimeUs(uid, rawRealTimeUs)));
|
Math.min(timeUs, getForegroundActivityTotalTimeUs(uid, rawRealTimeUs)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private long getScreenUsageTimeMs(BatteryStats.Uid uid, int which) {
|
private long getScreenUsageTimeMs(BatteryStats.Uid uid, int which) {
|
||||||
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
|
||||||
return getScreenUsageTimeMs(uid, which, rawRealTimeUs);
|
return getScreenUsageTimeMs(uid, which, rawRealTimeUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) {
|
private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) {
|
||||||
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
|
||||||
final long timeUs = uid.getProcessStateTime(
|
final long timeUs = uid.getProcessStateTime(
|
||||||
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which);
|
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which);
|
||||||
|
|
||||||
Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid()));
|
Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid()));
|
||||||
Log.v(TAG, "background time(us): " + timeUs);
|
Log.v(TAG, "background time(us): " + timeUs);
|
||||||
return convertUsToMs(timeUs);
|
return PowerUtil.convertUsToMs(timeUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) {
|
private long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) {
|
||||||
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
|
||||||
return getScreenUsageTimeMs(uid, which, rawRealTimeUs)
|
return getScreenUsageTimeMs(uid, which, rawRealTimeUs)
|
||||||
+ convertUsToMs(getForegroundServiceTotalTimeUs(uid, rawRealTimeUs));
|
+ PowerUtil.convertUsToMs(
|
||||||
|
getForegroundServiceTotalTimeUs(uid, rawRealTimeUs));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -267,9 +268,10 @@ public class BatteryUtils {
|
|||||||
*/
|
*/
|
||||||
public long calculateRunningTimeBasedOnStatsType(BatteryStatsHelper batteryStatsHelper,
|
public long calculateRunningTimeBasedOnStatsType(BatteryStatsHelper batteryStatsHelper,
|
||||||
int statsType) {
|
int statsType) {
|
||||||
final long elapsedRealtimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
|
||||||
|
SystemClock.elapsedRealtime());
|
||||||
// Return the battery time (millisecond) on status mStatsType
|
// Return the battery time (millisecond) on status mStatsType
|
||||||
return convertUsToMs(
|
return PowerUtil.convertUsToMs(
|
||||||
batteryStatsHelper.getStats().computeBatteryRealtime(elapsedRealtimeUs, statsType));
|
batteryStatsHelper.getStats().computeBatteryRealtime(elapsedRealtimeUs, statsType));
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -390,25 +392,15 @@ public class BatteryUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long convertUsToMs(long timeUs) {
|
|
||||||
return timeUs / 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static long convertMsToUs(long timeMs) {
|
|
||||||
return timeMs * 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setForceAppStandby(int uid, String packageName,
|
public void setForceAppStandby(int uid, String packageName,
|
||||||
int mode) {
|
int mode) {
|
||||||
final boolean isPreOApp = isLegacyApp(packageName);
|
final boolean isPreOApp = isLegacyApp(packageName);
|
||||||
if (isPreOApp) {
|
if (isPreOApp) {
|
||||||
// Control whether app could run in the background if it is pre O app
|
// Control whether app could run in the background if it is pre O app
|
||||||
mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName,
|
mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName, mode);
|
||||||
mode);
|
|
||||||
}
|
}
|
||||||
// Control whether app could run jobs in the background
|
// Control whether app could run jobs in the background
|
||||||
mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName,
|
mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName, mode);
|
||||||
mode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle,
|
public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle,
|
||||||
@@ -425,7 +417,8 @@ public class BatteryUtils {
|
|||||||
// Stuff we always need to get BatteryInfo
|
// Stuff we always need to get BatteryInfo
|
||||||
final Intent batteryBroadcast = mContext.registerReceiver(null,
|
final Intent batteryBroadcast = mContext.registerReceiver(null,
|
||||||
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||||
final long elapsedRealtimeUs = BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
|
final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
|
||||||
|
SystemClock.elapsedRealtime());
|
||||||
BatteryInfo batteryInfo;
|
BatteryInfo batteryInfo;
|
||||||
|
|
||||||
// 0 means we are discharging, anything else means charging
|
// 0 means we are discharging, anything else means charging
|
||||||
@@ -443,7 +436,7 @@ public class BatteryUtils {
|
|||||||
if (estimate != null) {
|
if (estimate != null) {
|
||||||
batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats,
|
batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats,
|
||||||
elapsedRealtimeUs, false /* shortString */,
|
elapsedRealtimeUs, false /* shortString */,
|
||||||
BatteryUtils.convertMsToUs(estimate.estimateMillis),
|
PowerUtil.convertMsToUs(estimate.estimateMillis),
|
||||||
estimate.isBasedOnUsage);
|
estimate.isBasedOnUsage);
|
||||||
} else {
|
} else {
|
||||||
batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats,
|
batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats,
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import android.os.BatteryStats;
|
|||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import com.android.internal.os.BatteryStatsHelper;
|
import com.android.internal.os.BatteryStatsHelper;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
|
import com.android.settingslib.utils.PowerUtil;
|
||||||
import com.android.settingslib.utils.AsyncLoader;
|
import com.android.settingslib.utils.AsyncLoader;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -46,7 +47,8 @@ public class DebugEstimatesLoader extends AsyncLoader<List<BatteryInfo>> {
|
|||||||
FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
|
FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
|
||||||
|
|
||||||
// get stuff we'll need for both BatteryInfo
|
// get stuff we'll need for both BatteryInfo
|
||||||
final long elapsedRealtimeUs = BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
|
final long elapsedRealtimeUs = PowerUtil.convertMsToUs(
|
||||||
|
SystemClock.elapsedRealtime());
|
||||||
Intent batteryBroadcast = getContext().registerReceiver(null,
|
Intent batteryBroadcast = getContext().registerReceiver(null,
|
||||||
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||||
BatteryStats stats = mStatsHelper.getStats();
|
BatteryStats stats = mStatsHelper.getStats();
|
||||||
@@ -60,7 +62,7 @@ public class DebugEstimatesLoader extends AsyncLoader<List<BatteryInfo>> {
|
|||||||
}
|
}
|
||||||
BatteryInfo newInfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast, stats,
|
BatteryInfo newInfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast, stats,
|
||||||
elapsedRealtimeUs, false,
|
elapsedRealtimeUs, false,
|
||||||
BatteryUtils.convertMsToUs(estimate.estimateMillis),
|
PowerUtil.convertMsToUs(estimate.estimateMillis),
|
||||||
estimate.isBasedOnUsage);
|
estimate.isBasedOnUsage);
|
||||||
|
|
||||||
List<BatteryInfo> infos = new ArrayList<>();
|
List<BatteryInfo> infos = new ArrayList<>();
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ import com.android.settings.overlay.FeatureFactory;
|
|||||||
import com.android.settings.search.BaseSearchIndexProvider;
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -318,7 +319,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (usageData.usageList.size() <= 1) {
|
if (usageData.usageList.size() <= 1) {
|
||||||
CharSequence timeSequence = Utils.formatElapsedTime(getContext(),
|
CharSequence timeSequence = StringUtil.formatElapsedTime(getContext(),
|
||||||
usageData.totalUsageTimeMs, false);
|
usageData.totalUsageTimeMs, false);
|
||||||
usageData.summary = usageData.usageType == UsageType.IDLE ? timeSequence
|
usageData.summary = usageData.usageType == UsageType.IDLE ? timeSequence
|
||||||
: TextUtils.expandTemplate(getText(R.string.battery_used_for), timeSequence);
|
: TextUtils.expandTemplate(getText(R.string.battery_used_for), timeSequence);
|
||||||
|
|||||||
@@ -37,10 +37,7 @@ import android.view.View.OnClickListener;
|
|||||||
import android.view.View.OnLongClickListener;
|
import android.view.View.OnLongClickListener;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.android.internal.hardware.AmbientDisplayConfiguration;
|
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.internal.os.BatterySipper;
|
|
||||||
import com.android.internal.os.BatterySipper.DrainType;
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Settings.HighPowerApplicationsActivity;
|
import com.android.settings.Settings.HighPowerApplicationsActivity;
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
@@ -48,10 +45,7 @@ import com.android.settings.Utils;
|
|||||||
import com.android.settings.applications.LayoutPreference;
|
import com.android.settings.applications.LayoutPreference;
|
||||||
import com.android.settings.applications.manageapplications.ManageApplications;
|
import com.android.settings.applications.manageapplications.ManageApplications;
|
||||||
import com.android.settings.dashboard.SummaryLoader;
|
import com.android.settings.dashboard.SummaryLoader;
|
||||||
import com.android.settings.display.AmbientDisplayPreferenceController;
|
|
||||||
import com.android.settings.display.AutoBrightnessPreferenceController;
|
|
||||||
import com.android.settings.display.BatteryPercentagePreferenceController;
|
import com.android.settings.display.BatteryPercentagePreferenceController;
|
||||||
import com.android.settings.display.TimeoutPreferenceController;
|
|
||||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||||
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
|
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
|
||||||
import com.android.settings.fuelgauge.batterytip.BatteryTipLoader;
|
import com.android.settings.fuelgauge.batterytip.BatteryTipLoader;
|
||||||
@@ -63,6 +57,8 @@ import com.android.settingslib.core.AbstractPreferenceController;
|
|||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.PowerUtil;
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -164,12 +160,12 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
|
|||||||
// be unplugged for a period of time before being willing ot make an estimate.
|
// be unplugged for a period of time before being willing ot make an estimate.
|
||||||
summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString(
|
summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString(
|
||||||
Formatter.formatShortElapsedTime(getContext(),
|
Formatter.formatShortElapsedTime(getContext(),
|
||||||
BatteryUtils.convertUsToMs(oldInfo.remainingTimeUs))));
|
PowerUtil.convertUsToMs(oldInfo.remainingTimeUs))));
|
||||||
|
|
||||||
// for this one we can just set the string directly
|
// for this one we can just set the string directly
|
||||||
summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString(
|
summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString(
|
||||||
Formatter.formatShortElapsedTime(getContext(),
|
Formatter.formatShortElapsedTime(getContext(),
|
||||||
BatteryUtils.convertUsToMs(newInfo.remainingTimeUs))));
|
PowerUtil.convertUsToMs(newInfo.remainingTimeUs))));
|
||||||
|
|
||||||
batteryView.setBatteryLevel(oldInfo.batteryLevel);
|
batteryView.setBatteryLevel(oldInfo.batteryLevel);
|
||||||
batteryView.setCharging(!oldInfo.discharging);
|
batteryView.setCharging(!oldInfo.discharging);
|
||||||
@@ -314,10 +310,10 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
|
|||||||
final long lastFullChargeTime = mBatteryUtils.calculateLastFullChargeTime(mStatsHelper,
|
final long lastFullChargeTime = mBatteryUtils.calculateLastFullChargeTime(mStatsHelper,
|
||||||
System.currentTimeMillis());
|
System.currentTimeMillis());
|
||||||
updateLastFullChargePreference(lastFullChargeTime);
|
updateLastFullChargePreference(lastFullChargeTime);
|
||||||
mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(),
|
mScreenUsagePref.setSubtitle(StringUtil.formatElapsedTime(getContext(),
|
||||||
mBatteryUtils.calculateScreenUsageTime(mStatsHelper), false));
|
mBatteryUtils.calculateScreenUsageTime(mStatsHelper), false));
|
||||||
|
|
||||||
final CharSequence timeSequence = Utils.formatRelativeTime(context, lastFullChargeTime,
|
final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime,
|
||||||
false);
|
false);
|
||||||
mBatteryAppListPreferenceController.refreshAppListGroup(mStatsHelper,
|
mBatteryAppListPreferenceController.refreshAppListGroup(mStatsHelper,
|
||||||
false /* showAllApps */, timeSequence);
|
false /* showAllApps */, timeSequence);
|
||||||
@@ -340,7 +336,7 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
void updateLastFullChargePreference(long timeMs) {
|
void updateLastFullChargePreference(long timeMs) {
|
||||||
final CharSequence timeSequence = Utils.formatRelativeTime(getContext(), timeMs, false);
|
final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false);
|
||||||
mLastFullChargePref.setSubtitle(timeSequence);
|
mLastFullChargePref.setSubtitle(timeSequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ import com.android.settings.overlay.FeatureFactory;
|
|||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.PowerUtil;
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -210,12 +212,12 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements
|
|||||||
// be unplugged for a period of time before being willing ot make an estimate.
|
// be unplugged for a period of time before being willing ot make an estimate.
|
||||||
summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString(
|
summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString(
|
||||||
Formatter.formatShortElapsedTime(getContext(),
|
Formatter.formatShortElapsedTime(getContext(),
|
||||||
BatteryUtils.convertUsToMs(oldInfo.remainingTimeUs))));
|
PowerUtil.convertUsToMs(oldInfo.remainingTimeUs))));
|
||||||
|
|
||||||
// for this one we can just set the string directly
|
// for this one we can just set the string directly
|
||||||
summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString(
|
summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString(
|
||||||
Formatter.formatShortElapsedTime(getContext(),
|
Formatter.formatShortElapsedTime(getContext(),
|
||||||
BatteryUtils.convertUsToMs(newInfo.remainingTimeUs))));
|
PowerUtil.convertUsToMs(newInfo.remainingTimeUs))));
|
||||||
|
|
||||||
batteryView.setBatteryLevel(oldInfo.batteryLevel);
|
batteryView.setBatteryLevel(oldInfo.batteryLevel);
|
||||||
batteryView.setCharging(!oldInfo.discharging);
|
batteryView.setCharging(!oldInfo.discharging);
|
||||||
@@ -524,7 +526,7 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements
|
|||||||
updateScreenPreference();
|
updateScreenPreference();
|
||||||
updateLastFullChargePreference(lastFullChargeTime);
|
updateLastFullChargePreference(lastFullChargeTime);
|
||||||
|
|
||||||
final CharSequence timeSequence = Utils.formatRelativeTime(context, lastFullChargeTime,
|
final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime,
|
||||||
false);
|
false);
|
||||||
final int resId = mShowAllApps ? R.string.power_usage_list_summary_device
|
final int resId = mShowAllApps ? R.string.power_usage_list_summary_device
|
||||||
: R.string.power_usage_list_summary;
|
: R.string.power_usage_list_summary;
|
||||||
@@ -653,12 +655,13 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements
|
|||||||
mStatsHelper.getUsageList(), DrainType.SCREEN);
|
mStatsHelper.getUsageList(), DrainType.SCREEN);
|
||||||
final long usageTimeMs = sipper != null ? sipper.usageTimeMs : 0;
|
final long usageTimeMs = sipper != null ? sipper.usageTimeMs : 0;
|
||||||
|
|
||||||
mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(), usageTimeMs, false));
|
mScreenUsagePref.setSubtitle(
|
||||||
|
StringUtil.formatElapsedTime(getContext(), usageTimeMs, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
void updateLastFullChargePreference(long timeMs) {
|
void updateLastFullChargePreference(long timeMs) {
|
||||||
final CharSequence timeSequence = Utils.formatRelativeTime(getContext(), timeMs, false);
|
final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false);
|
||||||
mLastFullChargePref.setSubtitle(timeSequence);
|
mLastFullChargePref.setSubtitle(timeSequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -685,8 +688,8 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements
|
|||||||
// Only show summary when usage time is longer than one minute
|
// Only show summary when usage time is longer than one minute
|
||||||
final long usageTimeMs = sipper.usageTimeMs;
|
final long usageTimeMs = sipper.usageTimeMs;
|
||||||
if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) {
|
if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) {
|
||||||
final CharSequence timeSequence = Utils.formatElapsedTime(getContext(), usageTimeMs,
|
final CharSequence timeSequence =
|
||||||
false);
|
StringUtil.formatElapsedTime(getContext(), usageTimeMs, false);
|
||||||
preference.setSummary(
|
preference.setSummary(
|
||||||
(sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper))
|
(sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper))
|
||||||
? timeSequence
|
? timeSequence
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
|
|||||||
import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
|
import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
|
||||||
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
|
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
|
||||||
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
|
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -83,7 +84,8 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme
|
|||||||
|
|
||||||
return new AlertDialog.Builder(context)
|
return new AlertDialog.Builder(context)
|
||||||
.setMessage(getString(R.string.battery_tip_dialog_message,
|
.setMessage(getString(R.string.battery_tip_dialog_message,
|
||||||
Utils.formatElapsedTime(context, highUsageTip.getScreenTimeMs(),
|
StringUtil.formatElapsedTime(
|
||||||
|
context, highUsageTip.getScreenTimeMs(),
|
||||||
false /* withSeconds */)))
|
false /* withSeconds */)))
|
||||||
.setView(view)
|
.setView(view)
|
||||||
.setPositiveButton(android.R.string.ok, null)
|
.setPositiveButton(android.R.string.ok, null)
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import android.widget.TextView;
|
|||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -78,7 +79,7 @@ public class HighUsageAdapter extends RecyclerView.Adapter<HighUsageAdapter.View
|
|||||||
UserHandle.myUserId()));
|
UserHandle.myUserId()));
|
||||||
holder.appName.setText(Utils.getApplicationLabel(mContext, app.packageName));
|
holder.appName.setText(Utils.getApplicationLabel(mContext, app.packageName));
|
||||||
if (app.screenOnTimeMs != 0) {
|
if (app.screenOnTimeMs != 0) {
|
||||||
holder.appTime.setText(Utils.formatElapsedTime(mContext, app.screenOnTimeMs, false));
|
holder.appTime.setText(StringUtil.formatElapsedTime(mContext, app.screenOnTimeMs, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,9 +22,9 @@ import android.os.Parcelable;
|
|||||||
import android.support.annotation.VisibleForTesting;
|
import android.support.annotation.VisibleForTesting;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Utils;
|
|
||||||
import com.android.settings.fuelgauge.batterytip.AppInfo;
|
import com.android.settings.fuelgauge.batterytip.AppInfo;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -65,7 +65,7 @@ public class HighUsageTip extends BatteryTip {
|
|||||||
@Override
|
@Override
|
||||||
public CharSequence getSummary(Context context) {
|
public CharSequence getSummary(Context context) {
|
||||||
return context.getString(R.string.battery_tip_high_usage_summary,
|
return context.getString(R.string.battery_tip_high_usage_summary,
|
||||||
Utils.formatElapsedTime(context, mScreenTimeMs, false));
|
StringUtil.formatElapsedTime(context, mScreenTimeMs, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import com.android.settings.widget.MasterSwitchPreference;
|
|||||||
import com.android.settingslib.applications.AppUtils;
|
import com.android.settingslib.applications.AppUtils;
|
||||||
import com.android.settingslib.applications.ApplicationsState;
|
import com.android.settingslib.applications.ApplicationsState;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -229,7 +230,7 @@ public class RecentNotifyingAppsPreferenceController extends AbstractPreferenceC
|
|||||||
pref.setKey(pkgName);
|
pref.setKey(pkgName);
|
||||||
pref.setTitle(appEntry.label);
|
pref.setTitle(appEntry.label);
|
||||||
pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info));
|
pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info));
|
||||||
pref.setSummary(Utils.formatRelativeTime(mContext,
|
pref.setSummary(StringUtil.formatRelativeTime(mContext,
|
||||||
System.currentTimeMillis() - app.getLastNotified(), false));
|
System.currentTimeMillis() - app.getLastNotified(), false));
|
||||||
pref.setOrder(i);
|
pref.setOrder(i);
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
|
|||||||
@@ -84,14 +84,17 @@ public class VisibilityPreferenceController extends NotificationPreferenceContro
|
|||||||
| DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
|
| DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getLockscreenNotificationsEnabled()) {
|
||||||
final String summaryHideEntry =
|
final String summaryHideEntry =
|
||||||
mContext.getString(R.string.lock_screen_notifications_summary_hide);
|
mContext.getString(R.string.lock_screen_notifications_summary_hide);
|
||||||
final String summaryHideEntryValue = Integer.toString(Notification.VISIBILITY_PRIVATE);
|
final String summaryHideEntryValue = Integer.toString(
|
||||||
|
Notification.VISIBILITY_PRIVATE);
|
||||||
entries.add(summaryHideEntry);
|
entries.add(summaryHideEntry);
|
||||||
values.add(summaryHideEntryValue);
|
values.add(summaryHideEntryValue);
|
||||||
setRestrictedIfNotificationFeaturesDisabled(pref,
|
setRestrictedIfNotificationFeaturesDisabled(pref,
|
||||||
summaryHideEntry, summaryHideEntryValue,
|
summaryHideEntry, summaryHideEntryValue,
|
||||||
DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
|
DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
|
||||||
|
}
|
||||||
entries.add(mContext.getString(R.string.lock_screen_notifications_summary_disable));
|
entries.add(mContext.getString(R.string.lock_screen_notifications_summary_disable));
|
||||||
values.add(Integer.toString(Notification.VISIBILITY_SECRET));
|
values.add(Integer.toString(Notification.VISIBILITY_SECRET));
|
||||||
pref.setEntries(entries.toArray(new CharSequence[entries.size()]));
|
pref.setEntries(entries.toArray(new CharSequence[entries.size()]));
|
||||||
|
|||||||
@@ -27,13 +27,12 @@ import com.android.settings.bluetooth.BluetoothFeatureProvider;
|
|||||||
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
|
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
|
||||||
import com.android.settings.dashboard.DashboardFeatureProvider;
|
import com.android.settings.dashboard.DashboardFeatureProvider;
|
||||||
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
|
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
|
||||||
import com.android.settings.datausage.DataPlanFeatureProvider;
|
|
||||||
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
|
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
|
||||||
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
|
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
|
||||||
import com.android.settings.gestures.AssistGestureFeatureProvider;
|
import com.android.settings.gestures.AssistGestureFeatureProvider;
|
||||||
import com.android.settings.localepicker.LocaleFeatureProvider;
|
import com.android.settings.localepicker.LocaleFeatureProvider;
|
||||||
import com.android.settings.security.SecurityFeatureProvider;
|
|
||||||
import com.android.settings.search.SearchFeatureProvider;
|
import com.android.settings.search.SearchFeatureProvider;
|
||||||
|
import com.android.settings.security.SecurityFeatureProvider;
|
||||||
import com.android.settings.slices.SlicesFeatureProvider;
|
import com.android.settings.slices.SlicesFeatureProvider;
|
||||||
import com.android.settings.users.UserFeatureProvider;
|
import com.android.settings.users.UserFeatureProvider;
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
@@ -104,8 +103,6 @@ public abstract class FeatureFactory {
|
|||||||
|
|
||||||
public abstract BluetoothFeatureProvider getBluetoothFeatureProvider(Context context);
|
public abstract BluetoothFeatureProvider getBluetoothFeatureProvider(Context context);
|
||||||
|
|
||||||
public abstract DataPlanFeatureProvider getDataPlanFeatureProvider();
|
|
||||||
|
|
||||||
public abstract SmsMirroringFeatureProvider getSmsMirroringFeatureProvider();
|
public abstract SmsMirroringFeatureProvider getSmsMirroringFeatureProvider();
|
||||||
|
|
||||||
public abstract SlicesFeatureProvider getSlicesFeatureProvider();
|
public abstract SlicesFeatureProvider getSlicesFeatureProvider();
|
||||||
|
|||||||
@@ -35,8 +35,6 @@ import com.android.settings.dashboard.DashboardFeatureProvider;
|
|||||||
import com.android.settings.dashboard.DashboardFeatureProviderImpl;
|
import com.android.settings.dashboard.DashboardFeatureProviderImpl;
|
||||||
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
|
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
|
||||||
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
|
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
|
||||||
import com.android.settings.datausage.DataPlanFeatureProvider;
|
|
||||||
import com.android.settings.datausage.DataPlanFeatureProviderImpl;
|
|
||||||
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
|
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
|
||||||
import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl;
|
import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl;
|
||||||
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
|
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
|
||||||
@@ -77,7 +75,6 @@ public class FeatureFactoryImpl extends FeatureFactory {
|
|||||||
private AssistGestureFeatureProvider mAssistGestureFeatureProvider;
|
private AssistGestureFeatureProvider mAssistGestureFeatureProvider;
|
||||||
private UserFeatureProvider mUserFeatureProvider;
|
private UserFeatureProvider mUserFeatureProvider;
|
||||||
private BluetoothFeatureProvider mBluetoothFeatureProvider;
|
private BluetoothFeatureProvider mBluetoothFeatureProvider;
|
||||||
private DataPlanFeatureProvider mDataPlanFeatureProvider;
|
|
||||||
private SmsMirroringFeatureProvider mSmsMirroringFeatureProvider;
|
private SmsMirroringFeatureProvider mSmsMirroringFeatureProvider;
|
||||||
private SlicesFeatureProvider mSlicesFeatureProvider;
|
private SlicesFeatureProvider mSlicesFeatureProvider;
|
||||||
private AccountFeatureProvider mAccountFeatureProvider;
|
private AccountFeatureProvider mAccountFeatureProvider;
|
||||||
@@ -191,14 +188,6 @@ public class FeatureFactoryImpl extends FeatureFactory {
|
|||||||
return mBluetoothFeatureProvider;
|
return mBluetoothFeatureProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public DataPlanFeatureProvider getDataPlanFeatureProvider() {
|
|
||||||
if (mDataPlanFeatureProvider == null) {
|
|
||||||
mDataPlanFeatureProvider = new DataPlanFeatureProviderImpl();
|
|
||||||
}
|
|
||||||
return mDataPlanFeatureProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AssistGestureFeatureProvider getAssistGestureFeatureProvider() {
|
public AssistGestureFeatureProvider getAssistGestureFeatureProvider() {
|
||||||
if (mAssistGestureFeatureProvider == null) {
|
if (mAssistGestureFeatureProvider == null) {
|
||||||
|
|||||||
@@ -1,213 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.search;
|
|
||||||
|
|
||||||
import static com.android.settings.search.DatabaseResultLoader.BASE_RANKS;
|
|
||||||
import static com.android.settings.search.SearchResult.TOP_RANK;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.database.Cursor;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.os.BadParcelableException;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Controller to Build search results from {@link Cursor} Objects.
|
|
||||||
*
|
|
||||||
* Each converted {@link Cursor} has the following fields:
|
|
||||||
* - String Title
|
|
||||||
* - String Summary
|
|
||||||
* - int rank
|
|
||||||
* - {@link Drawable} icon
|
|
||||||
* - {@link ResultPayload} payload
|
|
||||||
*/
|
|
||||||
public class CursorToSearchResultConverter {
|
|
||||||
|
|
||||||
private static final String TAG = "CursorConverter";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* These indices are used to match the columns of the this loader's SELECT statement.
|
|
||||||
* These are not necessarily the same order nor similar coverage as the schema defined in
|
|
||||||
* IndexDatabaseHelper
|
|
||||||
*/
|
|
||||||
public static final int COLUMN_INDEX_ID = 0;
|
|
||||||
public static final int COLUMN_INDEX_TITLE = 1;
|
|
||||||
public static final int COLUMN_INDEX_SUMMARY_ON = 2;
|
|
||||||
public static final int COLUMN_INDEX_SUMMARY_OFF = 3;
|
|
||||||
public static final int COLUMN_INDEX_CLASS_NAME = 4;
|
|
||||||
public static final int COLUMN_INDEX_SCREEN_TITLE = 5;
|
|
||||||
public static final int COLUMN_INDEX_ICON = 6;
|
|
||||||
public static final int COLUMN_INDEX_INTENT_ACTION = 7;
|
|
||||||
public static final int COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE = 8;
|
|
||||||
public static final int COLUMN_INDEX_INTENT_ACTION_TARGET_CLASS = 9;
|
|
||||||
public static final int COLUMN_INDEX_KEY = 10;
|
|
||||||
public static final int COLUMN_INDEX_PAYLOAD_TYPE = 11;
|
|
||||||
public static final int COLUMN_INDEX_PAYLOAD = 12;
|
|
||||||
|
|
||||||
private final Context mContext;
|
|
||||||
|
|
||||||
private final int LONG_TITLE_LENGTH = 20;
|
|
||||||
|
|
||||||
private static final String[] whiteList = {
|
|
||||||
"main_toggle_wifi",
|
|
||||||
"main_toggle_bluetooth",
|
|
||||||
"main_toggle_bluetooth_obsolete",
|
|
||||||
"toggle_airplane",
|
|
||||||
"tether_settings",
|
|
||||||
"battery_saver",
|
|
||||||
"toggle_nfc",
|
|
||||||
"restrict_background",
|
|
||||||
"data_usage_enable",
|
|
||||||
"button_roaming_key",
|
|
||||||
};
|
|
||||||
private static final Set<String> prioritySettings = new HashSet(Arrays.asList(whiteList));
|
|
||||||
|
|
||||||
|
|
||||||
public CursorToSearchResultConverter(Context context) {
|
|
||||||
mContext = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<SearchResult> convertCursor(Cursor cursorResults, int baseRank) {
|
|
||||||
if (cursorResults == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
final Map<String, Context> contextMap = new HashMap<>();
|
|
||||||
final Set<SearchResult> results = new HashSet<>();
|
|
||||||
|
|
||||||
while (cursorResults.moveToNext()) {
|
|
||||||
SearchResult result = buildSingleSearchResultFromCursor(contextMap, cursorResults,
|
|
||||||
baseRank);
|
|
||||||
if (result != null) {
|
|
||||||
results.add(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ResultPayload getUnmarshalledPayload(byte[] marshalledPayload,
|
|
||||||
int payloadType) {
|
|
||||||
try {
|
|
||||||
switch (payloadType) {
|
|
||||||
case ResultPayload.PayloadType.INTENT:
|
|
||||||
return ResultPayloadUtils.unmarshall(marshalledPayload,
|
|
||||||
ResultPayload.CREATOR);
|
|
||||||
case ResultPayload.PayloadType.INLINE_SWITCH:
|
|
||||||
return ResultPayloadUtils.unmarshall(marshalledPayload,
|
|
||||||
InlineSwitchPayload.CREATOR);
|
|
||||||
case ResultPayload.PayloadType.INLINE_LIST:
|
|
||||||
return ResultPayloadUtils.unmarshall(marshalledPayload,
|
|
||||||
InlineListPayload.CREATOR);
|
|
||||||
}
|
|
||||||
} catch (BadParcelableException e) {
|
|
||||||
Log.w(TAG, "Error creating parcelable: " + e);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private SearchResult buildSingleSearchResultFromCursor(Map<String, Context> contextMap,
|
|
||||||
Cursor cursor, int baseRank) {
|
|
||||||
final int docId = cursor.getInt(COLUMN_INDEX_ID);
|
|
||||||
final String pkgName = cursor.getString(COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE);
|
|
||||||
final String title = cursor.getString(COLUMN_INDEX_TITLE);
|
|
||||||
final String summaryOn = cursor.getString(COLUMN_INDEX_SUMMARY_ON);
|
|
||||||
final String className = cursor.getString(COLUMN_INDEX_CLASS_NAME);
|
|
||||||
final String key = cursor.getString(COLUMN_INDEX_KEY);
|
|
||||||
final String iconResStr = cursor.getString(COLUMN_INDEX_ICON);
|
|
||||||
final int payloadType = cursor.getInt(COLUMN_INDEX_PAYLOAD_TYPE);
|
|
||||||
final byte[] marshalledPayload = cursor.getBlob(COLUMN_INDEX_PAYLOAD);
|
|
||||||
final ResultPayload payload = getUnmarshalledPayload(marshalledPayload, payloadType);
|
|
||||||
|
|
||||||
final int rank = getRank(title, baseRank, key);
|
|
||||||
|
|
||||||
final SearchResult.Builder builder = new SearchResult.Builder()
|
|
||||||
.setStableId(docId)
|
|
||||||
.setTitle(title)
|
|
||||||
.setSummary(summaryOn)
|
|
||||||
.setRank(rank)
|
|
||||||
.setIcon(getIconForPackage(contextMap, pkgName, className, iconResStr))
|
|
||||||
.setPayload(payload);
|
|
||||||
return builder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Drawable getIconForPackage(Map<String, Context> contextMap, String pkgName,
|
|
||||||
String className, String iconResStr) {
|
|
||||||
final int iconId = TextUtils.isEmpty(iconResStr)
|
|
||||||
? 0 : Integer.parseInt(iconResStr);
|
|
||||||
Drawable icon;
|
|
||||||
Context packageContext;
|
|
||||||
if (iconId == 0) {
|
|
||||||
icon = null;
|
|
||||||
} else {
|
|
||||||
if (TextUtils.isEmpty(className) && !TextUtils.isEmpty(pkgName)) {
|
|
||||||
packageContext = contextMap.get(pkgName);
|
|
||||||
if (packageContext == null) {
|
|
||||||
try {
|
|
||||||
packageContext = mContext.createPackageContext(pkgName, 0);
|
|
||||||
} catch (PackageManager.NameNotFoundException e) {
|
|
||||||
Log.e(TAG, "Cannot create Context for package: " + pkgName);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
contextMap.put(pkgName, packageContext);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
packageContext = mContext;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
icon = packageContext.getDrawable(iconId);
|
|
||||||
} catch (Resources.NotFoundException nfe) {
|
|
||||||
icon = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Uses the breadcrumbs to determine the offset to the base rank.
|
|
||||||
* There are three checks
|
|
||||||
* A) If the result is prioritized and the highest base level
|
|
||||||
* B) If the query matches the highest level menu title
|
|
||||||
* C) If the query is longer than 20
|
|
||||||
*
|
|
||||||
* If the query matches A, set it to TOP_RANK
|
|
||||||
* If the query matches B, the offset is 0.
|
|
||||||
* If the query matches C, the offset is 1
|
|
||||||
|
|
||||||
* @param title of the result.
|
|
||||||
* @param baseRank of the result. Lower if it's a better result.
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private int getRank(String title, int baseRank, String key) {
|
|
||||||
// The result can only be prioritized if it is a top ranked result.
|
|
||||||
if (prioritySettings.contains(key) && baseRank < BASE_RANKS[1]) {
|
|
||||||
return TOP_RANK;
|
|
||||||
}
|
|
||||||
if (title.length() > LONG_TITLE_LENGTH) {
|
|
||||||
return baseRank + 1;
|
|
||||||
}
|
|
||||||
return baseRank;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -18,10 +18,10 @@
|
|||||||
package com.android.settings.search;
|
package com.android.settings.search;
|
||||||
|
|
||||||
|
|
||||||
import static com.android.settings.search.CursorToSearchResultConverter.COLUMN_INDEX_ID;
|
import static com.android.settings.search.DatabaseResultLoader.COLUMN_INDEX_ID;
|
||||||
import static com.android.settings.search.CursorToSearchResultConverter
|
import static com.android.settings.search.DatabaseResultLoader
|
||||||
.COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE;
|
.COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE;
|
||||||
import static com.android.settings.search.CursorToSearchResultConverter.COLUMN_INDEX_KEY;
|
import static com.android.settings.search.DatabaseResultLoader.COLUMN_INDEX_KEY;
|
||||||
import static com.android.settings.search.DatabaseResultLoader.SELECT_COLUMNS;
|
import static com.android.settings.search.DatabaseResultLoader.SELECT_COLUMNS;
|
||||||
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.CLASS_NAME;
|
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.CLASS_NAME;
|
||||||
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_ENTRIES;
|
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_ENTRIES;
|
||||||
|
|||||||
@@ -43,14 +43,11 @@ public class DatabaseResultLoader {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base ranks defines the best possible rank based on what the query matches.
|
* These indices are used to match the columns of the this loader's SELECT statement.
|
||||||
* If the query matches the prefix of the first word in the title, the best rank it can be
|
* These are not necessarily the same order nor similar coverage as the schema defined in
|
||||||
* is 1
|
* IndexDatabaseHelper
|
||||||
* If the query matches the prefix of the other words in the title, the best rank it can be
|
|
||||||
* is 3
|
|
||||||
* If the query only matches the summary, the best rank it can be is 7
|
|
||||||
* If the query only matches keywords or entries, the best rank it can be is 9
|
|
||||||
*/
|
*/
|
||||||
public static final int[] BASE_RANKS = {1, 3, 7, 9};
|
public static final int COLUMN_INDEX_ID = 0;
|
||||||
|
public static final int COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE = 8;
|
||||||
|
public static final int COLUMN_INDEX_KEY = 10;
|
||||||
}
|
}
|
||||||
@@ -22,6 +22,7 @@ import com.android.settings.DateTimeSettings;
|
|||||||
import com.android.settings.DisplaySettings;
|
import com.android.settings.DisplaySettings;
|
||||||
import com.android.settings.LegalSettings;
|
import com.android.settings.LegalSettings;
|
||||||
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
|
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
|
||||||
|
import com.android.settings.datausage.DataUsageSummaryLegacy;
|
||||||
import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
|
import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
|
||||||
import com.android.settings.accessibility.AccessibilitySettings;
|
import com.android.settings.accessibility.AccessibilitySettings;
|
||||||
import com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment;
|
import com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment;
|
||||||
@@ -112,6 +113,7 @@ public class SearchIndexableResourcesImpl implements SearchIndexableResources {
|
|||||||
addIndex(BluetoothSettings.class);
|
addIndex(BluetoothSettings.class);
|
||||||
addIndex(SimSettings.class);
|
addIndex(SimSettings.class);
|
||||||
addIndex(DataUsageSummary.class);
|
addIndex(DataUsageSummary.class);
|
||||||
|
addIndex(DataUsageSummaryLegacy.class);
|
||||||
addIndex(ScreenZoomSettings.class);
|
addIndex(ScreenZoomSettings.class);
|
||||||
addIndex(DisplaySettings.class);
|
addIndex(DisplaySettings.class);
|
||||||
addIndex(AmbientDisplaySettings.class);
|
addIndex(AmbientDisplaySettings.class);
|
||||||
|
|||||||
@@ -1,186 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.search;
|
|
||||||
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Data class as an interface for all Search Results.
|
|
||||||
*/
|
|
||||||
public class SearchResult implements Comparable<SearchResult> {
|
|
||||||
|
|
||||||
private static final String TAG = "SearchResult";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines the lowest rank for a search result to be considered as ranked. Results with ranks
|
|
||||||
* higher than this have no guarantee for sorting order.
|
|
||||||
*/
|
|
||||||
public static final int BOTTOM_RANK = 10;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines the highest rank for a search result. Used for special search results only.
|
|
||||||
*/
|
|
||||||
public static final int TOP_RANK = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The title of the result and main text displayed.
|
|
||||||
* Intent Results: Displays as the primary
|
|
||||||
*/
|
|
||||||
public final CharSequence title;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Summary / subtitle text
|
|
||||||
* Intent Results: Displays the text underneath the title
|
|
||||||
*/
|
|
||||||
final public CharSequence summary;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An ordered list of the information hierarchy.
|
|
||||||
* Intent Results: Displayed a hierarchy of selections to reach the setting from the home screen
|
|
||||||
*/
|
|
||||||
public final List<String> breadcrumbs;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A suggestion for the ranking of the result.
|
|
||||||
* Based on Settings Rank:
|
|
||||||
* 1 is a near perfect match
|
|
||||||
* 9 is the weakest match
|
|
||||||
* TODO subject to change
|
|
||||||
*/
|
|
||||||
public final int rank;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Identifier for the recycler view adapter.
|
|
||||||
*/
|
|
||||||
@ResultPayload.PayloadType
|
|
||||||
public final int viewType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Metadata for the specific result types.
|
|
||||||
*/
|
|
||||||
public final ResultPayload payload;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Result's icon.
|
|
||||||
*/
|
|
||||||
public final Drawable icon;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stable id for this object.
|
|
||||||
*/
|
|
||||||
public final int stableId;
|
|
||||||
|
|
||||||
protected SearchResult(Builder builder) {
|
|
||||||
stableId = builder.mStableId;
|
|
||||||
title = builder.mTitle;
|
|
||||||
summary = builder.mSummary;
|
|
||||||
breadcrumbs = builder.mBreadcrumbs;
|
|
||||||
rank = builder.mRank;
|
|
||||||
icon = builder.mIcon;
|
|
||||||
payload = builder.mResultPayload;
|
|
||||||
viewType = payload.getType();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(SearchResult searchResult) {
|
|
||||||
if (searchResult == null) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return this.rank - searchResult.rank;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object that) {
|
|
||||||
if (this == that) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(that instanceof SearchResult)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return this.stableId == ((SearchResult) that).stableId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return stableId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Builder {
|
|
||||||
protected CharSequence mTitle;
|
|
||||||
protected CharSequence mSummary;
|
|
||||||
protected List<String> mBreadcrumbs;
|
|
||||||
protected int mRank = 42;
|
|
||||||
protected ResultPayload mResultPayload;
|
|
||||||
protected Drawable mIcon;
|
|
||||||
protected int mStableId;
|
|
||||||
|
|
||||||
public Builder setTitle(CharSequence title) {
|
|
||||||
mTitle = title;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder setSummary(CharSequence summary) {
|
|
||||||
mSummary = summary;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder addBreadcrumbs(List<String> breadcrumbs) {
|
|
||||||
mBreadcrumbs = breadcrumbs;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder setRank(int rank) {
|
|
||||||
if (rank >= 0 && rank <= 9) {
|
|
||||||
mRank = rank;
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder setIcon(Drawable icon) {
|
|
||||||
mIcon = icon;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder setPayload(ResultPayload payload) {
|
|
||||||
mResultPayload = payload;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder setStableId(int stableId) {
|
|
||||||
mStableId = stableId;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SearchResult build() {
|
|
||||||
// Check that all of the mandatory fields are set.
|
|
||||||
if (TextUtils.isEmpty(mTitle)) {
|
|
||||||
throw new IllegalStateException("SearchResult missing title argument");
|
|
||||||
} else if (mStableId == 0) {
|
|
||||||
Log.v(TAG, "No stable ID on SearchResult with title: " + mTitle);
|
|
||||||
throw new IllegalStateException("SearchResult missing stableId argument");
|
|
||||||
} else if (mResultPayload == null) {
|
|
||||||
throw new IllegalStateException("SearchResult missing Payload argument");
|
|
||||||
}
|
|
||||||
return new SearchResult(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -17,6 +17,7 @@ package com.android.settings.users;
|
|||||||
|
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.os.UserHandle;
|
||||||
|
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
|
|
||||||
@@ -34,4 +35,10 @@ public class AutoSyncWorkDataPreferenceController extends AutoSyncPersonalDataPr
|
|||||||
public String getPreferenceKey() {
|
public String getPreferenceKey() {
|
||||||
return KEY_AUTO_SYNC_WORK_ACCOUNT;
|
return KEY_AUTO_SYNC_WORK_ACCOUNT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAvailable() {
|
||||||
|
return mUserHandle != null && !mUserManager.isManagedProfile() && !mUserManager.isLinkedUser()
|
||||||
|
&& mUserManager.getProfiles(UserHandle.myUserId()).size() > 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,8 +92,6 @@ public class ConfigureWifiSettings extends DashboardFragment {
|
|||||||
controllers.add(new WifiInfoPreferenceController(context, getLifecycle(), wifiManager));
|
controllers.add(new WifiInfoPreferenceController(context, getLifecycle(), wifiManager));
|
||||||
controllers.add(new CellularFallbackPreferenceController(context));
|
controllers.add(new CellularFallbackPreferenceController(context));
|
||||||
controllers.add(new WifiP2pPreferenceController(context, getLifecycle(), wifiManager));
|
controllers.add(new WifiP2pPreferenceController(context, getLifecycle(), wifiManager));
|
||||||
controllers.add(new WpsPreferenceController(
|
|
||||||
context, getLifecycle(), wifiManager, getFragmentManager()));
|
|
||||||
return controllers;
|
return controllers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,16 +85,12 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
|
|
||||||
private static final String TAG = "WifiSettings";
|
private static final String TAG = "WifiSettings";
|
||||||
|
|
||||||
/* package */ static final int MENU_ID_WPS_PBC = Menu.FIRST;
|
|
||||||
private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
|
|
||||||
private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
|
private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
|
||||||
private static final int MENU_ID_FORGET = Menu.FIRST + 7;
|
private static final int MENU_ID_FORGET = Menu.FIRST + 7;
|
||||||
private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
|
private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
|
||||||
private static final int MENU_ID_WRITE_NFC = Menu.FIRST + 9;
|
private static final int MENU_ID_WRITE_NFC = Menu.FIRST + 9;
|
||||||
|
|
||||||
public static final int WIFI_DIALOG_ID = 1;
|
public static final int WIFI_DIALOG_ID = 1;
|
||||||
/* package */ static final int WPS_PBC_DIALOG_ID = 2;
|
|
||||||
private static final int WPS_PIN_DIALOG_ID = 3;
|
|
||||||
private static final int WRITE_NFC_DIALOG_ID = 6;
|
private static final int WRITE_NFC_DIALOG_ID = 6;
|
||||||
|
|
||||||
// Instance state keys
|
// Instance state keys
|
||||||
@@ -109,6 +105,10 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
private static final String PREF_KEY_CONFIGURE_WIFI_SETTINGS = "configure_settings";
|
private static final String PREF_KEY_CONFIGURE_WIFI_SETTINGS = "configure_settings";
|
||||||
private static final String PREF_KEY_SAVED_NETWORKS = "saved_networks";
|
private static final String PREF_KEY_SAVED_NETWORKS = "saved_networks";
|
||||||
|
|
||||||
|
private static boolean isVerboseLoggingEnabled() {
|
||||||
|
return WifiTracker.sVerboseLogging || Log.isLoggable(TAG, Log.VERBOSE);
|
||||||
|
}
|
||||||
|
|
||||||
private final Runnable mUpdateAccessPointsRunnable = () -> {
|
private final Runnable mUpdateAccessPointsRunnable = () -> {
|
||||||
updateAccessPointPreferences();
|
updateAccessPointPreferences();
|
||||||
};
|
};
|
||||||
@@ -371,7 +371,7 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
}
|
}
|
||||||
setProgressBarVisible(true);
|
setProgressBarVisible(true);
|
||||||
mWifiTracker.forceUpdate();
|
mWifiTracker.forceUpdate();
|
||||||
if (WifiTracker.sVerboseLogging) {
|
if (isVerboseLoggingEnabled()) {
|
||||||
Log.i(TAG, "WifiSettings force update APs: " + mWifiTracker.getAccessPoints());
|
Log.i(TAG, "WifiSettings force update APs: " + mWifiTracker.getAccessPoints());
|
||||||
}
|
}
|
||||||
getView().removeCallbacks(mUpdateAccessPointsRunnable);
|
getView().removeCallbacks(mUpdateAccessPointsRunnable);
|
||||||
@@ -459,24 +459,6 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
// If the user is not allowed to configure wifi, do not handle menu selections.
|
|
||||||
if (mIsRestricted) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case MENU_ID_WPS_PBC:
|
|
||||||
showDialog(WPS_PBC_DIALOG_ID);
|
|
||||||
return true;
|
|
||||||
case MENU_ID_WPS_PIN:
|
|
||||||
showDialog(WPS_PIN_DIALOG_ID);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
|
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
|
||||||
Preference preference = (Preference) view.getTag();
|
Preference preference = (Preference) view.getTag();
|
||||||
@@ -635,10 +617,6 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
|
|
||||||
mSelectedAccessPoint = mDlgAccessPoint;
|
mSelectedAccessPoint = mDlgAccessPoint;
|
||||||
return mDialog;
|
return mDialog;
|
||||||
case WPS_PBC_DIALOG_ID:
|
|
||||||
return new WpsDialog(getActivity(), WpsInfo.PBC);
|
|
||||||
case WPS_PIN_DIALOG_ID:
|
|
||||||
return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
|
|
||||||
case WRITE_NFC_DIALOG_ID:
|
case WRITE_NFC_DIALOG_ID:
|
||||||
if (mSelectedAccessPoint != null) {
|
if (mSelectedAccessPoint != null) {
|
||||||
mWifiToNfcDialog = new WriteWifiConfigToNfcDialog(
|
mWifiToNfcDialog = new WriteWifiConfigToNfcDialog(
|
||||||
@@ -660,10 +638,6 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
switch (dialogId) {
|
switch (dialogId) {
|
||||||
case WIFI_DIALOG_ID:
|
case WIFI_DIALOG_ID:
|
||||||
return MetricsEvent.DIALOG_WIFI_AP_EDIT;
|
return MetricsEvent.DIALOG_WIFI_AP_EDIT;
|
||||||
case WPS_PBC_DIALOG_ID:
|
|
||||||
return MetricsEvent.DIALOG_WIFI_PBC;
|
|
||||||
case WPS_PIN_DIALOG_ID:
|
|
||||||
return MetricsEvent.DIALOG_WIFI_PIN;
|
|
||||||
case WRITE_NFC_DIALOG_ID:
|
case WRITE_NFC_DIALOG_ID:
|
||||||
return MetricsEvent.DIALOG_WIFI_WRITE_NFC;
|
return MetricsEvent.DIALOG_WIFI_WRITE_NFC;
|
||||||
default:
|
default:
|
||||||
@@ -762,7 +736,7 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
}
|
}
|
||||||
// AccessPoints are sorted by the WifiTracker
|
// AccessPoints are sorted by the WifiTracker
|
||||||
final List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
|
final List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
|
||||||
if (WifiTracker.sVerboseLogging) {
|
if (isVerboseLoggingEnabled()) {
|
||||||
Log.i(TAG, "updateAccessPoints called for: " + accessPoints);
|
Log.i(TAG, "updateAccessPoints called for: " + accessPoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,297 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2012 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.android.settings.wifi;
|
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.net.NetworkInfo;
|
|
||||||
import android.net.NetworkInfo.DetailedState;
|
|
||||||
import android.net.wifi.WifiInfo;
|
|
||||||
import android.net.wifi.WifiManager;
|
|
||||||
import android.net.wifi.WpsInfo;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.ProgressBar;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.android.settings.R;
|
|
||||||
|
|
||||||
import java.util.Timer;
|
|
||||||
import java.util.TimerTask;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dialog to show WPS progress.
|
|
||||||
*/
|
|
||||||
public class WpsDialog extends AlertDialog {
|
|
||||||
|
|
||||||
private final static String TAG = "WpsDialog";
|
|
||||||
private static final String DIALOG_STATE = "android:dialogState";
|
|
||||||
private static final String DIALOG_MSG_STRING = "android:dialogMsg";
|
|
||||||
|
|
||||||
private View mView;
|
|
||||||
private TextView mTextView;
|
|
||||||
private ProgressBar mTimeoutBar;
|
|
||||||
private ProgressBar mProgressBar;
|
|
||||||
private Button mButton;
|
|
||||||
private Timer mTimer;
|
|
||||||
|
|
||||||
private static final int WPS_TIMEOUT_S = 120;
|
|
||||||
|
|
||||||
private WifiManager mWifiManager;
|
|
||||||
private WifiManager.WpsCallback mWpsListener;
|
|
||||||
private int mWpsSetup;
|
|
||||||
|
|
||||||
private final IntentFilter mFilter;
|
|
||||||
private BroadcastReceiver mReceiver;
|
|
||||||
|
|
||||||
private Context mContext;
|
|
||||||
private Handler mHandler = new Handler();
|
|
||||||
private String mMsgString = "";
|
|
||||||
|
|
||||||
private enum DialogState {
|
|
||||||
WPS_INIT,
|
|
||||||
WPS_START,
|
|
||||||
WPS_COMPLETE,
|
|
||||||
CONNECTED, //WPS + IP config is done
|
|
||||||
WPS_FAILED
|
|
||||||
}
|
|
||||||
DialogState mDialogState = DialogState.WPS_INIT;
|
|
||||||
|
|
||||||
public WpsDialog(Context context, int wpsSetup) {
|
|
||||||
super(context);
|
|
||||||
mContext = context;
|
|
||||||
mWpsSetup = wpsSetup;
|
|
||||||
|
|
||||||
class WpsListener extends WifiManager.WpsCallback {
|
|
||||||
|
|
||||||
public void onStarted(String pin) {
|
|
||||||
if (pin != null) {
|
|
||||||
updateDialog(DialogState.WPS_START, String.format(
|
|
||||||
mContext.getString(R.string.wifi_wps_onstart_pin), pin));
|
|
||||||
} else {
|
|
||||||
updateDialog(DialogState.WPS_START, mContext.getString(
|
|
||||||
R.string.wifi_wps_onstart_pbc));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onSucceeded() {
|
|
||||||
updateDialog(DialogState.WPS_COMPLETE,
|
|
||||||
mContext.getString(R.string.wifi_wps_complete));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onFailed(int reason) {
|
|
||||||
String msg;
|
|
||||||
switch (reason) {
|
|
||||||
case WifiManager.WPS_OVERLAP_ERROR:
|
|
||||||
msg = mContext.getString(R.string.wifi_wps_failed_overlap);
|
|
||||||
break;
|
|
||||||
case WifiManager.WPS_WEP_PROHIBITED:
|
|
||||||
msg = mContext.getString(R.string.wifi_wps_failed_wep);
|
|
||||||
break;
|
|
||||||
case WifiManager.WPS_TKIP_ONLY_PROHIBITED:
|
|
||||||
msg = mContext.getString(R.string.wifi_wps_failed_tkip);
|
|
||||||
break;
|
|
||||||
case WifiManager.IN_PROGRESS:
|
|
||||||
msg = mContext.getString(R.string.wifi_wps_in_progress);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
msg = mContext.getString(R.string.wifi_wps_failed_generic);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
updateDialog(DialogState.WPS_FAILED, msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mWpsListener = new WpsListener();
|
|
||||||
|
|
||||||
|
|
||||||
mFilter = new IntentFilter();
|
|
||||||
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
|
|
||||||
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
|
|
||||||
mReceiver = new BroadcastReceiver() {
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
handleEvent(context, intent);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
setCanceledOnTouchOutside(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Bundle onSaveInstanceState () {
|
|
||||||
Bundle bundle = super.onSaveInstanceState();
|
|
||||||
bundle.putString(DIALOG_STATE, mDialogState.toString());
|
|
||||||
bundle.putString(DIALOG_MSG_STRING, mMsgString.toString());
|
|
||||||
return bundle;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRestoreInstanceState(Bundle savedInstanceState) {
|
|
||||||
if (savedInstanceState != null) {
|
|
||||||
super.onRestoreInstanceState(savedInstanceState);
|
|
||||||
DialogState dialogState = mDialogState.valueOf(savedInstanceState.getString(DIALOG_STATE));
|
|
||||||
String msg = savedInstanceState.getString(DIALOG_MSG_STRING);
|
|
||||||
updateDialog(dialogState, msg);
|
|
||||||
if (dialogState == DialogState.WPS_START) {
|
|
||||||
startWps();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
mView = getLayoutInflater().inflate(R.layout.wifi_wps_dialog, null);
|
|
||||||
|
|
||||||
mTextView = (TextView) mView.findViewById(R.id.wps_dialog_txt);
|
|
||||||
mTextView.setText(R.string.wifi_wps_setup_msg);
|
|
||||||
|
|
||||||
mTimeoutBar = ((ProgressBar) mView.findViewById(R.id.wps_timeout_bar));
|
|
||||||
mTimeoutBar.setMax(WPS_TIMEOUT_S);
|
|
||||||
mTimeoutBar.setProgress(0);
|
|
||||||
|
|
||||||
mProgressBar = ((ProgressBar) mView.findViewById(R.id.wps_progress_bar));
|
|
||||||
mProgressBar.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
mButton = ((Button) mView.findViewById(R.id.wps_dialog_btn));
|
|
||||||
mButton.setText(R.string.wifi_cancel);
|
|
||||||
mButton.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
dismiss();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
|
|
||||||
|
|
||||||
setView(mView);
|
|
||||||
if (savedInstanceState == null) {
|
|
||||||
startWps();
|
|
||||||
}
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onStart() {
|
|
||||||
/*
|
|
||||||
* increment timeout bar per second.
|
|
||||||
*/
|
|
||||||
mTimer = new Timer(false);
|
|
||||||
mTimer.schedule(new TimerTask() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
mHandler.post(new Runnable() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
mTimeoutBar.incrementProgressBy(1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, 1000, 1000);
|
|
||||||
|
|
||||||
mContext.registerReceiver(mReceiver, mFilter);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onStop() {
|
|
||||||
if (mDialogState != DialogState.WPS_COMPLETE) {
|
|
||||||
mWifiManager.cancelWps(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mReceiver != null) {
|
|
||||||
mContext.unregisterReceiver(mReceiver);
|
|
||||||
mReceiver = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mTimer != null) {
|
|
||||||
mTimer.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateDialog(final DialogState state, final String msg) {
|
|
||||||
if (mDialogState.ordinal() >= state.ordinal()) {
|
|
||||||
//ignore.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mDialogState = state;
|
|
||||||
mMsgString = msg;
|
|
||||||
|
|
||||||
mHandler.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
switch(state) {
|
|
||||||
case WPS_COMPLETE:
|
|
||||||
mTimeoutBar.setVisibility(View.GONE);
|
|
||||||
mProgressBar.setVisibility(View.VISIBLE);
|
|
||||||
break;
|
|
||||||
case CONNECTED:
|
|
||||||
case WPS_FAILED:
|
|
||||||
mButton.setText(mContext.getString(R.string.dlg_ok));
|
|
||||||
mTimeoutBar.setVisibility(View.GONE);
|
|
||||||
mProgressBar.setVisibility(View.GONE);
|
|
||||||
if (mReceiver != null) {
|
|
||||||
mContext.unregisterReceiver(mReceiver);
|
|
||||||
mReceiver = null;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
mTextView.setText(msg);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void handleEvent(Context context, Intent intent) {
|
|
||||||
String action = intent.getAction();
|
|
||||||
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
|
|
||||||
final int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
|
|
||||||
WifiManager.WIFI_STATE_UNKNOWN);
|
|
||||||
if (state == WifiManager.WIFI_STATE_DISABLED) {
|
|
||||||
if (mTimer != null) {
|
|
||||||
mTimer.cancel();
|
|
||||||
mTimer = null;
|
|
||||||
}
|
|
||||||
String msg = mContext.getString(R.string.wifi_wps_failed_wifi_disconnected);
|
|
||||||
updateDialog(DialogState.WPS_FAILED, msg);
|
|
||||||
}
|
|
||||||
} else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
|
|
||||||
NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
|
|
||||||
WifiManager.EXTRA_NETWORK_INFO);
|
|
||||||
final NetworkInfo.DetailedState state = info.getDetailedState();
|
|
||||||
if (state == DetailedState.CONNECTED &&
|
|
||||||
mDialogState == DialogState.WPS_COMPLETE) {
|
|
||||||
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
|
|
||||||
if (wifiInfo != null) {
|
|
||||||
String msg = String.format(mContext.getString(
|
|
||||||
R.string.wifi_wps_connected), wifiInfo.getSSID());
|
|
||||||
updateDialog(DialogState.CONNECTED, msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void startWps() {
|
|
||||||
WpsInfo wpsConfig = new WpsInfo();
|
|
||||||
wpsConfig.setup = mWpsSetup;
|
|
||||||
mWifiManager.startWps(wpsConfig, mWpsListener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,155 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.android.settings.wifi;
|
|
||||||
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.app.FragmentManager;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.net.wifi.WifiManager;
|
|
||||||
import android.net.wifi.WpsInfo;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.annotation.VisibleForTesting;
|
|
||||||
import android.support.v7.preference.Preference;
|
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
|
||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
|
||||||
import com.android.settings.core.PreferenceControllerMixin;
|
|
||||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
|
||||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
|
||||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
|
||||||
import com.android.settingslib.core.lifecycle.events.OnPause;
|
|
||||||
import com.android.settingslib.core.lifecycle.events.OnResume;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@link PreferenceControllerMixin} that shows Dialog for WPS progress. Disabled when Wi-Fi is off.
|
|
||||||
*/
|
|
||||||
public class WpsPreferenceController extends AbstractPreferenceController
|
|
||||||
implements PreferenceControllerMixin, LifecycleObserver, OnPause, OnResume {
|
|
||||||
|
|
||||||
private static final String KEY_WPS_PUSH = "wps_push_button";
|
|
||||||
private static final String KEY_WPS_PIN = "wps_pin_entry";
|
|
||||||
|
|
||||||
private final WifiManager mWifiManager;
|
|
||||||
private final FragmentManager mFragmentManager;
|
|
||||||
@VisibleForTesting
|
|
||||||
final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
togglePreferences();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
private final IntentFilter mFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
|
|
||||||
|
|
||||||
private Preference mWpsPushPref;
|
|
||||||
private Preference mWpsPinPref;
|
|
||||||
|
|
||||||
public WpsPreferenceController(
|
|
||||||
Context context,
|
|
||||||
Lifecycle lifecycle,
|
|
||||||
WifiManager wifiManager,
|
|
||||||
FragmentManager fragmentManager) {
|
|
||||||
super(context);
|
|
||||||
mWifiManager = wifiManager;
|
|
||||||
mFragmentManager = fragmentManager;
|
|
||||||
lifecycle.addObserver(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAvailable() {
|
|
||||||
// Always show preference.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPreferenceKey() {
|
|
||||||
// Returns null because this controller contains more than 1 preference.
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void displayPreference(PreferenceScreen screen) {
|
|
||||||
super.displayPreference(screen);
|
|
||||||
mWpsPushPref = screen.findPreference(KEY_WPS_PUSH);
|
|
||||||
mWpsPinPref = screen.findPreference(KEY_WPS_PIN);
|
|
||||||
if (mWpsPushPref == null || mWpsPinPref == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// WpsDialog: Create the dialog like WifiSettings does.
|
|
||||||
mWpsPushPref.setOnPreferenceClickListener((arg) -> {
|
|
||||||
WpsFragment wpsFragment = new WpsFragment(WpsInfo.PBC);
|
|
||||||
wpsFragment.show(mFragmentManager, KEY_WPS_PUSH);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// WpsDialog: Create the dialog like WifiSettings does.
|
|
||||||
mWpsPinPref.setOnPreferenceClickListener((arg) -> {
|
|
||||||
WpsFragment wpsFragment = new WpsFragment(WpsInfo.DISPLAY);
|
|
||||||
wpsFragment.show(mFragmentManager, KEY_WPS_PIN);
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
togglePreferences();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
mContext.registerReceiver(mReceiver, mFilter);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause() {
|
|
||||||
mContext.unregisterReceiver(mReceiver);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void togglePreferences() {
|
|
||||||
if (mWpsPushPref != null && mWpsPinPref != null) {
|
|
||||||
boolean enabled = mWifiManager.isWifiEnabled();
|
|
||||||
mWpsPushPref.setEnabled(enabled);
|
|
||||||
mWpsPinPref.setEnabled(enabled);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fragment for Dialog to show WPS progress.
|
|
||||||
*/
|
|
||||||
public static class WpsFragment extends InstrumentedDialogFragment {
|
|
||||||
private static int mWpsSetup;
|
|
||||||
|
|
||||||
// Public default constructor is required for rotation.
|
|
||||||
public WpsFragment() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public WpsFragment(int wpsSetup) {
|
|
||||||
super();
|
|
||||||
mWpsSetup = wpsSetup;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMetricsCategory() {
|
|
||||||
return MetricsEvent.DIALOG_WPS_SETUP;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
|
||||||
return new WpsDialog(getActivity(), mWpsSetup);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -15,7 +15,6 @@ com.android.settings.applications.VrListenerSettings
|
|||||||
com.android.settings.inputmethod.UserDictionaryList
|
com.android.settings.inputmethod.UserDictionaryList
|
||||||
com.android.settings.datausage.DataSaverSummary
|
com.android.settings.datausage.DataSaverSummary
|
||||||
com.android.settings.datausage.AppDataUsage
|
com.android.settings.datausage.AppDataUsage
|
||||||
com.android.settings.datausage.DataPlanUsageSummary
|
|
||||||
com.android.settings.accessibility.FontSizePreferenceFragmentForSetupWizard
|
com.android.settings.accessibility.FontSizePreferenceFragmentForSetupWizard
|
||||||
com.android.settings.applications.ManageDomainUrls
|
com.android.settings.applications.ManageDomainUrls
|
||||||
com.android.settings.applications.appinfo.WriteSettingsDetails
|
com.android.settings.applications.appinfo.WriteSettingsDetails
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package com.android.settings;
|
package com.android.settings;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
import static org.mockito.ArgumentMatchers.nullable;
|
import static org.mockito.ArgumentMatchers.nullable;
|
||||||
import static org.mockito.Matchers.anyInt;
|
import static org.mockito.Matchers.anyInt;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
@@ -28,17 +27,14 @@ import static org.mockito.Mockito.when;
|
|||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.FragmentManager;
|
import android.app.FragmentManager;
|
||||||
import android.app.FragmentTransaction;
|
import android.app.FragmentTransaction;
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.os.Bundle;
|
|
||||||
|
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Answers;
|
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
@@ -48,9 +44,6 @@ import org.robolectric.annotation.Config;
|
|||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
public class SettingsActivityTest {
|
public class SettingsActivityTest {
|
||||||
|
|
||||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
|
||||||
private Context mContext;
|
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private FragmentManager mFragmentManager;
|
private FragmentManager mFragmentManager;
|
||||||
@Mock
|
@Mock
|
||||||
@@ -84,13 +77,4 @@ public class SettingsActivityTest {
|
|||||||
|
|
||||||
verify(mTaskDescription).setIcon(nullable(Bitmap.class));
|
verify(mTaskDescription).setIcon(nullable(Bitmap.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSaveState_EnabledHomeSaved() {
|
|
||||||
mActivity.mDisplayHomeAsUpEnabled = true;
|
|
||||||
Bundle bundle = new Bundle();
|
|
||||||
mActivity.saveState(bundle);
|
|
||||||
|
|
||||||
assertThat((boolean) bundle.get(SettingsActivity.SAVE_KEY_SHOW_HOME_AS_UP)).isTrue();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
package com.android.settings;
|
package com.android.settings;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@@ -25,9 +41,7 @@ import android.os.UserManager;
|
|||||||
import android.os.storage.DiskInfo;
|
import android.os.storage.DiskInfo;
|
||||||
import android.os.storage.StorageManager;
|
import android.os.storage.StorageManager;
|
||||||
import android.os.storage.VolumeInfo;
|
import android.os.storage.VolumeInfo;
|
||||||
import android.text.SpannableStringBuilder;
|
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import android.text.style.TtsSpan;
|
|
||||||
import android.util.IconDrawableFactory;
|
import android.util.IconDrawableFactory;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
@@ -35,6 +49,7 @@ import android.widget.TextView;
|
|||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -109,175 +124,6 @@ public class UtilsTest {
|
|||||||
assertThat(Utils.getWifiIpAddresses(mContext)).isNull();
|
assertThat(Utils.getWifiIpAddresses(mContext)).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatElapsedTime_WithSeconds_ShowSeconds() {
|
|
||||||
final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS;
|
|
||||||
final String expectedTime = "5m 30s";
|
|
||||||
|
|
||||||
assertThat(Utils.formatElapsedTime(mContext, testMillis, true).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatElapsedTime_NoSeconds_DoNotShowSeconds() {
|
|
||||||
final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS;
|
|
||||||
final String expectedTime = "6m";
|
|
||||||
|
|
||||||
assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatElapsedTime_TimeMoreThanOneDay_ShowCorrectly() {
|
|
||||||
final double testMillis = 2 * DateUtils.DAY_IN_MILLIS
|
|
||||||
+ 4 * DateUtils.HOUR_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS;
|
|
||||||
final String expectedTime = "2d 4h 15m";
|
|
||||||
|
|
||||||
assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatElapsedTime_ZeroFieldsInTheMiddleDontShow() {
|
|
||||||
final double testMillis = 2 * DateUtils.DAY_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS;
|
|
||||||
final String expectedTime = "2d 15m";
|
|
||||||
|
|
||||||
assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatElapsedTime_FormatZero_WithSeconds() {
|
|
||||||
final double testMillis = 0;
|
|
||||||
final String expectedTime = "0s";
|
|
||||||
|
|
||||||
assertThat(Utils.formatElapsedTime(mContext, testMillis, true).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatElapsedTime_FormatZero_NoSeconds() {
|
|
||||||
final double testMillis = 0;
|
|
||||||
final String expectedTime = "0m";
|
|
||||||
|
|
||||||
assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatElapsedTime_onlyContainsMinute_hasTtsSpan() {
|
|
||||||
final double testMillis = 15 * DateUtils.MINUTE_IN_MILLIS;
|
|
||||||
|
|
||||||
final CharSequence charSequence = Utils.formatElapsedTime(mContext, testMillis, false);
|
|
||||||
assertThat(charSequence).isInstanceOf(SpannableStringBuilder.class);
|
|
||||||
|
|
||||||
final SpannableStringBuilder expectedString = (SpannableStringBuilder) charSequence;
|
|
||||||
final TtsSpan[] ttsSpans = expectedString.getSpans(0, expectedString.length(),
|
|
||||||
TtsSpan.class);
|
|
||||||
|
|
||||||
assertThat(ttsSpans).asList().hasSize(1);
|
|
||||||
assertThat(ttsSpans[0].getType()).isEqualTo(TtsSpan.TYPE_MEASURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_WithSeconds_ShowSeconds() {
|
|
||||||
final double testMillis = 40 * DateUtils.SECOND_IN_MILLIS;
|
|
||||||
final String expectedTime = "40 sec. ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_NoSeconds_DoNotShowSeconds() {
|
|
||||||
final double testMillis = 40 * DateUtils.SECOND_IN_MILLIS;
|
|
||||||
final String expectedTime = "1 min. ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_LessThanTwoMinutes_withSeconds() {
|
|
||||||
final double testMillis = 119 * DateUtils.SECOND_IN_MILLIS;
|
|
||||||
final String expectedTime = "119 sec. ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_LessThanTwoMinutes_NoSeconds() {
|
|
||||||
final double testMillis = 119 * DateUtils.SECOND_IN_MILLIS;
|
|
||||||
final String expectedTime = "2 min. ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_TwoMinutes_withSeconds() {
|
|
||||||
final double testMillis = 2 * DateUtils.MINUTE_IN_MILLIS;
|
|
||||||
final String expectedTime = "2 min. ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_LessThanTwoHours_withSeconds() {
|
|
||||||
final double testMillis = 119 * DateUtils.MINUTE_IN_MILLIS;
|
|
||||||
final String expectedTime = "119 min. ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_TwoHours_withSeconds() {
|
|
||||||
final double testMillis = 2 * DateUtils.HOUR_IN_MILLIS;
|
|
||||||
final String expectedTime = "2 hr. ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_LessThanTwoDays_withSeconds() {
|
|
||||||
final double testMillis = 47 * DateUtils.HOUR_IN_MILLIS;
|
|
||||||
final String expectedTime = "47 hr. ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_TwoDays_withSeconds() {
|
|
||||||
final double testMillis = 2 * DateUtils.DAY_IN_MILLIS;
|
|
||||||
final String expectedTime = "2 days ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_FormatZero_WithSeconds() {
|
|
||||||
final double testMillis = 0;
|
|
||||||
final String expectedTime = "0 sec. ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFormatRelativeTime_FormatZero_NoSeconds() {
|
|
||||||
final double testMillis = 0;
|
|
||||||
final String expectedTime = "0 min. ago";
|
|
||||||
|
|
||||||
assertThat(Utils.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
|
|
||||||
expectedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testInitializeVolumeDoesntBreakOnNullVolume() {
|
public void testInitializeVolumeDoesntBreakOnNullVolume() {
|
||||||
VolumeInfo info = new VolumeInfo("id", 0, new DiskInfo("id", 0), "");
|
VolumeInfo info = new VolumeInfo("id", 0, new DiskInfo("id", 0), "");
|
||||||
|
|||||||
@@ -16,6 +16,14 @@
|
|||||||
|
|
||||||
package com.android.settings.backup;
|
package com.android.settings.backup;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static org.mockito.Mockito.anyInt;
|
||||||
|
import static org.mockito.Mockito.anyString;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.app.backup.BackupManager;
|
import android.app.backup.BackupManager;
|
||||||
import android.app.backup.IBackupManager;
|
import android.app.backup.IBackupManager;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
@@ -26,6 +34,10 @@ import android.content.res.Resources;
|
|||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.TestConfig;
|
||||||
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -36,19 +48,6 @@ import org.robolectric.annotation.Config;
|
|||||||
import org.robolectric.annotation.Implementation;
|
import org.robolectric.annotation.Implementation;
|
||||||
import org.robolectric.annotation.Implements;
|
import org.robolectric.annotation.Implements;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
import static org.mockito.Mockito.anyInt;
|
|
||||||
import static org.mockito.Mockito.anyString;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
import static org.mockito.Mockito.spy;
|
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
|
||||||
import com.android.settings.TestConfig;
|
|
||||||
import com.android.settingslib.drawer.SettingsDrawerActivity;
|
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
|
||||||
shadows = {BackupSettingsHelperTest.ShadowBackupManagerStub.class})
|
shadows = {BackupSettingsHelperTest.ShadowBackupManagerStub.class})
|
||||||
@@ -263,8 +262,6 @@ public class BackupSettingsHelperTest {
|
|||||||
|
|
||||||
assertThat(backupIntent.getComponent().getClassName()).isEqualTo(
|
assertThat(backupIntent.getComponent().getClassName()).isEqualTo(
|
||||||
DEFAULT_SETTINGS_CLASSNAME);
|
DEFAULT_SETTINGS_CLASSNAME);
|
||||||
assertThat(backupIntent.getExtras().getBoolean(
|
|
||||||
SettingsDrawerActivity.EXTRA_SHOW_MENU)).isTrue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -1,122 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License
|
|
||||||
*/
|
|
||||||
package com.android.settings.datausage;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.support.v7.preference.PreferenceViewHolder;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.TestConfig;
|
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
|
||||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
|
||||||
import com.android.settings.widget.DonutView;
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
import org.robolectric.annotation.Config;
|
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
|
|
||||||
shadows = {
|
|
||||||
SettingsShadowResources.class,
|
|
||||||
SettingsShadowResources.SettingsShadowTheme.class
|
|
||||||
}
|
|
||||||
)
|
|
||||||
public final class DataPlanSummaryPreferenceTest {
|
|
||||||
|
|
||||||
private static final String TEST_PLAN_USAGE = "Test plan usage";
|
|
||||||
private static final String TEST_PLAN_NAME = "Test plan name";
|
|
||||||
private static final String TEST_PLAN_DESCRIPTION = "Test plan description";
|
|
||||||
private static int sPlanUsageTextColor;
|
|
||||||
private static int sMeterBackgroundColor;
|
|
||||||
private static int sMeterConsumedColor;
|
|
||||||
|
|
||||||
@BeforeClass
|
|
||||||
public static void beforeClass() {
|
|
||||||
sPlanUsageTextColor = Color.parseColor("#FF5C94F1");
|
|
||||||
sMeterBackgroundColor = Color.parseColor("#FFDBDCDC");
|
|
||||||
sMeterConsumedColor = Color.parseColor("#FF5C94F1");
|
|
||||||
}
|
|
||||||
|
|
||||||
private DataPlanSummaryPreference mPreference;
|
|
||||||
private PreferenceViewHolder mHolder;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
SettingsShadowResources.overrideResource(
|
|
||||||
com.android.internal.R.string.config_headlineFontFamily, "");
|
|
||||||
Context context = RuntimeEnvironment.application;
|
|
||||||
mPreference = new DataPlanSummaryPreference(context);
|
|
||||||
LayoutInflater inflater = LayoutInflater.from(context);
|
|
||||||
View view = inflater.inflate(mPreference.getLayoutResource(),
|
|
||||||
new LinearLayout(context), false);
|
|
||||||
mHolder = PreferenceViewHolder.createInstanceForTests(view);
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void tearDown() {
|
|
||||||
SettingsShadowResources.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldRender_withoutData() {
|
|
||||||
mPreference.onBindViewHolder(mHolder);
|
|
||||||
|
|
||||||
TextView planUsageTextView = (TextView) mHolder.findViewById(android.R.id.title);
|
|
||||||
assertThat(planUsageTextView.getText().toString()).isEmpty();
|
|
||||||
TextView planNameTextView = (TextView) mHolder.findViewById(android.R.id.text1);
|
|
||||||
assertThat(planNameTextView.getText().toString()).isEmpty();
|
|
||||||
TextView planDescriptionTextView = (TextView) mHolder.findViewById(android.R.id.text2);
|
|
||||||
assertThat(planDescriptionTextView.getText().toString()).isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldRender_withData() {
|
|
||||||
mPreference.setTitle(TEST_PLAN_USAGE);
|
|
||||||
mPreference.setUsageTextColor(sPlanUsageTextColor);
|
|
||||||
mPreference.setName(TEST_PLAN_NAME);
|
|
||||||
mPreference.setDescription(TEST_PLAN_DESCRIPTION);
|
|
||||||
mPreference.setPercentageUsage(0.25D);
|
|
||||||
mPreference.setMeterBackgroundColor(sMeterBackgroundColor);
|
|
||||||
mPreference.setMeterConsumedColor(sMeterConsumedColor);
|
|
||||||
|
|
||||||
mPreference.onBindViewHolder(mHolder);
|
|
||||||
|
|
||||||
TextView planUsageTextView = (TextView) mHolder.findViewById(android.R.id.title);
|
|
||||||
assertThat(planUsageTextView.getTextColors().getDefaultColor())
|
|
||||||
.isEqualTo(sPlanUsageTextColor);
|
|
||||||
assertThat(planUsageTextView.getText()).isEqualTo(TEST_PLAN_USAGE);
|
|
||||||
|
|
||||||
TextView planNameTextView = (TextView) mHolder.findViewById(android.R.id.text1);
|
|
||||||
assertThat(planNameTextView.getText()).isEqualTo(TEST_PLAN_NAME);
|
|
||||||
|
|
||||||
TextView planDescriptionTextView = (TextView) mHolder.findViewById(android.R.id.text2);
|
|
||||||
assertThat(planDescriptionTextView.getText()).isEqualTo(TEST_PLAN_DESCRIPTION);
|
|
||||||
|
|
||||||
DonutView donutView = (DonutView) mHolder.findViewById(R.id.donut);
|
|
||||||
assertThat(donutView.getMeterBackgroundColor()).isEqualTo(sMeterBackgroundColor);
|
|
||||||
assertThat(donutView.getMeterConsumedColor()).isEqualTo(sMeterConsumedColor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.datausage;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
import static org.mockito.Matchers.any;
|
|
||||||
import static org.mockito.Matchers.anyInt;
|
|
||||||
import static org.mockito.Mockito.doReturn;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
import static org.mockito.Mockito.spy;
|
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.net.ConnectivityManager;
|
|
||||||
import android.net.NetworkPolicy;
|
|
||||||
import android.net.wifi.WifiConfiguration;
|
|
||||||
import android.net.wifi.WifiManager;
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.TestConfig;
|
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
|
||||||
import com.android.settingslib.NetworkPolicyEditor;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.MockitoAnnotations;
|
|
||||||
import org.robolectric.annotation.Config;
|
|
||||||
import org.robolectric.shadows.ShadowApplication;
|
|
||||||
import org.robolectric.util.ReflectionHelpers;
|
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
|
||||||
public class DataPlanUsageSummaryTest {
|
|
||||||
@Mock
|
|
||||||
private ConnectivityManager mManager;
|
|
||||||
|
|
||||||
private Context mContext;
|
|
||||||
private DataPlanUsageSummary mDataUsageSummary;
|
|
||||||
private NetworkPolicyEditor mPolicyEditor;
|
|
||||||
private WifiConfiguration mWifiConfiguration;
|
|
||||||
private NetworkPolicy mNetworkPolicy;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
MockitoAnnotations.initMocks(this);
|
|
||||||
ShadowApplication shadowContext = ShadowApplication.getInstance();
|
|
||||||
shadowContext.setSystemService(Context.CONNECTIVITY_SERVICE, mManager);
|
|
||||||
mContext = shadowContext.getApplicationContext();
|
|
||||||
when(mManager.isNetworkSupported(anyInt())).thenReturn(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testUpdateNetworkRestrictionSummary_shouldSetSummary() {
|
|
||||||
mDataUsageSummary = spy(new DataPlanUsageSummary());
|
|
||||||
NetworkRestrictionsPreference preference = mock(NetworkRestrictionsPreference.class);
|
|
||||||
mPolicyEditor = mock(NetworkPolicyEditor.class);
|
|
||||||
WifiManager wifiManager = mock(WifiManager.class);
|
|
||||||
ReflectionHelpers.setField(mDataUsageSummary, "mPolicyEditor", mPolicyEditor);
|
|
||||||
ReflectionHelpers.setField(mDataUsageSummary, "mWifiManager", wifiManager);
|
|
||||||
when(wifiManager.getConfiguredNetworks()).thenReturn(new ArrayList<>());
|
|
||||||
doReturn(mContext.getResources()).when(mDataUsageSummary).getResources();
|
|
||||||
|
|
||||||
mDataUsageSummary.updateNetworkRestrictionSummary(preference);
|
|
||||||
|
|
||||||
verify(preference).setSummary(mContext.getResources().getQuantityString(
|
|
||||||
R.plurals.network_restrictions_summary, 0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIsMetered_noSsid_shouldReturnFalse() {
|
|
||||||
initTest();
|
|
||||||
|
|
||||||
assertThat(mDataUsageSummary.isMetered(mWifiConfiguration)).isFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIsMetered_noNetworkPolicy_shouldReturnFalse() {
|
|
||||||
initTest();
|
|
||||||
mWifiConfiguration.SSID = "network1";
|
|
||||||
doReturn(null).when(mPolicyEditor).getPolicyMaybeUnquoted(any());
|
|
||||||
|
|
||||||
assertThat(mDataUsageSummary.isMetered(mWifiConfiguration)).isFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIsMetered_policyHasLimit_shouldReturnTrue() {
|
|
||||||
initTest();
|
|
||||||
mWifiConfiguration.SSID = "network1";
|
|
||||||
mNetworkPolicy = mock(NetworkPolicy.class);
|
|
||||||
mNetworkPolicy.limitBytes = 100;
|
|
||||||
doReturn(mNetworkPolicy).when(mPolicyEditor).getPolicyMaybeUnquoted(any());
|
|
||||||
|
|
||||||
assertThat(mDataUsageSummary.isMetered(mWifiConfiguration)).isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIsMetered_noPolicyLimit_shouldReturnMeteredValue() {
|
|
||||||
initTest();
|
|
||||||
mWifiConfiguration.SSID = "network1";
|
|
||||||
mNetworkPolicy = mock(NetworkPolicy.class);
|
|
||||||
mNetworkPolicy.limitBytes = NetworkPolicy.LIMIT_DISABLED;
|
|
||||||
doReturn(mNetworkPolicy).when(mPolicyEditor).getPolicyMaybeUnquoted(any());
|
|
||||||
|
|
||||||
mNetworkPolicy.metered = true;
|
|
||||||
assertThat(mDataUsageSummary.isMetered(mWifiConfiguration)).isTrue();
|
|
||||||
|
|
||||||
mNetworkPolicy.metered = false;
|
|
||||||
assertThat(mDataUsageSummary.isMetered(mWifiConfiguration)).isFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initTest() {
|
|
||||||
mDataUsageSummary = new DataPlanUsageSummary();
|
|
||||||
mPolicyEditor = mock(NetworkPolicyEditor.class);
|
|
||||||
ReflectionHelpers.setField(mDataUsageSummary, "mPolicyEditor", mPolicyEditor);
|
|
||||||
mWifiConfiguration = mock(WifiConfiguration.class);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.datausage;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.support.v7.preference.Preference;
|
|
||||||
import android.support.v7.preference.PreferenceViewHolder;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.TestConfig;
|
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
import org.robolectric.annotation.Config;
|
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
|
||||||
public final class DataPlansSyncTimePreferenceTest {
|
|
||||||
private static final String SYNC_TIME = "Today 12:24pm";
|
|
||||||
|
|
||||||
private Preference mPreference;
|
|
||||||
private PreferenceViewHolder mHolder;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
Context context = RuntimeEnvironment.application;
|
|
||||||
mPreference = new Preference(context);
|
|
||||||
mPreference.setLayoutResource(R.layout.data_plans_sync_time_preference);
|
|
||||||
|
|
||||||
LayoutInflater inflater = LayoutInflater.from(context);
|
|
||||||
View view = inflater.inflate(mPreference.getLayoutResource(),
|
|
||||||
new LinearLayout(context), false);
|
|
||||||
mHolder = PreferenceViewHolder.createInstanceForTests(view);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldRender_withData() {
|
|
||||||
mPreference.setTitle(SYNC_TIME);
|
|
||||||
|
|
||||||
mPreference.onBindViewHolder(mHolder);
|
|
||||||
|
|
||||||
TextView syncTimeTextView = (TextView) mHolder.findViewById(android.R.id.title);
|
|
||||||
assertThat(syncTimeTextView.getText()).isEqualTo(SYNC_TIME);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.datausage;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static org.mockito.Matchers.anyInt;
|
||||||
|
import static org.mockito.Mockito.doReturn;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.wifi.WifiConfiguration;
|
||||||
|
import android.net.wifi.WifiManager;
|
||||||
|
import android.text.format.Formatter;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.TestConfig;
|
||||||
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||||
|
import com.android.settingslib.NetworkPolicyEditor;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.annotation.Config;
|
||||||
|
import org.robolectric.shadows.ShadowApplication;
|
||||||
|
import org.robolectric.util.ReflectionHelpers;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
|
public class DataUsageSummaryLegacyTest {
|
||||||
|
@Mock
|
||||||
|
private ConnectivityManager mManager;
|
||||||
|
private Context mContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This set up is contrived to get a passing test so that the build doesn't block without tests.
|
||||||
|
* These tests should be updated as code gets refactored to improve testability.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
MockitoAnnotations.initMocks(this);
|
||||||
|
ShadowApplication shadowContext = ShadowApplication.getInstance();
|
||||||
|
shadowContext.setSystemService(Context.CONNECTIVITY_SERVICE, mManager);
|
||||||
|
mContext = shadowContext.getApplicationContext();
|
||||||
|
when(mManager.isNetworkSupported(anyInt())).thenReturn(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Config(shadows = {
|
||||||
|
SettingsShadowResources.class,
|
||||||
|
SettingsShadowResources.SettingsShadowTheme.class
|
||||||
|
})
|
||||||
|
public void formatUsage_shouldLookLikeFormatFileSize() {
|
||||||
|
SettingsShadowResources.overrideResource(com.android.internal.R.string.fileSizeSuffix,
|
||||||
|
"%1$s %2$s");
|
||||||
|
final long usage = 2147483648L; // 2GB
|
||||||
|
final String formattedUsage =
|
||||||
|
DataUsageSummaryLegacy.formatUsage(mContext, "^1", usage).toString();
|
||||||
|
final String formattedAsFileSize = Formatter.formatFileSize(mContext, usage);
|
||||||
|
assertThat(formattedUsage).isEqualTo(formattedAsFileSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.datausage;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.support.v7.preference.Preference;
|
|
||||||
import android.support.v7.preference.PreferenceViewHolder;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.TestConfig;
|
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
import org.robolectric.annotation.Config;
|
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
|
||||||
public final class ManageDataPlansPreferenceTest {
|
|
||||||
private Preference mPreference;
|
|
||||||
private PreferenceViewHolder mHolder;
|
|
||||||
private Context mContext;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
mContext = RuntimeEnvironment.application;
|
|
||||||
mPreference = new Preference(mContext);
|
|
||||||
mPreference.setLayoutResource(R.layout.manage_data_plans_preference);
|
|
||||||
LayoutInflater inflater = LayoutInflater.from(mContext);
|
|
||||||
View view = inflater.inflate(mPreference.getLayoutResource(),
|
|
||||||
new LinearLayout(mContext), false);
|
|
||||||
mHolder = PreferenceViewHolder.createInstanceForTests(view);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldRender_withData() {
|
|
||||||
mPreference.onBindViewHolder(mHolder);
|
|
||||||
Button managePlanButton = (Button) mHolder.findViewById(R.id.manage_data_plans);
|
|
||||||
assertThat(managePlanButton.getText())
|
|
||||||
.isEqualTo(mContext.getString(R.string.data_plan_usage_manage_plans_button_text));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -43,6 +43,9 @@ import com.android.settings.testutils.BatteryTestUtils;
|
|||||||
import com.android.settings.testutils.FakeFeatureFactory;
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
|
||||||
|
import com.android.settingslib.R;
|
||||||
|
import com.android.settingslib.utils.PowerUtil;
|
||||||
|
import java.time.Duration;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -72,6 +75,8 @@ public class BatteryInfoTest {
|
|||||||
public static final long TEST_CHARGE_TIME_REMAINING = TimeUnit.MINUTES.toMicros(1);
|
public static final long TEST_CHARGE_TIME_REMAINING = TimeUnit.MINUTES.toMicros(1);
|
||||||
public static final String TEST_CHARGE_TIME_REMAINING_STRINGIFIED =
|
public static final String TEST_CHARGE_TIME_REMAINING_STRINGIFIED =
|
||||||
"1m left until fully charged";
|
"1m left until fully charged";
|
||||||
|
public static final String TEST_BATTERY_LEVEL_10 = "10%";
|
||||||
|
public static final String FIFTEEN_MIN_FORMATTED = "15m";
|
||||||
private Intent mDisChargingBatteryBroadcast;
|
private Intent mDisChargingBatteryBroadcast;
|
||||||
private Intent mChargingBatteryBroadcast;
|
private Intent mChargingBatteryBroadcast;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -134,13 +139,15 @@ public class BatteryInfoTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetBatteryInfo_basedOnUsageTrue_usesCorrectString() {
|
public void testGetBatteryInfo_basedOnUsageTrueMoreThanFifteenMinutes_usesCorrectString() {
|
||||||
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
|
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
|
||||||
mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
|
mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
|
||||||
1000, true /* basedOnUsage */);
|
PowerUtil.convertMsToUs(Duration.ofHours(4).toMillis()),
|
||||||
|
true /* basedOnUsage */);
|
||||||
BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
|
BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
|
||||||
mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */,
|
mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */,
|
||||||
1000, true /* basedOnUsage */);
|
PowerUtil.convertMsToUs(Duration.ofHours(4).toMillis()),
|
||||||
|
true /* basedOnUsage */);
|
||||||
|
|
||||||
// We only add special mention for the long string
|
// We only add special mention for the long string
|
||||||
assertThat(info.remainingLabel.toString()).contains(ENHANCED_STRING_SUFFIX);
|
assertThat(info.remainingLabel.toString()).contains(ENHANCED_STRING_SUFFIX);
|
||||||
@@ -148,6 +155,41 @@ public class BatteryInfoTest {
|
|||||||
assertThat(info2.remainingLabel.toString()).doesNotContain(ENHANCED_STRING_SUFFIX);
|
assertThat(info2.remainingLabel.toString()).doesNotContain(ENHANCED_STRING_SUFFIX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetBatteryInfo_basedOnUsageTrueLessThanSevenMinutes_usesCorrectString() {
|
||||||
|
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
|
||||||
|
mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
|
||||||
|
PowerUtil.convertMsToUs(Duration.ofMinutes(7).toMillis()),
|
||||||
|
true /* basedOnUsage */);
|
||||||
|
BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
|
||||||
|
mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */,
|
||||||
|
PowerUtil.convertMsToUs(Duration.ofMinutes(7).toMillis()),
|
||||||
|
true /* basedOnUsage */);
|
||||||
|
|
||||||
|
// These should be identical in either case
|
||||||
|
assertThat(info.remainingLabel.toString()).isEqualTo(
|
||||||
|
mContext.getString(R.string.power_remaining_duration_only_shutdown_imminent));
|
||||||
|
assertThat(info2.remainingLabel.toString()).isEqualTo(
|
||||||
|
mContext.getString(R.string.power_remaining_duration_only_shutdown_imminent));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetBatteryInfo_basedOnUsageTrueBetweenSevenAndFifteenMinutes_usesCorrectString() {
|
||||||
|
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
|
||||||
|
mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
|
||||||
|
PowerUtil.convertMsToUs(Duration.ofMinutes(10).toMillis()),
|
||||||
|
true /* basedOnUsage */);
|
||||||
|
|
||||||
|
// Check that strings are showing less than 15 minutes remaining regardless of exact time.
|
||||||
|
assertThat(info.chargeLabel.toString()).isEqualTo(
|
||||||
|
mContext.getString(R.string.power_remaining_less_than_duration,
|
||||||
|
TEST_BATTERY_LEVEL_10, FIFTEEN_MIN_FORMATTED));
|
||||||
|
assertThat(info.remainingLabel.toString()).isEqualTo(
|
||||||
|
mContext.getString(R.string.power_remaining_less_than_duration_only,
|
||||||
|
FIFTEEN_MIN_FORMATTED));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetBatteryInfo_basedOnUsageFalse_usesDefaultString() {
|
public void testGetBatteryInfo_basedOnUsageFalse_usesDefaultString() {
|
||||||
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
|
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ import com.android.internal.os.BatteryStatsImpl;
|
|||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.TestConfig;
|
import com.android.settings.TestConfig;
|
||||||
import com.android.settings.Utils;
|
|
||||||
import com.android.settings.applications.LayoutPreference;
|
import com.android.settings.applications.LayoutPreference;
|
||||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||||
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
|
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
|
||||||
@@ -65,6 +64,7 @@ import com.android.settings.testutils.XmlTestUtils;
|
|||||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
|
||||||
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -367,8 +367,8 @@ public class PowerUsageSummaryLegacyTest {
|
|||||||
public void testUpdateScreenPreference_showCorrectSummary() {
|
public void testUpdateScreenPreference_showCorrectSummary() {
|
||||||
doReturn(mScreenBatterySipper).when(mFragment).findBatterySipperByType(any(), any());
|
doReturn(mScreenBatterySipper).when(mFragment).findBatterySipperByType(any(), any());
|
||||||
doReturn(mRealContext).when(mFragment).getContext();
|
doReturn(mRealContext).when(mFragment).getContext();
|
||||||
final CharSequence expectedSummary = Utils.formatElapsedTime(mRealContext, USAGE_TIME_MS,
|
final CharSequence expectedSummary =
|
||||||
false);
|
StringUtil.formatElapsedTime(mRealContext, USAGE_TIME_MS, false);
|
||||||
|
|
||||||
mFragment.updateScreenPreference();
|
mFragment.updateScreenPreference();
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.settings.notification;
|
package com.android.settings.notification;
|
||||||
|
|
||||||
|
import static android.app.Notification.VISIBILITY_PRIVATE;
|
||||||
import static android.app.NotificationChannel.DEFAULT_CHANNEL_ID;
|
import static android.app.NotificationChannel.DEFAULT_CHANNEL_ID;
|
||||||
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
|
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
|
||||||
import static android.app.NotificationManager.IMPORTANCE_MIN;
|
import static android.app.NotificationManager.IMPORTANCE_MIN;
|
||||||
@@ -114,14 +115,14 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNoCrashIfNoOnResume() throws Exception {
|
public void testNoCrashIfNoOnResume() {
|
||||||
mController.isAvailable();
|
mController.isAvailable();
|
||||||
mController.updateState(mock(RestrictedListPreference.class));
|
mController.updateState(mock(RestrictedListPreference.class));
|
||||||
mController.onPreferenceChange(mock(RestrictedListPreference.class), true);
|
mController.onPreferenceChange(mock(RestrictedListPreference.class), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsAvailable_notSecure() throws Exception {
|
public void testIsAvailable_notSecure() {
|
||||||
when(mLockUtils.isSecure(anyInt())).thenReturn(false);
|
when(mLockUtils.isSecure(anyInt())).thenReturn(false);
|
||||||
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_DEFAULT);
|
NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_DEFAULT);
|
||||||
@@ -130,7 +131,7 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsAvailable_notIfNotImportant() throws Exception {
|
public void testIsAvailable_notIfNotImportant() {
|
||||||
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_MIN);
|
NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_MIN);
|
||||||
mController.onResume(appRow, channel, null, null);
|
mController.onResume(appRow, channel, null, null);
|
||||||
@@ -138,7 +139,7 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsAvailable() throws Exception {
|
public void testIsAvailable() {
|
||||||
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
NotificationChannel channel =
|
NotificationChannel channel =
|
||||||
new NotificationChannel(DEFAULT_CHANNEL_ID, "", IMPORTANCE_DEFAULT);
|
new NotificationChannel(DEFAULT_CHANNEL_ID, "", IMPORTANCE_DEFAULT);
|
||||||
@@ -151,7 +152,7 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateState_disabledByAdmin_disableSecure() throws Exception {
|
public void testUpdateState_disabledByAdmin_disableSecure() {
|
||||||
ShadowRestrictionUtils.setRestricted(true);
|
ShadowRestrictionUtils.setRestricted(true);
|
||||||
UserInfo userInfo = new UserInfo(2, "user 2", UserInfo.FLAG_MANAGED_PROFILE);
|
UserInfo userInfo = new UserInfo(2, "user 2", UserInfo.FLAG_MANAGED_PROFILE);
|
||||||
when(mUm.getUserInfo(anyInt())).thenReturn(userInfo);
|
when(mUm.getUserInfo(anyInt())).thenReturn(userInfo);
|
||||||
@@ -173,7 +174,7 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateState_disabledByAdmin_disableUnredacted() throws Exception {
|
public void testUpdateState_disabledByAdmin_disableUnredacted() {
|
||||||
ShadowRestrictionUtils.setRestricted(true);
|
ShadowRestrictionUtils.setRestricted(true);
|
||||||
UserInfo userInfo = new UserInfo(2, "user 2", UserInfo.FLAG_MANAGED_PROFILE);
|
UserInfo userInfo = new UserInfo(2, "user 2", UserInfo.FLAG_MANAGED_PROFILE);
|
||||||
when(mUm.getUserInfo(anyInt())).thenReturn(userInfo);
|
when(mUm.getUserInfo(anyInt())).thenReturn(userInfo);
|
||||||
@@ -195,7 +196,7 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateState_noLockScreenNotificationsGlobally() throws Exception {
|
public void testUpdateState_noLockScreenNotificationsGlobally() {
|
||||||
Settings.Secure.putInt(mContext.getContentResolver(),
|
Settings.Secure.putInt(mContext.getContentResolver(),
|
||||||
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0);
|
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0);
|
||||||
|
|
||||||
@@ -211,10 +212,14 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
verify(pref, times(1)).setEntryValues(argumentCaptor.capture());
|
verify(pref, times(1)).setEntryValues(argumentCaptor.capture());
|
||||||
assertFalse(toStringList(argumentCaptor.getValue())
|
assertFalse(toStringList(argumentCaptor.getValue())
|
||||||
.contains(String.valueOf(VISIBILITY_NO_OVERRIDE)));
|
.contains(String.valueOf(VISIBILITY_NO_OVERRIDE)));
|
||||||
|
assertFalse(toStringList(argumentCaptor.getValue())
|
||||||
|
.contains(String.valueOf(VISIBILITY_PRIVATE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateState_noPrivateLockScreenNotificationsGlobally() throws Exception {
|
public void testUpdateState_noPrivateLockScreenNotificationsGlobally() {
|
||||||
|
Settings.Secure.putInt(mContext.getContentResolver(),
|
||||||
|
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 1);
|
||||||
Settings.Secure.putInt(mContext.getContentResolver(),
|
Settings.Secure.putInt(mContext.getContentResolver(),
|
||||||
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0);
|
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0);
|
||||||
|
|
||||||
@@ -228,12 +233,13 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
ArgumentCaptor<CharSequence[]> argumentCaptor =
|
ArgumentCaptor<CharSequence[]> argumentCaptor =
|
||||||
ArgumentCaptor.forClass(CharSequence[].class);
|
ArgumentCaptor.forClass(CharSequence[].class);
|
||||||
verify(pref, times(1)).setEntryValues(argumentCaptor.capture());
|
verify(pref, times(1)).setEntryValues(argumentCaptor.capture());
|
||||||
|
assertEquals(2, toStringList(argumentCaptor.getValue()).size());
|
||||||
assertFalse(toStringList(argumentCaptor.getValue())
|
assertFalse(toStringList(argumentCaptor.getValue())
|
||||||
.contains(String.valueOf(VISIBILITY_NO_OVERRIDE)));
|
.contains(String.valueOf(VISIBILITY_NO_OVERRIDE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateState_noGlobalRestriction() throws Exception {
|
public void testUpdateState_noGlobalRestriction() {
|
||||||
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
NotificationChannel channel = mock(NotificationChannel.class);
|
NotificationChannel channel = mock(NotificationChannel.class);
|
||||||
mController.onResume(appRow, channel, null, null);
|
mController.onResume(appRow, channel, null, null);
|
||||||
@@ -247,7 +253,7 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
List<String> values = toStringList(argumentCaptor.getValue());
|
List<String> values = toStringList(argumentCaptor.getValue());
|
||||||
assertEquals(3, values.size());
|
assertEquals(3, values.size());
|
||||||
assertTrue(values.contains(String.valueOf(VISIBILITY_NO_OVERRIDE)));
|
assertTrue(values.contains(String.valueOf(VISIBILITY_NO_OVERRIDE)));
|
||||||
assertTrue(values.contains(String.valueOf(Notification.VISIBILITY_PRIVATE)));
|
assertTrue(values.contains(String.valueOf(VISIBILITY_PRIVATE)));
|
||||||
assertTrue(values.contains(String.valueOf(Notification.VISIBILITY_SECRET)));
|
assertTrue(values.contains(String.valueOf(Notification.VISIBILITY_SECRET)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,7 +266,7 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateState_noChannelOverride() throws Exception {
|
public void testUpdateState_noChannelOverride() {
|
||||||
Settings.Secure.putInt(mContext.getContentResolver(),
|
Settings.Secure.putInt(mContext.getContentResolver(),
|
||||||
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0);
|
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0);
|
||||||
|
|
||||||
@@ -275,11 +281,11 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
|
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
|
||||||
verify(pref, times(1)).setValue(argumentCaptor.capture());
|
verify(pref, times(1)).setValue(argumentCaptor.capture());
|
||||||
|
|
||||||
assertEquals(String.valueOf(Notification.VISIBILITY_PRIVATE), argumentCaptor.getValue());
|
assertEquals(String.valueOf(VISIBILITY_PRIVATE), argumentCaptor.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateState_channelOverride() throws Exception {
|
public void testUpdateState_channelOverride() {
|
||||||
Settings.Secure.putInt(mContext.getContentResolver(),
|
Settings.Secure.putInt(mContext.getContentResolver(),
|
||||||
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0);
|
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0);
|
||||||
|
|
||||||
@@ -310,7 +316,7 @@ public class VisibilityPreferenceControllerTest {
|
|||||||
RestrictedListPreference pref = mock(RestrictedListPreference.class);
|
RestrictedListPreference pref = mock(RestrictedListPreference.class);
|
||||||
mController.updateState(pref);
|
mController.updateState(pref);
|
||||||
|
|
||||||
mController.onPreferenceChange(pref, String.valueOf(Notification.VISIBILITY_PRIVATE));
|
mController.onPreferenceChange(pref, String.valueOf(VISIBILITY_PRIVATE));
|
||||||
|
|
||||||
assertEquals(VISIBILITY_NO_OVERRIDE, channel.getLockscreenVisibility());
|
assertEquals(VISIBILITY_NO_OVERRIDE, channel.getLockscreenVisibility());
|
||||||
verify(mBackend, times(1)).updateChannel(any(), anyInt(), any());
|
verify(mBackend, times(1)).updateChannel(any(), anyInt(), any());
|
||||||
|
|||||||
@@ -1,347 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.search;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.database.Cursor;
|
|
||||||
import android.database.MatrixCursor;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
|
|
||||||
import com.android.settings.DisplaySettings;
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.TestConfig;
|
|
||||||
import com.android.settings.gestures.SwipeToNotificationSettings;
|
|
||||||
import com.android.settings.search.ResultPayload.Availability;
|
|
||||||
import com.android.settings.search.ResultPayload.PayloadType;
|
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
|
||||||
import com.android.settings.wifi.WifiSettings;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.mockito.MockitoAnnotations;
|
|
||||||
import org.robolectric.Robolectric;
|
|
||||||
import org.robolectric.annotation.Config;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
|
||||||
public class CursorToSearchResultConverterTest {
|
|
||||||
|
|
||||||
private static final List<String> TITLES = Arrays.asList("title1", "title2", "title3");
|
|
||||||
private static final String SUMMARY = "summary";
|
|
||||||
private static final String TARGET_PACKAGE = "a.b.c";
|
|
||||||
private static final String TARGET_CLASS = "a.b.c.class";
|
|
||||||
private static final String KEY = "key";
|
|
||||||
private static final int ICON = R.drawable.ic_search_24dp;
|
|
||||||
private static final int BASE_RANK = 1;
|
|
||||||
private static Intent sIntent;
|
|
||||||
|
|
||||||
@BeforeClass
|
|
||||||
public static void beforeClass() {
|
|
||||||
sIntent = new Intent("com.android.settings");
|
|
||||||
}
|
|
||||||
|
|
||||||
private Drawable mDrawable;
|
|
||||||
private CursorToSearchResultConverter mConverter;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
MockitoAnnotations.initMocks(this);
|
|
||||||
Context context = Robolectric.buildActivity(Activity.class).get();
|
|
||||||
mDrawable = context.getDrawable(ICON);
|
|
||||||
mConverter = new CursorToSearchResultConverter(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseCursor_MatchesIcon() {
|
|
||||||
final MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
|
|
||||||
final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(sIntent));
|
|
||||||
final String BLANK = "";
|
|
||||||
cursor.addRow(new Object[] {
|
|
||||||
KEY.hashCode(), // Doc ID
|
|
||||||
"Longer than 20 characters", // Title
|
|
||||||
SUMMARY, // Summary on
|
|
||||||
SUMMARY, // summary off
|
|
||||||
DisplaySettings.class.getName(),
|
|
||||||
BLANK, // screen title
|
|
||||||
ICON, // icon
|
|
||||||
BLANK, // action
|
|
||||||
null, // target package
|
|
||||||
BLANK, // target class
|
|
||||||
KEY, // Key
|
|
||||||
PayloadType.INTENT, // Payload Type
|
|
||||||
payload // Payload
|
|
||||||
});
|
|
||||||
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
Drawable resultDrawable = result.icon;
|
|
||||||
assertThat(resultDrawable).isNotNull();
|
|
||||||
assertThat(resultDrawable.toString()).isEqualTo(mDrawable.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseCursor_NoIcon() {
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(
|
|
||||||
getDummyCursor("noIcon" /* key */, "" /* className */), BASE_RANK);
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.icon).isNull();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseCursor_MatchesPayloadType() {
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
|
|
||||||
ResultPayload payload;
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
payload = result.payload;
|
|
||||||
assertThat(payload.getType()).isEqualTo(PayloadType.INTENT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testLongTitle_PenalizedInRank() {
|
|
||||||
final MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
|
|
||||||
final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(sIntent));
|
|
||||||
final String BLANK = "";
|
|
||||||
cursor.addRow(new Object[] {
|
|
||||||
KEY.hashCode(), // Doc ID
|
|
||||||
"Longer than 20 characters", // Title
|
|
||||||
SUMMARY, // Summary on
|
|
||||||
SUMMARY, // summary off
|
|
||||||
DisplaySettings.class.getName(),
|
|
||||||
BLANK, // screen title
|
|
||||||
null, // icon
|
|
||||||
BLANK, // action
|
|
||||||
null, // target package
|
|
||||||
BLANK, // target class
|
|
||||||
KEY, // Key
|
|
||||||
PayloadType.INTENT, // Payload Type
|
|
||||||
payload // Payload
|
|
||||||
});
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.rank).isEqualTo(BASE_RANK + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseCursor_MatchesResultPayload() {
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
|
|
||||||
ResultPayload payload;
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
payload = result.payload;
|
|
||||||
Intent intent = payload.getIntent();
|
|
||||||
assertThat(intent.getAction()).isEqualTo(sIntent.getAction());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseCursor_MatchesInlineSwitchPayload() {
|
|
||||||
MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
|
|
||||||
final String BLANK = "";
|
|
||||||
final String uri = "test.com";
|
|
||||||
final int type = ResultPayload.PayloadType.INLINE_SWITCH;
|
|
||||||
final int source = ResultPayload.SettingsSource.SECURE;
|
|
||||||
final String intentKey = "key";
|
|
||||||
final String intentVal = "value";
|
|
||||||
final Intent intent = new Intent();
|
|
||||||
intent.putExtra(intentKey, intentVal);
|
|
||||||
final InlineSwitchPayload payload = new InlineSwitchPayload(uri, source, 1 /* onValue */,
|
|
||||||
intent, true /* isDeviceSupported */, 0 /* defautValue */);
|
|
||||||
|
|
||||||
cursor.addRow(new Object[] {
|
|
||||||
KEY.hashCode(), // Doc ID
|
|
||||||
TITLES.get(0), // Title
|
|
||||||
SUMMARY, // Summary on
|
|
||||||
SUMMARY, // summary off
|
|
||||||
SwipeToNotificationSettings.class.getName(),
|
|
||||||
BLANK, // screen title
|
|
||||||
null, // icon
|
|
||||||
BLANK, // action
|
|
||||||
null, // target package
|
|
||||||
BLANK, // target class
|
|
||||||
KEY, // Key
|
|
||||||
type, // Payload Type
|
|
||||||
ResultPayloadUtils.marshall(payload) // Payload
|
|
||||||
});
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
final InlineSwitchPayload newPayload = (InlineSwitchPayload) result.payload;
|
|
||||||
final Intent rebuiltIntent = newPayload.getIntent();
|
|
||||||
assertThat(newPayload.getKey()).isEqualTo(uri);
|
|
||||||
assertThat(newPayload.getType()).isEqualTo(type);
|
|
||||||
assertThat(newPayload.mSettingSource).isEqualTo(source);
|
|
||||||
assertThat(newPayload.isStandard()).isTrue();
|
|
||||||
assertThat(newPayload.getAvailability()).isEqualTo(Availability.AVAILABLE);
|
|
||||||
assertThat(rebuiltIntent.getStringExtra(intentKey)).isEqualTo(intentVal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The following tests are temporary, and should be removed when we replace the Search
|
|
||||||
// White-list solution for elevating ranking.
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testWifiKey_PrioritizedResult() {
|
|
||||||
final String key = "main_toggle_wifi";
|
|
||||||
final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testBluetoothKey_PrioritizedResult() {
|
|
||||||
final String key = "main_toggle_bluetooth";
|
|
||||||
final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAirplaneKey_PrioritizedResult() {
|
|
||||||
final String key = "toggle_airplane";
|
|
||||||
final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
|
|
||||||
Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testHotspotKey_PrioritizedResult() {
|
|
||||||
final String key = "tether_settings";
|
|
||||||
final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testBatterySaverKey_PrioritizedResult() {
|
|
||||||
final String key = "battery_saver";
|
|
||||||
final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testNFCKey_PrioritizedResult() {
|
|
||||||
final String key = "toggle_nfc";
|
|
||||||
final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDataSaverKey_PrioritizedResult() {
|
|
||||||
final String key = "restrict_background";
|
|
||||||
final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDataUsageKey_PrioritizedResult() {
|
|
||||||
final String key = "data_usage_enable";
|
|
||||||
final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRoamingKey_PrioritizedResult() {
|
|
||||||
final String key = "button_roaming_key";
|
|
||||||
final Cursor cursor = getDummyCursor(key, WifiSettings.class.getName());
|
|
||||||
final Set<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
|
||||||
|
|
||||||
for (SearchResult result : results) {
|
|
||||||
assertThat(result.rank).isEqualTo(SearchResult.TOP_RANK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// End of temporary tests
|
|
||||||
|
|
||||||
private MatrixCursor getDummyCursor() {
|
|
||||||
String[] keys = new String[] {KEY + "1", KEY + "2", KEY + "3"};
|
|
||||||
return getDummyCursor(keys, "" /* className */);
|
|
||||||
}
|
|
||||||
|
|
||||||
private MatrixCursor getDummyCursor(String key, String className) {
|
|
||||||
String[] keys = new String[] {key};
|
|
||||||
return getDummyCursor(keys, className);
|
|
||||||
}
|
|
||||||
|
|
||||||
private MatrixCursor getDummyCursor(String[] keys, String className) {
|
|
||||||
MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
|
|
||||||
final String BLANK = "";
|
|
||||||
final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(sIntent));
|
|
||||||
|
|
||||||
for (int i = 0; i < keys.length; i++) {
|
|
||||||
ArrayList<Object> item = new ArrayList<>(DatabaseResultLoader.SELECT_COLUMNS.length);
|
|
||||||
item.add(keys[i].hashCode()); // Doc ID
|
|
||||||
item.add(TITLES.get(i)); // Title
|
|
||||||
item.add(SUMMARY); // Summary on
|
|
||||||
item.add(BLANK); // summary off
|
|
||||||
item.add(className); // classname
|
|
||||||
item.add(BLANK); // screen title
|
|
||||||
item.add(null); // Icon
|
|
||||||
item.add(sIntent.getAction()); // Intent action
|
|
||||||
item.add(TARGET_PACKAGE); // target package
|
|
||||||
item.add(TARGET_CLASS); // target class
|
|
||||||
item.add(keys[i]); // Key
|
|
||||||
item.add(Integer.toString(0)); // Payload Type
|
|
||||||
item.add(payload); // Payload
|
|
||||||
|
|
||||||
cursor.addRow(item);
|
|
||||||
}
|
|
||||||
return cursor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2016 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.search;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.TestConfig;
|
|
||||||
import com.android.settings.search.SearchResult.Builder;
|
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.robolectric.annotation.Config;
|
|
||||||
import org.robolectric.shadows.ShadowApplication;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
|
||||||
public class SearchResultBuilderTest {
|
|
||||||
|
|
||||||
private static final String TITLE = "title";
|
|
||||||
private static final String SUMMARY = "summary";
|
|
||||||
|
|
||||||
private Builder mBuilder;
|
|
||||||
private ArrayList<String> mBreadcrumbs;
|
|
||||||
private int mRank;
|
|
||||||
private ResultPayload mResultPayload;
|
|
||||||
private Drawable mIcon;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
mBuilder = new Builder();
|
|
||||||
mBreadcrumbs = new ArrayList<>();
|
|
||||||
mRank = 3;
|
|
||||||
mResultPayload = new ResultPayload(new Intent());
|
|
||||||
|
|
||||||
final Context context = ShadowApplication.getInstance().getApplicationContext();
|
|
||||||
mIcon = context.getDrawable(R.drawable.ic_search_24dp);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAllInfo_BuildSearchResult() {
|
|
||||||
mBuilder.setTitle(TITLE)
|
|
||||||
.setSummary(SUMMARY)
|
|
||||||
.setRank(mRank)
|
|
||||||
.addBreadcrumbs(mBreadcrumbs)
|
|
||||||
.setIcon(mIcon)
|
|
||||||
.setPayload(mResultPayload)
|
|
||||||
.setStableId(1);
|
|
||||||
SearchResult result = mBuilder.build();
|
|
||||||
|
|
||||||
assertThat(result).isNotNull();
|
|
||||||
assertThat(result.title).isEqualTo(TITLE);
|
|
||||||
assertThat(result.summary).isEqualTo(SUMMARY);
|
|
||||||
assertThat(result.rank).isEqualTo(mRank);
|
|
||||||
assertThat(result.breadcrumbs).isEqualTo(mBreadcrumbs);
|
|
||||||
assertThat(result.icon).isEqualTo(mIcon);
|
|
||||||
assertThat(result.payload).isEqualTo(mResultPayload);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(expected = IllegalStateException.class)
|
|
||||||
public void testNoStableId_BuildSearchResultException() {
|
|
||||||
mBuilder.setTitle(TITLE)
|
|
||||||
.setSummary(SUMMARY)
|
|
||||||
.setRank(mRank)
|
|
||||||
.addBreadcrumbs(mBreadcrumbs)
|
|
||||||
.setIcon(mIcon)
|
|
||||||
.setPayload(mResultPayload);
|
|
||||||
|
|
||||||
mBuilder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(expected = IllegalStateException.class)
|
|
||||||
public void testNoTitle_BuildSearchResultException() {
|
|
||||||
mBuilder.setSummary(SUMMARY)
|
|
||||||
.setRank(mRank)
|
|
||||||
.addBreadcrumbs(mBreadcrumbs)
|
|
||||||
.setIcon(mIcon)
|
|
||||||
.setPayload(mResultPayload)
|
|
||||||
.setStableId(1);
|
|
||||||
|
|
||||||
mBuilder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testNoRank_BuildSearchResult_pass() {
|
|
||||||
mBuilder.setTitle(TITLE)
|
|
||||||
.setSummary(SUMMARY)
|
|
||||||
.addBreadcrumbs(mBreadcrumbs)
|
|
||||||
.setIcon(mIcon)
|
|
||||||
.setPayload(mResultPayload)
|
|
||||||
.setStableId(1);
|
|
||||||
|
|
||||||
assertThat(mBuilder.build()).isNotNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testNoIcon_BuildSearchResult_pass() {
|
|
||||||
mBuilder.setTitle(TITLE)
|
|
||||||
.setSummary(SUMMARY)
|
|
||||||
.setRank(mRank)
|
|
||||||
.addBreadcrumbs(mBreadcrumbs)
|
|
||||||
.setPayload(mResultPayload)
|
|
||||||
.setStableId(1);
|
|
||||||
|
|
||||||
assertThat(mBuilder.build()).isNotNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(expected = IllegalStateException.class)
|
|
||||||
public void testNoPayload_BuildSearchResultException() {
|
|
||||||
mBuilder.setTitle(TITLE)
|
|
||||||
.setSummary(SUMMARY)
|
|
||||||
.setRank(mRank)
|
|
||||||
.addBreadcrumbs(mBreadcrumbs)
|
|
||||||
.setIcon(mIcon)
|
|
||||||
.setStableId(1);
|
|
||||||
|
|
||||||
mBuilder.build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -27,7 +27,6 @@ import com.android.settings.bluetooth.BluetoothFeatureProvider;
|
|||||||
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
|
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
|
||||||
import com.android.settings.dashboard.DashboardFeatureProvider;
|
import com.android.settings.dashboard.DashboardFeatureProvider;
|
||||||
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
|
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
|
||||||
import com.android.settings.datausage.DataPlanFeatureProvider;
|
|
||||||
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
|
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
|
||||||
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
|
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
|
||||||
import com.android.settings.gestures.AssistGestureFeatureProvider;
|
import com.android.settings.gestures.AssistGestureFeatureProvider;
|
||||||
@@ -62,7 +61,6 @@ public class FakeFeatureFactory extends FeatureFactory {
|
|||||||
public final UserFeatureProvider userFeatureProvider;
|
public final UserFeatureProvider userFeatureProvider;
|
||||||
public final AssistGestureFeatureProvider assistGestureFeatureProvider;
|
public final AssistGestureFeatureProvider assistGestureFeatureProvider;
|
||||||
public final BluetoothFeatureProvider bluetoothFeatureProvider;
|
public final BluetoothFeatureProvider bluetoothFeatureProvider;
|
||||||
public final DataPlanFeatureProvider dataPlanFeatureProvider;
|
|
||||||
public final SmsMirroringFeatureProvider smsMirroringFeatureProvider;
|
public final SmsMirroringFeatureProvider smsMirroringFeatureProvider;
|
||||||
public final SlicesFeatureProvider slicesFeatureProvider;
|
public final SlicesFeatureProvider slicesFeatureProvider;
|
||||||
public SearchFeatureProvider searchFeatureProvider;
|
public SearchFeatureProvider searchFeatureProvider;
|
||||||
@@ -103,7 +101,6 @@ public class FakeFeatureFactory extends FeatureFactory {
|
|||||||
userFeatureProvider = mock(UserFeatureProvider.class);
|
userFeatureProvider = mock(UserFeatureProvider.class);
|
||||||
assistGestureFeatureProvider = mock(AssistGestureFeatureProvider.class);
|
assistGestureFeatureProvider = mock(AssistGestureFeatureProvider.class);
|
||||||
bluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
|
bluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
|
||||||
dataPlanFeatureProvider = mock(DataPlanFeatureProvider.class);
|
|
||||||
smsMirroringFeatureProvider = mock(SmsMirroringFeatureProvider.class);
|
smsMirroringFeatureProvider = mock(SmsMirroringFeatureProvider.class);
|
||||||
slicesFeatureProvider = mock(SlicesFeatureProvider.class);
|
slicesFeatureProvider = mock(SlicesFeatureProvider.class);
|
||||||
mAccountFeatureProvider = mock(AccountFeatureProvider.class);
|
mAccountFeatureProvider = mock(AccountFeatureProvider.class);
|
||||||
@@ -174,11 +171,6 @@ public class FakeFeatureFactory extends FeatureFactory {
|
|||||||
return bluetoothFeatureProvider;
|
return bluetoothFeatureProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public DataPlanFeatureProvider getDataPlanFeatureProvider() {
|
|
||||||
return dataPlanFeatureProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AssistGestureFeatureProvider getAssistGestureFeatureProvider() {
|
public AssistGestureFeatureProvider getAssistGestureFeatureProvider() {
|
||||||
return assistGestureFeatureProvider;
|
return assistGestureFeatureProvider;
|
||||||
|
|||||||
@@ -91,6 +91,21 @@ public class AutoSyncWorkDataPreferenceControllerTest {
|
|||||||
assertThat(mController.isAvailable()).isFalse();
|
assertThat(mController.isAvailable()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void checkIsAvailable_null_workProfileUserHandle_shouldNotDisplay() {
|
||||||
|
when(mUserManager.isManagedProfile()).thenReturn(false);
|
||||||
|
when(mUserManager.isLinkedUser()).thenReturn(false);
|
||||||
|
|
||||||
|
final List<UserInfo> infos = new ArrayList<>();
|
||||||
|
infos.add(new UserInfo(UserHandle.USER_SYSTEM, "user 1", 0 /* flags */));
|
||||||
|
infos.add(new UserInfo(999, "xspace", 800010));
|
||||||
|
when(mUserManager.getProfiles(eq(UserHandle.USER_SYSTEM))).thenReturn(infos);
|
||||||
|
mController = new AutoSyncWorkDataPreferenceController(mContext, mFragment);
|
||||||
|
|
||||||
|
assertThat(mController.mUserHandle).isEqualTo(null);
|
||||||
|
assertThat(mController.isAvailable()).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void multipleProfile_shouldInitWithWorkProfileUserHandle() {
|
public void multipleProfile_shouldInitWithWorkProfileUserHandle() {
|
||||||
when(mUserManager.isManagedProfile()).thenReturn(false);
|
when(mUserManager.isManagedProfile()).thenReturn(false);
|
||||||
|
|||||||
@@ -1,140 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.android.settings.wifi;
|
|
||||||
|
|
||||||
import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
|
|
||||||
import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
|
|
||||||
import static org.mockito.Matchers.any;
|
|
||||||
import static org.mockito.Matchers.anyString;
|
|
||||||
import static org.mockito.Mockito.times;
|
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
|
|
||||||
import android.app.FragmentManager;
|
|
||||||
import android.arch.lifecycle.LifecycleOwner;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.net.wifi.WifiManager;
|
|
||||||
import android.support.v7.preference.Preference;
|
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
|
||||||
|
|
||||||
import com.android.settings.TestConfig;
|
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
|
||||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.mockito.Answers;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.MockitoAnnotations;
|
|
||||||
import org.robolectric.annotation.Config;
|
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
|
||||||
public class WpsPreferenceControllerTest {
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private Context mContext;
|
|
||||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
|
||||||
private WifiManager mWifiManager;
|
|
||||||
@Mock
|
|
||||||
private FragmentManager mFragmentManager;
|
|
||||||
@Mock
|
|
||||||
private PreferenceScreen mScreen;
|
|
||||||
@Mock
|
|
||||||
private Preference mWpsPushPref;
|
|
||||||
@Mock
|
|
||||||
private Preference mWpsPinPref;
|
|
||||||
|
|
||||||
private Lifecycle mLifecycle;
|
|
||||||
private LifecycleOwner mLifecycleOwner;
|
|
||||||
private WpsPreferenceController mController;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
MockitoAnnotations.initMocks(this);
|
|
||||||
mLifecycleOwner = () -> mLifecycle;
|
|
||||||
mLifecycle = new Lifecycle(mLifecycleOwner);
|
|
||||||
when(mContext.getSystemService(WifiManager.class))
|
|
||||||
.thenReturn(mWifiManager);
|
|
||||||
when(mScreen.findPreference(anyString()))
|
|
||||||
.thenReturn(mWpsPushPref)
|
|
||||||
.thenReturn(mWpsPinPref);
|
|
||||||
mController = new WpsPreferenceController(
|
|
||||||
mContext, mLifecycle, mWifiManager, mFragmentManager);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIsAvailable_shouldAlwaysReturnTrue() {
|
|
||||||
assertThat(mController.isAvailable()).isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testOnResume_shouldRegisterListener() {
|
|
||||||
mLifecycle.handleLifecycleEvent(ON_RESUME);
|
|
||||||
verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
|
|
||||||
}
|
|
||||||
@Test
|
|
||||||
public void testOnPause_shouldUnregisterListener() {
|
|
||||||
mLifecycle.handleLifecycleEvent(ON_RESUME);
|
|
||||||
mLifecycle.handleLifecycleEvent(ON_PAUSE);
|
|
||||||
verify(mContext).unregisterReceiver(any(BroadcastReceiver.class));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testWifiStateChange_shouldToggleEnabledState() {
|
|
||||||
when(mWifiManager.isWifiEnabled()).thenReturn(true);
|
|
||||||
|
|
||||||
//Sets the preferences.
|
|
||||||
mController.displayPreference(mScreen);
|
|
||||||
verify(mWpsPushPref).setEnabled(true);
|
|
||||||
verify(mWpsPinPref).setEnabled(true);
|
|
||||||
|
|
||||||
Intent dummyIntent = new Intent();
|
|
||||||
mController.mReceiver.onReceive(mContext, dummyIntent);
|
|
||||||
verify(mWpsPushPref, times(2)).setEnabled(true);
|
|
||||||
verify(mWpsPinPref, times(2)).setEnabled(true);
|
|
||||||
|
|
||||||
when(mWifiManager.isWifiEnabled()).thenReturn(false);
|
|
||||||
mController.mReceiver.onReceive(mContext, dummyIntent);
|
|
||||||
verify(mWpsPushPref).setEnabled(false);
|
|
||||||
verify(mWpsPinPref).setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDisplayPreference_shouldSetPreferenceClickListenerAndToggleEnabledState() {
|
|
||||||
when(mWifiManager.isWifiEnabled()).thenReturn(true);
|
|
||||||
mController.displayPreference(mScreen);
|
|
||||||
verify(mWpsPushPref).setOnPreferenceClickListener(any());
|
|
||||||
verify(mWpsPinPref).setOnPreferenceClickListener(any());
|
|
||||||
verify(mWpsPushPref).setEnabled(true);
|
|
||||||
verify(mWpsPinPref).setEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDisplayPreference_shouldDisablePreferenceWhenWifiDisabled() {
|
|
||||||
when(mWifiManager.isWifiEnabled()).thenReturn(false);
|
|
||||||
mController.displayPreference(mScreen);
|
|
||||||
verify(mWpsPushPref).setEnabled(false);
|
|
||||||
verify(mWpsPinPref).setEnabled(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||