diff --git a/packages/SystemUI/res/layout/internet_connectivity_dialog.xml b/packages/SystemUI/res/layout/internet_connectivity_dialog.xml
index 4a5b637a05d9e..e90a6446c47b5 100644
--- a/packages/SystemUI/res/layout/internet_connectivity_dialog.xml
+++ b/packages/SystemUI/res/layout/internet_connectivity_dialog.xml
@@ -34,6 +34,7 @@
+
@@ -370,27 +377,60 @@
android:clickable="true"/>
-
-
+ android:clickable="false"
+ android:focusable="false">
+
+
+
+
+
+
+
+
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 879726650b887..4dc52e7540be8 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2336,6 +2336,8 @@
To switch networks, disconnect ethernet
To improve device experience, apps and services can still scan for Wi\u2011Fi networks at any time, even when Wi\u2011Fi is off. You can change this in Wi\u2011Fi scanning settings. Change
+
+ Turn off airplane mode
Select user
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java
index 033fe1e0e6a97..26c89ff830767 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java
@@ -120,10 +120,12 @@ public class InternetDialog extends SystemUIDialog implements
private ImageView mSignalIcon;
private TextView mMobileTitleText;
private TextView mMobileSummaryText;
+ private TextView mAirplaneModeSummaryText;
private Switch mMobileDataToggle;
private View mMobileToggleDivider;
private Switch mWiFiToggle;
private FrameLayout mDoneLayout;
+ private FrameLayout mAirplaneModeLayout;
private Drawable mBackgroundOn;
private Drawable mBackgroundOff = null;
private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -210,9 +212,11 @@ public class InternetDialog extends SystemUIDialog implements
mWifiRecyclerView = mDialogView.requireViewById(R.id.wifi_list_layout);
mSeeAllLayout = mDialogView.requireViewById(R.id.see_all_layout);
mDoneLayout = mDialogView.requireViewById(R.id.done_layout);
+ mAirplaneModeLayout = mDialogView.requireViewById(R.id.apm_layout);
mSignalIcon = mDialogView.requireViewById(R.id.signal_icon);
mMobileTitleText = mDialogView.requireViewById(R.id.mobile_title);
mMobileSummaryText = mDialogView.requireViewById(R.id.mobile_summary);
+ mAirplaneModeSummaryText = mDialogView.requireViewById(R.id.airplane_mode_summary);
mMobileToggleDivider = mDialogView.requireViewById(R.id.mobile_toggle_divider);
mMobileDataToggle = mDialogView.requireViewById(R.id.mobile_toggle);
mWiFiToggle = mDialogView.requireViewById(R.id.wifi_toggle);
@@ -230,6 +234,8 @@ public class InternetDialog extends SystemUIDialog implements
setOnClickListener();
mTurnWifiOnLayout.setBackground(null);
+ mAirplaneModeLayout.setVisibility(
+ mInternetDialogController.isAirplaneModeEnabled() ? View.VISIBLE : View.GONE);
mWifiRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
mWifiRecyclerView.setAdapter(mAdapter);
}
@@ -269,6 +275,7 @@ public class InternetDialog extends SystemUIDialog implements
mSeeAllLayout.setOnClickListener(null);
mWiFiToggle.setOnCheckedChangeListener(null);
mDoneLayout.setOnClickListener(null);
+ mAirplaneModeLayout.setOnClickListener(null);
mInternetDialogController.onStop();
mInternetDialogFactory.destroyDialog();
}
@@ -294,13 +301,17 @@ public class InternetDialog extends SystemUIDialog implements
}
if (mInternetDialogController.isAirplaneModeEnabled()) {
mInternetDialogSubTitle.setVisibility(View.GONE);
+ mAirplaneModeLayout.setVisibility(View.VISIBLE);
} else {
+ mInternetDialogTitle.setText(getDialogTitleText());
+ mInternetDialogSubTitle.setVisibility(View.VISIBLE);
mInternetDialogSubTitle.setText(getSubtitleText());
+ mAirplaneModeLayout.setVisibility(View.GONE);
}
updateEthernet();
if (shouldUpdateMobileNetwork) {
- setMobileDataLayout(mInternetDialogController.activeNetworkIsCellular()
- || mInternetDialogController.isCarrierNetworkActive());
+ setMobileDataLayout(mInternetDialogController.activeNetworkIsCellular(),
+ mInternetDialogController.isCarrierNetworkActive());
}
if (!mCanConfigWifi) {
@@ -343,6 +354,9 @@ public class InternetDialog extends SystemUIDialog implements
mWifiManager.setWifiEnabled(isChecked);
});
mDoneLayout.setOnClickListener(v -> dismiss());
+ mAirplaneModeLayout.setOnClickListener(v -> {
+ mInternetDialogController.setAirplaneModeDisabled();
+ });
}
@MainThread
@@ -351,42 +365,60 @@ public class InternetDialog extends SystemUIDialog implements
mInternetDialogController.hasEthernet() ? View.VISIBLE : View.GONE);
}
- private void setMobileDataLayout(boolean isCarrierNetworkConnected) {
- if (mInternetDialogController.isAirplaneModeEnabled()
- || !mInternetDialogController.hasCarrier()) {
+ private void setMobileDataLayout(boolean activeNetworkIsCellular,
+ boolean isCarrierNetworkActive) {
+ boolean isNetworkConnected = activeNetworkIsCellular || isCarrierNetworkActive;
+ // 1. Mobile network should be gone if airplane mode ON or the list of active
+ // subscriptionId is null.
+ // 2. Carrier network should be gone if airplane mode ON and Wi-Fi is OFF.
+ if (DEBUG) {
+ Log.d(TAG, "setMobileDataLayout, isCarrierNetworkActive = " + isCarrierNetworkActive);
+ }
+
+ if (!mInternetDialogController.hasActiveSubId()
+ && (!mWifiManager.isWifiEnabled() || !isCarrierNetworkActive)) {
mMobileNetworkLayout.setVisibility(View.GONE);
} else {
- mMobileDataToggle.setChecked(mInternetDialogController.isMobileDataEnabled());
mMobileNetworkLayout.setVisibility(View.VISIBLE);
+ mMobileDataToggle.setChecked(mInternetDialogController.isMobileDataEnabled());
mMobileTitleText.setText(getMobileNetworkTitle());
- if (!TextUtils.isEmpty(getMobileNetworkSummary())) {
+ String summary = getMobileNetworkSummary();
+ if (!TextUtils.isEmpty(summary)) {
mMobileSummaryText.setText(
- Html.fromHtml(getMobileNetworkSummary(), Html.FROM_HTML_MODE_LEGACY));
+ Html.fromHtml(summary, Html.FROM_HTML_MODE_LEGACY));
mMobileSummaryText.setVisibility(View.VISIBLE);
} else {
mMobileSummaryText.setVisibility(View.GONE);
}
-
mBackgroundExecutor.execute(() -> {
Drawable drawable = getSignalStrengthDrawable();
mHandler.post(() -> {
mSignalIcon.setImageDrawable(drawable);
});
});
- mMobileTitleText.setTextAppearance(isCarrierNetworkConnected
+ mMobileTitleText.setTextAppearance(isNetworkConnected
? R.style.TextAppearance_InternetDialog_Active
: R.style.TextAppearance_InternetDialog);
- mMobileSummaryText.setTextAppearance(isCarrierNetworkConnected
+ int secondaryRes = isNetworkConnected
? R.style.TextAppearance_InternetDialog_Secondary_Active
- : R.style.TextAppearance_InternetDialog_Secondary);
+ : R.style.TextAppearance_InternetDialog_Secondary;
+ mMobileSummaryText.setTextAppearance(secondaryRes);
+ // Set airplane mode to the summary for carrier network
+ if (mInternetDialogController.isAirplaneModeEnabled()) {
+ mAirplaneModeSummaryText.setVisibility(View.VISIBLE);
+ mAirplaneModeSummaryText.setText(mContext.getText(R.string.airplane_mode));
+ mAirplaneModeSummaryText.setTextAppearance(secondaryRes);
+ } else {
+ mAirplaneModeSummaryText.setVisibility(View.GONE);
+ }
mMobileNetworkLayout.setBackground(
- isCarrierNetworkConnected ? mBackgroundOn : mBackgroundOff);
+ isNetworkConnected ? mBackgroundOn : mBackgroundOff);
TypedArray array = mContext.obtainStyledAttributes(
R.style.InternetDialog_Divider_Active, new int[]{android.R.attr.background});
int dividerColor = Utils.getColorAttrDefaultColor(mContext,
android.R.attr.textColorSecondary);
- mMobileToggleDivider.setBackgroundColor(isCarrierNetworkConnected
+ mMobileToggleDivider.setBackgroundColor(isNetworkConnected
? array.getColor(0, dividerColor) : dividerColor);
array.recycle();
@@ -620,10 +652,13 @@ public class InternetDialog extends SystemUIDialog implements
@WorkerThread
public void onAccessPointsChanged(@Nullable List wifiEntries,
@Nullable WifiEntry connectedEntry) {
+ // Should update the carrier network layout when it is connected under airplane mode ON.
+ boolean shouldUpdateCarrierNetwork = mMobileNetworkLayout.getVisibility() == View.VISIBLE
+ && mInternetDialogController.isAirplaneModeEnabled();
mHandler.post(() -> {
mConnectedWifiEntry = connectedEntry;
mWifiEntriesCount = wifiEntries == null ? 0 : wifiEntries.size();
- updateDialog(false /* shouldUpdateMobileNetwork */);
+ updateDialog(shouldUpdateCarrierNetwork /* shouldUpdateMobileNetwork */);
mAdapter.setWifiEntries(wifiEntries, mWifiEntriesCount);
mAdapter.notifyDataSetChanged();
});
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
index 2a7d2c35e82f9..706f4230bf9fd 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
@@ -281,6 +281,10 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
return mGlobalSettings.getInt(Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
+ void setAirplaneModeDisabled() {
+ mConnectivityManager.setAirplaneMode(false);
+ }
+
@VisibleForTesting
protected int getDefaultDataSubscriptionId() {
return mSubscriptionManager.getDefaultDataSubscriptionId();
@@ -352,7 +356,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
if (DEBUG) {
Log.d(TAG, "No Wi-Fi item.");
}
- if (!hasCarrier() || (!isVoiceStateInService() && !isDataStateInService())) {
+ if (!hasActiveSubId() || (!isVoiceStateInService() && !isDataStateInService())) {
if (DEBUG) {
Log.d(TAG, "No carrier or service is out of service.");
}
@@ -403,15 +407,16 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
return drawable;
}
- if (isDataStateInService() || isVoiceStateInService()) {
+ boolean isCarrierNetworkActive = isCarrierNetworkActive();
+ if (isDataStateInService() || isVoiceStateInService() || isCarrierNetworkActive) {
AtomicReference shared = new AtomicReference<>();
- shared.set(getSignalStrengthDrawableWithLevel());
+ shared.set(getSignalStrengthDrawableWithLevel(isCarrierNetworkActive));
drawable = shared.get();
}
int tintColor = Utils.getColorAttrDefaultColor(mContext,
android.R.attr.textColorTertiary);
- if (activeNetworkIsCellular() || isCarrierNetworkActive()) {
+ if (activeNetworkIsCellular() || isCarrierNetworkActive) {
tintColor = mContext.getColor(R.color.connected_network_primary_color);
}
drawable.setTint(tintColor);
@@ -426,12 +431,15 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
*
* @return The Drawable which is a signal bar icon with level.
*/
- Drawable getSignalStrengthDrawableWithLevel() {
+ Drawable getSignalStrengthDrawableWithLevel(boolean isCarrierNetworkActive) {
final SignalStrength strength = mTelephonyManager.getSignalStrength();
int level = (strength == null) ? 0 : strength.getLevel();
int numLevels = SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
- if (mSubscriptionManager != null && shouldInflateSignalStrength(mDefaultDataSubId)) {
- level += 1;
+ if ((mSubscriptionManager != null && shouldInflateSignalStrength(mDefaultDataSubId))
+ || isCarrierNetworkActive) {
+ level = isCarrierNetworkActive
+ ? SignalStrength.NUM_SIGNAL_STRENGTH_BINS
+ : (level + 1);
numLevels += 1;
}
return getSignalStrengthIcon(mContext, level, numLevels, NO_CELL_DATA_TYPE_ICON,
@@ -586,15 +594,18 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
if (!isMobileDataEnabled()) {
return context.getString(R.string.mobile_data_off_summary);
}
- if (!isDataStateInService()) {
- return context.getString(R.string.mobile_data_no_connection);
- }
+
String summary = networkTypeDescription;
+ // Set network description for the carrier network when connecting to the carrier network
+ // under the airplane mode ON.
if (activeNetworkIsCellular() || isCarrierNetworkActive()) {
summary = context.getString(R.string.preference_summary_default_combination,
context.getString(R.string.mobile_data_connection_active),
networkTypeDescription);
+ } else if (!isDataStateInService()) {
+ summary = context.getString(R.string.mobile_data_no_connection);
}
+
return summary;
}
@@ -678,7 +689,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
/**
* @return whether there is the carrier item in the slice.
*/
- boolean hasCarrier() {
+ boolean hasActiveSubId() {
if (mSubscriptionManager == null) {
if (DEBUG) {
Log.d(TAG, "SubscriptionManager is null, can not check carrier.");
@@ -888,7 +899,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
if (mHasEthernet) {
count -= 1;
}
- if (hasCarrier()) {
+ if (hasActiveSubId()) {
count -= 1;
}
if (hasConnectedWifi) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java
index 339d5bb04d745..0cf063f5db398 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java
@@ -80,6 +80,7 @@ public class InternetDialogTest extends SysuiTestCase {
private RecyclerView mWifiList;
private LinearLayout mSeeAll;
private LinearLayout mWifiScanNotify;
+ private TextView mAirplaneModeSummaryText;
@Before
public void setUp() {
@@ -114,6 +115,7 @@ public class InternetDialogTest extends SysuiTestCase {
mWifiList = mDialogView.requireViewById(R.id.wifi_list_layout);
mSeeAll = mDialogView.requireViewById(R.id.see_all_layout);
mWifiScanNotify = mDialogView.requireViewById(R.id.wifi_scan_notify_layout);
+ mAirplaneModeSummaryText = mDialogView.requireViewById(R.id.airplane_mode_summary);
}
@After
@@ -191,7 +193,41 @@ public class InternetDialogTest extends SysuiTestCase {
}
@Test
- public void updateDialog_withApmOn_mobileDataLayoutGone() {
+ public void updateDialog_apmOffAndNotCarrierNetwork_mobileDataLayoutGone() {
+ // Mobile network should be gone if the list of active subscriptionId is null.
+ when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(false);
+ when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false);
+ when(mInternetDialogController.hasActiveSubId()).thenReturn(false);
+
+ mInternetDialog.updateDialog(true);
+
+ assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void updateDialog_apmOnWithCarrierNetworkAndWifiStatus_mobileDataLayout() {
+ // Carrier network should be gone if airplane mode ON and Wi-Fi is off.
+ when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true);
+ when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true);
+ when(mWifiManager.isWifiEnabled()).thenReturn(false);
+
+ mInternetDialog.updateDialog(true);
+
+ assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.GONE);
+
+ // Carrier network should be visible if airplane mode ON and Wi-Fi is ON.
+ when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true);
+ when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true);
+ when(mWifiManager.isWifiEnabled()).thenReturn(true);
+
+ mInternetDialog.updateDialog(true);
+
+ assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void updateDialog_apmOnAndNoCarrierNetwork_mobileDataLayoutGone() {
+ when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(false);
when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true);
mInternetDialog.updateDialog(true);
@@ -199,6 +235,51 @@ public class InternetDialogTest extends SysuiTestCase {
assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.GONE);
}
+ @Test
+ public void updateDialog_apmOnAndWifiOnHasCarrierNetwork_showAirplaneSummary() {
+ when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true);
+ when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true);
+ mInternetDialog.mConnectedWifiEntry = null;
+ doReturn(false).when(mInternetDialogController).activeNetworkIsCellular();
+
+ mInternetDialog.updateDialog(true);
+
+ assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mAirplaneModeSummaryText.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void updateDialog_apmOffAndWifiOnHasCarrierNetwork_notShowApmSummary() {
+ when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true);
+ when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false);
+ mInternetDialog.mConnectedWifiEntry = null;
+ doReturn(false).when(mInternetDialogController).activeNetworkIsCellular();
+
+ mInternetDialog.updateDialog(true);
+
+ assertThat(mAirplaneModeSummaryText.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void updateDialog_apmOffAndHasCarrierNetwork_notShowApmSummary() {
+ when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(true);
+ when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false);
+
+ mInternetDialog.updateDialog(true);
+
+ assertThat(mAirplaneModeSummaryText.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void updateDialog_apmOnAndNoCarrierNetwork_notShowApmSummary() {
+ when(mInternetDialogController.isCarrierNetworkActive()).thenReturn(false);
+ when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true);
+
+ mInternetDialog.updateDialog(true);
+
+ assertThat(mAirplaneModeSummaryText.getVisibility()).isEqualTo(View.GONE);
+ }
+
@Test
public void updateDialog_wifiOnAndHasInternetWifi_showConnectedWifi() {
// The preconditions WiFi ON and Internet WiFi are already in setUp()