Fix Wi-Fi hotspot switch UI issue

- The Wi-Fi hotspot switch only handles the click event from the UI.

- Use the onSwitchChanged callback to handle click and swipe events.

Bug: 218891956
Test: manual test
make RunSettingsRoboTests \
  ROBOTEST_FILTER=WifiTetherSwitchBarControllerTest

Change-Id: Ie4136443845489be295a8ee0f3058f493a3b5829
This commit is contained in:
Weng Su
2022-03-24 20:09:29 +08:00
parent a12da0a8e8
commit b844a7a920
2 changed files with 18 additions and 20 deletions

View File

@@ -26,7 +26,6 @@ import android.net.ConnectivityManager;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.view.View;
import android.widget.Switch; import android.widget.Switch;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -36,12 +35,13 @@ import com.android.settings.widget.SettingsMainSwitchBar;
import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop; import com.android.settingslib.core.lifecycle.events.OnStop;
import com.android.settingslib.widget.OnMainSwitchChangeListener;
/** /**
* Controller for logic pertaining to switch Wi-Fi tethering. * Controller for logic pertaining to switch Wi-Fi tethering.
*/ */
public class WifiTetherSwitchBarController implements public class WifiTetherSwitchBarController implements
LifecycleObserver, OnStart, OnStop, DataSaverBackend.Listener, View.OnClickListener { LifecycleObserver, OnStart, OnStop, DataSaverBackend.Listener, OnMainSwitchChangeListener {
private static final IntentFilter WIFI_INTENT_FILTER; private static final IntentFilter WIFI_INTENT_FILTER;
private final Context mContext; private final Context mContext;
@@ -82,7 +82,7 @@ public class WifiTetherSwitchBarController implements
@Override @Override
public void onStart() { public void onStart() {
mDataSaverBackend.addListener(this); mDataSaverBackend.addListener(this);
mSwitch.setOnClickListener(this); mSwitchBar.addOnSwitchChangeListener(this);
mContext.registerReceiver(mReceiver, WIFI_INTENT_FILTER, mContext.registerReceiver(mReceiver, WIFI_INTENT_FILTER,
Context.RECEIVER_EXPORTED_UNAUDITED); Context.RECEIVER_EXPORTED_UNAUDITED);
} }
@@ -94,8 +94,8 @@ public class WifiTetherSwitchBarController implements
} }
@Override @Override
public void onClick(View v) { public void onSwitchChanged(Switch switchView, boolean isChecked) {
if (((Switch) v).isChecked()) { if (isChecked) {
startTether(); startTether();
} else { } else {
stopTether(); stopTether();

View File

@@ -16,15 +16,14 @@
package com.android.settings.wifi.tether; package com.android.settings.wifi.tether;
import static android.net.ConnectivityManager.TETHERING_WIFI;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -52,6 +51,8 @@ public class WifiTetherSwitchBarControllerTest {
private ConnectivityManager mConnectivityManager; private ConnectivityManager mConnectivityManager;
@Mock @Mock
private NetworkPolicyManager mNetworkPolicyManager; private NetworkPolicyManager mNetworkPolicyManager;
@Mock
private Switch mSwitch;
private Context mContext; private Context mContext;
private SettingsMainSwitchBar mSwitchBar; private SettingsMainSwitchBar mSwitchBar;
@@ -99,23 +100,20 @@ public class WifiTetherSwitchBarControllerTest {
} }
@Test @Test
public void onSwitchToggled_switchOff_noStartTethering() { public void onSwitchChanged_isChecked_startTethering() {
final Switch mockSwitch = mock(Switch.class); when(mSwitch.isChecked()).thenReturn(true);
when(mockSwitch.isChecked()).thenReturn(false);
mController.onClick(mockSwitch); mController.onSwitchChanged(mSwitch, mSwitch.isChecked());
verify(mConnectivityManager, never()).startTethering(anyInt(), anyBoolean(), any(), any()); verify(mConnectivityManager).startTethering(eq(TETHERING_WIFI), anyBoolean(), any(), any());
} }
@Test @Test
public void onSwitchToggled_switchOn_startTethering() { public void onSwitchChanged_isNotChecked_stopTethering() {
final Switch mockSwitch = mock(Switch.class); when(mSwitch.isChecked()).thenReturn(false);
when(mockSwitch.isChecked()).thenReturn(true);
mController.onClick(mockSwitch); mController.onSwitchChanged(mSwitch, mSwitch.isChecked());
verify(mConnectivityManager, times(1)) verify(mConnectivityManager).stopTethering(TETHERING_WIFI);
.startTethering(anyInt(), anyBoolean(), any(), any());
} }
} }