Merge "Change header of wifi detail page to "Network info"."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4e75bf6..c73c909 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2496,11 +2496,6 @@
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</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.apps.default" />
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.nfc.PaymentSettings" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
@@ -3001,7 +2996,7 @@
<meta-data android:name="com.android.settings.category"
android:value="com.android.settings.category.ia.apps"/>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.applications.AdvancedAppSettings" />
+ android:value="com.android.settings.applications.DefaultAppSettings" />
<meta-data android:name="com.android.settings.summary"
android:resource="@string/summary_empty"/>
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
diff --git a/res/layout/data_plans_sync_time_preference.xml b/res/layout/data_plans_sync_time_preference.xml
new file mode 100644
index 0000000..bb9da90
--- /dev/null
+++ b/res/layout/data_plans_sync_time_preference.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 The Android Open Source Project
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at"+
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Shows the data plans sync time -->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@android:id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/preference_no_icon_padding_start"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:gravity="end"
+ android:textColor="?android:attr/textColorSecondary"/>
diff --git a/res/layout/data_usage_bytes_editor.xml b/res/layout/data_usage_bytes_editor.xml
index 2878c3e..af2d59b 100644
--- a/res/layout/data_usage_bytes_editor.xml
+++ b/res/layout/data_usage_bytes_editor.xml
@@ -37,7 +37,6 @@
android:id="@+id/size_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:entries="@array/bytes_picker_sizes" />
+ android:layout_gravity="center_vertical" />
</LinearLayout>
diff --git a/res/layout/manage_data_plans_preference.xml b/res/layout/manage_data_plans_preference.xml
new file mode 100644
index 0000000..1686d3f
--- /dev/null
+++ b/res/layout/manage_data_plans_preference.xml
@@ -0,0 +1,32 @@
+<?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/AppActionPrimaryButton" />
+</FrameLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index acb53d2..df2168d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4688,7 +4688,7 @@
<!-- Text for OK button in force stop dialog [CHAR LIMIT=30] -->
<string name="dialog_stop_ok">Stop app</string>
- <!-- Title for background usage dialog [CHAR LIMIT=60] -->
+ <!-- Title for background usage dialog [CHAR LIMIT=70] -->
<string name="dialog_background_check_title">Turn off background usage & stop app?</string>
<!-- Message body for background usage dialog [CHAR LIMIT=NONE] -->
<string name="dialog_background_check_message" product="default">Your phone can\'t manage battery normally because <xliff:g id="app">%1$s</xliff:g> keeps waking up your phone.\n\nTo try to fix this issue, you can stop <xliff:g id="app">%1$s</xliff:g> and prevent it from running in the background.</string>
@@ -5528,6 +5528,9 @@
<!-- action to select all [CHAR LIMIT=30] -->
<string name="select_all">Select all</string>
+ <!-- A button that gets displayed in data plan usage preference in settings page to manage data plans [CHAR LIMIT=25] -->
+ <string name="data_plan_usage_manage_plans_button_text">Manage plans</string>
+
<!-- Activity title for network data usage summary. [CHAR LIMIT=25] -->
<string name="data_usage_summary_title">Data usage</string>
<!-- Activity title for Appk data usage summary. [CHAR LIMIT=25] -->
@@ -5717,6 +5720,13 @@
<!-- Body text prompting user to enable Wi-Fi to configure metered networks. [CHAR LIMIT=64] -->
<string name="data_usage_metered_wifi_disabled">To select metered networks, turn Wi\u2011Fi on.</string>
+ <!-- Option for indicating that a network being metered (expensive) should be determined automatically. [CHAR LIMIT=32] -->
+ <string name="data_usage_metered_auto">Automatic</string>
+ <!-- Option for indicating that a network is metered (expensive). [CHAR LIMIT=32] -->
+ <string name="data_usage_metered_yes">Metered</string>
+ <!-- Option for indicating that a network is not metered (inexpensive). [CHAR LIMIT=32] -->
+ <string name="data_usage_metered_no">Not metered</string>
+
<!-- Disclaimer string for data usage measured by device. [CHAR LIMIT=80] -->
<string name="data_usage_disclaimer">Carrier data accounting may differ from your device.</string>
@@ -8330,11 +8340,6 @@
<!-- Text for the setting on whether you can type text into notifications without unlocking the device. -->
<string name="lockscreen_remote_input">If device is locked, prevent typing replies or other text in notifications</string>
- <string-array name="bytes_picker_sizes" translatable="false">
- <item>@*android:string/megabyteShort</item>
- <item>@*android:string/gigabyteShort</item>
- </string-array>
-
<!-- [CHAR LIMIT=30] Label for setting to control the default spell checker -->
<string name="default_spell_checker">Default spell checker</string>
diff --git a/res/xml/app_default_settings.xml b/res/xml/app_default_settings.xml
index 11acb24..196ed9f 100644
--- a/res/xml/app_default_settings.xml
+++ b/res/xml/app_default_settings.xml
@@ -23,56 +23,56 @@
<Preference
android:key="assist_and_voice_input"
android:title="@string/assist_and_voice_input_title"
- android:fragment="com.android.settings.applications.assist.ManageAssist"
- android:order="-20"/>
+ android:fragment="com.android.settings.applications.assist.ManageAssist" />
<Preference
android:key="default_browser"
android:title="@string/default_browser_title"
- android:fragment="com.android.settings.applications.defaultapps.DefaultBrowserPicker"
- android:order="-19">
- <extra android:name="for_work" android:value="false"/>
+ android:fragment="com.android.settings.applications.defaultapps.DefaultBrowserPicker">
+ <extra android:name="for_work" android:value="false" />
</Preference>
<Preference
android:key="default_home"
android:title="@string/home_app"
android:fragment="com.android.settings.applications.defaultapps.DefaultHomePicker"
- settings:keywords="@string/keywords_home"
- android:order="-18"/>
+ settings:keywords="@string/keywords_home" />
<Preference
android:key="default_phone_app"
android:title="@string/default_phone_title"
android:fragment="com.android.settings.applications.defaultapps.DefaultPhonePicker"
- settings:keywords="@string/keywords_default_phone_app"
- android:order="-17"/>
+ settings:keywords="@string/keywords_default_phone_app" />
<Preference
android:key="default_sms_app"
android:title="@string/sms_application_title"
android:fragment="com.android.settings.applications.defaultapps.DefaultSmsPicker"
- settings:keywords="@string/keywords_more_default_sms_app"
- android:order="-16"/>
+ settings:keywords="@string/keywords_more_default_sms_app" />
+
+ <Preference
+ android:key="default_payment_app"
+ android:title="@string/nfc_payment_settings_title"
+ android:summary="@string/summary_placeholder"
+ android:fragment="com.android.settings.nfc.PaymentSettings" />
<Preference
android:key="default_emergency_app"
android:title="@string/default_emergency_app"
- settings:keywords="@string/keywords_emergency_app"
- android:order="-15"/>
+ settings:keywords="@string/keywords_emergency_app" />
<!--
<Preference
android:key="default_notification_asst_app"
android:title="@string/default_notification_assistant"
android:fragment="com.android.settings.applications.defaultapps.DefaultNotificationAssistantPicker"
- android:order="-13"/>
+ />
-->
<Preference
android:key="domain_urls"
android:title="@string/domain_urls_title"
- android:fragment="com.android.settings.applications.ManageDomainUrls"/>
+ android:fragment="com.android.settings.applications.ManageDomainUrls" />
<com.android.settings.WorkOnlyCategory
android:key="work_defaults"
@@ -82,7 +82,7 @@
android:key="work_default_browser"
android:title="@string/default_browser_title"
android:fragment="com.android.settings.applications.defaultapps.DefaultBrowserPicker">
- <extra android:name="for_work" android:value="true"/>
+ <extra android:name="for_work" android:value="true" />
</Preference>
<Preference
@@ -90,7 +90,7 @@
android:title="@string/default_phone_title"
android:fragment="com.android.settings.applications.defaultapps.DefaultPhonePicker"
settings:keywords="@string/keywords_default_phone_app">
- <extra android:name="for_work" android:value="true"/>
+ <extra android:name="for_work" android:value="true" />
</Preference>
</com.android.settings.WorkOnlyCategory>
diff --git a/res/xml/wifi_network_details_fragment.xml b/res/xml/wifi_network_details_fragment.xml
index 64e61b1..443cb88 100644
--- a/res/xml/wifi_network_details_fragment.xml
+++ b/res/xml/wifi_network_details_fragment.xml
@@ -14,9 +14,7 @@
limitations under the License.
-->
-<PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res/com.android.settings" >
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.android.settings.applications.LayoutPreference
android:key="connection_header"
diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index dc4c995..fe0111b 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -247,9 +247,8 @@
/**
* Whether to show the checkbox to wipe the eUICC.
*
- * <p>We show the checkbox on any device which supports eUICC as long as either the eUICC was
- * ever provisioned (that is, at least one profile was ever downloaded onto it), or if the user
- * has enabled development mode.
+ * <p>We show the checkbox on any device which supports eUICC as long as the eUICC was ever
+ * provisioned (that is, at least one profile was ever downloaded onto it).
*/
@VisibleForTesting
boolean showWipeEuicc() {
@@ -258,8 +257,7 @@
return false;
}
ContentResolver cr = context.getContentResolver();
- return Settings.Global.getInt(cr, Settings.Global.EUICC_PROVISIONED, 0) != 0
- || Settings.Global.getInt(cr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
+ return Settings.Global.getInt(cr, Settings.Global.EUICC_PROVISIONED, 0) != 0;
}
@VisibleForTesting
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index a7d9afc..225c5ea 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -813,13 +813,6 @@
Settings.DateTimeSettingsActivity.class.getName()),
!UserManager.isDeviceInDemoMode(this), isAdmin)
|| somethingChanged;
- NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
- somethingChanged = setTileEnabled(new ComponentName(packageName,
- Settings.PaymentSettingsActivity.class.getName()),
- pm.hasSystemFeature(PackageManager.FEATURE_NFC)
- && pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)
- && adapter != null && adapter.isEnabled(), isAdmin)
- || somethingChanged;
somethingChanged = setTileEnabled(new ComponentName(packageName,
Settings.PrintSettingsActivity.class.getName()),
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/DefaultAppSettings.java
similarity index 90%
rename from src/com/android/settings/applications/AdvancedAppSettings.java
rename to src/com/android/settings/applications/DefaultAppSettings.java
index a237bb8..5b15e51 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/DefaultAppSettings.java
@@ -22,6 +22,7 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
+import com.android.settings.applications.assist.DefaultAssistPreferenceController;
import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
import com.android.settings.applications.defaultapps.DefaultEmergencyPreferenceController;
import com.android.settings.applications.defaultapps.DefaultHomePreferenceController;
@@ -29,6 +30,7 @@
import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
import com.android.settings.applications.defaultapps.DefaultWorkBrowserPreferenceController;
import com.android.settings.applications.defaultapps.DefaultWorkPhonePreferenceController;
+import com.android.settings.applications.defaultapps.DefaultPaymentSettingsPreferenceController;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -39,9 +41,9 @@
import java.util.Arrays;
import java.util.List;
-public class AdvancedAppSettings extends DashboardFragment {
+public class DefaultAppSettings extends DashboardFragment {
- static final String TAG = "AdvancedAppSettings";
+ static final String TAG = "DefaultAppSettings";
private static final String KEY_ASSIST_VOICE_INPUT = "assist_and_voice_input";
@@ -67,6 +69,8 @@
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ controllers.add(new DefaultAssistPreferenceController(context, KEY_ASSIST_VOICE_INPUT,
+ false /* showSetting */));
controllers.add(new DefaultBrowserPreferenceController(context));
controllers.add(new DefaultWorkBrowserPreferenceController(context));
controllers.add(new DefaultPhonePreferenceController(context));
@@ -74,6 +78,7 @@
controllers.add(new DefaultSmsPreferenceController(context));
controllers.add(new DefaultEmergencyPreferenceController(context));
controllers.add(new DefaultHomePreferenceController(context));
+ controllers.add(new DefaultPaymentSettingsPreferenceController(context));
return controllers;
}
@@ -100,7 +105,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> getPreferenceControllers(
+ Context context) {
return buildPreferenceControllers(context);
}
};
@@ -152,7 +158,7 @@
@Override
public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
SummaryLoader summaryLoader) {
- return new AdvancedAppSettings.SummaryProvider(activity, summaryLoader);
+ return new DefaultAppSettings.SummaryProvider(activity, summaryLoader);
}
};
}
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index d12fcf8..f339c58 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -1070,27 +1070,27 @@
final Context context = getContext();
if (DefaultHomePreferenceController.hasHomePreference(mPackageName, context)) {
screen.addPreference(new ShortcutPreference(getPrefContext(),
- AdvancedAppSettings.class, "default_home", R.string.home_app,
+ DefaultAppSettings.class, "default_home", R.string.home_app,
R.string.configure_apps));
}
if (DefaultBrowserPreferenceController.hasBrowserPreference(mPackageName, context)) {
screen.addPreference(new ShortcutPreference(getPrefContext(),
- AdvancedAppSettings.class, "default_browser", R.string.default_browser_title,
+ DefaultAppSettings.class, "default_browser", R.string.default_browser_title,
R.string.configure_apps));
}
if (DefaultPhonePreferenceController.hasPhonePreference(mPackageName, context)) {
screen.addPreference(new ShortcutPreference(getPrefContext(),
- AdvancedAppSettings.class, "default_phone_app", R.string.default_phone_title,
+ DefaultAppSettings.class, "default_phone_app", R.string.default_phone_title,
R.string.configure_apps));
}
if (DefaultEmergencyPreferenceController.hasEmergencyPreference(mPackageName, context)) {
screen.addPreference(new ShortcutPreference(getPrefContext(),
- AdvancedAppSettings.class, "default_emergency_app",
+ DefaultAppSettings.class, "default_emergency_app",
R.string.default_emergency_app, R.string.configure_apps));
}
if (DefaultSmsPreferenceController.hasSmsPreference(mPackageName, context)) {
screen.addPreference(new ShortcutPreference(getPrefContext(),
- AdvancedAppSettings.class, "default_sms_app", R.string.sms_application_title,
+ DefaultAppSettings.class, "default_sms_app", R.string.sms_application_title,
R.string.configure_apps));
}
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 454241a..7cc47e0 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -688,7 +688,7 @@
ADVANCED_SETTINGS);
} else {
((SettingsActivity) getActivity()).startPreferencePanel(this,
- AdvancedAppSettings.class.getName(), null, R.string.configure_apps,
+ DefaultAppSettings.class.getName(), null, R.string.configure_apps,
null, this, ADVANCED_SETTINGS);
}
return true;
diff --git a/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java b/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
index b8d6a87..7520155 100644
--- a/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
+++ b/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
@@ -23,8 +23,8 @@
import android.content.pm.ResolveInfo;
import android.service.voice.VoiceInteractionService;
import android.service.voice.VoiceInteractionServiceInfo;
-
import android.support.annotation.VisibleForTesting;
+
import com.android.internal.app.AssistUtils;
import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.applications.defaultapps.DefaultAppPreferenceController;
@@ -33,17 +33,23 @@
public class DefaultAssistPreferenceController extends DefaultAppPreferenceController {
- private static final String KEY_DEFAULT_ASSIST = "default_assist";
+ private final AssistUtils mAssistUtils;
+ private final boolean mShowSetting;
+ private final String mPrefKey;
- private AssistUtils mAssistUtils;
-
- public DefaultAssistPreferenceController(Context context) {
+ public DefaultAssistPreferenceController(Context context, String prefKey,
+ boolean showSetting) {
super(context);
+ mPrefKey = prefKey;
+ mShowSetting = showSetting;
mAssistUtils = new AssistUtils(context);
}
@Override
protected Intent getSettingIntent(DefaultAppInfo info) {
+ if (!mShowSetting) {
+ return null;
+ }
final ComponentName cn = mAssistUtils.getAssistComponentForUser(mUserId);
if (cn == null) {
return null;
@@ -72,7 +78,7 @@
@Override
public String getPreferenceKey() {
- return KEY_DEFAULT_ASSIST;
+ return mPrefKey;
}
@Override
diff --git a/src/com/android/settings/applications/assist/ManageAssist.java b/src/com/android/settings/applications/assist/ManageAssist.java
index a34d3f1..eb14ea1 100644
--- a/src/com/android/settings/applications/assist/ManageAssist.java
+++ b/src/com/android/settings/applications/assist/ManageAssist.java
@@ -71,7 +71,8 @@
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
- controllers.add(new DefaultAssistPreferenceController(context));
+ controllers.add(new DefaultAssistPreferenceController(context, "default_assist",
+ true /* showSetting */));
controllers.add(new AssistGesturePreferenceController(context, lifecycle, KEY_ASSIST,
true /* assistOnly */));
controllers.add(new AssistContextPreferenceController(context, lifecycle));
@@ -81,7 +82,6 @@
return controllers;
}
-
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java b/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
index b40943f..12470eb 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
@@ -18,7 +18,6 @@
import android.app.AppGlobals;
import android.content.ComponentName;
-import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageItemInfo;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
index 6b60abc..c7b450e 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.Intent;
+import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.os.UserManager;
import android.support.v7.preference.Preference;
@@ -54,9 +55,11 @@
CharSequence defaultAppLabel = getDefaultAppLabel();
if (!TextUtils.isEmpty(defaultAppLabel)) {
preference.setSummary(defaultAppLabel);
+ preference.setIcon(getDefaultAppIcon());
} else {
Log.d(TAG, "No default app");
preference.setSummary(R.string.app_list_preference_none);
+ preference.setIcon(null);
}
mayUpdateGearIcon(app, preference);
}
@@ -84,6 +87,17 @@
return null;
}
+ public Drawable getDefaultAppIcon() {
+ if (!isAvailable()) {
+ return null;
+ }
+ final DefaultAppInfo app = getDefaultAppInfo();
+ if (app != null) {
+ return app.loadIcon();
+ }
+ return null;
+ }
+
public CharSequence getDefaultAppLabel() {
if (!isAvailable()) {
return null;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
index 219ce0f..a0bf0ca 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
@@ -21,6 +21,7 @@
import android.content.pm.ComponentInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.v7.preference.Preference;
import android.text.TextUtils;
@@ -86,6 +87,18 @@
return getOnlyAppLabel();
}
+ @Override
+ public Drawable getDefaultAppIcon() {
+ if (!isAvailable()) {
+ return null;
+ }
+ final DefaultAppInfo defaultApp = getDefaultAppInfo();
+ if (defaultApp != null) {
+ return defaultApp.loadIcon();
+ }
+ return getOnlyAppIcon();
+ }
+
private List<ResolveInfo> getCandidates() {
return mPackageManager.queryIntentActivitiesAsUser(BROWSE_PROBE, PackageManager.MATCH_ALL,
mUserId);
@@ -105,6 +118,18 @@
return null;
}
+ private Drawable getOnlyAppIcon() {
+ final List<ResolveInfo> list = getCandidates();
+ if (list != null && list.size() == 1) {
+ final ResolveInfo info = list.get(0);
+ final ComponentInfo cn = info.getComponentInfo();
+ final String packageName = cn == null ? null : cn.packageName;
+ Log.d(TAG, "Getting icon for the only browser app: " + packageName);
+ return info.loadIcon(mPackageManager.getPackageManager());
+ }
+ return null;
+ }
+
/**
* Whether or not the pkg contains browser capability
*/
diff --git a/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
index a89766f..88b36b2 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
@@ -23,8 +23,6 @@
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.support.v7.preference.Preference;
-import android.text.TextUtils;
import com.android.settings.applications.PackageManagerWrapper;
@@ -59,27 +57,20 @@
}
@Override
- public void updateState(Preference preference) {
- super.updateState(preference);
- final DefaultAppInfo defaultApp = getDefaultAppInfo();
- final CharSequence defaultAppLabel = defaultApp != null ? defaultApp.loadLabel() : null;
- if (TextUtils.isEmpty(defaultAppLabel)) {
- final String onlyAppLabel = getOnlyAppLabel();
- if (!TextUtils.isEmpty(onlyAppLabel)) {
- preference.setSummary(onlyAppLabel);
- }
- }
- }
-
- @Override
protected DefaultAppInfo getDefaultAppInfo() {
final ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
final ComponentName currentDefaultHome = mPackageManager.getHomeActivities(homeActivities);
-
- return new DefaultAppInfo(mPackageManager, mUserId, currentDefaultHome);
+ if (currentDefaultHome != null) {
+ return new DefaultAppInfo(mPackageManager, mUserId, currentDefaultHome);
+ }
+ final ActivityInfo onlyAppInfo = getOnlyAppInfo();
+ if (onlyAppInfo != null) {
+ return new DefaultAppInfo(mPackageManager, mUserId, onlyAppInfo.getComponentName());
+ }
+ return null;
}
- private String getOnlyAppLabel() {
+ private ActivityInfo getOnlyAppInfo() {
final List<ResolveInfo> homeActivities = new ArrayList<>();
final List<ActivityInfo> appLabels = new ArrayList<>();
@@ -92,7 +83,7 @@
appLabels.add(info);
}
return appLabels.size() == 1
- ? appLabels.get(0).loadLabel(mPackageManager.getPackageManager()).toString()
+ ? appLabels.get(0)
: null;
}
diff --git a/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceController.java
new file mode 100644
index 0000000..413e1d5
--- /dev/null
+++ b/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceController.java
@@ -0,0 +1,79 @@
+/*
+ * 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.applications.defaultapps;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.nfc.NfcAdapter;
+import android.os.UserManager;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.nfc.PaymentBackend;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+public class DefaultPaymentSettingsPreferenceController extends AbstractPreferenceController
+ implements PreferenceControllerMixin {
+
+ private final NfcAdapter mNfcAdapter;
+ private final PackageManager mPackageManager;
+ private final UserManager mUserManager;
+ private PaymentBackend mPaymentBackend;
+
+ public DefaultPaymentSettingsPreferenceController(Context context) {
+ super(context);
+ mPackageManager = context.getPackageManager();
+ mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC)
+ && mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)
+ && mUserManager.isAdminUser()
+ && mNfcAdapter != null
+ && mNfcAdapter.isEnabled();
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ if (mPaymentBackend == null) {
+ if (mNfcAdapter != null) {
+ mPaymentBackend = new PaymentBackend(mContext);
+ } else {
+ mPaymentBackend = null;
+ }
+ }
+ if (mPaymentBackend == null) {
+ return;
+ }
+ mPaymentBackend.refresh();
+ final PaymentBackend.PaymentAppInfo app = mPaymentBackend.getDefaultApp();
+ if (app != null) {
+ preference.setSummary(app.label);
+ } else {
+ preference.setSummary(R.string.app_list_preference_none);
+ }
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return "default_payment_app";
+ }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java b/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
index 6f9cf40..b64da26 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
@@ -21,6 +21,9 @@
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -30,11 +33,13 @@
public static final String PREF_KEY = "bt_rename_device";
private final Fragment mFragment;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
public BluetoothDeviceRenamePreferenceController(Context context, Fragment fragment,
Lifecycle lifecycle) {
super(context, lifecycle);
mFragment = fragment;
+ mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
}
@VisibleForTesting
@@ -42,6 +47,7 @@
LocalBluetoothAdapter localAdapter) {
super(context, localAdapter);
mFragment = fragment;
+ mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
}
@Override
@@ -57,6 +63,8 @@
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (PREF_KEY.equals(preference.getKey())) {
+ mMetricsFeatureProvider.action(mContext,
+ MetricsProto.MetricsEvent.ACTION_BLUETOOTH_RENAME);
LocalDeviceNameDialogFragment.newInstance()
.show(mFragment.getFragmentManager(), LocalDeviceNameDialogFragment.TAG);
return true;
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java
index 6c41f83..3d7c5b6 100644
--- a/src/com/android/settings/bluetooth/BluetoothEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java
@@ -106,7 +106,7 @@
mContext = context;
}
- maybeEnforceRestrictions();
+ final boolean restricted = maybeEnforceRestrictions();
if (mLocalAdapter == null) {
mSwitchWidget.setEnabled(false);
@@ -114,7 +114,9 @@
}
// Bluetooth state is not sticky, so set it manually
- handleStateChanged(mLocalAdapter.getBluetoothState());
+ if (!restricted) {
+ handleStateChanged(mLocalAdapter.getBluetoothState());
+ }
mSwitchWidget.startListening();
mContext.registerReceiver(mReceiver, mIntentFilter);
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 273c313..da92c3b 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -41,7 +41,7 @@
import com.android.settings.accounts.ChooseAccountActivity;
import com.android.settings.accounts.ManagedProfileSettings;
import com.android.settings.accounts.UserAndAccountDashboardFragment;
-import com.android.settings.applications.AdvancedAppSettings;
+import com.android.settings.applications.DefaultAppSettings;
import com.android.settings.applications.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DrawOverlayDetails;
import com.android.settings.applications.ExternalSourcesDetails;
@@ -220,7 +220,7 @@
DrawOverlayDetails.class.getName(),
WriteSettingsDetails.class.getName(),
ExternalSourcesDetails.class.getName(),
- AdvancedAppSettings.class.getName(),
+ DefaultAppSettings.class.getName(),
WallpaperTypeSettings.class.getName(),
VrListenerSettings.class.getName(),
PictureInPictureSettings.class.getName(),
@@ -254,7 +254,6 @@
};
public static final String[] SETTINGS_FOR_RESTRICTED = {
- // New IA
// Home page
Settings.NetworkDashboardActivity.class.getName(),
Settings.ConnectedDeviceDashboardActivity.class.getName(),
diff --git a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
index 7c8c8f1..fddd522 100644
--- a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
+++ b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
@@ -22,8 +22,8 @@
import com.android.settings.SecuritySettings;
import com.android.settings.accounts.AccountDetailDashboardFragment;
import com.android.settings.accounts.UserAndAccountDashboardFragment;
-import com.android.settings.applications.AdvancedAppSettings;
import com.android.settings.applications.AppAndNotificationDashboardFragment;
+import com.android.settings.applications.DefaultAppSettings;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.development.DevelopmentSettings;
import com.android.settings.deviceinfo.StorageDashboardFragment;
@@ -65,7 +65,7 @@
CategoryKey.CATEGORY_APPS);
PARENT_TO_CATEGORY_KEY_MAP.put(PowerUsageSummary.class.getName(),
CategoryKey.CATEGORY_BATTERY);
- PARENT_TO_CATEGORY_KEY_MAP.put(AdvancedAppSettings.class.getName(),
+ PARENT_TO_CATEGORY_KEY_MAP.put(DefaultAppSettings.class.getName(),
CategoryKey.CATEGORY_APPS_DEFAULT);
PARENT_TO_CATEGORY_KEY_MAP.put(DisplaySettings.class.getName(),
CategoryKey.CATEGORY_DISPLAY);
diff --git a/src/com/android/settings/dashboard/conditional/ConditionAdapter.java b/src/com/android/settings/dashboard/conditional/ConditionAdapter.java
index 4a7422f..5a12f9d 100644
--- a/src/com/android/settings/dashboard/conditional/ConditionAdapter.java
+++ b/src/com/android/settings/dashboard/conditional/ConditionAdapter.java
@@ -16,6 +16,7 @@
package com.android.settings.dashboard.conditional;
import android.content.Context;
+import android.support.annotation.VisibleForTesting;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log;
@@ -58,6 +59,31 @@
}
};
+ @VisibleForTesting
+ ItemTouchHelper.SimpleCallback mSwipeCallback = new ItemTouchHelper.SimpleCallback(0,
+ ItemTouchHelper.START | ItemTouchHelper.END) {
+ @Override
+ public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
+ RecyclerView.ViewHolder target) {
+ return true;
+ }
+
+ @Override
+ public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+ return viewHolder.getItemViewType() == R.layout.condition_tile_new_ui
+ ? super.getSwipeDirs(recyclerView, viewHolder) : 0;
+ }
+
+ @Override
+ public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
+ Object item = getItem(viewHolder.getItemId());
+ // item can become null when running monkey
+ if (item != null) {
+ ((Condition) item).silence();
+ }
+ }
+ };
+
public ConditionAdapter(Context context, List<Condition> conditions, @HeaderMode int mode) {
mContext = context;
mConditions = conditions;
@@ -107,27 +133,7 @@
}
public void addDismissHandling(final RecyclerView recyclerView) {
- ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(0,
- ItemTouchHelper.START | ItemTouchHelper.END) {
- @Override
- public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
- RecyclerView.ViewHolder target) {
- return true;
- }
-
- @Override
- public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
- return viewHolder.getItemViewType() == R.layout.condition_tile_new_ui
- ? super.getSwipeDirs(recyclerView, viewHolder) : 0;
- }
-
- @Override
- public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
- Object item = getItem(viewHolder.getItemId());
- ((Condition) item).silence();
- }
- };
- ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
+ final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(mSwipeCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
}
diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java
index 1025ad7..ea0bcf0 100644
--- a/src/com/android/settings/datausage/BillingCycleSettings.java
+++ b/src/com/android/settings/datausage/BillingCycleSettings.java
@@ -21,6 +21,8 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
+import android.icu.text.MeasureFormat;
+import android.icu.util.MeasureUnit;
import android.net.NetworkPolicy;
import android.net.NetworkTemplate;
import android.os.Bundle;
@@ -31,6 +33,7 @@
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
+import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.Spinner;
@@ -248,6 +251,17 @@
: editor.getPolicyWarningBytes(template);
final long limitDisabled = isLimit ? LIMIT_DISABLED : WARNING_DISABLED;
+ final MeasureFormat formatter = MeasureFormat.getInstance(
+ getContext().getResources().getConfiguration().locale,
+ MeasureFormat.FormatWidth.SHORT);
+ final String[] unitNames = new String[] {
+ formatter.getUnitDisplayName(MeasureUnit.MEGABYTE),
+ formatter.getUnitDisplayName(MeasureUnit.GIGABYTE)
+ };
+ final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
+ getContext(), android.R.layout.simple_spinner_item, unitNames);
+ type.setAdapter(adapter);
+
if (bytes > 1.5f * GB_IN_BYTES) {
final String bytesText = formatText(bytes / (float) GB_IN_BYTES);
bytesPicker.setText(bytesText);
diff --git a/src/com/android/settings/datausage/DataUsageMeteredSettings.java b/src/com/android/settings/datausage/DataUsageMeteredSettings.java
index c2a18e9..830fc96 100644
--- a/src/com/android/settings/datausage/DataUsageMeteredSettings.java
+++ b/src/com/android/settings/datausage/DataUsageMeteredSettings.java
@@ -14,19 +14,21 @@
package com.android.settings.datausage;
+import static android.net.wifi.WifiInfo.removeDoubleQuotes;
+
+import static com.android.settings.datausage.DataUsageSummary.hasWifiRadio;
+
import android.app.backup.BackupManager;
import android.content.Context;
import android.content.res.Resources;
-import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
-import android.net.NetworkTemplate;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
-import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.DropDownPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
-import android.telephony.TelephonyManager;
+import android.text.TextUtils;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
@@ -39,18 +41,11 @@
import java.util.ArrayList;
import java.util.List;
-import static android.net.NetworkPolicy.LIMIT_DISABLED;
-import static android.net.wifi.WifiInfo.removeDoubleQuotes;
-import static com.android.settings.datausage.DataUsageList.hasReadyMobileRadio;
-import static com.android.settings.datausage.DataUsageSummary.hasWifiRadio;
-
/**
- * Panel to configure {@link NetworkPolicy#metered} for networks.
+ * Panel to configure {@link WifiConfiguration#meteredOverride}.
*/
public class DataUsageMeteredSettings extends SettingsPreferenceFragment implements Indexable {
- private static final boolean SHOW_MOBILE_CATEGORY = false;
-
private NetworkPolicyManager mPolicyManager;
private WifiManager mWifiManager;
@@ -85,18 +80,14 @@
}
private void updateNetworks(Context context) {
- if (SHOW_MOBILE_CATEGORY && hasReadyMobileRadio(context)) {
- mMobileCategory.removeAll();
- mMobileCategory.addPreference(buildMobilePref(context));
- } else {
- getPreferenceScreen().removePreference(mMobileCategory);
- }
+ getPreferenceScreen().removePreference(mMobileCategory);
mWifiCategory.removeAll();
if (hasWifiRadio(context) && mWifiManager.isWifiEnabled()) {
for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
- if (config.SSID != null) {
- mWifiCategory.addPreference(buildWifiPref(config));
+ final Preference pref = new MeteredPreference(getPrefContext(), config);
+ if (!TextUtils.isEmpty(pref.getTitle())) {
+ mWifiCategory.addPreference(pref);
}
}
} else {
@@ -104,57 +95,40 @@
}
}
- private Preference buildMobilePref(Context context) {
- final TelephonyManager tele = TelephonyManager.from(context);
- final NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(
- tele.getSubscriberId());
- final MeteredPreference pref = new MeteredPreference(getPrefContext(), template);
- pref.setTitle(tele.getNetworkOperatorName());
- return pref;
- }
+ private class MeteredPreference extends DropDownPreference {
+ private final WifiConfiguration mConfig;
- private Preference buildWifiPref(WifiConfiguration config) {
- final String networkId = config.isPasspoint() ?
- config.providerFriendlyName : config.SSID;
- final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(networkId);
- final MeteredPreference pref = new MeteredPreference(getPrefContext(), template);
- pref.setTitle(removeDoubleQuotes(networkId));
- return pref;
- }
-
- private class MeteredPreference extends SwitchPreference {
- private final NetworkTemplate mTemplate;
- private boolean mBinding;
-
- public MeteredPreference(Context context, NetworkTemplate template) {
+ public MeteredPreference(Context context, WifiConfiguration config) {
super(context);
- mTemplate = template;
+ mConfig = config;
setPersistent(false);
+ setEntries(new CharSequence[] {
+ getString(R.string.data_usage_metered_auto),
+ getString(R.string.data_usage_metered_yes),
+ getString(R.string.data_usage_metered_no),
+ });
+ setEntryValues(new CharSequence[] {
+ Integer.toString(WifiConfiguration.METERED_OVERRIDE_NONE),
+ Integer.toString(WifiConfiguration.METERED_OVERRIDE_METERED),
+ Integer.toString(WifiConfiguration.METERED_OVERRIDE_NOT_METERED),
+ });
+ setValue(Integer.toString(mConfig.meteredOverride));
+ setTitle(NetworkPolicyManager.resolveNetworkId(mConfig));
+ setSummary(getEntries()[mConfig.meteredOverride]);
- mBinding = true;
- final NetworkPolicy policy = mPolicyEditor.getPolicyMaybeUnquoted(template);
- if (policy != null) {
- if (policy.limitBytes != LIMIT_DISABLED) {
- setChecked(true);
- setEnabled(false);
- } else {
- setChecked(policy.metered);
+ setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ mConfig.meteredOverride = Integer.parseInt((String) newValue);
+ setSummary(getEntries()[mConfig.meteredOverride]);
+
+ mWifiManager.updateNetwork(mConfig);
+ // Stage the backup of the SettingsProvider package which backs this up
+ BackupManager.dataChanged("com.android.providers.settings");
+ return true;
}
- } else {
- setChecked(false);
- }
- mBinding = false;
- }
-
- @Override
- protected void notifyChanged() {
- super.notifyChanged();
- if (!mBinding) {
- mPolicyEditor.setPolicyMetered(mTemplate, isChecked());
- // Stage the backup of the SettingsProvider package which backs this up
- BackupManager.dataChanged("com.android.providers.settings");
- }
+ });
}
}
@@ -180,21 +154,6 @@
data.screenTitle = res.getString(R.string.data_usage_menu_metered);
result.add(data);
- if (SHOW_MOBILE_CATEGORY && hasReadyMobileRadio(context)) {
- // Mobile networks category
- data = new SearchIndexableRaw(context);
- data.title = res.getString(R.string.data_usage_metered_mobile);
- data.screenTitle = res.getString(R.string.data_usage_menu_metered);
- result.add(data);
-
- final TelephonyManager tele = TelephonyManager.from(context);
-
- data = new SearchIndexableRaw(context);
- data.title = tele.getNetworkOperatorName();
- data.screenTitle = res.getString(R.string.data_usage_menu_metered);
- result.add(data);
- }
-
// Wi-Fi networks category
data = new SearchIndexableRaw(context);
data.title = res.getString(R.string.data_usage_metered_wifi);
@@ -227,12 +186,8 @@
@Override
public List<String> getNonIndexableKeys(Context context) {
final List<String> result = super.getNonIndexableKeys(context);
- if (!SHOW_MOBILE_CATEGORY || !hasReadyMobileRadio(context)) {
- result.add("mobile");
- }
-
+ result.add("mobile");
return result;
}
};
-
}
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index c5c32ba..e6fc5e7 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -14,13 +14,15 @@
package com.android.settings.datausage;
+import static android.net.ConnectivityManager.TYPE_ETHERNET;
+import static android.net.ConnectivityManager.TYPE_WIFI;
+
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.INetworkStatsSession;
-import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
import android.net.NetworkTemplate;
import android.net.TrafficStats;
@@ -46,6 +48,7 @@
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.SummaryPreference;
@@ -55,13 +58,10 @@
import com.android.settings.search.Indexable;
import com.android.settingslib.NetworkPolicyEditor;
import com.android.settingslib.net.DataUsageController;
+
import java.util.ArrayList;
import java.util.List;
-import static android.net.ConnectivityManager.TYPE_ETHERNET;
-import static android.net.ConnectivityManager.TYPE_WIFI;
-import static android.net.NetworkPolicy.LIMIT_DISABLED;
-
public class DataUsageSummary extends DataUsageBase implements Indexable, DataUsageEditController {
static final boolean LOGD = false;
@@ -403,7 +403,7 @@
mPolicyEditor.read();
int count = 0;
for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
- if (isMetered(config)) {
+ if (WifiConfiguration.isMetered(config, null)) {
count++;
}
}
@@ -411,23 +411,6 @@
R.plurals.network_restrictions_summary, count, count));
}
- @VisibleForTesting
- boolean isMetered(WifiConfiguration config) {
- if (config.SSID == null) {
- return false;
- }
- final String networkId = config.isPasspoint() ? config.providerFriendlyName : config.SSID;
- final NetworkPolicy policy =
- mPolicyEditor.getPolicyMaybeUnquoted(NetworkTemplate.buildTemplateWifi(networkId));
- if (policy == null) {
- return false;
- }
- if (policy.limitBytes != LIMIT_DISABLED) {
- return true;
- }
- return policy.metered;
- }
-
private static class SummaryProvider
implements SummaryLoader.SummaryProvider {
diff --git a/src/com/android/settings/deviceinfo/StorageItemPreference.java b/src/com/android/settings/deviceinfo/StorageItemPreference.java
index 3dcf935..d0114e3 100644
--- a/src/com/android/settings/deviceinfo/StorageItemPreference.java
+++ b/src/com/android/settings/deviceinfo/StorageItemPreference.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.res.Resources;
+import android.icu.util.MeasureUnit;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet;
@@ -51,7 +52,7 @@
FileSizeFormatter.formatFileSize(
getContext(),
size,
- getGigabyteSuffix(getContext().getResources()),
+ MeasureUnit.GIGABYTE,
FileSizeFormatter.GIGABYTE_IN_BYTES));
if (total == 0) {
mProgressPercent = 0;
@@ -75,8 +76,4 @@
updateProgressBar();
super.onBindViewHolder(view);
}
-
- private static int getGigabyteSuffix(Resources res) {
- return res.getIdentifier("gigabyteShort", "string", "android");
- }
}
diff --git a/src/com/android/settings/nfc/PaymentBackend.java b/src/com/android/settings/nfc/PaymentBackend.java
index eeb43e2..bc9dbbe 100644
--- a/src/com/android/settings/nfc/PaymentBackend.java
+++ b/src/com/android/settings/nfc/PaymentBackend.java
@@ -42,7 +42,7 @@
}
public static class PaymentAppInfo {
- CharSequence label;
+ public CharSequence label;
CharSequence description;
Drawable banner;
boolean isDefault;
diff --git a/src/com/android/settings/nfc/PaymentSettings.java b/src/com/android/settings/nfc/PaymentSettings.java
index d914cd8..10f1154 100644
--- a/src/com/android/settings/nfc/PaymentSettings.java
+++ b/src/com/android/settings/nfc/PaymentSettings.java
@@ -16,12 +16,10 @@
package com.android.settings.nfc;
-import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
-import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen;
@@ -34,8 +32,6 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.nfc.PaymentBackend.PaymentAppInfo;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;
@@ -109,40 +105,6 @@
menuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_NEVER);
}
- private static class SummaryProvider implements SummaryLoader.SummaryProvider {
-
- private final Context mContext;
- private final SummaryLoader mSummaryLoader;
-
- public SummaryProvider(Context context, SummaryLoader summaryLoader) {
- mContext = context;
- mSummaryLoader = summaryLoader;
- }
-
- @Override
- public void setListening(boolean listening) {
- if (listening && NfcAdapter.getDefaultAdapter(mContext) != null) {
- PaymentBackend paymentBackend = new PaymentBackend(mContext);
- paymentBackend.refresh();
- PaymentAppInfo app = paymentBackend.getDefaultApp();
- String summary = null;
- if (app != null) {
- summary = mContext.getString(R.string.payment_summary, app.label);
- }
- mSummaryLoader.setSummary(this, summary);
- }
- }
- }
-
- public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
- = new SummaryLoader.SummaryProviderFactory() {
- @Override
- public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
- SummaryLoader summaryLoader) {
- return new SummaryProvider(activity, summaryLoader);
- }
- };
-
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index 0d9c78f..6087503 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -304,11 +304,8 @@
try {
ApplicationInfo info = mPm.getApplicationInfo(rule.getOwner().getPackageName(), 0);
- LoadIconTask task = new LoadIconTask(this);
- task.execute(info);
setSummary(computeRuleSummary(rule, isSystemRule, info.loadLabel(mPm)));
} catch (PackageManager.NameNotFoundException e) {
- setIcon(R.drawable.ic_label);
appExists = false;
return;
}
@@ -345,29 +342,6 @@
};
}
- private class LoadIconTask extends AsyncTask<ApplicationInfo, Void, Drawable> {
- private final WeakReference<Preference> prefReference;
-
- public LoadIconTask(Preference pref) {
- prefReference = new WeakReference<>(pref);
- }
-
- @Override
- protected Drawable doInBackground(ApplicationInfo... params) {
- return params[0].loadIcon(mPm);
- }
-
- @Override
- protected void onPostExecute(Drawable icon) {
- if (icon != null) {
- final Preference pref = prefReference.get();
- if (pref != null) {
- pref.setIcon(icon);
- }
- }
- }
- }
-
public static class SummaryBuilder {
private Context mContext;
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index 9b84bf1..dccdc65 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -20,8 +20,8 @@
import android.support.annotation.DrawableRes;
import android.support.annotation.VisibleForTesting;
import android.support.annotation.XmlRes;
-
import android.text.TextUtils;
+
import com.android.settings.DateTimeSettings;
import com.android.settings.DeviceInfoSettings;
import com.android.settings.DisplaySettings;
@@ -34,15 +34,14 @@
import com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment;
import com.android.settings.accessibility.MagnificationPreferenceFragment;
import com.android.settings.accounts.UserAndAccountDashboardFragment;
-import com.android.settings.applications.AdvancedAppSettings;
import com.android.settings.applications.AppAndNotificationDashboardFragment;
+import com.android.settings.applications.DefaultAppSettings;
import com.android.settings.applications.SpecialAccessSettings;
import com.android.settings.applications.assist.ManageAssist;
import com.android.settings.backup.BackupSettingsActivity;
import com.android.settings.backup.BackupSettingsFragment;
import com.android.settings.bluetooth.BluetoothSettings;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
-import com.android.settings.support.SupportDashboardActivity;
import com.android.settings.datausage.DataUsageMeteredSettings;
import com.android.settings.datausage.DataUsageSummary;
import com.android.settings.development.DevelopmentSettings;
@@ -78,6 +77,7 @@
import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.security.LockscreenDashboardFragment;
import com.android.settings.sim.SimSettings;
+import com.android.settings.support.SupportDashboardActivity;
import com.android.settings.system.ResetDashboardFragment;
import com.android.settings.system.SystemDashboardFragment;
import com.android.settings.tts.TtsEnginePreferenceFragment;
@@ -101,7 +101,7 @@
@XmlRes
public static final int NO_DATA_RES_ID = 0;
- @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+ @VisibleForTesting
static final HashMap<String, SearchIndexableResource> sResMap = new HashMap<>();
@VisibleForTesting
@@ -156,7 +156,7 @@
addIndex(PowerUsageAdvanced.class, NO_DATA_RES_ID, R.drawable.ic_settings_battery);
addIndex(BatterySaverSettings.class,
R.xml.battery_saver_settings, R.drawable.ic_settings_battery);
- addIndex(AdvancedAppSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications);
+ addIndex(DefaultAppSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications);
addIndex(ManageAssist.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications);
addIndex(SpecialAccessSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications);
addIndex(UserSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_multiuser);
@@ -201,7 +201,7 @@
addIndex(
TtsEnginePreferenceFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language);
addIndex(LockscreenDashboardFragment.class, R.xml.security_lockscreen_settings,
- R.drawable.ic_settings_security);
+ R.drawable.ic_settings_security);
addIndex(MagnificationPreferenceFragment.class, NO_DATA_RES_ID,
R.drawable.ic_settings_accessibility);
addIndex(AccessibilityShortcutPreferenceFragment.class, NO_DATA_RES_ID,
diff --git a/src/com/android/settings/security/SecurityFeatureProviderImpl.java b/src/com/android/settings/security/SecurityFeatureProviderImpl.java
index 8c6d343..47f7a1b 100644
--- a/src/com/android/settings/security/SecurityFeatureProviderImpl.java
+++ b/src/com/android/settings/security/SecurityFeatureProviderImpl.java
@@ -17,31 +17,30 @@
package com.android.settings.security;
import android.content.Context;
-import android.content.Intent;
import android.content.IContentProvider;
+import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
-import com.android.settings.R;
-import com.android.settings.trustagent.TrustAgentManager;
-import com.android.settings.trustagent.TrustAgentManagerImpl;
-import com.android.settingslib.drawer.DashboardCategory;
import android.support.annotation.VisibleForTesting;
-import android.support.v4.content.ContextCompat;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Pair;
+import com.android.settings.R;
+import com.android.settings.trustagent.TrustAgentManager;
+import com.android.settings.trustagent.TrustAgentManagerImpl;
+import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.drawer.TileUtils;
-import java.util.concurrent.Executors;
-import java.util.TreeMap;
import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.Executors;
/** Implementation for {@code SecurityFeatureProvider}. */
public class SecurityFeatureProviderImpl implements SecurityFeatureProvider {
diff --git a/src/com/android/settings/utils/FileSizeFormatter.java b/src/com/android/settings/utils/FileSizeFormatter.java
index e56388a..c0d360f 100644
--- a/src/com/android/settings/utils/FileSizeFormatter.java
+++ b/src/com/android/settings/utils/FileSizeFormatter.java
@@ -16,11 +16,22 @@
package com.android.settings.utils;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
+import android.icu.text.DecimalFormat;
+import android.icu.text.MeasureFormat;
+import android.icu.text.NumberFormat;
+import android.icu.util.Measure;
+import android.icu.util.MeasureUnit;
import android.text.BidiFormatter;
+import android.text.TextUtils;
import android.text.format.Formatter;
+import android.view.View;
+
+import java.math.BigDecimal;
+import java.util.Locale;
/**
* Utility class to aid in formatting file sizes always with the same unit. This is modified from
@@ -31,6 +42,61 @@
public static final long MEGABYTE_IN_BYTES = KILOBYTE_IN_BYTES * 1000;
public static final long GIGABYTE_IN_BYTES = MEGABYTE_IN_BYTES * 1000;
+ private static class RoundedBytesResult {
+ public final float value;
+ public final MeasureUnit units;
+ public final int fractionDigits;
+ public final long roundedBytes;
+
+ public RoundedBytesResult(
+ float value, MeasureUnit units, int fractionDigits, long roundedBytes) {
+ this.value = value;
+ this.units = units;
+ this.fractionDigits = fractionDigits;
+ this.roundedBytes = roundedBytes;
+ }
+ }
+
+ private static Locale localeFromContext(@NonNull Context context) {
+ return context.getResources().getConfiguration().locale;
+ }
+
+ private static String bidiWrap(@NonNull Context context, String source) {
+ final Locale locale = localeFromContext(context);
+ if (TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL) {
+ return BidiFormatter.getInstance(true /* RTL*/).unicodeWrap(source);
+ } else {
+ return source;
+ }
+ }
+
+ private static NumberFormat getNumberFormatter(Locale locale, int fractionDigits) {
+ final NumberFormat numberFormatter = NumberFormat.getInstance(locale);
+ numberFormatter.setMinimumFractionDigits(fractionDigits);
+ numberFormatter.setMaximumFractionDigits(fractionDigits);
+ numberFormatter.setGroupingUsed(false);
+ if (numberFormatter instanceof DecimalFormat) {
+ // We do this only for DecimalFormat, since in the general NumberFormat case, calling
+ // setRoundingMode may throw an exception.
+ numberFormatter.setRoundingMode(BigDecimal.ROUND_HALF_UP);
+ }
+ return numberFormatter;
+ }
+
+ private static String formatMeasureShort(Locale locale, NumberFormat numberFormatter,
+ float value, MeasureUnit units) {
+ final MeasureFormat measureFormatter = MeasureFormat.getInstance(
+ locale, MeasureFormat.FormatWidth.SHORT, numberFormatter);
+ return measureFormatter.format(new Measure(value, units));
+ }
+
+ private static String formatRoundedBytesResult(
+ @NonNull Context context, @NonNull RoundedBytesResult input) {
+ final Locale locale = localeFromContext(context);
+ final NumberFormat numberFormatter = getNumberFormatter(locale, input.fractionDigits);
+ return formatMeasureShort(locale, numberFormatter, input.value, input.units);
+ }
+
/**
* Formats a content size to be in the form of bytes, kilobytes, megabytes, etc.
*
@@ -47,23 +113,17 @@
*
* @param context Context to use to load the localized units
* @param sizeBytes size value to be formatted, in bytes
- * @param suffix String id for the unit suffix.
- * @param mult Amount of bytes in the unit. * @return formatted string with the number
+ * @param unit The unit used for formatting.
+ * @param mult Amount of bytes in the unit.
+ * @return formatted string with the number
*/
public static String formatFileSize(
- @Nullable Context context, long sizeBytes, int suffix, long mult) {
+ @Nullable Context context, long sizeBytes, MeasureUnit unit, long mult) {
if (context == null) {
return "";
}
- final Formatter.BytesResult res =
- formatBytes(context.getResources(), sizeBytes, suffix, mult);
- return BidiFormatter.getInstance()
- .unicodeWrap(context.getString(getFileSizeSuffix(context), res.value, res.units));
- }
-
- private static int getFileSizeSuffix(Context context) {
- final Resources res = context.getResources();
- return res.getIdentifier("fileSizeSuffix", "string", "android");
+ final RoundedBytesResult res = formatBytes(sizeBytes, unit, mult);
+ return bidiWrap(context, formatRoundedBytesResult(context, res));
}
/**
@@ -76,8 +136,8 @@
* @param suffix String id for the unit suffix.
* @param mult Amount of bytes in the unit.
*/
- private static Formatter.BytesResult formatBytes(
- Resources res, long sizeBytes, int suffix, long mult) {
+ private static RoundedBytesResult formatBytes(
+ long sizeBytes, MeasureUnit unit, long mult) {
final boolean isNegative = (sizeBytes < 0);
float result = isNegative ? -sizeBytes : sizeBytes;
result = result / mult;
@@ -85,32 +145,29 @@
// compute the rounded value. String.format("%f", 0.1) might not return "0.1" due to
// floating point errors.
final int roundFactor;
- final String roundFormat;
+ final int roundDigits;
if (mult == 1) {
roundFactor = 1;
- roundFormat = "%.0f";
+ roundDigits = 0;
} else if (result < 1) {
roundFactor = 100;
- roundFormat = "%.2f";
+ roundDigits = 2;
} else if (result < 10) {
roundFactor = 10;
- roundFormat = "%.1f";
+ roundDigits = 1;
} else { // 10 <= result < 100
roundFactor = 1;
- roundFormat = "%.0f";
+ roundDigits = 0;
}
if (isNegative) {
result = -result;
}
- final String roundedString = String.format(roundFormat, result);
// Note this might overflow if abs(result) >= Long.MAX_VALUE / 100, but that's like 80PB so
// it's okay (for now)...
final long roundedBytes = (((long) Math.round(result * roundFactor)) * mult / roundFactor);
- final String units = res.getString(suffix);
-
- return new Formatter.BytesResult(roundedString, units, roundedBytes);
+ return new RoundedBytesResult(result, unit, roundDigits, roundedBytes);
}
}
diff --git a/src/com/android/settings/webview/WebViewAppPreferenceController.java b/src/com/android/settings/webview/WebViewAppPreferenceController.java
index 2f3246c..c774093 100644
--- a/src/com/android/settings/webview/WebViewAppPreferenceController.java
+++ b/src/com/android/settings/webview/WebViewAppPreferenceController.java
@@ -26,7 +26,6 @@
private static final String WEBVIEW_APP_KEY = "select_webview_provider";
- private final Context mContext;
private final WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper;
private Preference mPreference;
@@ -37,7 +36,6 @@
public WebViewAppPreferenceController(Context context,
WebViewUpdateServiceWrapper webviewUpdateServiceWrapper) {
super(context);
- mContext = context;
mWebViewUpdateServiceWrapper = webviewUpdateServiceWrapper;
}
diff --git a/src/com/android/settings/wifi/WifiInfoPreferenceController.java b/src/com/android/settings/wifi/WifiInfoPreferenceController.java
index 97c4fb9..ad6ecba 100644
--- a/src/com/android/settings/wifi/WifiInfoPreferenceController.java
+++ b/src/com/android/settings/wifi/WifiInfoPreferenceController.java
@@ -22,6 +22,7 @@
import android.content.IntentFilter;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
+import android.support.v4.text.BidiFormatter;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
@@ -104,7 +105,7 @@
final String ipAddress = Utils.getWifiIpAddresses(mContext);
mWifiIpAddressPref.setSummary(ipAddress == null
? mContext.getString(R.string.status_unavailable)
- : ipAddress);
+ : BidiFormatter.getInstance().unicodeWrap(ipAddress));
}
}
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index d8db2d0..7402485 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -40,6 +40,7 @@
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
+import android.support.v4.text.BidiFormatter;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceScreen;
@@ -443,7 +444,8 @@
updatePreference(mDnsPref, dnsServers);
if (ipv6Addresses.length() > 0) {
- mIpv6AddressPref.setSummary(ipv6Addresses.toString());
+ mIpv6AddressPref.setSummary(
+ BidiFormatter.getInstance().unicodeWrap(ipv6Addresses.toString()));
mIpv6Category.setVisible(true);
} else {
mIpv6Category.setVisible(false);
diff --git a/tests/app/src/com/android/settings/applications/AdvancedAppSettingsTest.java b/tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java
similarity index 97%
rename from tests/app/src/com/android/settings/applications/AdvancedAppSettingsTest.java
rename to tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java
index 1831b59..bd03bc9 100644
--- a/tests/app/src/com/android/settings/applications/AdvancedAppSettingsTest.java
+++ b/tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java
@@ -32,7 +32,7 @@
* Test for Advanced App preferences.
*/
@SmallTest
-public class AdvancedAppSettingsTest extends InstrumentationTestCase {
+public class DefaultAppSettingsTest extends InstrumentationTestCase {
private UiDevice mDevice;
private Context mTargetContext;
diff --git a/tests/robotests/src/com/android/settings/MasterClearTest.java b/tests/robotests/src/com/android/settings/MasterClearTest.java
index d913946..8e8578f 100644
--- a/tests/robotests/src/com/android/settings/MasterClearTest.java
+++ b/tests/robotests/src/com/android/settings/MasterClearTest.java
@@ -92,55 +92,32 @@
@Test
public void testShowWipeEuicc_euiccDisabled() {
prepareEuiccState(
- false /* isEuiccEnabled */, true /* isEuiccProvisioned */,
- true /* isDevelopmentSettingsEnabled */);
+ false /* isEuiccEnabled */, true /* isEuiccProvisioned */);
assertThat(mMasterClear.showWipeEuicc()).isFalse();
}
@Test
public void testShowWipeEuicc_euiccEnabled_unprovisioned() {
prepareEuiccState(
- true /* isEuiccEnabled */, false /* isEuiccProvisioned */,
- false /* isDevelopmentSettingsEnabled */);
+ true /* isEuiccEnabled */, false /* isEuiccProvisioned */);
assertThat(mMasterClear.showWipeEuicc()).isFalse();
}
@Test
public void testShowWipeEuicc_euiccEnabled_provisioned() {
prepareEuiccState(
- true /* isEuiccEnabled */, true /* isEuiccProvisioned */,
- false /* isDevelopmentSettingsEnabled */);
- assertThat(mMasterClear.showWipeEuicc()).isTrue();
- }
-
- @Test
- public void testShowWipeEuicc_euiccEnabled_developmentSettingsEnabled() {
- prepareEuiccState(
- true /* isEuiccEnabled */, false /* isEuiccProvisioned */,
- true /* isDevelopmentSettingsEnabled */);
- assertThat(mMasterClear.showWipeEuicc()).isTrue();
- }
-
- @Test
- public void testShowWipeEuicc_euiccEnabled_provisioned_developmentSettingsEnabled() {
- prepareEuiccState(
- true /* isEuiccEnabled */, true /* isEuiccProvisioned */,
- true /* isDevelopmentSettingsEnabled */);
+ true /* isEuiccEnabled */, true /* isEuiccProvisioned */);
assertThat(mMasterClear.showWipeEuicc()).isTrue();
}
private void prepareEuiccState(
boolean isEuiccEnabled,
- boolean isEuiccProvisioned,
- boolean isDevelopmentSettingsEnabled) {
+ boolean isEuiccProvisioned) {
doReturn(mActivity).when(mMasterClear).getContext();
doReturn(isEuiccEnabled).when(mMasterClear).isEuiccEnabled(any());
ContentResolver cr = mActivity.getContentResolver();
Settings.Global.putInt(
cr, android.provider.Settings.Global.EUICC_PROVISIONED, isEuiccProvisioned ? 1 : 0);
- Settings.Global.putInt(
- cr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED,
- isDevelopmentSettingsEnabled ? 1 : 0);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java b/tests/robotests/src/com/android/settings/applications/DefaultAppSettingsTest.java
similarity index 93%
rename from tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java
rename to tests/robotests/src/com/android/settings/applications/DefaultAppSettingsTest.java
index 968421b..9054a8e 100644
--- a/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/DefaultAppSettingsTest.java
@@ -16,18 +16,29 @@
package com.android.settings.applications;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserManager;
import android.telephony.TelephonyManager;
import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.XmlTestUtils;
import org.junit.Before;
@@ -40,31 +51,19 @@
import java.util.List;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class AdvancedAppSettingsTest {
+public class DefaultAppSettingsTest {
private Context mContext;
- private AdvancedAppSettings mFragment;
+ private DefaultAppSettings mFragment;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
-
mContext = RuntimeEnvironment.application;
- mFragment = new AdvancedAppSettings();
+ mFragment = new DefaultAppSettings();
mFragment.onAttach(mContext);
}
@@ -77,8 +76,8 @@
@Test
public void setListening_shouldUpdateSummary() {
final SummaryLoader summaryLoader = mock(SummaryLoader.class);
- final AdvancedAppSettings.SummaryProvider summaryProvider =
- new AdvancedAppSettings.SummaryProvider(mContext, summaryLoader);
+ final DefaultAppSettings.SummaryProvider summaryProvider =
+ new DefaultAppSettings.SummaryProvider(mContext, summaryLoader);
final DefaultSmsPreferenceController defaultSms =
mock(DefaultSmsPreferenceController.class);
final DefaultBrowserPreferenceController defaultBrowser =
@@ -149,6 +148,7 @@
public void testNonIndexableKeys_existInXmlLayout() {
final Context context = spy(RuntimeEnvironment.application);
final Context mockContext = mock(Context.class);
+ when(mockContext.getApplicationContext()).thenReturn(mockContext);
final UserManager userManager = mock(UserManager.class, RETURNS_DEEP_STUBS);
when(mockContext.getSystemService(Context.USER_SERVICE))
@@ -159,10 +159,10 @@
.thenReturn(mock(TelephonyManager.class));
when(mockContext.getPackageManager())
.thenReturn(mock(PackageManager.class));
- final List<String> niks = AdvancedAppSettings.SEARCH_INDEX_DATA_PROVIDER
+ final List<String> niks = DefaultAppSettings.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(mockContext);
- final int xmlId = (new AdvancedAppSettings()).getPreferenceScreenResId();
+ final int xmlId = (new DefaultAppSettings()).getPreferenceScreenResId();
final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
diff --git a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
index f382b90..180abbb 100644
--- a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
@@ -16,6 +16,16 @@
package com.android.settings.applications.assist;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+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.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
import android.Manifest;
import android.app.SearchManager;
import android.content.ComponentName;
@@ -28,33 +38,29 @@
import android.content.pm.ServiceInfo;
import android.provider.Settings;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.internal.app.AssistUtils;
import com.android.settings.TestConfig;
import com.android.settings.applications.defaultapps.DefaultAppInfo;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
-import java.util.ArrayList;
-import java.util.List;
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.util.ReflectionHelpers;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DefaultAssistPreferenceControllerTest {
+ private static final String TEST_KEY = "test_pref_key";
+
@Mock
private Context mContext;
@Mock
@@ -66,7 +72,8 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mController = new DefaultAssistPreferenceController(mContext);
+ mController = new DefaultAssistPreferenceController(mContext, TEST_KEY,
+ true /* showSetting */);
}
@Test
@@ -75,6 +82,12 @@
}
@Test
+ public void getPrefKey_shouldReturnKey() {
+ assertThat(mController.getPreferenceKey())
+ .isEqualTo(TEST_KEY);
+ }
+
+ @Test
@Config(shadows = {ShadowSecureSettings.class})
public void getDefaultAppInfo_hasDefaultAssist_shouldReturnKey() {
final String flattenKey = "com.android.settings/assist";
@@ -89,15 +102,15 @@
final String flattenKey = "com.android.settings/assist";
Settings.Secure.putString(null, Settings.Secure.ASSISTANT, flattenKey);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
- DefaultAssistPreferenceController controller =
- spy(new DefaultAssistPreferenceController(mContext));
+ DefaultAssistPreferenceController controller = spy(
+ new DefaultAssistPreferenceController(mContext, TEST_KEY, true /* showSetting */));
final ResolveInfo resolveInfo = new ResolveInfo();
resolveInfo.activityInfo = new ActivityInfo();
resolveInfo.activityInfo.name = "assist";
resolveInfo.activityInfo.applicationInfo = new ApplicationInfo();
resolveInfo.activityInfo.applicationInfo.packageName = "com.android.settings";
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt()))
- .thenReturn(resolveInfo);
+ .thenReturn(resolveInfo);
when(mContext.getSystemService(Context.SEARCH_SERVICE)).thenReturn(mSearchManager);
when(mSearchManager.getAssistIntent(anyBoolean())).thenReturn(mock(Intent.class));
final ServiceInfo serviceInfo = new ServiceInfo();
@@ -107,9 +120,21 @@
services.add(resolveInfo);
when(mPackageManager.queryIntentServices(any(Intent.class), anyInt())).thenReturn(services);
doReturn(null).when(controller).getAssistSettingsActivity(
- ComponentName.unflattenFromString(flattenKey), resolveInfo, mPackageManager);
+ ComponentName.unflattenFromString(flattenKey), resolveInfo, mPackageManager);
controller.getSettingIntent(null);
// should not crash
}
+
+ @Test
+ public void getSettingIntent_doNotShowSetting_shouldNotTryToGetSettingIntent() {
+ final AssistUtils assistUtils = mock(AssistUtils.class);
+ final DefaultAssistPreferenceController controller = new DefaultAssistPreferenceController(
+ mContext, TEST_KEY, false /* showSetting */);
+ ReflectionHelpers.setField(controller, "mAssistUtils", assistUtils);
+
+ controller.getSettingIntent(null);
+
+ verifyZeroInteractions(assistUtils);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceControllerTest.java
index d7e5192..22b30bd 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceControllerTest.java
@@ -17,14 +17,22 @@
package com.android.settings.applications.defaultapps;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyList;
+import static org.mockito.Mockito.atLeastOnce;
+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.ComponentName;
import android.content.Context;
import android.os.UserManager;
import android.support.v7.preference.Preference;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.applications.PackageManagerWrapper;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
@@ -35,14 +43,6 @@
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyList;
-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;
-
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DefaultHomePreferenceControllerTest {
@@ -79,11 +79,10 @@
@Test
public void updateState_noDefaultApp_shouldAskPackageManagerForOnlyApp() {
- doReturn(null).when(mController).getDefaultAppInfo();
-
+ when(mPackageManager.getHomeActivities(anyList())).thenReturn(null);
mController.updateState(mock(Preference.class));
- verify(mPackageManager).getHomeActivities(anyList());
+ verify(mPackageManager, atLeastOnce()).getHomeActivities(anyList());
}
@Test
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceControllerTest.java
new file mode 100644
index 0000000..6a73269
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceControllerTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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.applications.defaultapps;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.nfc.NfcAdapter;
+import android.os.UserManager;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.TestConfig;
+import com.android.settings.nfc.PaymentBackend;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DefaultPaymentSettingsPreferenceControllerTest {
+
+ @Mock
+ private NfcAdapter mNfcAdapter;
+ @Mock
+ private Context mContext;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private PaymentBackend mPaymentBackend;
+
+ private DefaultPaymentSettingsPreferenceController mController;
+ private Preference mPreference;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ when(mContext.getApplicationContext()).thenReturn(mContext);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+ mController = new DefaultPaymentSettingsPreferenceController(mContext);
+ ReflectionHelpers.setField(mController, "mNfcAdapter", mNfcAdapter);
+
+ mPreference = new Preference(RuntimeEnvironment.application);
+ }
+
+ @Test
+ public void isAvailable_hasNfc_shouldReturnTrue() {
+ when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true);
+ when(mUserManager.isAdminUser()).thenReturn(true);
+ when(mNfcAdapter.isEnabled()).thenReturn(true);
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_noNfcAdapter_shouldReturnFalse() {
+ when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true);
+ when(mUserManager.isAdminUser()).thenReturn(true);
+ ReflectionHelpers.setField(mController, "mNfcAdapter", null);
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void updateState_shouldSetSummaryToDefaultPaymentApp() {
+ final PaymentBackend.PaymentAppInfo defaultApp = mock(PaymentBackend.PaymentAppInfo.class);
+ defaultApp.label = "test_payment_app";
+ when(mPaymentBackend.getDefaultApp()).thenReturn(defaultApp);
+ ReflectionHelpers.setField(mController, "mPaymentBackend", mPaymentBackend);
+
+ mController.updateState(mPreference);
+
+ verify(mPaymentBackend).refresh();
+ assertThat(mPreference.getSummary()).isEqualTo(defaultApp.label);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
index 2d64396..74c47e2 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
@@ -24,6 +24,7 @@
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.widget.MasterSwitchController;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import org.junit.Before;
@@ -58,17 +59,22 @@
private MasterSwitchController mMasterSwitchController;
@Mock
private RestrictionUtils mRestrictionUtils;
+ @Mock
+ private LocalBluetoothManager mBluetoothManager;
+ @Mock
+ private LocalBluetoothAdapter mBluetoothAdapter;
private BluetoothEnabler mBluetoothEnabler;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ when(mBluetoothManager.getBluetoothAdapter()).thenReturn(mBluetoothAdapter);
mBluetoothEnabler = new BluetoothEnabler(
mContext,
mMasterSwitchController,
mMetricsFeatureProvider,
- mock(LocalBluetoothManager.class),
+ mBluetoothManager,
123,
mRestrictionUtils);
}
@@ -136,4 +142,17 @@
verify(mMasterSwitchController).setChecked(false);
}
+ @Test
+ public void maybeEnforceRestrictions_disallowBluetoothNotOverriden() {
+ // GIVEN Bluetooth has been disallowed...
+ when(mRestrictionUtils.checkIfRestrictionEnforced(
+ mContext, UserManager.DISALLOW_BLUETOOTH)).thenReturn(FAKE_ENFORCED_ADMIN);
+ when(mRestrictionUtils.checkIfRestrictionEnforced(
+ mContext, UserManager.DISALLOW_CONFIG_BLUETOOTH)).thenReturn(null);
+
+ mBluetoothEnabler.resume(mContext);
+
+ verify(mMasterSwitchController, never()).setEnabled(true);
+ }
+
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterTest.java
index f0412d6..c651132 100644
--- a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterTest.java
@@ -16,6 +16,7 @@
package com.android.settings.dashboard.conditional;
import android.content.Context;
+import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
@@ -130,4 +131,20 @@
verify(mCondition1).onPrimaryClick();
}
+ @Test
+ public void onSwiped_nullCondition_shouldNotCrash() {
+ final RecyclerView recyclerView = new RecyclerView(mContext);
+ final View view = LayoutInflater.from(mContext).inflate(
+ R.layout.condition_tile_new_ui, new LinearLayout(mContext), true);
+ final DashboardAdapter.DashboardItemHolder viewHolder =
+ new DashboardAdapter.DashboardItemHolder(view);
+ mConditionAdapter = new ConditionAdapter(
+ mContext, mOneCondition, DashboardData.HEADER_MODE_SUGGESTION_EXPANDED);
+ mConditionAdapter.addDismissHandling(recyclerView);
+
+ // do not bind viewholder to simulate the null condition scenario
+ mConditionAdapter.mSwipeCallback.onSwiped(viewHolder, 0);
+ // no crash
+ }
+
}
diff --git a/tests/robotests/src/com/android/settings/datausage/DataPlansSyncTimePreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataPlansSyncTimePreferenceTest.java
new file mode 100644
index 0000000..ba2d5f1
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/datausage/DataPlansSyncTimePreferenceTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public final class DataPlansSyncTimePreferenceTest {
+ private static final String SYNC_TIME = "Today 12:24pm";
+
+ private Preference mPreference;
+ private PreferenceViewHolder mHolder;
+
+ @Before
+ public void setUp() {
+ Context context = RuntimeEnvironment.application;
+ mPreference = new Preference(context);
+ mPreference.setLayoutResource(R.layout.data_plans_sync_time_preference);
+
+ LayoutInflater inflater = LayoutInflater.from(context);
+ View view = inflater.inflate(mPreference.getLayoutResource(),
+ new LinearLayout(context), false);
+ mHolder = PreferenceViewHolder.createInstanceForTests(view);
+ }
+
+ @Test
+ public void shouldRender_withData() {
+ mPreference.setTitle(SYNC_TIME);
+
+ mPreference.onBindViewHolder(mHolder);
+
+ TextView syncTimeTextView = (TextView) mHolder.findViewById(android.R.id.title);
+ assertThat(syncTimeTextView.getText()).isEqualTo(SYNC_TIME);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
index 77e0fe9..13e3aee 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
@@ -95,60 +95,6 @@
}
@Test
- public void testIsMetered_noSsid_shouldReturnFalse() {
- final DataUsageSummary dataUsageSummary = new DataUsageSummary();
- final NetworkPolicyEditor policyEditor = mock(NetworkPolicyEditor.class);
- ReflectionHelpers.setField(dataUsageSummary, "mPolicyEditor", policyEditor);
- WifiConfiguration config = mock(WifiConfiguration.class);
-
- assertThat(dataUsageSummary.isMetered(config)).isFalse();
- }
-
- @Test
- public void testIsMetered_noNetworkPolicy_shouldReturnFalse() {
- final DataUsageSummary dataUsageSummary = new DataUsageSummary();
- final NetworkPolicyEditor policyEditor = mock(NetworkPolicyEditor.class);
- ReflectionHelpers.setField(dataUsageSummary, "mPolicyEditor", policyEditor);
- WifiConfiguration config = mock(WifiConfiguration.class);
- config.SSID = "network1";
- doReturn(null).when(policyEditor).getPolicyMaybeUnquoted(any());
-
- assertThat(dataUsageSummary.isMetered(config)).isFalse();
- }
-
- @Test
- public void testIsMetered_policyHasLimit_shouldReturnTrue() {
- final DataUsageSummary dataUsageSummary = new DataUsageSummary();
- final NetworkPolicyEditor policyEditor = mock(NetworkPolicyEditor.class);
- ReflectionHelpers.setField(dataUsageSummary, "mPolicyEditor", policyEditor);
- WifiConfiguration config = mock(WifiConfiguration.class);
- config.SSID = "network1";
- NetworkPolicy policy = mock(NetworkPolicy.class);
- policy.limitBytes = 100;
- doReturn(policy).when(policyEditor).getPolicyMaybeUnquoted(any());
-
- assertThat(dataUsageSummary.isMetered(config)).isTrue();
- }
-
- @Test
- public void testIsMetered_noPolicyLimit_shouldReturnMeteredValue() {
- final DataUsageSummary dataUsageSummary = new DataUsageSummary();
- final NetworkPolicyEditor policyEditor = mock(NetworkPolicyEditor.class);
- ReflectionHelpers.setField(dataUsageSummary, "mPolicyEditor", policyEditor);
- WifiConfiguration config = mock(WifiConfiguration.class);
- config.SSID = "network1";
- NetworkPolicy policy = mock(NetworkPolicy.class);
- policy.limitBytes = NetworkPolicy.LIMIT_DISABLED;
- doReturn(policy).when(policyEditor).getPolicyMaybeUnquoted(any());
-
- policy.metered = true;
- assertThat(dataUsageSummary.isMetered(config)).isTrue();
-
- policy.metered = false;
- assertThat(dataUsageSummary.isMetered(config)).isFalse();
- }
-
- @Test
public void testNonIndexableKeys_existInXmlLayout() {
final Context context = RuntimeEnvironment.application;
final List<String> niks = DataUsageSummary.SEARCH_INDEX_DATA_PROVIDER
diff --git a/tests/robotests/src/com/android/settings/datausage/ManageDataPlansPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/ManageDataPlansPreferenceTest.java
new file mode 100644
index 0000000..6eff393
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/datausage/ManageDataPlansPreferenceTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public final class ManageDataPlansPreferenceTest {
+ private Preference mPreference;
+ private PreferenceViewHolder mHolder;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mPreference = new Preference(mContext);
+ mPreference.setLayoutResource(R.layout.manage_data_plans_preference);
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ View view = inflater.inflate(mPreference.getLayoutResource(),
+ new LinearLayout(mContext), false);
+ mHolder = PreferenceViewHolder.createInstanceForTests(view);
+ }
+
+ @Test
+ public void shouldRender_withData() {
+ mPreference.onBindViewHolder(mHolder);
+ Button managePlanButton = (Button) mHolder.findViewById(R.id.manage_data_plans);
+ assertThat(managePlanButton.getText())
+ .isEqualTo(mContext.getString(R.string.data_plan_usage_manage_plans_button_text));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java b/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java
index a154c03..5b34c7d 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java
@@ -55,7 +55,7 @@
@Test
public void testAfterLoad() {
mPreference.setStorageSize(MEGABYTE_IN_BYTES * 10, MEGABYTE_IN_BYTES * 100);
- assertThat(((String) mPreference.getSummary())).isEqualTo("0.01GB");
+ assertThat(((String) mPreference.getSummary())).isEqualTo("0.01 GB");
}
@Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java
index fcda085..a871c19 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java
@@ -104,7 +104,7 @@
verify(mGroup).addPreference(argumentCaptor.capture());
Preference preference = argumentCaptor.getValue();
- assertThat(preference.getSummary()).isEqualTo("0.01GB");
+ assertThat(preference.getSummary()).isEqualTo("0.01 GB");
}
@Test
@@ -177,7 +177,7 @@
verify(mGroup).addPreference(argumentCaptor.capture());
Preference preference = argumentCaptor.getValue();
- assertThat(preference.getSummary()).isEqualTo("0.03GB");
+ assertThat(preference.getSummary()).isEqualTo("0.03 GB");
}
@Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
index 0d6a4d7..1599440 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
@@ -84,8 +84,6 @@
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- SettingsShadowResources.overrideResource("android:string/fileSizeSuffix", "%1$s %2$s");
- SettingsShadowResources.overrideResource("android:string/gigabyteShort", "GB");
mContext = spy(RuntimeEnvironment.application.getApplicationContext());
FakeFeatureFactory.setupForTest(mContext);
mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
@@ -287,12 +285,12 @@
results.put(0, result);
mController.onLoadFinished(results, 0);
- assertThat(audio.getSummary().toString()).isEqualTo("0.14GB");
- assertThat(image.getSummary().toString()).isEqualTo("0.35GB");
- assertThat(games.getSummary().toString()).isEqualTo("0.08GB");
- assertThat(movies.getSummary().toString()).isEqualTo("0.16GB");
- assertThat(apps.getSummary().toString()).isEqualTo("0.09GB");
- assertThat(files.getSummary().toString()).isEqualTo("0.05GB");
+ assertThat(audio.getSummary().toString()).isEqualTo("0.14 GB");
+ assertThat(image.getSummary().toString()).isEqualTo("0.35 GB");
+ assertThat(games.getSummary().toString()).isEqualTo("0.08 GB");
+ assertThat(movies.getSummary().toString()).isEqualTo("0.16 GB");
+ assertThat(apps.getSummary().toString()).isEqualTo("0.09 GB");
+ assertThat(files.getSummary().toString()).isEqualTo("0.05 GB");
}
@Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java
index db7c9f7..a2e57b9 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java
@@ -122,7 +122,7 @@
verify(mScreen).addPreference(argumentCaptor.capture());
Preference preference = argumentCaptor.getValue();
- assertThat(preference.getSummary()).isEqualTo("0.10GB");
+ assertThat(preference.getSummary()).isEqualTo("0.10 GB");
}
@Test
diff --git a/tests/unit/README b/tests/unit/README
index 5184b07..2544ea5 100644
--- a/tests/unit/README
+++ b/tests/unit/README
@@ -1,8 +1,8 @@
To build the tests you can use the following command at the root of your android source tree
-$ make SettingsUnitTests
+$ make -j SettingsUnitTests
The test apk then needs to be installed onto your test device via for example
-$ adb install -r out/target/product/shamu/data/app/SettingsUnitTests/SettingsUnitTests.apk
+$ adb install -r ${ANDROID_PRODUCT_OUT}/data/app/SettingsUnitTests/SettingsUnitTests.apk
To run all tests:
$ adb shell am instrument -w com.android.settings.tests.unit/android.support.test.runner.AndroidJUnitRunner
diff --git a/tests/unit/src/com/android/settings/utils/FileSizeFormatterTest.java b/tests/unit/src/com/android/settings/utils/FileSizeFormatterTest.java
index c5b050a..41b236c 100644
--- a/tests/unit/src/com/android/settings/utils/FileSizeFormatterTest.java
+++ b/tests/unit/src/com/android/settings/utils/FileSizeFormatterTest.java
@@ -22,6 +22,7 @@
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
+import android.icu.util.MeasureUnit;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -46,7 +47,7 @@
FileSizeFormatter.formatFileSize(
mContext,
0 /* size */,
- com.android.internal.R.string.gigabyteShort,
+ MeasureUnit.GIGABYTE,
GIGABYTE_IN_BYTES))
.isEqualTo("0.00 GB");
}
@@ -57,7 +58,7 @@
FileSizeFormatter.formatFileSize(
mContext,
MEGABYTE_IN_BYTES * 11 /* size */,
- com.android.internal.R.string.gigabyteShort,
+ MeasureUnit.GIGABYTE,
GIGABYTE_IN_BYTES))
.isEqualTo("0.01 GB");
}
@@ -68,7 +69,7 @@
FileSizeFormatter.formatFileSize(
mContext,
MEGABYTE_IN_BYTES * 155 /* size */,
- com.android.internal.R.string.gigabyteShort,
+ MeasureUnit.GIGABYTE,
GIGABYTE_IN_BYTES))
.isEqualTo("0.16 GB");
}
@@ -79,7 +80,7 @@
FileSizeFormatter.formatFileSize(
mContext,
MEGABYTE_IN_BYTES * 1551 /* size */,
- com.android.internal.R.string.gigabyteShort,
+ MeasureUnit.GIGABYTE,
GIGABYTE_IN_BYTES))
.isEqualTo("1.6 GB");
}
@@ -91,7 +92,7 @@
FileSizeFormatter.formatFileSize(
mContext,
GIGABYTE_IN_BYTES * 15 + MEGABYTE_IN_BYTES * 50 /* size */,
- com.android.internal.R.string.gigabyteShort,
+ MeasureUnit.GIGABYTE,
GIGABYTE_IN_BYTES))
.isEqualTo("15 GB");
}
@@ -102,7 +103,7 @@
FileSizeFormatter.formatFileSize(
mContext,
MEGABYTE_IN_BYTES * -155 /* size */,
- com.android.internal.R.string.gigabyteShort,
+ MeasureUnit.GIGABYTE,
GIGABYTE_IN_BYTES))
.isEqualTo("-0.16 GB");
}