diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java index c24b5ada71c29..92ae88db7c6d4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java @@ -53,6 +53,7 @@ import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.qs.tiles.dialog.InternetDialogFactory; import com.android.systemui.statusbar.policy.NetworkController; +import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; @@ -69,6 +70,7 @@ public class InternetTile extends QSTileImpl { private static final Intent WIFI_SETTINGS = new Intent(Settings.ACTION_WIFI_SETTINGS); protected final NetworkController mController; + private final AccessPointController mAccessPointController; private final DataUsageController mDataController; // The last updated tile state, 0: mobile, 1: wifi, 2: ethernet. private int mLastTileState = -1; @@ -88,6 +90,7 @@ public class InternetTile extends QSTileImpl { ActivityStarter activityStarter, QSLogger qsLogger, NetworkController networkController, + AccessPointController accessPointController, InternetDialogFactory internetDialogFactory ) { super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger, @@ -95,6 +98,7 @@ public class InternetTile extends QSTileImpl { mInternetDialogFactory = internetDialogFactory; mHandler = mainHandler; mController = networkController; + mAccessPointController = accessPointController; mDataController = mController.getMobileDataController(); mController.observe(getLifecycle(), mSignalCallback); } @@ -118,9 +122,8 @@ public class InternetTile extends QSTileImpl { @Override protected void handleClick(@Nullable View view) { - mHandler.post(() -> { - mInternetDialogFactory.create(true); - }); + boolean canConfigMobileData = mAccessPointController.canConfigMobileData(); + mHandler.post(() -> mInternetDialogFactory.create(true, canConfigMobileData)); } @Override 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 50fb66c10f832..812be15bfceb7 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 @@ -126,6 +126,7 @@ public class InternetDialog extends SystemUIDialog implements private int mListMaxHeight; private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private boolean mIsProgressBarVisible; + private boolean mCanConfigMobileData; private final ViewTreeObserver.OnGlobalLayoutListener mInternetListLayoutListener = () -> { // Set max height for list @@ -137,7 +138,7 @@ public class InternetDialog extends SystemUIDialog implements }; public InternetDialog(Context context, InternetDialogFactory internetDialogFactory, - InternetDialogController internetDialogController, + InternetDialogController internetDialogController, boolean canConfigMobileData, boolean aboveStatusBar, UiEventLogger uiEventLogger, @Main Handler handler) { super(context, R.style.Theme_SystemUI_Dialog_Internet); if (DEBUG) { @@ -151,6 +152,7 @@ public class InternetDialog extends SystemUIDialog implements mDefaultDataSubId = mInternetDialogController.getDefaultDataSubscriptionId(); mTelephonyManager = mInternetDialogController.getTelephonyManager(); mWifiManager = mInternetDialogController.getWifiManager(); + mCanConfigMobileData = canConfigMobileData; mLayoutManager = new LinearLayoutManager(mContext) { @Override @@ -319,8 +321,13 @@ public class InternetDialog extends SystemUIDialog implements mMobileDataToggle.setChecked(mInternetDialogController.isMobileDataEnabled()); mMobileNetworkLayout.setVisibility(View.VISIBLE); mMobileTitleText.setText(getMobileNetworkTitle()); - mMobileSummaryText.setText( - Html.fromHtml(getMobileNetworkSummary(), Html.FROM_HTML_MODE_LEGACY)); + if (!TextUtils.isEmpty(getMobileNetworkSummary())) { + mMobileSummaryText.setText( + Html.fromHtml(getMobileNetworkSummary(), Html.FROM_HTML_MODE_LEGACY)); + mMobileSummaryText.setVisibility(View.VISIBLE); + } else { + mMobileSummaryText.setVisibility(View.GONE); + } mSignalIcon.setImageDrawable(getSignalStrengthDrawable()); int titleColor = isCellularNetwork ? mContext.getColor( R.color.connected_network_primary_color) : Utils.getColorAttrDefaultColor( @@ -331,6 +338,8 @@ public class InternetDialog extends SystemUIDialog implements mMobileTitleText.setTextColor(titleColor); mMobileSummaryText.setTextColor(summaryColor); mMobileNetworkLayout.setBackground(isCellularNetwork ? mBackgroundOn : null); + + mMobileDataToggle.setVisibility(mCanConfigMobileData ? View.VISIBLE : View.INVISIBLE); } } 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 24c2fb1eb3f9b..11179899ec224 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 @@ -36,6 +36,8 @@ import android.net.wifi.ScanResult; import android.net.wifi.WifiManager; import android.os.Handler; import android.provider.Settings; +import android.telephony.AccessNetworkConstants; +import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; @@ -115,7 +117,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, private MobileMappings.Config mConfig = null; private Executor mExecutor; private AccessPointController mAccessPointController; - private IntentFilter mWifiStateFilter; + private IntentFilter mConnectionStateFilter; private InternetDialogCallback mCallback; private List mWifiEntry; private WifiEntry mConnectedEntry; @@ -168,8 +170,10 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mSubscriptionManager = subscriptionManager; mBroadcastDispatcher = broadcastDispatcher; mKeyguardUpdateMonitor = keyguardUpdateMonitor; - mWifiStateFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION); - mWifiStateFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); + mConnectionStateFilter = new IntentFilter(); + mConnectionStateFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); + mConnectionStateFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); + mConnectionStateFilter.addAction(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); mUiEventLogger = uiEventLogger; mActivityStarter = starter; mAccessPointController = accessPointController; @@ -183,12 +187,16 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mCallback = callback; mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateCallback); mAccessPointController.addAccessPointCallback(this); - mBroadcastDispatcher.registerReceiver(mWifiStateReceiver, mWifiStateFilter, mExecutor); + mBroadcastDispatcher.registerReceiver(mConnectionStateReceiver, mConnectionStateFilter, + mExecutor); // Listen the subscription changes mOnSubscriptionsChangedListener = new InternetOnSubscriptionChangedListener(); mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor, mOnSubscriptionsChangedListener); mDefaultDataSubId = getDefaultDataSubscriptionId(); + if (DEBUG) { + Log.d(TAG, "Init, SubId: " + mDefaultDataSubId); + } mTelephonyManager = mTelephonyManager.createForSubscriptionId(mDefaultDataSubId); mInternetTelephonyCallback = new InternetTelephonyCallback(); mTelephonyManager.registerTelephonyCallback(mExecutor, mInternetTelephonyCallback); @@ -203,7 +211,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, if (DEBUG) { Log.d(TAG, "onStop"); } - mBroadcastDispatcher.unregisterReceiver(mWifiStateReceiver); + mBroadcastDispatcher.unregisterReceiver(mConnectionStateReceiver); mTelephonyManager.unregisterTelephonyCallback(mInternetTelephonyCallback); mSubscriptionManager.removeOnSubscriptionsChangedListener( mOnSubscriptionsChangedListener); @@ -626,13 +634,12 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, } boolean isDataStateInService() { - if (mTelephonyManager == null) { - if (DEBUG) { - Log.d(TAG, "TelephonyManager is null, can not detect mobile state."); - } - return false; - } - return mTelephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED; + final ServiceState serviceState = mTelephonyManager.getServiceState(); + NetworkRegistrationInfo regInfo = + (serviceState == null) ? null : serviceState.getNetworkRegistrationInfo( + NetworkRegistrationInfo.DOMAIN_PS, + AccessNetworkConstants.TRANSPORT_TYPE_WWAN); + return (regInfo == null) ? false : regInfo.isRegistered(); } boolean isVoiceStateInService() { @@ -793,15 +800,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, @Override public void onSubscriptionsChanged() { - mDefaultDataSubId = getDefaultDataSubscriptionId(); - if (SubscriptionManager.isUsableSubscriptionId(mDefaultDataSubId)) { - mTelephonyManager.unregisterTelephonyCallback(mInternetTelephonyCallback); - - mTelephonyManager = mTelephonyManager.createForSubscriptionId(mDefaultDataSubId); - mTelephonyManager.registerTelephonyCallback(mHandler::post, - mInternetTelephonyCallback); - mCallback.onSubscriptionsChanged(mDefaultDataSubId); - } + updateListener(); } } @@ -817,13 +816,46 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, } } - private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() { + private final BroadcastReceiver mConnectionStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - mCallback.onWifiStateReceived(context, intent); + final String action = intent.getAction(); + if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION) + || action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { + mCallback.onWifiStateReceived(context, intent); + } + + if (action.equals(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) { + if (DEBUG) { + Log.d(TAG, "ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED"); + } + updateListener(); + } } }; + private void updateListener() { + int defaultDataSubId = getDefaultDataSubscriptionId(); + if (mDefaultDataSubId == getDefaultDataSubscriptionId()) { + if (DEBUG) { + Log.d(TAG, "DDS: no change"); + } + return; + } + + mDefaultDataSubId = defaultDataSubId; + if (DEBUG) { + Log.d(TAG, "DDS: defaultDataSubId:" + mDefaultDataSubId); + } + if (SubscriptionManager.isUsableSubscriptionId(mDefaultDataSubId)) { + mTelephonyManager.unregisterTelephonyCallback(mInternetTelephonyCallback); + mTelephonyManager = mTelephonyManager.createForSubscriptionId(mDefaultDataSubId); + mTelephonyManager.registerTelephonyCallback(mHandler::post, + mInternetTelephonyCallback); + mCallback.onSubscriptionsChanged(mDefaultDataSubId); + } + } + interface InternetDialogCallback { void onRefreshCarrierInfo(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogFactory.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogFactory.kt index 85e6160e98c90..e82e89ef14c44 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogFactory.kt @@ -41,15 +41,15 @@ class InternetDialogFactory @Inject constructor( } /** Creates a [InternetDialog]. */ - fun create(aboveStatusBar: Boolean) { + fun create(aboveStatusBar: Boolean, canConfigMobileData: Boolean) { if (internetDialog != null) { if (DEBUG) { Log.d(TAG, "InternetDialog is showing, do not create it twice.") } return } else { - internetDialog = InternetDialog(context, this, internetDialogController, aboveStatusBar, - uiEventLogger, handler) + internetDialog = InternetDialog(context, this, internetDialogController, + canConfigMobileData, aboveStatusBar, uiEventLogger, handler) internetDialog?.show() } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java index 5a3d72555d767..4ca1f6004d90d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java @@ -119,6 +119,11 @@ public class AccessPointControllerImpl new UserHandle(mCurrentUser)); } + public boolean canConfigMobileData() { + return !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, + UserHandle.of(mCurrentUser)); + } + public void onUserSwitched(int newUserId) { mCurrentUser = newUserId; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 6b71f46238e49..eeea699a0b742 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -228,6 +228,7 @@ public interface NetworkController extends CallbackController, D int getIcon(WifiEntry ap); boolean connect(WifiEntry ap); boolean canConfigWifi(); + boolean canConfigMobileData(); public interface AccessPointCallback { void onAccessPointsChanged(List accessPoints); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index acbbde5fad607..52c37a9b72d37 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -793,7 +793,8 @@ public class NetworkControllerImpl extends BroadcastReceiver mReceiverHandler.post(this::handleConfigurationChanged); break; case Settings.Panel.ACTION_INTERNET_CONNECTIVITY: - mMainHandler.post(() -> mInternetDialogFactory.create(true)); + boolean canConfigMobileData = mAccessPoints.canConfigMobileData(); + mMainHandler.post(() -> mInternetDialogFactory.create(true, canConfigMobileData)); break; default: int subId = intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, 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 d394b0c9bfe25..94bd959c9585a 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 @@ -73,7 +73,7 @@ public class InternetDialogTest extends SysuiTestCase { public void setUp() { MockitoAnnotations.initMocks(this); mInternetDialog = new MockInternetDialog(mContext, mInternetDialogFactory, - mInternetDialogController, true, mUiEventLogger, mHandler); + mInternetDialogController, true, true, mUiEventLogger, mHandler); mInternetDialog.show(); doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID); when(mMockWifiManager.isWifiEnabled()).thenReturn(true); @@ -178,10 +178,10 @@ public class InternetDialogTest extends SysuiTestCase { private String mConnectedWifiSummary; MockInternetDialog(Context context, InternetDialogFactory internetDialogFactory, - InternetDialogController internetDialogController, boolean aboveStatusBar, - UiEventLogger uiEventLogger, @Main Handler handler) { - super(context, internetDialogFactory, internetDialogController, aboveStatusBar, - uiEventLogger, handler); + InternetDialogController internetDialogController, boolean canConfigMobileData, + boolean aboveStatusBar, UiEventLogger uiEventLogger, @Main Handler handler) { + super(context, internetDialogFactory, internetDialogController, canConfigMobileData, + aboveStatusBar, uiEventLogger, handler); mAdapter = mInternetAdapter; mWifiManager = mMockWifiManager; }