Merge "Show the disclaimer regarding WFC location privacy policy"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 5c0256b..0a0e403 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -348,7 +348,7 @@
android:clearTaskOnLaunch="true"
android:excludeFromRecents="true"
android:exported="true"
- android:permission="android.permission.CONNECTIVITY_INTERNAL"
+ android:permission="android.permission.NETWORK_STACK"
android:taskAffinity=""
android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert">
<intent-filter>
@@ -2812,7 +2812,7 @@
<receiver android:name=".sim.SimSelectNotification">
<intent-filter>
- <action android:name="android.intent.action.SIM_STATE_CHANGED"></action>
+ <action android:name="android.intent.action.PRIMARY_SUBSCRIPTION_LIST_CHANGED"/>
</intent-filter>
</receiver>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index a3a9865..930e21e 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1165,4 +1165,17 @@
<item>0</item>
</string-array>
+ <!-- WiFi calling mode array -->
+ <string-array name="wifi_calling_mode_summaries" translatable="false">
+ <item>@string/wifi_calling_mode_wifi_preferred_summary</item>
+ <item>@string/wifi_calling_mode_cellular_preferred_summary</item>
+ <item>@string/wifi_calling_mode_wifi_only_summary</item>
+ </string-array>
+
+ <!-- WiFi calling mode array without wifi only mode -->
+ <string-array name="wifi_calling_mode_summaries_without_wifi_only" translatable="false">
+ <item>@string/wifi_calling_mode_wifi_preferred_summary</item>
+ <item>@string/wifi_calling_mode_cellular_preferred_summary</item>
+ </string-array>
+
</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 33573ac..181af40 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -149,6 +149,11 @@
<attr name="aspectRatio" format="float" />
</declare-styleable>
+ <declare-styleable name="ListWithEntrySummaryPreference">
+ <!-- Summaries of entry -->
+ <attr name="entrySummaries" format="reference" />
+ </declare-styleable>
+
<!-- For UsageView -->
<declare-styleable name="UsageView">
<attr name="android:colorAccent" />
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2c52c3a..ae12511 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -291,6 +291,15 @@
<dimen name="password_requirement_textsize">14sp</dimen>
+ <!-- Visible vertical space we want to show below password edittext field when ime is shown.
+ The unit is sp as it is related to the text size of password requirement item. -->
+ <dimen name="visible_vertical_space_below_password">20sp</dimen>
+
+ <!-- Select dialog -->
+ <dimen name="select_dialog_padding_start">20dp</dimen>
+ <dimen name="select_dialog_item_margin_start">12dp</dimen>
+ <dimen name="select_dialog_summary_padding_bottom">8dp</dimen>
+
<!-- Padding between the donut and the storage summary. -->
<dimen name="storage_summary_padding_end">16dp</dimen>
<!-- Text size of the big number in the donut. -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2e21942..6cfe255 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2040,6 +2040,8 @@
<!-- Dialog text to tell the user that the selected network does not have Internet access. -->
<string name="no_internet_access_text">This network has no internet access. Stay connected?</string>
+ <!-- Dialog text to tell the user that the selected network has incomplete Internet access. [CHAR LIMIT=100] -->
+ <string name="partial_connectivity_text">Some apps and services may not work due to limited connectivity. Use anyway?</string>
<string name="no_internet_access_remember">Don\u2019t ask again for this network</string>
<!-- Dialog text to tell the user that the selected network has lost Internet access, and asking the user whether they want to avoid this network. -->
@@ -2302,7 +2304,7 @@
<!-- Title of WFC preference item [CHAR LIMIT=30] -->
<string name="wifi_calling_mode_title">Calling preference</string>
<!-- Title of WFC preference selection dialog [CHAR LIMIT=30] -->
- <string name="wifi_calling_mode_dialog_title">Wi-Fi calling mode</string>
+ <string name="wifi_calling_mode_dialog_title">Calling preference</string>
<!-- Title of WFC roaming preference item [CHAR LIMIT=45] -->
<string name="wifi_calling_roaming_mode_title">Roaming preference</string>
<!-- Summary of WFC roaming preference item [CHAR LIMIT=NONE]-->
@@ -2310,9 +2312,9 @@
<!-- WFC mode dialog [CHAR LIMIT=45] -->
<string name="wifi_calling_roaming_mode_dialog_title">Roaming preference</string>
<string-array name="wifi_calling_mode_choices">
- <item>Wi-Fi preferred</item>
- <item>Mobile preferred</item>
- <item>Wi-Fi only</item>
+ <item>@*android:string/wfc_mode_wifi_preferred_summary</item>
+ <item>@*android:string/wfc_mode_cellular_preferred_summary</item>
+ <item>@*android:string/wfc_mode_wifi_only_summary</item>
</string-array>
<string-array name="wifi_calling_mode_choices_v2">
<item>Wi-Fi</item>
@@ -2325,8 +2327,8 @@
<item>"0"</item>
</string-array>
<string-array name="wifi_calling_mode_choices_without_wifi_only">
- <item>Wi-Fi preferred</item>
- <item>Mobile preferred</item>
+ <item>@*android:string/wfc_mode_wifi_preferred_summary</item>
+ <item>@*android:string/wfc_mode_cellular_preferred_summary</item>
</string-array>
<string-array name="wifi_calling_mode_choices_v2_without_wifi_only">
<item>Wi-Fi</item>
@@ -2336,6 +2338,14 @@
<item>"2"</item>
<item>"1"</item>
</string-array>
+
+ <!-- Summary of WFC preference item on the WFC preference selection dialog. [CHAR LIMIT=70]-->
+ <string name="wifi_calling_mode_wifi_preferred_summary">If Wi\u2011Fi is unavailable, use mobile network</string>
+ <!-- Summary of WFC preference item on the WFC preference selection dialog. [CHAR LIMIT=70]-->
+ <string name="wifi_calling_mode_cellular_preferred_summary">If mobile network is unavailable, use Wi\u2011Fi</string>
+ <!-- Summary of WFC preference item on the WFC preference selection dialog. [CHAR LIMIT=70]-->
+ <string name="wifi_calling_mode_wifi_only_summary">Call over Wi\u2011Fi. If Wi\u2011Fi is lost, call will end.</string>
+
<!-- Wi-Fi Calling settings. Text displayed when Wi-Fi Calling is off -->
<string name="wifi_calling_off_explanation">When Wi-Fi calling is on, your phone can route calls via Wi-Fi networks or your carrier\u2019s network, depending on your preference and which signal is stronger. Before turning on this feature, check with your carrier regarding fees and other details.<xliff:g id="additional_text" example="Learn More">%1$s</xliff:g></string>
<!-- Wi-Fi Calling settings. Additional text displayed when Wi-Fi Calling is off. Default empty. [CHAR LIMIT=NONE] -->
@@ -3393,9 +3403,9 @@
<!-- Reset settings complete toast text [CHAR LIMIT=75] -->
<string name="reset_network_complete_toast">Network settings have been reset</string>
<!-- Title of the error message shown when error happens during erase eSIM data [CHAR LIMIT=NONE] -->
- <string name="reset_esim_error_title">Cant\u2019t reset eSIMs</string>
+ <string name="reset_esim_error_title">Can\u2019t reset eSIMs</string>
<!-- Message of the error message shown when error happens during erase eSIM data [CHAR LIMIT=NONE] -->
- <string name="reset_esim_error_msg">The eSIMs can\u2019tt be reset due to an error.</string>
+ <string name="reset_esim_error_msg">The eSIMs can\u2019t be reset due to an error.</string>
<!-- Master Clear -->
<!-- Button title to factory data reset the entire device -->
diff --git a/res/xml/single_choice_list_item_2.xml b/res/xml/single_choice_list_item_2.xml
new file mode 100644
index 0000000..ca80f44
--- /dev/null
+++ b/res/xml/single_choice_list_item_2.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/select_dialog_padding_start"
+ android:paddingEnd="?android:attr/dialogPreferredPadding"
+ android:orientation="horizontal"
+ android:descendantFocusability="blocksDescendants">
+
+ <RadioButton
+ android:id="@+id/radio"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:clickable="false" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:layout_marginStart="@dimen/select_dialog_item_margin_start"
+ android:layout_gravity="center_vertical">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="?android:attr/textColorAlertDialogListItem"
+ android:ellipsize="marquee" />
+
+ <TextView
+ android:id="@+id/summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingBottom="@dimen/select_dialog_summary_padding_bottom"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+ android:textColor="?android:attr/textColorSecondary"
+ android:maxLines="10" />
+
+ </LinearLayout>
+</LinearLayout>
diff --git a/res/xml/wifi_calling_settings.xml b/res/xml/wifi_calling_settings.xml
index 0adb1e8..0276bdb 100644
--- a/res/xml/wifi_calling_settings.xml
+++ b/res/xml/wifi_calling_settings.xml
@@ -15,24 +15,27 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="wifi_calling_settings"
android:title="@string/wifi_calling_settings_title">
- <ListPreference
+ <com.android.settings.wifi.calling.ListWithEntrySummaryPreference
android:key="wifi_calling_mode"
android:title="@string/wifi_calling_mode_title"
android:summary="@string/wifi_calling_mode_title"
android:entries="@array/wifi_calling_mode_choices"
android:entryValues="@array/wifi_calling_mode_values"
- android:dialogTitle="@string/wifi_calling_mode_dialog_title" />
+ android:dialogTitle="@string/wifi_calling_mode_dialog_title"
+ settings:entrySummaries="@array/wifi_calling_mode_summaries" />
- <ListPreference
+ <com.android.settings.wifi.calling.ListWithEntrySummaryPreference
android:key="wifi_calling_roaming_mode"
android:title="@string/wifi_calling_roaming_mode_title"
android:summary="@string/wifi_calling_roaming_mode_summary"
android:entries="@array/wifi_calling_mode_choices_v2"
android:entryValues="@array/wifi_calling_mode_values"
- android:dialogTitle="@string/wifi_calling_roaming_mode_dialog_title" />
+ android:dialogTitle="@string/wifi_calling_roaming_mode_dialog_title"
+ settings:entrySummaries="@array/wifi_calling_mode_summaries" />
<Preference
android:key="emergency_address_key"
diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java
index 6276b19..8da507b 100644
--- a/src/com/android/settings/RadioInfo.java
+++ b/src/com/android/settings/RadioInfo.java
@@ -455,6 +455,13 @@
imsWfcProvisionedSwitch = (Switch) findViewById(R.id.wfc_provisioned_switch);
eabProvisionedSwitch = (Switch) findViewById(R.id.eab_provisioned_switch);
+ if (!ImsManager.isImsSupportedOnDevice(phone.getContext())) {
+ imsVolteProvisionedSwitch.setVisibility(View.GONE);
+ imsVtProvisionedSwitch.setVisibility(View.GONE);
+ imsWfcProvisionedSwitch.setVisibility(View.GONE);
+ eabProvisionedSwitch.setVisibility(View.GONE);
+ }
+
radioPowerOnSwitch = (Switch) findViewById(R.id.radio_power);
mDownlinkKbps = (TextView) findViewById(R.id.dl_kbps);
@@ -604,8 +611,10 @@
R.string.radioInfo_menu_viewFDN).setOnMenuItemClickListener(mViewFDNCallback);
menu.add(1, MENU_ITEM_VIEW_SDN, 0,
R.string.radioInfo_menu_viewSDN).setOnMenuItemClickListener(mViewSDNCallback);
- menu.add(1, MENU_ITEM_GET_IMS_STATUS,
- 0, R.string.radioInfo_menu_getIMS).setOnMenuItemClickListener(mGetImsStatus);
+ if (ImsManager.isImsSupportedOnDevice(phone.getContext())) {
+ menu.add(1, MENU_ITEM_GET_IMS_STATUS,
+ 0, R.string.radioInfo_menu_getIMS).setOnMenuItemClickListener(mGetImsStatus);
+ }
menu.add(1, MENU_ITEM_TOGGLE_DATA,
0, R.string.radio_info_data_connection_disable).setOnMenuItemClickListener(mToggleData);
return true;
@@ -1357,6 +1366,9 @@
}
private void updateImsProvisionedState() {
+ if (!ImsManager.isImsSupportedOnDevice(phone.getContext())) {
+ return;
+ }
log("updateImsProvisionedState isImsVolteProvisioned()=" + isImsVolteProvisioned());
//delightful hack to prevent on-checked-changed calls from
//actually forcing the ims provisioning to its transient/current value.
diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java
index 99f2df6..950a0b0 100644
--- a/src/com/android/settings/ResetNetworkConfirm.java
+++ b/src/com/android/settings/ResetNetworkConfirm.java
@@ -154,20 +154,9 @@
SubscriptionManager.getPhoneId(mSubId)).factoryReset();
restoreDefaultApn(context);
esimFactoryReset(context, context.getPackageName());
- // There has been issues when Sms raw table somehow stores orphan
- // fragments. They lead to garbled message when new fragments come
- // in and combied with those stale ones. In case this happens again,
- // user can reset all network settings which will clean up this table.
- cleanUpSmsRawTable(context);
}
};
- private void cleanUpSmsRawTable(Context context) {
- ContentResolver resolver = context.getContentResolver();
- Uri uri = Uri.withAppendedPath(Telephony.Sms.CONTENT_URI, "raw/permanentDelete");
- resolver.delete(uri, null, null);
- }
-
@VisibleForTesting
void esimFactoryReset(Context context, String packageName) {
if (mEraseEsim) {
diff --git a/src/com/android/settings/development/FileEncryptionPreferenceController.java b/src/com/android/settings/development/FileEncryptionPreferenceController.java
index 731f487..a988fdd 100644
--- a/src/com/android/settings/development/FileEncryptionPreferenceController.java
+++ b/src/com/android/settings/development/FileEncryptionPreferenceController.java
@@ -63,7 +63,8 @@
@Override
public void updateState(Preference preference) {
- if (!TextUtils.equals("file", CryptoProperties.type().orElse("none"))) {
+ if (CryptoProperties.type().orElse(CryptoProperties.type_values.NONE) !=
+ CryptoProperties.type_values.FILE) {
return;
}
diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java
index ebf34e5..891d171 100644
--- a/src/com/android/settings/sim/SimSelectNotification.java
+++ b/src/com/android/settings/sim/SimSelectNotification.java
@@ -16,6 +16,12 @@
package com.android.settings.sim;
+import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_ID;
+import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_FOR_ALL_TYPES;
+import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE;
+import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA;
+import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_NONE;
+
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -23,19 +29,12 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
-import android.provider.Settings;
-import androidx.core.app.NotificationCompat;
-import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.util.Log;
-import com.android.internal.telephony.IccCardConstants;
import com.android.settings.R;
import com.android.settings.Settings.SimSettingsActivity;
-import com.android.settings.Utils;
-import java.util.List;
+import androidx.core.app.NotificationCompat;
public class SimSelectNotification extends BroadcastReceiver {
private static final String TAG = "SimSelectNotification";
@@ -46,71 +45,24 @@
@Override
public void onReceive(Context context, Intent intent) {
- final TelephonyManager telephonyManager = (TelephonyManager)
- context.getSystemService(Context.TELEPHONY_SERVICE);
- final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);
- final int numSlots = telephonyManager.getSimCount();
-
- // Do not create notifications on single SIM devices or when provisioning i.e. Setup Wizard.
- if (numSlots < 2 || !Utils.isDeviceProvisioned(context)) {
- return;
- }
-
// Cancel any previous notifications
cancelNotification(context);
-
- // If sim state is not ABSENT or LOADED then ignore
- String simStatus = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
- if (!(IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(simStatus) ||
- IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(simStatus))) {
- Log.d(TAG, "sim state is not Absent or Loaded");
- return;
- } else {
- Log.d(TAG, "simstatus = " + simStatus);
- }
-
- int state;
- for (int i = 0; i < numSlots; i++) {
- state = telephonyManager.getSimState(i);
- if (!(state == TelephonyManager.SIM_STATE_ABSENT
- || state == TelephonyManager.SIM_STATE_READY
- || state == TelephonyManager.SIM_STATE_UNKNOWN)) {
- Log.d(TAG, "All sims not in valid state yet");
- return;
- }
- }
-
- List<SubscriptionInfo> sil = subscriptionManager.getActiveSubscriptionInfoList();
- if (sil == null || sil.size() < 1) {
- Log.d(TAG, "Subscription list is empty");
- return;
- }
-
- // Clear defaults for any subscriptions which no longer exist
- subscriptionManager.clearDefaultsForInactiveSubIds();
-
- boolean dataSelected = SubscriptionManager.isUsableSubIdValue(
- SubscriptionManager.getDefaultDataSubscriptionId());
- boolean smsSelected = SubscriptionManager.isUsableSubIdValue(
- SubscriptionManager.getDefaultSmsSubscriptionId());
-
- // If data and sms defaults are selected, dont show notification (Calls default is optional)
- if (dataSelected && smsSelected) {
- Log.d(TAG, "Data & SMS default sims are selected. No notification");
- return;
- }
-
// Create a notification to tell the user that some defaults are missing
createNotification(context);
- if (sil.size() == 1) {
+ int dialogType = intent.getIntExtra(EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE,
+ EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_NONE);
+ if (dialogType == EXTRA_DEFAULT_SUBSCRIPTION_SELECT_FOR_ALL_TYPES) {
+ int subId = intent.getIntExtra(EXTRA_DEFAULT_SUBSCRIPTION_ID,
+ SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+ int slotIndex = SubscriptionManager.getSlotIndex(subId);
// If there is only one subscription, ask if user wants to use if for everything
Intent newIntent = new Intent(context, SimDialogActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
newIntent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, SimDialogActivity.PREFERRED_PICK);
- newIntent.putExtra(SimDialogActivity.PREFERRED_SIM, sil.get(0).getSimSlotIndex());
+ newIntent.putExtra(SimDialogActivity.PREFERRED_SIM, slotIndex);
context.startActivity(newIntent);
- } else if (!dataSelected) {
+ } else if (dialogType == EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA) {
// If there are mulitple, ensure they pick default data
Intent newIntent = new Intent(context, SimDialogActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
diff --git a/src/com/android/settings/wifi/WifiNoInternetDialog.java b/src/com/android/settings/wifi/WifiNoInternetDialog.java
index b175665..e641f2c 100644
--- a/src/com/android/settings/wifi/WifiNoInternetDialog.java
+++ b/src/com/android/settings/wifi/WifiNoInternetDialog.java
@@ -38,6 +38,7 @@
import com.android.settings.R;
import static android.net.ConnectivityManager.ACTION_PROMPT_LOST_VALIDATION;
+import static android.net.ConnectivityManager.ACTION_PROMPT_PARTIAL_CONNECTIVITY;
import static android.net.ConnectivityManager.ACTION_PROMPT_UNVALIDATED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
@@ -53,8 +54,9 @@
private String mAction;
private boolean isKnownAction(Intent intent) {
- return intent.getAction().equals(ACTION_PROMPT_UNVALIDATED) ||
- intent.getAction().equals(ACTION_PROMPT_LOST_VALIDATION);
+ return intent.getAction().equals(ACTION_PROMPT_UNVALIDATED)
+ || intent.getAction().equals(ACTION_PROMPT_LOST_VALIDATION)
+ || intent.getAction().equals(ACTION_PROMPT_PARTIAL_CONNECTIVITY);
}
@Override
@@ -131,6 +133,11 @@
ap.mMessage = getString(R.string.no_internet_access_text);
ap.mPositiveButtonText = getString(R.string.yes);
ap.mNegativeButtonText = getString(R.string.no);
+ } else if (ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
+ ap.mTitle = mNetworkName;
+ ap.mMessage = getString(R.string.partial_connectivity_text);
+ ap.mPositiveButtonText = getString(R.string.yes);
+ ap.mNegativeButtonText = getString(R.string.no);
} else {
ap.mTitle = getString(R.string.lost_internet_access_title);
ap.mMessage = getString(R.string.lost_internet_access_text);
@@ -146,7 +153,8 @@
ap.mView = checkbox;
mAlwaysAllow = (CheckBox) checkbox.findViewById(com.android.internal.R.id.alwaysUse);
- if (ACTION_PROMPT_UNVALIDATED.equals(mAction)) {
+ if (ACTION_PROMPT_UNVALIDATED.equals(mAction)
+ || ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
mAlwaysAllow.setText(getString(R.string.no_internet_access_remember));
} else {
mAlwaysAllow.setText(getString(R.string.lost_internet_access_persist));
@@ -174,6 +182,11 @@
final boolean accept = (which == BUTTON_POSITIVE);
action = (accept ? "Connect" : "Ignore");
mCM.setAcceptUnvalidated(mNetwork, accept, always);
+ } else if (ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
+ what = "PARTIAL_CONNECTIVITY";
+ final boolean accept = (which == BUTTON_POSITIVE);
+ action = (accept ? "Connect" : "Ignore");
+ mCM.setAcceptPartialConnectivity(mNetwork, accept, always);
} else {
what = "LOST_INTERNET";
final boolean avoid = (which == BUTTON_POSITIVE);
diff --git a/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreference.java b/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreference.java
new file mode 100644
index 0000000..c24ff2b
--- /dev/null
+++ b/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreference.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi.calling;
+
+import android.app.AlertDialog.Builder;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.res.TypedArray;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ListAdapter;
+import android.widget.RadioButton;
+import android.widget.TextView;
+
+import com.android.settings.CustomListPreference;
+import com.android.settings.R;
+
+/**
+ * ListPreference contain the entry summary.
+ */
+public class ListWithEntrySummaryPreference extends CustomListPreference {
+ private static final String LOG_TAG = "ListWithEntrySummaryPreference";
+ private final Context mContext;
+ private CharSequence[] mSummaries;
+
+ /**
+ * ListWithEntrySummaryPreference constructor.
+ *
+ * @param context The context of view.
+ * @param attrs The attributes of the XML tag that is inflating the linear layout.
+ */
+ public ListWithEntrySummaryPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mContext = context;
+
+ TypedArray array = context.obtainStyledAttributes(attrs,
+ R.styleable.ListWithEntrySummaryPreference, 0, 0);
+ mSummaries = array.getTextArray(R.styleable.ListWithEntrySummaryPreference_entrySummaries);
+ array.recycle();
+ }
+
+ /**
+ * Sets the summaries of mode items to be shown in the mode select dialog.
+ *
+ * @param summariesResId The summaries of mode items.
+ */
+ public void setEntrySummaries(int summariesResId) {
+ mSummaries = getContext().getResources().getTextArray(summariesResId);
+ }
+
+ /**
+ * Sets the summaries of mode items to be shown in the mode select dialog.
+ *
+ * @param summaries The summaries of mode items.
+ */
+ public void setEntrySummaries(CharSequence[] summaries) {
+ mSummaries = summaries;
+ }
+
+ private CharSequence getEntrySummary(int index) {
+ if (mSummaries == null) {
+ Log.w(LOG_TAG, "getEntrySummary : mSummaries is null");
+ return "";
+ }
+ return mSummaries[index];
+ }
+
+ @Override
+ protected void onPrepareDialogBuilder(Builder builder,
+ DialogInterface.OnClickListener listener) {
+ ListAdapter la = (ListAdapter) new SelectorAdapter(mContext,
+ R.xml.single_choice_list_item_2, this);
+ builder.setSingleChoiceItems(la, findIndexOfValue(getValue()), listener);
+ super.onPrepareDialogBuilder(builder, listener);
+ }
+
+ private static class SelectorAdapter extends ArrayAdapter<CharSequence> {
+ private final Context mContext;
+ private ListWithEntrySummaryPreference mSelector;
+
+ /**
+ * SelectorAdapter constructor.
+ *
+ * @param context The current context.
+ * @param rowResourceId The resource id of the XML tag that is inflating the linear layout.
+ * @param listPreference The instance of ListWithEntrySummaryPreference.
+ */
+ public SelectorAdapter(Context context, int rowResourceId,
+ ListWithEntrySummaryPreference listPreference) {
+ super(context, rowResourceId, listPreference.getEntryValues());
+ mContext = context;
+ mSelector = listPreference;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ View row = inflater.inflate(R.xml.single_choice_list_item_2, parent, false);
+
+ TextView title = (TextView) row.findViewById(R.id.title);
+ title.setText(mSelector.getEntries()[position]);
+
+ TextView summary = (TextView) row.findViewById(R.id.summary);
+ summary.setText(mSelector.getEntrySummary(position));
+
+ RadioButton rb = (RadioButton) row.findViewById(R.id.radio);
+ if (position == mSelector.findIndexOfValue(mSelector.getValue())) {
+ rb.setChecked(true);
+ }
+
+ return row;
+ }
+ }
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ final Parcelable superState = super.onSaveInstanceState();
+
+ final SavedState myState = new SavedState(superState);
+ myState.mEntries = getEntries();
+ myState.mEntryValues = getEntryValues();
+ myState.mSummaries = mSummaries;
+ return myState;
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ if (state == null || !state.getClass().equals(SavedState.class)) {
+ // Didn't save state for us in onSaveInstanceState
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
+ SavedState myState = (SavedState) state;
+ super.onRestoreInstanceState(myState.getSuperState());
+ setEntries(myState.mEntries);
+ setEntryValues(myState.mEntryValues);
+ mSummaries = myState.mSummaries;
+ }
+
+ /**
+ * We save entries, entryValues and summaries into bundle.
+ * At onCreate of fragment, dialog will be restored if it was open. In this case,
+ * we need to restore entries, entryValues and summaries. Without those information,
+ * crash when entering multi window during wfc modes dialog shown.
+ */
+ private static class SavedState extends BaseSavedState {
+ private CharSequence[] mEntries;
+ private CharSequence[] mEntryValues;
+ private CharSequence[] mSummaries;
+
+ public SavedState(Parcel source) {
+ super(source);
+ mEntries = source.readCharSequenceArray();
+ mEntryValues = source.readCharSequenceArray();
+ mSummaries = source.readCharSequenceArray();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeCharSequenceArray(mEntries);
+ dest.writeCharSequenceArray(mEntryValues);
+ dest.writeCharSequenceArray(mSummaries);
+ }
+
+ public SavedState(Parcelable superState) {
+ super(superState);
+ }
+
+ public static final Parcelable.Creator<SavedState> CREATOR =
+ new Parcelable.Creator<SavedState>() {
+ @Override
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+
+ @Override
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+ }
+}
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index 9449922..34963e0 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -86,8 +86,8 @@
//UI objects
private SwitchBar mSwitchBar;
private Switch mSwitch;
- private ListPreference mButtonWfcMode;
- private ListPreference mButtonWfcRoamingMode;
+ private ListWithEntrySummaryPreference mButtonWfcMode;
+ private ListWithEntrySummaryPreference mButtonWfcRoamingMode;
private Preference mUpdateAddress;
private TextView mEmptyView;
@@ -265,10 +265,11 @@
mImsManager = getImsManager();
- mButtonWfcMode = (ListPreference) findPreference(BUTTON_WFC_MODE);
+ mButtonWfcMode = (ListWithEntrySummaryPreference) findPreference(BUTTON_WFC_MODE);
mButtonWfcMode.setOnPreferenceChangeListener(this);
- mButtonWfcRoamingMode = (ListPreference) findPreference(BUTTON_WFC_ROAMING_MODE);
+ mButtonWfcRoamingMode = (ListWithEntrySummaryPreference) findPreference(
+ BUTTON_WFC_ROAMING_MODE);
mButtonWfcRoamingMode.setOnPreferenceChangeListener(this);
mUpdateAddress = (Preference) findPreference(PREFERENCE_EMERGENCY_ADDRESS);
@@ -329,10 +330,14 @@
if (!isWifiOnlySupported) {
mButtonWfcMode.setEntries(R.array.wifi_calling_mode_choices_without_wifi_only);
mButtonWfcMode.setEntryValues(R.array.wifi_calling_mode_values_without_wifi_only);
+ mButtonWfcMode.setEntrySummaries(R.array.wifi_calling_mode_summaries_without_wifi_only);
+
mButtonWfcRoamingMode.setEntries(
R.array.wifi_calling_mode_choices_v2_without_wifi_only);
mButtonWfcRoamingMode.setEntryValues(
R.array.wifi_calling_mode_values_without_wifi_only);
+ mButtonWfcRoamingMode.setEntrySummaries(
+ R.array.wifi_calling_mode_summaries_without_wifi_only);
}
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index fda5ce4..dece927 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -16,6 +16,7 @@
package com.android.settings.wifi.details;
import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
@@ -192,12 +193,14 @@
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
- // If the network just validated or lost Internet access, refresh network state.
- // Don't do this on every NetworkCapabilities change because refreshNetworkState
- // sends IPCs to the system server from the UI thread, which can cause jank.
+ // If the network just validated or lost Internet access or detected partial internet
+ // connectivity, refresh network state. Don't do this on every NetworkCapabilities
+ // change because refreshNetworkState sends IPCs to the system server from the UI
+ // thread, which can cause jank.
if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) {
- if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED) ||
- hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)) {
+ if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED)
+ || hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)
+ || hasCapabilityChanged(nc, NET_CAPABILITY_PARTIAL_CONNECTIVITY)) {
refreshNetworkState();
}
mNetworkCapabilities = nc;
diff --git a/tests/robotests/src/com/android/settings/development/FileEncryptionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/FileEncryptionPreferenceControllerTest.java
index afd465a..fb5eaab 100644
--- a/tests/robotests/src/com/android/settings/development/FileEncryptionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/FileEncryptionPreferenceControllerTest.java
@@ -91,7 +91,7 @@
ReflectionHelpers.setField(mController, "mStorageManager", mStorageManager);
when(mStorageManager.isConvertibleToFBE()).thenReturn(true);
mController.displayPreference(mPreferenceScreen);
- CryptoProperties.type("foobar");
+ CryptoProperties.type(CryptoProperties.type_values.NONE);
mController.updateState(mPreference);
@@ -105,7 +105,7 @@
ReflectionHelpers.setField(mController, "mStorageManager", mStorageManager);
when(mStorageManager.isConvertibleToFBE()).thenReturn(true);
mController.displayPreference(mPreferenceScreen);
- CryptoProperties.type("file");
+ CryptoProperties.type(CryptoProperties.type_values.FILE);
mController.updateState(mPreference);
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java
new file mode 100644
index 0000000..0cef231
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi.calling;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.os.Parcelable;
+import android.widget.ListAdapter;
+import android.widget.TextView;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.io.IOException;
+
+@RunWith(RobolectricTestRunner.class)
+public class ListWithEntrySummaryPreferenceTest {
+
+ private Context mContext;
+ private ListWithEntrySummaryPreference mPreference;
+
+ private CharSequence[] mDefaultEntries =
+ {"default_entry1", "default_entry2", "default_entry3"};
+ private CharSequence[] mDefaultEntryValues = {"0", "1", "2"};
+ private CharSequence[] mDefaultEntrySummaries =
+ {"default_summary1", "default_summary2", "default_summary3"};
+
+ private CharSequence[] mCustomEntries = {"custom_entry1", "custom_entry2"};
+ private CharSequence[] mCustomEntryValues = {"0", "1"};
+ private CharSequence[] mCustomEntrySummaries = {"custom_summary1", "custom_summary2"};
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mPreference = new ListWithEntrySummaryPreference(mContext, null);
+ mPreference.setEntries(mDefaultEntries);
+ mPreference.setEntryValues(mDefaultEntryValues);
+ mPreference.setEntrySummaries(mDefaultEntrySummaries);
+ }
+
+ @Test
+ public void initialize_defaultEntries_shouldDisplayDefalutEntries() {
+ AlertDialog dialog = showDialog(mPreference);
+ ListAdapter adapter = dialog.getListView().getAdapter();
+
+ int len = mDefaultEntries.length;
+ assertThat(adapter.getCount()).isEqualTo(len);
+ for (int i = 0; i < len; i++) {
+ TextView title = adapter.getView(i, null, null).findViewById(R.id.title);
+ TextView summary = adapter.getView(i, null, null).findViewById(R.id.summary);
+ assertThat(title.getText()).isEqualTo(mDefaultEntries[i]);
+ assertThat(summary.getText()).isEqualTo(mDefaultEntrySummaries[i]);
+ }
+ }
+
+ @Test
+ public void setEntries_customEntries_shouldUpdateEntries() {
+ mPreference.setEntries(mCustomEntries);
+ mPreference.setEntryValues(mCustomEntryValues);
+ mPreference.setEntrySummaries(mCustomEntrySummaries);
+
+ AlertDialog dialog = showDialog(mPreference);
+ ListAdapter adapter = dialog.getListView().getAdapter();
+
+ int len = mCustomEntries.length;
+ assertThat(adapter.getCount()).isEqualTo(len);
+ for (int i = 0; i < len; i++) {
+ TextView title = adapter.getView(i, null, null).findViewById(R.id.title);
+ TextView summary = adapter.getView(i, null, null).findViewById(R.id.summary);
+ assertThat(title.getText()).isEqualTo(mCustomEntries[i]);
+ assertThat(summary.getText()).isEqualTo(mCustomEntrySummaries[i]);
+ }
+ }
+
+ @Test
+ public void onSaveAndRestoreInstanceState_resumePreference_shouldNotChangeEntries() {
+ setEntries_customEntries_shouldUpdateEntries();
+
+ final Parcelable parcelable = mPreference.onSaveInstanceState();
+ ListWithEntrySummaryPreference preference
+ = new ListWithEntrySummaryPreference(mContext, null);
+ preference.setEntries(mDefaultEntries);
+ preference.setEntryValues(mDefaultEntryValues);
+ preference.setEntrySummaries(mDefaultEntrySummaries);
+ preference.onRestoreInstanceState(parcelable);
+
+ AlertDialog dialog = showDialog(preference);
+ ListAdapter adapter = dialog.getListView().getAdapter();
+
+ int len = mCustomEntries.length;
+ assertThat(adapter.getCount()).isEqualTo(len);
+ for (int i = 0; i < len; i++) {
+ TextView title = adapter.getView(i, null, null).findViewById(R.id.title);
+ TextView summary = adapter.getView(i, null, null).findViewById(R.id.summary);
+ assertThat(title.getText()).isEqualTo(mCustomEntries[i]);
+ assertThat(summary.getText()).isEqualTo(mCustomEntrySummaries[i]);
+ }
+ }
+
+ private AlertDialog showDialog(ListWithEntrySummaryPreference preference) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ preference.onPrepareDialogBuilder(builder, null);
+ return builder.show();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
index fbdc303..8f01d39 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
@@ -92,8 +92,8 @@
@Mock private ToggleSwitch mToggleSwitch;
@Mock private View mView;
@Mock private ImsConfig mImsConfig;
- @Mock private ListPreference mButtonWfcMode;
- @Mock private ListPreference mButtonWfcRoamingMode;
+ @Mock private ListWithEntrySummaryPreference mButtonWfcMode;
+ @Mock private ListWithEntrySummaryPreference mButtonWfcRoamingMode;
@Mock private Preference mUpdateAddress;
@Before
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 435882b..d5fd48e 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -622,6 +622,19 @@
nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
updateNetworkCapabilities(nc);
inOrder.verify(mockHeaderController).setSummary(summary);
+
+ // UI will be refreshed when device connects to a partial connectivity network.
+ summary = "Limited connection";
+ when(mockAccessPoint.getSettingsSummary()).thenReturn(summary);
+ nc.addCapability(NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY);
+ updateNetworkCapabilities(nc);
+ inOrder.verify(mockHeaderController).setSummary(summary);
+
+ // Although UI will be refreshed when network become validated. The Settings should
+ // continue to display "Limited connection" if network still provides partial connectivity.
+ nc.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+ updateNetworkCapabilities(nc);
+ inOrder.verify(mockHeaderController).setSummary(summary);
}
@Test