diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java index 61006156d8aad..56454e975370c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java @@ -20,10 +20,13 @@ import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_ import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.getMaxNetworkSelectionDisableReason; import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration.NetworkSelectionStatus; import android.net.wifi.WifiInfo; +import android.os.Bundle; import android.os.SystemClock; import androidx.annotation.VisibleForTesting; @@ -36,6 +39,23 @@ public class WifiUtils { private static final int INVALID_RSSI = -127; + /** + * The intent action shows network details settings to allow configuration of Wi-Fi. + *

+ * In some cases, a matching Activity may not exist, so ensure you + * safeguard against this. + *

+ * Input: The calling package should put the chosen + * com.android.wifitrackerlib.WifiEntry#getKey() to a string extra in the request bundle into + * the {@link #KEY_CHOSEN_WIFIENTRY_KEY}. + *

+ * Output: Nothing. + */ + public static final String ACTION_WIFI_DETAILS_SETTINGS = + "android.settings.WIFI_DETAILS_SETTINGS"; + public static final String KEY_CHOSEN_WIFIENTRY_KEY = "key_chosen_wifientry_key"; + public static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":settings:show_fragment_args"; + static final int[] WIFI_PIE = { com.android.internal.R.drawable.ic_wifi_signal_0, com.android.internal.R.drawable.ic_wifi_signal_1, @@ -275,7 +295,42 @@ public class WifiUtils { return noInternet ? NO_INTERNET_WIFI_PIE[level] : WIFI_PIE[level]; } + /** + * Wrapper the {@link #getInternetIconResource} for testing compatibility. + */ + public static class InternetIconInjector { + + protected final Context mContext; + + public InternetIconInjector(Context context) { + mContext = context; + } + + /** + * Returns the Internet icon for a given RSSI level. + * + * @param noInternet True if a connected Wi-Fi network cannot access the Internet + * @param level The number of bars to show (0-4) + */ + public Drawable getIcon(boolean noInternet, int level) { + return mContext.getDrawable(WifiUtils.getInternetIconResource(level, noInternet)); + } + } + public static boolean isMeteredOverridden(WifiConfiguration config) { return config.meteredOverride != WifiConfiguration.METERED_OVERRIDE_NONE; } + + /** + * Returns the Intent for Wi-Fi network details settings. + * + * @param key The Wi-Fi entry key + */ + public static Intent getWifiDetailsSettingsIntent(String key) { + final Intent intent = new Intent(ACTION_WIFI_DETAILS_SETTINGS); + final Bundle bundle = new Bundle(); + bundle.putString(KEY_CHOSEN_WIFIENTRY_KEY, key); + intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, bundle); + return intent; + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java index 89960cba2bf5b..7c2b904fc5769 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java @@ -20,9 +20,12 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.any; import static org.mockito.Mockito.doReturn; +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.Intent; import android.net.NetworkKey; import android.net.RssiCurve; import android.net.ScoredNetwork; @@ -36,6 +39,8 @@ import android.os.SystemClock; import android.text.format.DateUtils; import android.util.ArraySet; +import androidx.test.core.app.ApplicationProvider; + import com.android.settingslib.R; import org.junit.Before; @@ -44,7 +49,6 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; import java.util.Set; @@ -69,7 +73,7 @@ public class WifiUtilsTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; + mContext = spy(ApplicationProvider.getApplicationContext()); } @Test @@ -148,6 +152,32 @@ public class WifiUtilsTest { assertThat(WifiUtils.isMeteredOverridden(mWifiConfig)).isTrue(); } + @Test + public void getWifiDetailsSettingsIntent_returnsCorrectValues() { + final String key = "test_key"; + + final Intent intent = WifiUtils.getWifiDetailsSettingsIntent(key); + + assertThat(intent.getAction()).isEqualTo(WifiUtils.ACTION_WIFI_DETAILS_SETTINGS); + final Bundle bundle = intent.getBundleExtra(WifiUtils.EXTRA_SHOW_FRAGMENT_ARGUMENTS); + assertThat(bundle.getString(WifiUtils.KEY_CHOSEN_WIFIENTRY_KEY)).isEqualTo(key); + } + + @Test + public void testInternetIconInjector_getIcon_returnsCorrectValues() { + WifiUtils.InternetIconInjector iconInjector = new WifiUtils.InternetIconInjector(mContext); + + for (int level = 0; level <= 4; level++) { + iconInjector.getIcon(false /* noInternet */, level); + verify(mContext).getDrawable( + WifiUtils.getInternetIconResource(level, false /* noInternet */)); + + iconInjector.getIcon(true /* noInternet */, level); + verify(mContext).getDrawable( + WifiUtils.getInternetIconResource(level, true /* noInternet */)); + } + } + private static ArrayList buildScanResultCache() { ArrayList scanResults = new ArrayList<>(); for (int i = 0; i < 5; i++) { diff --git a/packages/SystemUI/res/layout/internet_connectivity_dialog.xml b/packages/SystemUI/res/layout/internet_connectivity_dialog.xml index 6163af09fa6b0..7f22b71832a3d 100644 --- a/packages/SystemUI/res/layout/internet_connectivity_dialog.xml +++ b/packages/SystemUI/res/layout/internet_connectivity_dialog.xml @@ -58,6 +58,15 @@ android:layout_height="1dp" android:background="?android:attr/listDivider"/> + + - - { 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..ce1c2fd08a4d9 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 @@ -55,6 +55,10 @@ import android.widget.Space; import android.widget.Switch; import android.widget.TextView; +import androidx.annotation.VisibleForTesting; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; import com.android.settingslib.Utils; @@ -67,10 +71,6 @@ import com.android.wifitrackerlib.WifiEntry; import java.util.List; -import androidx.annotation.VisibleForTesting; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - /** * Dialog for showing mobile network, connected Wi-Fi network and Wi-Fi networks. */ @@ -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 @@ -298,9 +300,7 @@ public class InternetDialog extends SystemUIDialog implements isChecked, false); } }); - mConnectedWifListLayout.setOnClickListener(v -> { - // TODO(b/191475923): Need to launch the detailed page of Wi-Fi entry. - }); + mConnectedWifListLayout.setOnClickListener(v -> onClickConnectedWifi()); mSeeAllLayout.setOnClickListener(v -> onClickSeeMoreButton()); mWiFiToggle.setOnCheckedChangeListener( (buttonView, isChecked) -> { @@ -319,8 +319,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 +336,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); } } @@ -354,6 +361,10 @@ public class InternetDialog extends SystemUIDialog implements mConnectedWifListLayout.setBackground(mBackgroundOn); } + void onClickConnectedWifi() { + mInternetDialogController.launchWifiNetworkDetailsSetting(); + } + void onClickSeeMoreButton() { mInternetDialogController.launchNetworkSetting(); } 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..edab33aa6aff5 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; @@ -48,6 +50,10 @@ import android.util.Log; import android.view.Gravity; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + import com.android.internal.logging.UiEventLogger; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; @@ -56,6 +62,7 @@ import com.android.settingslib.Utils; import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.mobile.MobileMappings; import com.android.settingslib.net.SignalStrengthUtil; +import com.android.settingslib.wifi.WifiUtils; import com.android.systemui.R; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Main; @@ -78,10 +85,6 @@ import java.util.stream.Stream; import javax.inject.Inject; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; - public class InternetDialogController implements WifiEntry.DisconnectCallback, NetworkController.AccessPointController.AccessPointCallback { @@ -104,7 +107,6 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, private WifiManager mWifiManager; private Context mContext; - private ActivityStarter mActivityStarter; private SubscriptionManager mSubscriptionManager; private TelephonyManager mTelephonyManager; private ConnectivityManager mConnectivityManager; @@ -115,16 +117,19 @@ 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; private UiEventLogger mUiEventLogger; private BroadcastDispatcher mBroadcastDispatcher; private KeyguardUpdateMonitor mKeyguardUpdateMonitor; private GlobalSettings mGlobalSettings; private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + @VisibleForTesting + protected ActivityStarter mActivityStarter; + @VisibleForTesting + protected WifiEntry mConnectedEntry; @VisibleForTesting protected SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangedListener; @VisibleForTesting @@ -168,8 +173,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 +190,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 +214,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); @@ -226,6 +237,17 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, return new Intent(ACTION_NETWORK_PROVIDER_SETTINGS).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } + protected Intent getWifiDetailsSettingsIntent() { + String key = mConnectedEntry == null ? null : mConnectedEntry.getKey(); + if (TextUtils.isEmpty(key)) { + if (DEBUG) { + Log.d(TAG, "connected entry's key is empty"); + } + return null; + } + return WifiUtils.getWifiDetailsSettingsIntent(key); + } + CharSequence getDialogTitleText() { if (isAirplaneModeEnabled()) { return mContext.getText(R.string.airplane_mode); @@ -533,6 +555,14 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mActivityStarter.postStartActivityDismissingKeyguard(getSettingsIntent(), 0); } + void launchWifiNetworkDetailsSetting() { + Intent intent = getWifiDetailsSettingsIntent(); + if (intent != null) { + mCallback.dismissDialog(); + mActivityStarter.postStartActivityDismissingKeyguard(intent, 0); + } + } + void connectCarrierNetwork() { final MergedCarrierEntry mergedCarrierEntry = mAccessPointController.getMergedCarrierEntry(); @@ -626,13 +656,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 +822,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 +838,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 075fa174067cb..8bb545b394f93 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -801,7 +801,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/InternetDialogControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java index 83e4d00b3a8f5..facb19fae95a4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java @@ -3,11 +3,16 @@ package com.android.systemui.qs.tiles.dialog; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.Intent; import android.net.ConnectivityManager; import android.net.wifi.ScanResult; import android.net.wifi.WifiInfo; @@ -20,6 +25,9 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.text.TextUtils; +import androidx.annotation.Nullable; +import androidx.test.filters.SmallTest; + import com.android.internal.logging.UiEventLogger; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; @@ -33,9 +41,6 @@ import com.android.systemui.util.settings.GlobalSettings; import com.android.systemui.util.time.FakeSystemClock; import com.android.wifitrackerlib.WifiEntry; -import androidx.annotation.Nullable; -import androidx.test.filters.SmallTest; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -68,13 +73,15 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Mock private Handler mHandler; @Mock + private ActivityStarter mActivityStarter; + @Mock private GlobalSettings mGlobalSettings; @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Mock private NetworkController.AccessPointController mAccessPointController; @Mock - private WifiEntry mWifiEntryConnected = mock(WifiEntry.class); + private WifiEntry mConnectedEntry; @Mock private WifiInfo mWifiInfo; @Mock @@ -94,6 +101,8 @@ public class InternetDialogControllerTest extends SysuiTestCase { mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor, mInternetDialogController.mOnSubscriptionsChangedListener); mInternetDialogController.onStart(mCallback); + mInternetDialogController.mActivityStarter = mActivityStarter; + mInternetDialogController.mConnectedEntry = mConnectedEntry; } @Test @@ -188,7 +197,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getConnectedWifiTitle_withNoConnectedEntry_returnNull() { - mInternetDialogController.setConnectedWifiEntry(null); + mInternetDialogController.mConnectedEntry = null; assertTrue(TextUtils.equals(mInternetDialogController.getConnectedWifiTitle(), "")); @@ -196,8 +205,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getConnectedWifiTitle_withConnectedEntry_returnTitle() { - mInternetDialogController.setConnectedWifiEntry(mWifiEntryConnected); - when(mWifiEntryConnected.getTitle()).thenReturn(CONNECTED_TITLE); + when(mConnectedEntry.getTitle()).thenReturn(CONNECTED_TITLE); assertTrue(TextUtils.equals(mInternetDialogController.getConnectedWifiTitle(), CONNECTED_TITLE)); @@ -205,7 +213,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getConnectedWifiSummary_withNoConnectedEntry_returnNull() { - mInternetDialogController.setConnectedWifiEntry(null); + mInternetDialogController.mConnectedEntry = null; assertTrue(TextUtils.equals(mInternetDialogController.getConnectedWifiSummary(), "")); @@ -213,13 +221,52 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Test public void getConnectedWifiSummary_withConnectedEntry_returnSummary() { - mInternetDialogController.setConnectedWifiEntry(mWifiEntryConnected); - when(mWifiEntryConnected.getSummary(false)).thenReturn(CONNECTED_SUMMARY); + when(mConnectedEntry.getSummary(false)).thenReturn(CONNECTED_SUMMARY); assertTrue(TextUtils.equals(mInternetDialogController.getConnectedWifiSummary(), CONNECTED_SUMMARY)); } + @Test + public void getWifiDetailsSettingsIntent_withNoConnectedEntry_returnNull() { + mInternetDialogController.mConnectedEntry = null; + + assertThat(mInternetDialogController.getWifiDetailsSettingsIntent()).isNull(); + } + + @Test + public void getWifiDetailsSettingsIntent_withNoConnectedEntryKey_returnNull() { + when(mConnectedEntry.getKey()).thenReturn(null); + + assertThat(mInternetDialogController.getWifiDetailsSettingsIntent()).isNull(); + } + + @Test + public void getWifiDetailsSettingsIntent_withConnectedEntryKey_returnIntent() { + when(mConnectedEntry.getKey()).thenReturn("test_key"); + + assertThat(mInternetDialogController.getWifiDetailsSettingsIntent()).isNotNull(); + } + + @Test + public void launchWifiNetworkDetailsSetting_withNoConnectedEntry_doNothing() { + mInternetDialogController.mConnectedEntry = null; + + mInternetDialogController.launchWifiNetworkDetailsSetting(); + + verify(mActivityStarter, never()) + .postStartActivityDismissingKeyguard(any(Intent.class), anyInt()); + } + + @Test + public void launchWifiNetworkDetailsSetting_withConnectedEntryKey_startActivity() { + when(mConnectedEntry.getKey()).thenReturn("test_key"); + + mInternetDialogController.launchWifiNetworkDetailsSetting(); + + verify(mActivityStarter).postStartActivityDismissingKeyguard(any(Intent.class), anyInt()); + } + private String getResourcesString(String name) { return mContext.getResources().getString(getResourcesId(name)); } @@ -231,7 +278,6 @@ public class InternetDialogControllerTest extends SysuiTestCase { private class MockInternetDialogController extends InternetDialogController { - private WifiEntry mConnectedEntry; private GlobalSettings mGlobalSettings; private boolean mIsAirplaneModeOn; @@ -256,14 +302,5 @@ public class InternetDialogControllerTest extends SysuiTestCase { public void setAirplaneModeEnabled(boolean enabled) { mIsAirplaneModeOn = enabled; } - - @Override - WifiEntry getConnectedWifiEntry() { - return mConnectedEntry; - } - - public void setConnectedWifiEntry(WifiEntry connectedEntry) { - mConnectedEntry = connectedEntry; - } } } 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; }