From 74b18587fb676f6a44eb4da3d4503f78b8fc5023 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Sun, 27 Dec 2020 17:37:41 +0000 Subject: [PATCH] [Provider Model] Implement the carrner network selection - Add primaryAction for connecting carrier network - User toggles carrier network On/Off - Calls MergedCarrierEntry#setEnabled(true/false) - User taps on carrier network - Calls MergedCarrierEntry#connect() Bug: 175761096 Test: - Manual Test - atest ProviderModelSliceTest - atest ProviderModelSliceHelperTest - make RunSettingsRoboTests ROBOTEST_FILTER=WifiScanWorkerTest Change-Id: I07cb6c142a2f4e9cbdbab1f77afdc367728b4e3f --- .../settings/network/ProviderModelSlice.java | 16 +++++++-- .../network/ProviderModelSliceHelper.java | 10 +++--- .../settings/wifi/slice/WifiScanWorker.java | 15 ++++++++ .../wifi/slice/WifiScanWorkerTest.java | 26 ++++++++++++++ .../network/ProviderModelSliceTest.java | 36 +++++++++++++++++-- 5 files changed, 95 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/network/ProviderModelSlice.java b/src/com/android/settings/network/ProviderModelSlice.java index f6908c9e6c1..5314d7f177b 100644 --- a/src/com/android/settings/network/ProviderModelSlice.java +++ b/src/com/android/settings/network/ProviderModelSlice.java @@ -165,16 +165,28 @@ public class ProviderModelSlice extends WifiSlice { if (subscriptionManager == null) { return; } - final boolean newState = intent.getBooleanExtra(EXTRA_TOGGLE_STATE, - mHelper.isMobileDataEnabled()); final int defaultSubId = subscriptionManager.getDefaultDataSubscriptionId(); log("defaultSubId:" + defaultSubId); if (!SubscriptionManager.isUsableSubscriptionId(defaultSubId)) { return; // No subscription - do nothing. } + boolean requestConnectCarrier = !intent.hasExtra(EXTRA_TOGGLE_STATE); + // Enable the mobile data always if the user requests to connect to the carrier network. + boolean newState = requestConnectCarrier ? true + : intent.getBooleanExtra(EXTRA_TOGGLE_STATE, mHelper.isMobileDataEnabled()); MobileNetworkUtils.setMobileDataEnabled(mContext, defaultSubId, newState, false /* disableOtherSubscriptions */); + + final NetworkProviderWorker worker = getWorker(); + if (worker == null) { + return; + } + if (requestConnectCarrier) { + worker.connectCarrierNetwork(); + } else { + worker.setCarrierNetworkEnabled(newState); + } } @Override diff --git a/src/com/android/settings/network/ProviderModelSliceHelper.java b/src/com/android/settings/network/ProviderModelSliceHelper.java index 482695a8db6..de43737f02d 100644 --- a/src/com/android/settings/network/ProviderModelSliceHelper.java +++ b/src/com/android/settings/network/ProviderModelSliceHelper.java @@ -131,14 +131,16 @@ public class ProviderModelSliceHelper { e.printStackTrace(); } final IconCompat levelIcon = Utils.createIconWithDrawable(drawable); - final PendingIntent toggleAction = mSliceable.getBroadcastIntent(mContext); - final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction, + final PendingIntent rowIntent = mSliceable.getBroadcastIntent(mContext); + final SliceAction primaryAction = SliceAction.create(rowIntent, + levelIcon, ListBuilder.ICON_IMAGE, title); + final SliceAction toggleAction = SliceAction.createToggle(rowIntent, "mobile_toggle" /* actionTitle */, isMobileDataEnabled()); final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder() .setTitle(title) .setTitleItem(levelIcon, ListBuilder.ICON_IMAGE) - .addEndItem(toggleSliceAction) - .setPrimaryAction(toggleSliceAction) + .addEndItem(toggleAction) + .setPrimaryAction(primaryAction) .setSubtitle(summary); return rowBuilder; } diff --git a/src/com/android/settings/wifi/slice/WifiScanWorker.java b/src/com/android/settings/wifi/slice/WifiScanWorker.java index 6c0f4aabe2b..a87b36ac4a2 100644 --- a/src/com/android/settings/wifi/slice/WifiScanWorker.java +++ b/src/com/android/settings/wifi/slice/WifiScanWorker.java @@ -36,6 +36,7 @@ import androidx.lifecycle.LifecycleRegistry; import com.android.settings.slices.SliceBackgroundWorker; import com.android.settingslib.utils.ThreadUtils; +import com.android.wifitrackerlib.MergedCarrierEntry; import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback; import com.android.wifitrackerlib.WifiPickerTracker; @@ -199,4 +200,18 @@ public class WifiScanWorker extends SliceBackgroundWorker impleme } super.updateResults(resultList); } + + public void setCarrierNetworkEnabled(boolean enable) { + final MergedCarrierEntry mergedCarrierEntry = mWifiPickerTracker.getMergedCarrierEntry(); + if (mergedCarrierEntry != null) { + mergedCarrierEntry.setEnabled(enable); + } + } + + public void connectCarrierNetwork() { + final MergedCarrierEntry mergedCarrierEntry = mWifiPickerTracker.getMergedCarrierEntry(); + if (mergedCarrierEntry != null && mergedCarrierEntry.canConnect()) { + mergedCarrierEntry.connect(null /* ConnectCallback */); + } + } } diff --git a/tests/robotests/src/com/android/settings/wifi/slice/WifiScanWorkerTest.java b/tests/robotests/src/com/android/settings/wifi/slice/WifiScanWorkerTest.java index 395048c3c64..2a8d26538e3 100644 --- a/tests/robotests/src/com/android/settings/wifi/slice/WifiScanWorkerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/slice/WifiScanWorkerTest.java @@ -20,11 +20,14 @@ import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import androidx.lifecycle.Lifecycle; +import com.android.wifitrackerlib.MergedCarrierEntry; import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiPickerTracker; @@ -44,6 +47,8 @@ public class WifiScanWorkerTest { private WifiScanWorker mWifiScanWorker; @Mock WifiPickerTracker mWifiPickerTracker; + @Mock + MergedCarrierEntry mMergedCarrierEntry; @Before public void setUp() { @@ -51,6 +56,7 @@ public class WifiScanWorkerTest { mWifiScanWorker = new WifiScanWorker(RuntimeEnvironment.application, WIFI_SLICE_URI); mWifiScanWorker.mWifiPickerTracker = mWifiPickerTracker; + when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry); } @Test @@ -102,4 +108,24 @@ public class WifiScanWorkerTest { assertThat(mWifiScanWorker.getWifiEntry(key)).isEqualTo(reachableWifiEntry); } + + @Test + public void setCarrierNetworkEnabled_shouldCallMergedCarrierEntrySetEnabled() { + mWifiScanWorker.setCarrierNetworkEnabled(true); + + verify(mMergedCarrierEntry).setEnabled(true); + + mWifiScanWorker.setCarrierNetworkEnabled(false); + + verify(mMergedCarrierEntry).setEnabled(false); + } + + @Test + public void connectCarrierNetwork_shouldCallMergedCarrierEntryConnect() { + when(mMergedCarrierEntry.canConnect()).thenReturn(true); + + mWifiScanWorker.connectCarrierNetwork(); + + verify(mMergedCarrierEntry).connect(any()); + } } diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java index 9c16b8a9c1f..f9450dbf8bd 100644 --- a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java +++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java @@ -16,6 +16,8 @@ package com.android.settings.network; +import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -113,13 +115,14 @@ public class ProviderModelSliceTest { // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); - mMockNetworkProviderWorker = new MockNetworkProviderWorker(mContext, - PROVIDER_MODEL_SLICE_URI); + mMockNetworkProviderWorker = spy(new MockNetworkProviderWorker(mContext, + PROVIDER_MODEL_SLICE_URI)); mMockProviderModelSlice = new MockProviderModelSlice(mContext, mMockNetworkProviderWorker); mListBuilder = spy(new ListBuilder(mContext, PROVIDER_MODEL_SLICE_URI, ListBuilder.INFINITY).setAccentColor(-1)); when(mProviderModelSliceHelper.createListBuilder(PROVIDER_MODEL_SLICE_URI)).thenReturn( mListBuilder); + when(mProviderModelSliceHelper.getSubscriptionManager()).thenReturn(mSubscriptionManager); mWifiList = new ArrayList<>(); mMockNetworkProviderWorker.updateSelfResults(mWifiList); @@ -330,4 +333,33 @@ public class ProviderModelSliceTest { return mNetworkProviderWorker; } } + + @Test + public void onNotifyChange_intentToggleActionOn_shouldSetCarrierNetworkEnabledTrue() { + Intent intent = mMockProviderModelSlice.getBroadcastIntent(mContext).getIntent(); + intent.putExtra(EXTRA_TOGGLE_STATE, true); + + mMockProviderModelSlice.onNotifyChange(intent); + + verify(mMockNetworkProviderWorker).setCarrierNetworkEnabled(true); + } + + @Test + public void onNotifyChange_intentToggleActionOff_shouldSetCarrierNetworkEnabledFalse() { + Intent intent = mMockProviderModelSlice.getBroadcastIntent(mContext).getIntent(); + intent.putExtra(EXTRA_TOGGLE_STATE, false); + + mMockProviderModelSlice.onNotifyChange(intent); + + verify(mMockNetworkProviderWorker).setCarrierNetworkEnabled(false); + } + + @Test + public void onNotifyChange_intentPrimaryAction_shouldConnectCarrierNetwork() { + Intent intent = mMockProviderModelSlice.getBroadcastIntent(mContext).getIntent(); + + mMockProviderModelSlice.onNotifyChange(intent); + + verify(mMockNetworkProviderWorker).connectCarrierNetwork(); + } }