[Provider Model] Enforce DISALLOW_CONFIG_WIFI in Internet Panel

- Avoid the appearance of WiFi-related strings in sub-title

- Hide all of Wi-Fi related views

- Do not scan Wi-Fi result

Bug: 195669955
Test: manual test
atest -c InternetDialogControllerTest \
         InternetDialogTest

Change-Id: I5c19e6a8e52d2c9207053ffb7539d931d1f04799
This commit is contained in:
Weng Su
2021-08-10 23:27:11 +08:00
parent 99b0bd20c3
commit 018c97979c
7 changed files with 130 additions and 107 deletions

View File

@@ -122,8 +122,9 @@ public class InternetTile extends QSTileImpl<SignalState> {
@Override
protected void handleClick(@Nullable View view) {
boolean canConfigMobileData = mAccessPointController.canConfigMobileData();
mHandler.post(() -> mInternetDialogFactory.create(true, canConfigMobileData));
mHandler.post(() -> mInternetDialogFactory.create(true,
mAccessPointController.canConfigMobileData(),
mAccessPointController.canConfigWifi()));
}
@Override

View File

@@ -51,7 +51,6 @@ import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Space;
import android.widget.Switch;
import android.widget.TextView;
@@ -93,6 +92,8 @@ public class InternetDialog extends SystemUIDialog implements
protected View mDialogView;
@VisibleForTesting
protected WifiEntry mConnectedWifiEntry;
@VisibleForTesting
protected boolean mCanConfigWifi;
private InternetDialogFactory mInternetDialogFactory;
private SubscriptionManager mSubscriptionManager;
@@ -151,7 +152,8 @@ public class InternetDialog extends SystemUIDialog implements
public InternetDialog(Context context, InternetDialogFactory internetDialogFactory,
InternetDialogController internetDialogController, boolean canConfigMobileData,
boolean aboveStatusBar, UiEventLogger uiEventLogger, @Main Handler handler) {
boolean canConfigWifi, boolean aboveStatusBar, UiEventLogger uiEventLogger,
@Main Handler handler) {
super(context, R.style.Theme_SystemUI_Dialog_Internet);
if (DEBUG) {
Log.d(TAG, "Init InternetDialog");
@@ -165,6 +167,7 @@ public class InternetDialog extends SystemUIDialog implements
mTelephonyManager = mInternetDialogController.getTelephonyManager();
mWifiManager = mInternetDialogController.getWifiManager();
mCanConfigMobileData = canConfigMobileData;
mCanConfigWifi = canConfigWifi;
mLayoutManager = new LinearLayoutManager(mContext) {
@Override
@@ -247,7 +250,19 @@ public class InternetDialog extends SystemUIDialog implements
if (DEBUG) {
Log.d(TAG, "onStart");
}
mInternetDialogController.onStart(this);
mInternetDialogController.onStart(this, mCanConfigWifi);
if (!mCanConfigWifi) {
hideWifiViews();
}
}
@VisibleForTesting
void hideWifiViews() {
setProgressBarVisible(false);
mTurnWifiOnLayout.setVisibility(View.GONE);
mConnectedWifListLayout.setVisibility(View.GONE);
mWifiRecyclerView.setVisibility(View.GONE);
mSeeAllLayout.setVisibility(View.GONE);
}
@Override
@@ -286,9 +301,13 @@ public class InternetDialog extends SystemUIDialog implements
} else {
mInternetDialogSubTitle.setText(getSubtitleText());
}
showProgressBar();
setMobileDataLayout(mInternetDialogController.activeNetworkIsCellular());
if (!mCanConfigWifi) {
return;
}
showProgressBar();
final boolean isDeviceLocked = mInternetDialogController.isDeviceLocked();
final boolean isWifiEnabled = mWifiManager.isWifiEnabled();
updateWifiToggle(isWifiEnabled, isDeviceLocked);
@@ -379,8 +398,8 @@ public class InternetDialog extends SystemUIDialog implements
return;
}
mConnectedWifListLayout.setVisibility(View.VISIBLE);
mConnectedWifiTitleText.setText(mInternetDialogController.getInternetWifiTitle());
mConnectedWifiSummaryText.setText(mInternetDialogController.getInternetWifiSummary());
mConnectedWifiTitleText.setText(mConnectedWifiEntry.getTitle());
mConnectedWifiSummaryText.setText(mConnectedWifiEntry.getSummary(false));
mConnectedWifiIcon.setImageDrawable(
mInternetDialogController.getInternetWifiDrawable(mConnectedWifiEntry));
if (mInternetDialogController.isNightMode()) {

View File

@@ -139,6 +139,8 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
protected InternetTelephonyCallback mInternetTelephonyCallback;
@VisibleForTesting
protected WifiUtils.InternetIconInjector mWifiIconInjector;
@VisibleForTesting
protected boolean mCanConfigWifi;
@VisibleForTesting
KeyguardStateController mKeyguardStateController;
@@ -193,7 +195,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
mWifiIconInjector = new WifiUtils.InternetIconInjector(mContext);
}
void onStart(@NonNull InternetDialogCallback callback) {
void onStart(@NonNull InternetDialogCallback callback, boolean canConfigWifi) {
if (DEBUG) {
Log.d(TAG, "onStart");
}
@@ -217,6 +219,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
mConnectivityManager.registerNetworkCallback(new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build(), new DataConnectivityListener(), mHandler);
mCanConfigWifi = canConfigWifi;
scanWifiAccessPoints();
}
@@ -270,7 +273,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
return null;
}
if (!mWifiManager.isWifiEnabled()) {
if (mCanConfigWifi && !mWifiManager.isWifiEnabled()) {
// When the airplane mode is off and Wi-Fi is disabled.
// Sub-Title: Wi-Fi is off
if (DEBUG) {
@@ -290,10 +293,10 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
final List<ScanResult> wifiList = mWifiManager.getScanResults();
if (wifiList != null && wifiList.size() != 0) {
return mContext.getText(SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT);
return mCanConfigWifi ? mContext.getText(SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT) : null;
}
if (isProgressBarVisible) {
if (mCanConfigWifi && isProgressBarVisible) {
// When the Wi-Fi scan result callback is received
// Sub-Title: Searching for networks...
return mContext.getText(SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS);
@@ -317,7 +320,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
return mContext.getText(SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE);
}
if (!isMobileDataEnabled()) {
if (mCanConfigWifi && !isMobileDataEnabled()) {
if (DEBUG) {
Log.d(TAG, "Mobile data off");
}
@@ -331,7 +334,10 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
return mContext.getText(SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE);
}
return mContext.getText(SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE);
if (mCanConfigWifi) {
return mContext.getText(SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE);
}
return null;
}
Drawable getInternetWifiDrawable(@NonNull WifiEntry wifiEntry) {
@@ -549,26 +555,6 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
return summary;
}
String getInternetWifiTitle() {
if (getInternetWifiEntry() == null) {
if (DEBUG) {
Log.d(TAG, "connected entry is null");
}
return "";
}
return getInternetWifiEntry().getTitle();
}
String getInternetWifiSummary() {
if (getInternetWifiEntry() == null) {
if (DEBUG) {
Log.d(TAG, "connected entry is null");
}
return "";
}
return getInternetWifiEntry().getSummary(false);
}
void launchNetworkSetting() {
mCallback.dismissDialog();
mActivityStarter.postStartActivityDismissingKeyguard(getSettingsIntent(), 0);
@@ -780,12 +766,14 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
}
void scanWifiAccessPoints() {
mAccessPointController.scanForAccessPoints();
if (mCanConfigWifi) {
mAccessPointController.scanForAccessPoints();
}
}
@Override
public void onAccessPointsChanged(List<WifiEntry> accessPoints) {
if (accessPoints == null) {
if (accessPoints == null || !mCanConfigWifi) {
return;
}
@@ -869,8 +857,8 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback,
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)
|| action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
if (mCanConfigWifi && (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)
|| action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION))) {
mCallback.onWifiStateReceived(context, intent);
}

View File

@@ -31,17 +31,17 @@ private val DEBUG = Log.isLoggable(TAG, Log.DEBUG)
*/
@SysUISingleton
class InternetDialogFactory @Inject constructor(
@Main private val handler: Handler,
private val internetDialogController: InternetDialogController,
private val context: Context,
private val uiEventLogger: UiEventLogger
@Main private val handler: Handler,
private val internetDialogController: InternetDialogController,
private val context: Context,
private val uiEventLogger: UiEventLogger
) {
companion object {
var internetDialog: InternetDialog? = null
}
/** Creates a [InternetDialog]. */
fun create(aboveStatusBar: Boolean, canConfigMobileData: Boolean) {
fun create(aboveStatusBar: Boolean, canConfigMobileData: Boolean, canConfigWifi: Boolean) {
if (internetDialog != null) {
if (DEBUG) {
Log.d(TAG, "InternetDialog is showing, do not create it twice.")
@@ -49,7 +49,7 @@ class InternetDialogFactory @Inject constructor(
return
} else {
internetDialog = InternetDialog(context, this, internetDialogController,
canConfigMobileData, aboveStatusBar, uiEventLogger, handler)
canConfigMobileData, canConfigWifi, aboveStatusBar, uiEventLogger, handler)
internetDialog?.show()
}
}

View File

@@ -793,8 +793,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
mReceiverHandler.post(this::handleConfigurationChanged);
break;
case Settings.Panel.ACTION_INTERNET_CONNECTIVITY:
boolean canConfigMobileData = mAccessPoints.canConfigMobileData();
mMainHandler.post(() -> mInternetDialogFactory.create(true, canConfigMobileData));
mMainHandler.post(() -> mInternetDialogFactory.create(true,
mAccessPoints.canConfigMobileData(), mAccessPoints.canConfigWifi()));
break;
default:
int subId = intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX,

View File

@@ -10,6 +10,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -100,6 +101,7 @@ public class InternetDialogControllerTest extends SysuiTestCase {
when(mKeyguardStateController.isUnlocked()).thenReturn(true);
when(mConnectedEntry.isDefaultNetwork()).thenReturn(true);
when(mConnectedEntry.hasInternetAccess()).thenReturn(true);
when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[]{SUB_ID});
mInternetDialogController = new MockInternetDialogController(mContext,
mock(UiEventLogger.class), mock(ActivityStarter.class), mAccessPointController,
@@ -109,7 +111,7 @@ public class InternetDialogControllerTest extends SysuiTestCase {
mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor,
mInternetDialogController.mOnSubscriptionsChangedListener);
mInternetDialogController.onStart(
mock(InternetDialogController.InternetDialogCallback.class));
mock(InternetDialogController.InternetDialogCallback.class), true);
mInternetDialogController.mActivityStarter = mActivityStarter;
mInternetDialogController.mConnectedEntry = mConnectedEntry;
mInternetDialogController.mWifiIconInjector = mWifiIconInjector;
@@ -143,8 +145,14 @@ public class InternetDialogControllerTest extends SysuiTestCase {
mInternetDialogController.setAirplaneModeEnabled(false);
when(mWifiManager.isWifiEnabled()).thenReturn(false);
assertTrue(TextUtils.equals(mInternetDialogController.getSubtitleText(false),
getResourcesString("wifi_is_off")));
assertThat(mInternetDialogController.getSubtitleText(false))
.isEqualTo(getResourcesString("wifi_is_off"));
// if the Wi-Fi disallow config, then don't return Wi-Fi related string.
mInternetDialogController.mCanConfigWifi = false;
assertThat(mInternetDialogController.getSubtitleText(false))
.isNotEqualTo(getResourcesString("wifi_is_off"));
}
@Test
@@ -155,8 +163,14 @@ public class InternetDialogControllerTest extends SysuiTestCase {
doReturn(0).when(wifiScanResults).size();
when(mWifiManager.getScanResults()).thenReturn(wifiScanResults);
assertTrue(TextUtils.equals(mInternetDialogController.getSubtitleText(true),
getResourcesString("wifi_empty_list_wifi_on")));
assertThat(mInternetDialogController.getSubtitleText(true))
.isEqualTo(getResourcesString("wifi_empty_list_wifi_on"));
// if the Wi-Fi disallow config, then don't return Wi-Fi related string.
mInternetDialogController.mCanConfigWifi = false;
assertThat(mInternetDialogController.getSubtitleText(true))
.isNotEqualTo(getResourcesString("wifi_empty_list_wifi_on"));
}
@Test
@@ -167,8 +181,14 @@ public class InternetDialogControllerTest extends SysuiTestCase {
doReturn(1).when(wifiScanResults).size();
when(mWifiManager.getScanResults()).thenReturn(wifiScanResults);
assertTrue(TextUtils.equals(mInternetDialogController.getSubtitleText(false),
getResourcesString("tap_a_network_to_connect")));
assertThat(mInternetDialogController.getSubtitleText(false))
.isEqualTo(getResourcesString("tap_a_network_to_connect"));
// if the Wi-Fi disallow config, then don't return Wi-Fi related string.
mInternetDialogController.mCanConfigWifi = false;
assertThat(mInternetDialogController.getSubtitleText(false))
.isNotEqualTo(getResourcesString("tap_a_network_to_connect"));
}
@Test
@@ -188,8 +208,6 @@ public class InternetDialogControllerTest extends SysuiTestCase {
List<ScanResult> wifiScanResults = new ArrayList<>();
doReturn(wifiScanResults).when(mWifiManager).getScanResults();
when(mWifiManager.getScanResults()).thenReturn(wifiScanResults);
when(mSubscriptionManager.getActiveSubscriptionIdList())
.thenReturn(new int[] {SUB_ID});
doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mServiceState).getState();
doReturn(mServiceState).when(mTelephonyManager).getServiceState();
@@ -206,16 +224,20 @@ public class InternetDialogControllerTest extends SysuiTestCase {
List<ScanResult> wifiScanResults = new ArrayList<>();
doReturn(wifiScanResults).when(mWifiManager).getScanResults();
when(mWifiManager.getScanResults()).thenReturn(wifiScanResults);
when(mSubscriptionManager.getActiveSubscriptionIdList())
.thenReturn(new int[] {SUB_ID});
doReturn(ServiceState.STATE_IN_SERVICE).when(mServiceState).getState();
doReturn(mServiceState).when(mTelephonyManager).getServiceState();
when(mTelephonyManager.isDataEnabled()).thenReturn(false);
assertTrue(TextUtils.equals(mInternetDialogController.getSubtitleText(false),
getResourcesString("non_carrier_network_unavailable")));
assertThat(mInternetDialogController.getSubtitleText(false))
.isEqualTo(getResourcesString("non_carrier_network_unavailable"));
// if the Wi-Fi disallow config, then don't return Wi-Fi related string.
mInternetDialogController.mCanConfigWifi = false;
assertThat(mInternetDialogController.getSubtitleText(false))
.isNotEqualTo(getResourcesString("non_carrier_network_unavailable"));
}
@Test
@@ -247,36 +269,6 @@ public class InternetDialogControllerTest extends SysuiTestCase {
assertThat(mInternetDialogController.getInternetWifiEntry()).isEqualTo(mConnectedEntry);
}
@Test
public void getInternetWifiTitle_withNoConnectedWifiEntry_returnEmpty() {
mInternetDialogController.mConnectedEntry = null;
assertThat(mInternetDialogController.getInternetWifiTitle()).isEmpty();
}
@Test
public void getInternetWifiTitle_withInternetWifi_returnTitle() {
// The preconditions have been set in setUp().
// - The connected Wi-Fi entry have both default network and internet access conditions.
when(mConnectedEntry.getTitle()).thenReturn(CONNECTED_TITLE);
assertThat(mInternetDialogController.getInternetWifiTitle()).isEqualTo(CONNECTED_TITLE);
}
@Test
public void getInternetWifiSummary_withNoConnectedWifiEntry_returnEmpty() {
mInternetDialogController.mConnectedEntry = null;
assertThat(mInternetDialogController.getInternetWifiSummary()).isEmpty();
}
@Test
public void getInternetWifiSummary_withInternetWifi_returnSummary() {
when(mConnectedEntry.getSummary(false)).thenReturn(CONNECTED_SUMMARY);
assertThat(mInternetDialogController.getInternetWifiSummary()).isEqualTo(CONNECTED_SUMMARY);
}
@Test
public void getWifiDetailsSettingsIntent_withNoConnectedEntry_returnNull() {
mInternetDialogController.mConnectedEntry = null;
@@ -342,6 +334,16 @@ public class InternetDialogControllerTest extends SysuiTestCase {
assertThat(mInternetDialogController.isDeviceLocked()).isTrue();
}
@Test
public void scanWifiAccessPoints_cannotConfigWifi_doNothing() {
reset(mAccessPointController);
mInternetDialogController.mCanConfigWifi = false;
mInternetDialogController.scanWifiAccessPoints();
verify(mAccessPointController, never()).scanForAccessPoints();
}
private String getResourcesString(String name) {
return mContext.getResources().getString(getResourcesId(name));
}

View File

@@ -20,7 +20,6 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import androidx.test.filters.SmallTest;
@@ -69,6 +68,9 @@ public class InternetDialogTest extends SysuiTestCase {
private InternetDialogController mInternetDialogController;
private InternetDialog mInternetDialog;
private View mDialogView;
private View mSubTitle;
private LinearLayout mMobileDataToggle;
private LinearLayout mWifiToggle;
private LinearLayout mConnectedWifi;
private RecyclerView mWifiList;
@@ -94,15 +96,18 @@ public class InternetDialogTest extends SysuiTestCase {
when(mInternetDialogController.getWifiEntryList()).thenReturn(Arrays.asList(mWifiEntry));
mInternetDialog = new InternetDialog(mContext, mock(InternetDialogFactory.class),
mInternetDialogController, true, true, mock(UiEventLogger.class), mHandler);
mInternetDialogController, true, true, true, mock(UiEventLogger.class), mHandler);
mInternetDialog.mAdapter = mInternetAdapter;
mInternetDialog.mConnectedWifiEntry = mInternetWifiEntry;
mInternetDialog.show();
mWifiToggle = mInternetDialog.mDialogView.requireViewById(R.id.turn_on_wifi_layout);
mConnectedWifi = mInternetDialog.mDialogView.requireViewById(R.id.wifi_connected_layout);
mWifiList = mInternetDialog.mDialogView.requireViewById(R.id.wifi_list_layout);
mSeeAll = mInternetDialog.mDialogView.requireViewById(R.id.see_all_layout);
mDialogView = mInternetDialog.mDialogView;
mSubTitle = mDialogView.requireViewById(R.id.internet_dialog_subtitle);
mMobileDataToggle = mDialogView.requireViewById(R.id.mobile_network_layout);
mWifiToggle = mDialogView.requireViewById(R.id.turn_on_wifi_layout);
mConnectedWifi = mDialogView.requireViewById(R.id.wifi_connected_layout);
mWifiList = mDialogView.requireViewById(R.id.wifi_list_layout);
mSeeAll = mDialogView.requireViewById(R.id.see_all_layout);
}
@After
@@ -110,34 +115,42 @@ public class InternetDialogTest extends SysuiTestCase {
mInternetDialog.dismissDialog();
}
@Test
public void hideWifiViews_WifiViewsGone() {
mInternetDialog.hideWifiViews();
assertThat(mInternetDialog.mIsProgressBarVisible).isFalse();
assertThat(mWifiToggle.getVisibility()).isEqualTo(View.GONE);
assertThat(mConnectedWifi.getVisibility()).isEqualTo(View.GONE);
assertThat(mWifiList.getVisibility()).isEqualTo(View.GONE);
assertThat(mSeeAll.getVisibility()).isEqualTo(View.GONE);
}
@Test
public void updateDialog_withApmOn_internetDialogSubTitleGone() {
when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true);
mInternetDialog.updateDialog();
final TextView view = mInternetDialog.mDialogView.requireViewById(
R.id.internet_dialog_subtitle);
assertThat(view.getVisibility()).isEqualTo(View.GONE);
mInternetDialog.updateDialog();
assertThat(mSubTitle.getVisibility()).isEqualTo(View.GONE);
}
@Test
public void updateDialog_withApmOff_internetDialogSubTitleVisible() {
when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false);
mInternetDialog.updateDialog();
final TextView view = mInternetDialog.mDialogView.requireViewById(
R.id.internet_dialog_subtitle);
assertThat(view.getVisibility()).isEqualTo(View.VISIBLE);
mInternetDialog.updateDialog();
assertThat(mSubTitle.getVisibility()).isEqualTo(View.VISIBLE);
}
@Test
public void updateDialog_withApmOn_mobileDataLayoutGone() {
when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true);
mInternetDialog.updateDialog();
final LinearLayout linearLayout = mInternetDialog.mDialogView.requireViewById(
R.id.mobile_network_layout);
assertThat(linearLayout.getVisibility()).isEqualTo(View.GONE);
mInternetDialog.updateDialog();
assertThat(mMobileDataToggle.getVisibility()).isEqualTo(View.GONE);
}
@Test