[Provider Model] Carrie Wi-Fi offload toggle request (panel)

- Do not set Carrier Network together when setting Mobile Data, if
carrner network provision enabled.

Bug: 182324921
Test: manual test
atest -c ProviderModelSliceTest
make RunSettingsRoboTests ROBOTEST_FILTER=WifiScanWorkerTest

Change-Id: Ic8b77fd7b43372f077ba1c8be8fd9a7c3bcff197
This commit is contained in:
Weng Su
2021-04-20 22:27:44 +08:00
parent aeb6200bfe
commit a320fb12a1
4 changed files with 46 additions and 62 deletions

View File

@@ -182,18 +182,18 @@ public class ProviderModelSlice extends WifiSlice {
final boolean isDataEnabled = final boolean isDataEnabled =
isToggleAction ? newState : MobileNetworkUtils.isMobileDataEnabled(mContext); isToggleAction ? newState : MobileNetworkUtils.isMobileDataEnabled(mContext);
doCarrierNetworkAction(isToggleAction, isDataEnabled); doCarrierNetworkAction(isToggleAction, isDataEnabled, defaultSubId);
} }
@VisibleForTesting @VisibleForTesting
void doCarrierNetworkAction(boolean isToggleAction, boolean isDataEnabled) { void doCarrierNetworkAction(boolean isToggleAction, boolean isDataEnabled, int subId) {
final NetworkProviderWorker worker = getWorker(); final NetworkProviderWorker worker = getWorker();
if (worker == null) { if (worker == null) {
return; return;
} }
if (isToggleAction) { if (isToggleAction) {
worker.setCarrierNetworkEnabled(isDataEnabled); worker.setCarrierNetworkEnabledIfNeeded(isDataEnabled, subId);
return; return;
} }

View File

@@ -21,10 +21,6 @@ import static com.android.settings.wifi.slice.WifiSlice.DEFAULT_EXPANDED_ROW_COU
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.HandlerThread;
import android.os.Process;
import android.os.SimpleClock;
import android.os.SystemClock;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -32,16 +28,12 @@ import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry; import androidx.lifecycle.LifecycleRegistry;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.slices.SliceBackgroundWorker; import com.android.settings.slices.SliceBackgroundWorker;
import com.android.settingslib.utils.ThreadUtils; import com.android.settings.wifi.WifiPickerTrackerHelper;
import com.android.wifitrackerlib.MergedCarrierEntry;
import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback; import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback;
import com.android.wifitrackerlib.WifiPickerTracker; import com.android.wifitrackerlib.WifiPickerTracker;
import java.time.Clock;
import java.time.ZoneOffset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -53,40 +45,19 @@ public class WifiScanWorker extends SliceBackgroundWorker<WifiSliceItem> impleme
private static final String TAG = "WifiScanWorker"; private static final String TAG = "WifiScanWorker";
// Max age of tracked WifiEntries.
private static final long MAX_SCAN_AGE_MILLIS = 15_000;
// Interval between initiating WifiPickerTracker scans.
private static final long SCAN_INTERVAL_MILLIS = 10_000;
@VisibleForTesting @VisibleForTesting
final LifecycleRegistry mLifecycleRegistry; final LifecycleRegistry mLifecycleRegistry;
@VisibleForTesting @VisibleForTesting
protected WifiPickerTracker mWifiPickerTracker; protected WifiPickerTracker mWifiPickerTracker;
// Worker thread used for WifiPickerTracker work protected WifiPickerTrackerHelper mWifiPickerTrackerHelper;
private final HandlerThread mWorkerThread;
public WifiScanWorker(Context context, Uri uri) { public WifiScanWorker(Context context, Uri uri) {
super(context, uri); super(context, uri);
mLifecycleRegistry = new LifecycleRegistry(this); mLifecycleRegistry = new LifecycleRegistry(this);
mWorkerThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND); mWifiPickerTrackerHelper = new WifiPickerTrackerHelper(mLifecycleRegistry, context, this);
mWorkerThread.start(); mWifiPickerTracker = mWifiPickerTrackerHelper.getWifiPickerTracker();
final Clock elapsedRealtimeClock = new SimpleClock(ZoneOffset.UTC) {
@Override
public long millis() {
return SystemClock.elapsedRealtime();
}
};
mWifiPickerTracker = FeatureFactory.getFactory(context)
.getWifiTrackerLibProvider()
.createWifiPickerTracker(getLifecycle(), context,
ThreadUtils.getUiThreadHandler(),
mWorkerThread.getThreadHandler(),
elapsedRealtimeClock,
MAX_SCAN_AGE_MILLIS,
SCAN_INTERVAL_MILLIS,
this);
mLifecycleRegistry.markState(Lifecycle.State.INITIALIZED); mLifecycleRegistry.markState(Lifecycle.State.INITIALIZED);
mLifecycleRegistry.markState(Lifecycle.State.CREATED); mLifecycleRegistry.markState(Lifecycle.State.CREATED);
@@ -108,7 +79,6 @@ public class WifiScanWorker extends SliceBackgroundWorker<WifiSliceItem> impleme
@Override @Override
public void close() { public void close() {
mLifecycleRegistry.markState(Lifecycle.State.DESTROYED); mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);
mWorkerThread.quit();
} }
@Override @Override
@@ -199,17 +169,15 @@ public class WifiScanWorker extends SliceBackgroundWorker<WifiSliceItem> impleme
super.updateResults(resultList); super.updateResults(resultList);
} }
public void setCarrierNetworkEnabled(boolean enable) { /** Enables/disables the carrier network if the carrier network provision disabled */
final MergedCarrierEntry mergedCarrierEntry = mWifiPickerTracker.getMergedCarrierEntry(); public void setCarrierNetworkEnabledIfNeeded(boolean enabled, int subId) {
if (mergedCarrierEntry != null) { if (!mWifiPickerTrackerHelper.isCarrierNetworkProvisionEnabled(subId)) {
mergedCarrierEntry.setEnabled(enable); mWifiPickerTrackerHelper.setCarrierNetworkEnabled(enabled);
} }
} }
/** Connect to the carrier network */
public void connectCarrierNetwork() { public void connectCarrierNetwork() {
final MergedCarrierEntry mergedCarrierEntry = mWifiPickerTracker.getMergedCarrierEntry(); mWifiPickerTrackerHelper.connectCarrierNetwork(null /* ConnectCallback */);
if (mergedCarrierEntry != null && mergedCarrierEntry.canConnect()) {
mergedCarrierEntry.connect(null /* ConnectCallback */);
}
} }
} }

View File

@@ -22,12 +22,13 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle;
import com.android.wifitrackerlib.MergedCarrierEntry; import com.android.settings.wifi.WifiPickerTrackerHelper;
import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker; import com.android.wifitrackerlib.WifiPickerTracker;
@@ -44,11 +45,13 @@ import java.util.Arrays;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class WifiScanWorkerTest { public class WifiScanWorkerTest {
private static final int SUB_ID = 2;
private WifiScanWorker mWifiScanWorker; private WifiScanWorker mWifiScanWorker;
@Mock @Mock
WifiPickerTracker mWifiPickerTracker; WifiPickerTracker mWifiPickerTracker;
@Mock @Mock
MergedCarrierEntry mMergedCarrierEntry; WifiPickerTrackerHelper mWifiPickerTrackerHelper;
@Before @Before
public void setUp() { public void setUp() {
@@ -56,7 +59,8 @@ public class WifiScanWorkerTest {
mWifiScanWorker = new WifiScanWorker(RuntimeEnvironment.application, WIFI_SLICE_URI); mWifiScanWorker = new WifiScanWorker(RuntimeEnvironment.application, WIFI_SLICE_URI);
mWifiScanWorker.mWifiPickerTracker = mWifiPickerTracker; mWifiScanWorker.mWifiPickerTracker = mWifiPickerTracker;
when(mWifiPickerTracker.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry); mWifiScanWorker.mWifiPickerTrackerHelper = mWifiPickerTrackerHelper;
when(mWifiPickerTrackerHelper.isCarrierNetworkProvisionEnabled(SUB_ID)).thenReturn(false);
} }
@Test @Test
@@ -110,22 +114,33 @@ public class WifiScanWorkerTest {
} }
@Test @Test
public void setCarrierNetworkEnabled_shouldCallMergedCarrierEntrySetEnabled() { public void setCarrierNetworkEnabledIfNeeded_shouldSetCarrierNetworkEnabled() {
mWifiScanWorker.setCarrierNetworkEnabled(true); mWifiScanWorker.setCarrierNetworkEnabledIfNeeded(true, SUB_ID);
verify(mMergedCarrierEntry).setEnabled(true); verify(mWifiPickerTrackerHelper).setCarrierNetworkEnabled(true);
mWifiScanWorker.setCarrierNetworkEnabled(false); mWifiScanWorker.setCarrierNetworkEnabledIfNeeded(false, SUB_ID);
verify(mMergedCarrierEntry).setEnabled(false); verify(mWifiPickerTrackerHelper).setCarrierNetworkEnabled(false);
} }
@Test @Test
public void connectCarrierNetwork_shouldCallMergedCarrierEntryConnect() { public void setCarrierNetworkEnabledIfNeeded_enabledProvision_neverSetCarrierNetworkEnabled() {
when(mMergedCarrierEntry.canConnect()).thenReturn(true); when(mWifiPickerTrackerHelper.isCarrierNetworkProvisionEnabled(SUB_ID)).thenReturn(true);
mWifiScanWorker.setCarrierNetworkEnabledIfNeeded(true, SUB_ID);
verify(mWifiPickerTrackerHelper, never()).setCarrierNetworkEnabled(true);
mWifiScanWorker.setCarrierNetworkEnabledIfNeeded(false, SUB_ID);
verify(mWifiPickerTrackerHelper, never()).setCarrierNetworkEnabled(false);
}
@Test
public void connectCarrierNetwork_shouldConnectCarrierNetwork() {
mWifiScanWorker.connectCarrierNetwork(); mWifiScanWorker.connectCarrierNetwork();
verify(mMergedCarrierEntry).connect(any()); verify(mWifiPickerTrackerHelper).connectCarrierNetwork(any());
} }
} }

View File

@@ -70,6 +70,7 @@ public class ProviderModelSliceTest {
private static final Uri PROVIDER_MODEL_SLICE_URI = private static final Uri PROVIDER_MODEL_SLICE_URI =
Uri.parse("content://com.android.settings.slices/action/provider_model"); Uri.parse("content://com.android.settings.slices/action/provider_model");
private static final int MOCK_SLICE_LEVEL = 3; private static final int MOCK_SLICE_LEVEL = 3;
private static final int SUB_ID = 2;
private Context mContext; private Context mContext;
private MockProviderModelSlice mMockProviderModelSlice; private MockProviderModelSlice mMockProviderModelSlice;
@@ -359,23 +360,23 @@ public class ProviderModelSliceTest {
@Test @Test
public void doCarrierNetworkAction_toggleActionSetDataEnabled_setCarrierNetworkEnabledTrue() { public void doCarrierNetworkAction_toggleActionSetDataEnabled_setCarrierNetworkEnabledTrue() {
mMockProviderModelSlice.doCarrierNetworkAction(true /* isToggleAction */, mMockProviderModelSlice.doCarrierNetworkAction(true /* isToggleAction */,
true /* isDataEnabled */); true /* isDataEnabled */, SUB_ID);
verify(mMockNetworkProviderWorker).setCarrierNetworkEnabled(true); verify(mMockNetworkProviderWorker).setCarrierNetworkEnabledIfNeeded(true, SUB_ID);
} }
@Test @Test
public void doCarrierNetworkAction_toggleActionSetDataDisabled_setCarrierNetworkEnabledFalse() { public void doCarrierNetworkAction_toggleActionSetDataDisabled_setCarrierNetworkEnabledFalse() {
mMockProviderModelSlice.doCarrierNetworkAction(true /* isToggleAction */, mMockProviderModelSlice.doCarrierNetworkAction(true /* isToggleAction */,
false /* isDataEnabled */); false /* isDataEnabled */, SUB_ID);
verify(mMockNetworkProviderWorker).setCarrierNetworkEnabled(false); verify(mMockNetworkProviderWorker).setCarrierNetworkEnabledIfNeeded(false, SUB_ID);
} }
@Test @Test
public void doCarrierNetworkAction_primaryActionAndDataEnabled_connectCarrierNetwork() { public void doCarrierNetworkAction_primaryActionAndDataEnabled_connectCarrierNetwork() {
mMockProviderModelSlice.doCarrierNetworkAction(false /* isToggleAction */, mMockProviderModelSlice.doCarrierNetworkAction(false /* isToggleAction */,
true /* isDataEnabled */); true /* isDataEnabled */, SUB_ID);
verify(mMockNetworkProviderWorker).connectCarrierNetwork(); verify(mMockNetworkProviderWorker).connectCarrierNetwork();
} }
@@ -383,7 +384,7 @@ public class ProviderModelSliceTest {
@Test @Test
public void doCarrierNetworkAction_primaryActionAndDataDisabled_notConnectCarrierNetwork() { public void doCarrierNetworkAction_primaryActionAndDataDisabled_notConnectCarrierNetwork() {
mMockProviderModelSlice.doCarrierNetworkAction(false /* isToggleAction */, mMockProviderModelSlice.doCarrierNetworkAction(false /* isToggleAction */,
false /* isDataEnabled */); false /* isDataEnabled */, SUB_ID);
verify(mMockNetworkProviderWorker, never()).connectCarrierNetwork(); verify(mMockNetworkProviderWorker, never()).connectCarrierNetwork();
} }