[Wi-Fi] Support disconnect button for connected Wi-Fi AP

Connect button becomes Disconnect button if the Wi-Fi AP
is connected.

Bug: 135891885
Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=WifiDetailPreferenceController2Test
Change-Id: I0e0d485385294658170da3d37bc1cc1f8748468f
This commit is contained in:
Arc Wang
2019-12-31 16:41:14 +08:00
parent d5ec80afc5
commit 3971d4e0c4
3 changed files with 92 additions and 60 deletions

View File

@@ -18,7 +18,8 @@
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24"
android:tint="?android:attr/colorControlNormal">
<path <path
android:fillColor="#FF000000" android:fillColor="#FF000000"
android:pathData="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41z"/> android:pathData="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41z"/>

View File

@@ -78,6 +78,8 @@ import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiEntry.ConnectCallback; import com.android.wifitrackerlib.WifiEntry.ConnectCallback;
import com.android.wifitrackerlib.WifiEntry.ConnectCallback.ConnectStatus; import com.android.wifitrackerlib.WifiEntry.ConnectCallback.ConnectStatus;
import com.android.wifitrackerlib.WifiEntry.ConnectedInfo; import com.android.wifitrackerlib.WifiEntry.ConnectedInfo;
import com.android.wifitrackerlib.WifiEntry.DisconnectCallback;
import com.android.wifitrackerlib.WifiEntry.DisconnectCallback.DisconnectStatus;
import com.android.wifitrackerlib.WifiEntry.ForgetCallback; import com.android.wifitrackerlib.WifiEntry.ForgetCallback;
import com.android.wifitrackerlib.WifiEntry.ForgetCallback.ForgetStatus; import com.android.wifitrackerlib.WifiEntry.ForgetCallback.ForgetStatus;
import com.android.wifitrackerlib.WifiEntry.SignInCallback; import com.android.wifitrackerlib.WifiEntry.SignInCallback;
@@ -97,7 +99,8 @@ import java.util.stream.Collectors;
*/ */
public class WifiDetailPreferenceController2 extends AbstractPreferenceController public class WifiDetailPreferenceController2 extends AbstractPreferenceController
implements PreferenceControllerMixin, WifiDialog2Listener, LifecycleObserver, OnPause, implements PreferenceControllerMixin, WifiDialog2Listener, LifecycleObserver, OnPause,
OnResume, WifiEntryCallback, ConnectCallback, ForgetCallback, SignInCallback { OnResume, WifiEntryCallback, ConnectCallback, DisconnectCallback, ForgetCallback,
SignInCallback {
private static final String TAG = "WifiDetailsPrefCtrl2"; private static final String TAG = "WifiDetailsPrefCtrl2";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -298,17 +301,15 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
setupEntityHeader(screen); setupEntityHeader(screen);
mButtonsPref = ((ActionButtonsPreference) screen.findPreference(KEY_BUTTONS_PREF)) mButtonsPref = ((ActionButtonsPreference) screen.findPreference(KEY_BUTTONS_PREF))
.setButton1Text(!mWifiEntry.isSaved() .setButton1Text(R.string.forget)
? R.string.wifi_disconnect_button_text : R.string.forget)
.setButton1Icon(R.drawable.ic_settings_delete) .setButton1Icon(R.drawable.ic_settings_delete)
.setButton1OnClickListener(view -> forgetNetwork()) .setButton1OnClickListener(view -> forgetNetwork())
.setButton2Text(R.string.wifi_sign_in_button_text) .setButton2Text(R.string.wifi_sign_in_button_text)
.setButton2Icon(R.drawable.ic_settings_sign_in) .setButton2Icon(R.drawable.ic_settings_sign_in)
.setButton2OnClickListener(view -> signIntoNetwork()) .setButton2OnClickListener(view -> signIntoNetwork())
.setButton3Text(R.string.wifi_connect) .setButton3Text(getConnectDisconnectButtonTextResource())
.setButton3Icon(R.drawable.ic_settings_wireless) .setButton3Icon(getConnectDisconnectButtonIconResource())
.setButton3OnClickListener(view -> connectNetwork()) .setButton3OnClickListener(view -> connectDisconnectNetwork())
.setButton3Enabled(true)
.setButton4Text(R.string.share) .setButton4Text(R.string.share)
.setButton4Icon(R.drawable.ic_qrcode_24dp) .setButton4Icon(R.drawable.ic_qrcode_24dp)
.setButton4OnClickListener(view -> shareNetwork()); .setButton4OnClickListener(view -> shareNetwork());
@@ -587,29 +588,50 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
} }
private void refreshButtons() { private void refreshButtons() {
boolean canForgetNetwork = mWifiEntry.canForget(); final boolean canForgetNetwork = mWifiEntry.canForget();
boolean canSignIntoNetwork = canSignIntoNetwork(); final boolean canSignIntoNetwork = canSignIntoNetwork();
boolean showConnectButton = mWifiEntry.canConnect() final boolean canConnectDisconnectNetwork = mWifiEntry.canConnect()
|| mWifiEntry.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTING; || mWifiEntry.canDisconnect();
boolean canShareNetwork = canShareNetwork(); final boolean canShareNetwork = canShareNetwork();
mButtonsPref.setButton1Visible(canForgetNetwork); mButtonsPref.setButton1Visible(canForgetNetwork);
mButtonsPref.setButton2Visible(canSignIntoNetwork); mButtonsPref.setButton2Visible(canSignIntoNetwork);
mButtonsPref.setButton3Visible(showConnectButton); mButtonsPref.setButton3Visible(mWifiEntry.getLevel() != WifiEntry.WIFI_LEVEL_UNREACHABLE);
if (showConnectButton) { mButtonsPref.setButton3Enabled(canConnectDisconnectNetwork);
if (mWifiEntry.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTING) { mButtonsPref.setButton3Text(getConnectDisconnectButtonTextResource());
mButtonsPref.setButton3Text(R.string.wifi_connecting).setButton3Enabled(false); mButtonsPref.setButton3Icon(getConnectDisconnectButtonIconResource());
} else {
mButtonsPref.setButton3Text(R.string.wifi_connect).setButton3Enabled(true);
}
}
mButtonsPref.setButton4Visible(canShareNetwork); mButtonsPref.setButton4Visible(canShareNetwork);
mButtonsPref.setVisible(canForgetNetwork mButtonsPref.setVisible(canForgetNetwork
|| canSignIntoNetwork || canSignIntoNetwork
|| showConnectButton || canConnectDisconnectNetwork
|| canShareNetwork); || canShareNetwork);
} }
private int getConnectDisconnectButtonTextResource() {
switch (mWifiEntry.getConnectedState()) {
case WifiEntry.CONNECTED_STATE_DISCONNECTED:
return R.string.wifi_connect;
case WifiEntry.CONNECTED_STATE_CONNECTED:
return R.string.wifi_disconnect_button_text;
case WifiEntry.CONNECTED_STATE_CONNECTING:
return R.string.wifi_connecting;
default:
throw new IllegalStateException("Invalid WifiEntry connected state");
}
}
private int getConnectDisconnectButtonIconResource() {
switch (mWifiEntry.getConnectedState()) {
case WifiEntry.CONNECTED_STATE_DISCONNECTED:
case WifiEntry.CONNECTED_STATE_CONNECTING:
return R.drawable.ic_settings_wireless;
case WifiEntry.CONNECTED_STATE_CONNECTED:
return R.drawable.ic_settings_close;
default:
throw new IllegalStateException("Invalid WifiEntry connected state");
}
}
private void refreshIpLayerInfo() { private void refreshIpLayerInfo() {
// Hide IP layer info if not a connected network. // Hide IP layer info if not a connected network.
if (mWifiEntry.getConnectedState() != WifiEntry.CONNECTED_STATE_CONNECTED if (mWifiEntry.getConnectedState() != WifiEntry.CONNECTED_STATE_CONNECTED
@@ -813,8 +835,12 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
} }
@VisibleForTesting @VisibleForTesting
void connectNetwork() { void connectDisconnectNetwork() {
mWifiEntry.connect(this); if (mWifiEntry.getConnectedState() == WifiEntry.CONNECTED_STATE_DISCONNECTED) {
mWifiEntry.connect(this);
} else {
mWifiEntry.disconnect(this);
}
} }
private void refreshMacTitle() { private void refreshMacTitle() {
@@ -862,25 +888,17 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
R.string.wifi_failed_connect_message, R.string.wifi_failed_connect_message,
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
} }
mButtonsPref.setButton3Text(R.string.wifi_connect)
.setButton3Icon(R.drawable.ic_settings_wireless)
.setButton3Enabled(true)
.setButton3Visible(true);
} }
// TODO: Add disconnect button.
/** /**
* Result of the disconnect request indicated by the DISCONNECT_STATUS constants. * Result of the disconnect request indicated by the DISCONNECT_STATUS constants.
*/ */
//@Override @Override
//public void onDisconnectResult(@DisconnectStatus int status) { public void onDisconnectResult(@DisconnectStatus int status) {
// if (status != DisconnectCallback.DISCONNECT_STATUS_SUCCESS) { if (status != DisconnectCallback.DISCONNECT_STATUS_SUCCESS) {
// Log.e(TAG, "Disconnect Wi-Fi network failed"); Log.e(TAG, "Disconnect Wi-Fi network failed");
// } }
// }
// updateNetworkInfo();
// refreshPage();
//}
/** /**
* Result of the forget request indicated by the FORGET_STATUS constants. * Result of the forget request indicated by the FORGET_STATUS constants.

View File

@@ -1303,22 +1303,35 @@ public class WifiDetailPreferenceController2Test {
} }
@Test @Test
public void testConnectButton_shouldInvisibleForConnectNetwork() { public void testDisconnectButton_connectedNetwork_shouldVisible() {
setUpForConnectedNetwork(); setUpForConnectedNetwork();
when(mMockWifiEntry.getLevel()).thenReturn(WifiEntry.WIFI_LEVEL_MAX);
displayAndResume(); displayAndResume();
verify(mMockButtonsPref, times(1)).setButton3Visible(false); verify(mMockButtonsPref).setButton3Visible(true);
verify(mMockButtonsPref).setButton3Text(R.string.wifi_disconnect);
} }
@Test @Test
public void testConnectButton_shouldVisibleForDisconnectNetwork() { public void testConnectButton_disconnectedNetwork_shouldVisibleIfReachable() {
setUpForDisconnectedNetwork(); setUpForDisconnectedNetwork();
when(mMockWifiEntry.getLevel()).thenReturn(WifiEntry.WIFI_LEVEL_MAX);
displayAndResume(); displayAndResume();
verify(mMockButtonsPref, times(1)).setButton3Visible(true); verify(mMockButtonsPref).setButton3Visible(true);
verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connect); verify(mMockButtonsPref).setButton3Text(R.string.wifi_connect);
}
@Test
public void testConnectButton_disconnectedNetwork_shouldInvisibleIfUnreachable() {
setUpForDisconnectedNetwork();
when(mMockWifiEntry.getLevel()).thenReturn(WifiEntry.WIFI_LEVEL_UNREACHABLE);
displayAndResume();
verify(mMockButtonsPref).setButton3Visible(false);
} }
private void setUpForToast() { private void setUpForToast() {
@@ -1337,11 +1350,11 @@ public class WifiDetailPreferenceController2Test {
displayAndResume(); displayAndResume();
// check connect button exist // check connect button enabled
verifyConnectBtnSetUpAsVisible(inOrder); verifyConnectBtnSetUpAsEnabled(inOrder);
// click connect button // click connect button
mController.connectNetwork(); mController.connectDisconnectNetwork();
// check display button as connecting // check display button as connecting
verify(mMockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class)); verify(mMockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class));
@@ -1352,7 +1365,7 @@ public class WifiDetailPreferenceController2Test {
// check connect button invisible, be init as default state and toast success message // check connect button invisible, be init as default state and toast success message
verifyConnectBtnBeInitAsDefault(inOrder); verifyConnectBtnBeInitAsDefault(inOrder);
inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(false); inOrder.verify(mMockButtonsPref).setButton3Enabled(false);
assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo( assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
mContext.getString(R.string.wifi_connected_to_message, label)); mContext.getString(R.string.wifi_connected_to_message, label));
} }
@@ -1368,11 +1381,11 @@ public class WifiDetailPreferenceController2Test {
displayAndResume(); displayAndResume();
// check connect button exist // check connect button enabled
verifyConnectBtnSetUpAsVisible(inOrder); verifyConnectBtnSetUpAsEnabled(inOrder);
// click connect button // click connect button
mController.connectNetwork(); mController.connectDisconnectNetwork();
// check display button as connecting // check display button as connecting
verify(mMockWifiManager, times(1)).connect(anyInt(), connectListenerCaptor.capture()); verify(mMockWifiManager, times(1)).connect(anyInt(), connectListenerCaptor.capture());
@@ -1383,26 +1396,26 @@ public class WifiDetailPreferenceController2Test {
// check connect button visible, be init as default and toast failed message // check connect button visible, be init as default and toast failed message
verifyConnectBtnBeInitAsDefault(inOrder); verifyConnectBtnBeInitAsDefault(inOrder);
inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true); inOrder.verify(mMockButtonsPref).setButton3Enabled(true);
assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo( assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
mContext.getString(R.string.wifi_failed_connect_message)); mContext.getString(R.string.wifi_failed_connect_message));
} }
private void verifyConnectBtnSetUpAsVisible(InOrder inOrder) { private void verifyConnectBtnSetUpAsEnabled(InOrder inOrder) {
inOrder.verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connect); inOrder.verify(mMockButtonsPref).setButton3Text(R.string.wifi_connect);
inOrder.verify(mMockButtonsPref, times(1)).setButton3Icon(R.drawable.ic_settings_wireless); inOrder.verify(mMockButtonsPref).setButton3Icon(R.drawable.ic_settings_wireless);
inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true); inOrder.verify(mMockButtonsPref).setButton3Enabled(true);
} }
private void verifyConnectBtnSetUpAsConnecting(InOrder inOrder) { private void verifyConnectBtnSetUpAsConnecting(InOrder inOrder) {
inOrder.verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connecting); inOrder.verify(mMockButtonsPref).setButton3Text(R.string.wifi_connecting);
inOrder.verify(mMockButtonsPref, times(1)).setButton3Enabled(false); inOrder.verify(mMockButtonsPref).setButton3Enabled(false);
} }
private void verifyConnectBtnBeInitAsDefault(InOrder inOrder) { private void verifyConnectBtnBeInitAsDefault(InOrder inOrder) {
inOrder.verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connect); inOrder.verify(mMockButtonsPref).setButton3Text(R.string.wifi_connect);
inOrder.verify(mMockButtonsPref, times(1)).setButton3Icon(R.drawable.ic_settings_wireless); inOrder.verify(mMockButtonsPref).setButton3Icon(R.drawable.ic_settings_wireless);
inOrder.verify(mMockButtonsPref, times(1)).setButton3Enabled(true); inOrder.verify(mMockButtonsPref).setButton3Enabled(true);
} }
@Test @Test