[Wi-Fi] Support WiFi detail page for OpenRoaming feature in AOSP setting.

Issue: Openroaming should have a specific detail page.
Solution: Apply the mock design to only reserve two preference items:
          1.Auto-connect
          2.Scription details

Bug: 146669261
Test: Add unit test case to test the new controller: WifiSubscriptionDetailPreferenceController2
Change-Id: Iba96500062f412f4cdcd1c8248544657770ab231
This commit is contained in:
govenliu
2020-02-19 22:22:47 +08:00
parent 9ab1bd2587
commit 824796d3b2
9 changed files with 198 additions and 14 deletions

View File

@@ -2029,6 +2029,8 @@
<string name="wifi_ip_settings">IP settings</string>
<!-- Label for the spinner to show Wifi MAC randomization [CHAR LIMIT=25] -->
<string name="wifi_privacy_settings">Privacy</string>
<!-- Label for the subscription detail preference. [CHAR LIMIT=32] -->
<string name="wifi_subscription_detail">Subscription details</string>
<!-- Summary for Wifi MAC randomization option when it is ephemeral network [CHAR LIMIT=50] -->
<string name="wifi_privacy_settings_ephemeral_summary">Randomized MAC</string>
<!-- Title for the fragment to add a device into the wifi network [CHAR LIMIT=50] -->

View File

@@ -138,4 +138,10 @@
android:selectable="false"
settings:enableCopying="true"/>
</PreferenceCategory>
<Preference
android:key="subscription_detail"
android:title="@string/wifi_subscription_detail"
settings:allowDividerAbove="true"/>
</PreferenceScreen>

View File

@@ -51,11 +51,11 @@ public class AddDevicePreferenceController2 extends BasePreferenceController {
@Override
public int getAvailabilityStatus() {
if (WifiDppUtils.isSupportConfiguratorQrCodeScanner(mContext, mWifiEntry)) {
return AVAILABLE;
} else {
if (!WifiDppUtils.isSupportConfiguratorQrCodeScanner(mContext, mWifiEntry)
|| mWifiEntry.canManageSubscription()) {
return CONDITIONALLY_UNAVAILABLE;
}
return AVAILABLE;
}
@Override

View File

@@ -145,6 +145,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
static final String KEY_IPV6_CATEGORY = "ipv6_category";
@VisibleForTesting
static final String KEY_IPV6_ADDRESSES_PREF = "ipv6_addresses";
static final String KEY_IP_DETAILS_CATEGORY = "ip_details_category";
private final WifiEntry mWifiEntry;
private final ConnectivityManager mConnectivityManager;
@@ -164,6 +165,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
private ActionButtonsPreference mButtonsPref;
private EntityHeaderController mEntityHeaderController;
private Preference mSignalStrengthPref;
private PreferenceCategory mIpDetailsCategory;
private Preference mTxLinkSpeedPref;
private Preference mRxLinkSpeedPref;
private Preference mFrequencyPref;
@@ -194,7 +196,9 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
mLinkProperties = lp;
refreshEntityHeader();
refreshButtons();
refreshIpLayerInfo();
if (!mWifiEntry.canManageSubscription()) {
refreshIpLayerInfo();
}
}
}
@@ -234,7 +238,9 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
}
mNetworkCapabilities = nc;
refreshButtons();
refreshIpLayerInfo();
if (!mWifiEntry.canManageSubscription()) {
refreshIpLayerInfo();
}
}
}
@@ -329,6 +335,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
updateCaptivePortalButton();
mSignalStrengthPref = screen.findPreference(KEY_SIGNAL_STRENGTH_PREF);
mIpDetailsCategory = screen.findPreference(KEY_IP_DETAILS_CATEGORY);
mTxLinkSpeedPref = screen.findPreference(KEY_TX_LINK_SPEED);
mRxLinkSpeedPref = screen.findPreference(KEY_RX_LINK_SPEED);
mFrequencyPref = screen.findPreference(KEY_FREQUENCY_PREF);
@@ -344,6 +351,13 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
mIpv6Category = screen.findPreference(KEY_IPV6_CATEGORY);
mIpv6AddressPref = screen.findPreference(KEY_IPV6_ADDRESSES_PREF);
if (mWifiEntry.canManageSubscription()) {
mIpDetailsCategory.setVisible(false);
mIpv6Category.setVisible(false);
mSignalStrengthPref.setVisible(false);
mFrequencyPref.setVisible(false);
mSecurityPref.setVisible(false);
}
mSecurityPref.setSummary(mWifiEntry.getSecurityString(false /* concise */));
}
@@ -491,10 +505,16 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
// refresh header
refreshEntityHeader();
refreshEntityHeaderIcon();
// refresh Buttons
refreshButtons();
// When support manage subscription, there won't have any detail information, so don't
// need to update those detail UIs.
if (mWifiEntry.canManageSubscription()) {
return;
}
// Update Connection Header icon and Signal Strength Preference
refreshRssiViews();
// Frequency Pref
@@ -511,7 +531,11 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
refreshMacAddress();
}
private void refreshRssiViews() {
private void refreshEntityHeaderIcon() {
if (mEntityHeaderController == null) {
return;
}
int signalLevel = mWifiEntry.getLevel();
// Disappears signal view if not in range. e.g. for saved networks.
@@ -526,13 +550,23 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
}
mRssiSignalLevel = signalLevel;
Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel);
mEntityHeaderController
.setIcon(redrawIconForHeader(wifiIcon)).done(mFragment.getActivity(),
true /* rebind */);
}
if (mEntityHeaderController != null) {
mEntityHeaderController
.setIcon(redrawIconForHeader(wifiIcon)).done(mFragment.getActivity(),
true /* rebind */);
private void refreshRssiViews() {
int signalLevel = mWifiEntry.getLevel();
// Disappears signal view if not in range. e.g. for saved networks.
if (signalLevel == WifiEntry.WIFI_LEVEL_UNREACHABLE) {
mSignalStrengthPref.setVisible(false);
mRssiSignalLevel = -1;
return;
}
mRssiSignalLevel = signalLevel;
Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel);
Drawable wifiIconDark = wifiIcon.getConstantState().newDrawable().mutate();
wifiIconDark.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorControlNormal));
mSignalStrengthPref.setIcon(wifiIconDark);

View File

@@ -55,7 +55,7 @@ public class WifiMeteredPreferenceController2 extends BasePreferenceController i
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
return mWifiEntry.canManageSubscription() ? CONDITIONALLY_UNAVAILABLE : AVAILABLE;
}
@Override

View File

@@ -115,6 +115,10 @@ public class WifiNetworkDetailsFragment2 extends DashboardFragment implements
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (mNetworkDetailsTracker.getWifiEntry().canManageSubscription()) {
return;
}
MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.wifi_modify);
item.setIcon(com.android.internal.R.drawable.ic_mode_edit);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
@@ -174,6 +178,12 @@ public class WifiNetworkDetailsFragment2 extends DashboardFragment implements
privacyController2.setWifiEntry(wifiEntry);
controllers.add(privacyController2);
final WifiSubscriptionDetailPreferenceController2
wifiSubscriptionDetailPreferenceController2 =
new WifiSubscriptionDetailPreferenceController2(context);
wifiSubscriptionDetailPreferenceController2.setWifiEntry(wifiEntry);
controllers.add(wifiSubscriptionDetailPreferenceController2);
// Sets callback listener for wifi dialog.
mWifiDialogListeners.add(mWifiDetailPreferenceController2);
mWifiDialogListeners.add(privacyController2);

View File

@@ -55,8 +55,11 @@ public class WifiPrivacyPreferenceController2 extends BasePreferenceController i
@Override
public int getAvailabilityStatus() {
return mWifiManager.isConnectedMacRandomizationSupported()
? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
if (!mWifiManager.isConnectedMacRandomizationSupported()
|| mWifiEntry.canManageSubscription()) {
return CONDITIONALLY_UNAVAILABLE;
}
return AVAILABLE;
}
@Override

View File

@@ -0,0 +1,60 @@
/*
* Copyright (C) 2020 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.details2;
import android.content.Context;
import androidx.preference.Preference;
import com.android.settings.core.BasePreferenceController;
import com.android.wifitrackerlib.WifiEntry;
/**
* {@link BasePreferenceController} that controls show the subscription detail preference item.
* or not
*/
public class WifiSubscriptionDetailPreferenceController2 extends BasePreferenceController {
private static final String KEY_WIFI_SUBSCRIPTION_DETAIL = "subscription_detail";
private WifiEntry mWifiEntry;
public WifiSubscriptionDetailPreferenceController2(Context context) {
super(context, KEY_WIFI_SUBSCRIPTION_DETAIL);
}
public void setWifiEntry(WifiEntry wifiEntry) {
mWifiEntry = wifiEntry;
}
@Override
public int getAvailabilityStatus() {
if (mWifiEntry.canManageSubscription()) {
return AVAILABLE;
}
return CONDITIONALLY_UNAVAILABLE;
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (KEY_WIFI_SUBSCRIPTION_DETAIL.equals(preference.getKey())) {
mWifiEntry.manageSubscription();
return true; /* click is handled */
}
return false; /* click is not handled */
}
}

View File

@@ -0,0 +1,69 @@
/*
* Copyright (C) 2020 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.details2;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
import com.android.wifitrackerlib.WifiEntry;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class)
public class WifiSubscriptionDetailPreferenceController2Test {
@Mock
private WifiEntry mMockWifiEntry;
private WifiSubscriptionDetailPreferenceController2 mPreferenceController;
private Context mContext;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
mMockWifiEntry = mock(WifiEntry.class);
WifiSubscriptionDetailPreferenceController2 preferenceController =
new WifiSubscriptionDetailPreferenceController2(mContext);
preferenceController.setWifiEntry(mMockWifiEntry);
mPreferenceController = spy(preferenceController);
}
@Test
public void testUpdateState_canSetPrivacy_shouldBeSelectable() {
when(mMockWifiEntry.canManageSubscription()).thenReturn(true);
assertThat(mPreferenceController.isAvailable()).isTrue();
}
@Test
public void testUpdateState_canNotSetPrivacy_shouldNotSelectable() {
when(mMockWifiEntry.canManageSubscription()).thenReturn(false);
assertThat(mPreferenceController.isAvailable()).isFalse();
}
}