diff --git a/res/values/strings.xml b/res/values/strings.xml index 4f5c140a432..80b6afd77cb 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2029,6 +2029,8 @@ IP settings Privacy + + Subscription details Randomized MAC diff --git a/res/xml/wifi_network_details_fragment2.xml b/res/xml/wifi_network_details_fragment2.xml index 3058678c036..156b744bdc5 100644 --- a/res/xml/wifi_network_details_fragment2.xml +++ b/res/xml/wifi_network_details_fragment2.xml @@ -138,4 +138,10 @@ android:selectable="false" settings:enableCopying="true"/> + + + diff --git a/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java b/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java index 3a50107c052..f1c24c3998b 100644 --- a/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java +++ b/src/com/android/settings/wifi/details2/AddDevicePreferenceController2.java @@ -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 diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java index 803b828fcb2..c12f8d39119 100644 --- a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java +++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java @@ -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); diff --git a/src/com/android/settings/wifi/details2/WifiMeteredPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiMeteredPreferenceController2.java index b4909e2ccb1..df205a3cc6f 100644 --- a/src/com/android/settings/wifi/details2/WifiMeteredPreferenceController2.java +++ b/src/com/android/settings/wifi/details2/WifiMeteredPreferenceController2.java @@ -55,7 +55,7 @@ public class WifiMeteredPreferenceController2 extends BasePreferenceController i @Override public int getAvailabilityStatus() { - return AVAILABLE; + return mWifiEntry.canManageSubscription() ? CONDITIONALLY_UNAVAILABLE : AVAILABLE; } @Override diff --git a/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java b/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java index d07d6d6b3de..a11cadf8e1c 100644 --- a/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java +++ b/src/com/android/settings/wifi/details2/WifiNetworkDetailsFragment2.java @@ -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); diff --git a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java index b87b05df1dc..479848c68e0 100644 --- a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java +++ b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java @@ -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 diff --git a/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2.java new file mode 100644 index 00000000000..7c9332784f7 --- /dev/null +++ b/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2.java @@ -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 */ + } +} diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2Test.java new file mode 100644 index 00000000000..18a5b861913 --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/details2/WifiSubscriptionDetailPreferenceController2Test.java @@ -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(); + } +}