Merge "Improve UX of Wi-Fi QR code scanner enrollee flow"

This commit is contained in:
TreeHugger Robot
2019-02-26 05:48:56 +00:00
committed by Android (Google) Code Review
7 changed files with 135 additions and 26 deletions

View File

@@ -19,12 +19,14 @@ package com.android.settings.wifi;
import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Intent;
import android.net.wifi.WifiConfiguration;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.VisibleForTesting;
@@ -40,7 +42,10 @@ public class AddNetworkFragment extends InstrumentedFragment implements WifiConf
final static int SUBMIT_BUTTON_ID = android.R.id.button1;
@VisibleForTesting
final static int CANCEL_BUTTON_ID = android.R.id.button2;
final static int SCANNER_BUTTON_ID = R.id.ssid_scanner_button;
final static int SSID_SCANNER_BUTTON_ID = R.id.ssid_scanner_button;
final static int PASSWORD_SCANNER_BUTTON_ID = R.id.password_scanner_button;
private static final int REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER = 0;
private WifiConfigController mUIController;
private Button mSubmitBtn;
@@ -68,10 +73,12 @@ public class AddNetworkFragment extends InstrumentedFragment implements WifiConf
mSubmitBtn = rootView.findViewById(SUBMIT_BUTTON_ID);
mCancelBtn = rootView.findViewById(CANCEL_BUTTON_ID);
final ImageButton scannerButton = rootView.findViewById(SCANNER_BUTTON_ID);
final ImageButton ssidScannerButton = rootView.findViewById(SSID_SCANNER_BUTTON_ID);
final ImageButton passwordScannerButton = rootView.findViewById(PASSWORD_SCANNER_BUTTON_ID);
mSubmitBtn.setOnClickListener(this);
mCancelBtn.setOnClickListener(this);
scannerButton.setOnClickListener(this);
ssidScannerButton.setOnClickListener(this);
passwordScannerButton.setOnClickListener(this);
mUIController = new WifiConfigController(this, rootView, null, getMode());
return rootView;
@@ -85,6 +92,8 @@ public class AddNetworkFragment extends InstrumentedFragment implements WifiConf
@Override
public void onClick(View view) {
String ssid = null;
switch (view.getId()) {
case SUBMIT_BUTTON_ID:
handleSubmitAction();
@@ -92,14 +101,33 @@ public class AddNetworkFragment extends InstrumentedFragment implements WifiConf
case CANCEL_BUTTON_ID:
handleCancelAction();
break;
case SCANNER_BUTTON_ID:
case SSID_SCANNER_BUTTON_ID:
final TextView ssidEditText = getView().findViewById(R.id.ssid);
ssid = ssidEditText.getText().toString();
// No break and flows to case PASSWORD_SCANNER_BUTTON_ID
case PASSWORD_SCANNER_BUTTON_ID:
// Launch QR code scanner to join a network.
getContext().startActivity(
WifiDppUtils.getEnrolleeQrCodeScannerIntent(/* ssid */ null));
startActivityForResult(WifiDppUtils.getEnrolleeQrCodeScannerIntent(ssid),
REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER);
break;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER) {
if (resultCode != Activity.RESULT_OK) {
return;
}
final WifiConfiguration config = data.getParcelableExtra(
WifiDialogActivity.KEY_WIFI_CONFIGURATION);
successfullyFinish(config);
}
}
@Override
public int getMode() {
return WifiConfigUiBase.MODE_CONNECT;
@@ -158,9 +186,13 @@ public class AddNetworkFragment extends InstrumentedFragment implements WifiConf
@VisibleForTesting
void handleSubmitAction() {
successfullyFinish(mUIController.getConfig());
}
private void successfullyFinish(WifiConfiguration config) {
final Intent intent = new Intent();
final Activity activity = getActivity();
intent.putExtra(WIFI_CONFIG_KEY, mUIController.getConfig());
intent.putExtra(WIFI_CONFIG_KEY, config);
activity.setResult(Activity.RESULT_OK, intent);
activity.finish();
}

View File

@@ -18,15 +18,16 @@ package com.android.settings.wifi;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import com.android.settings.R;
import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.wifi.AccessPoint;
@@ -40,6 +41,9 @@ public class WifiDialog extends AlertDialog implements WifiConfigUiBase,
default void onSubmit(WifiDialog dialog) {
}
default void onScan(WifiDialog dialog, String ssid) {
}
}
private static final int BUTTON_SUBMIT = DialogInterface.BUTTON_POSITIVE;
@@ -80,18 +84,6 @@ public class WifiDialog extends AlertDialog implements WifiConfigUiBase,
@Override
protected void onCreate(Bundle savedInstanceState) {
mView = getLayoutInflater().inflate(R.layout.wifi_dialog, /* root */ null);
final ImageButton scannerButton = mView.findViewById(R.id.password_scanner_button);
if (scannerButton != null) {
scannerButton.setOnClickListener((View v) -> {
String ssid = null;
if (mAccessPoint != null) {
ssid = mAccessPoint.getSsidStr();
}
// Launch QR code scanner to join a network.
getContext().startActivity(
WifiDppUtils.getEnrolleeQrCodeScannerIntent(ssid));
});
}
setView(mView);
mController = new WifiConfigController(this, mView, mAccessPoint, mMode);
super.onCreate(savedInstanceState);
@@ -109,6 +101,35 @@ public class WifiDialog extends AlertDialog implements WifiConfigUiBase,
}
}
@Override
protected void onStart() {
View.OnClickListener onClickScannerButtonListener = v -> {
if (mListener == null) {
return;
}
String ssid = null;
if (mAccessPoint == null) {
final TextView ssidEditText = findViewById(R.id.ssid);
ssid = ssidEditText.getText().toString();
} else {
ssid = mAccessPoint.getSsidStr();
}
mListener.onScan(/* WifiDialog */ this, ssid);
};
final ImageButton ssidScannerButton = findViewById(R.id.ssid_scanner_button);
ssidScannerButton.setOnClickListener(onClickScannerButtonListener);
final ImageButton passwordScannerButton = findViewById(R.id.password_scanner_button);
passwordScannerButton.setOnClickListener(onClickScannerButtonListener);
if (mHideSubmitButton) {
ssidScannerButton.setVisibility(View.GONE);
passwordScannerButton.setVisibility(View.GONE);
}
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mController.updatePassword();

View File

@@ -29,6 +29,7 @@ import android.util.Log;
import androidx.annotation.VisibleForTesting;
import com.android.settings.SetupWizardUtils;
import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settingslib.wifi.AccessPoint;
import com.google.android.setupcompat.util.WizardManagerHelper;
@@ -49,10 +50,13 @@ public class WifiDialogActivity extends Activity implements WifiDialog.WifiDialo
@VisibleForTesting
static final String KEY_CONNECT_FOR_CALLER = "connect_for_caller";
private static final String KEY_WIFI_CONFIGURATION = "wifi_configuration";
public static final String KEY_WIFI_CONFIGURATION = "wifi_configuration";
private static final int RESULT_CONNECTED = RESULT_FIRST_USER;
private static final int RESULT_FORGET = RESULT_FIRST_USER + 1;
private static final int REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER = 0;
private WifiDialog mDialog;
@Override
@@ -162,4 +166,25 @@ public class WifiDialogActivity extends Activity implements WifiDialog.WifiDialo
mDialog = null;
finish();
}
@Override
public void onScan(WifiDialog dialog, String ssid) {
// Launch QR code scanner to join a network.
startActivityForResult(WifiDppUtils.getEnrolleeQrCodeScannerIntent(ssid),
REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER) {
if (resultCode != RESULT_OK) {
return;
}
setResult(RESULT_CONNECTED, data);
finish();
}
}
}

View File

@@ -117,6 +117,8 @@ public class WifiSettings extends RestrictedSettingsFragment
private static final String PREF_KEY_SAVED_NETWORKS = "saved_networks";
private static final String PREF_KEY_STATUS_MESSAGE = "wifi_status_message";
private static final int REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER = 0;
private static boolean isVerboseLoggingEnabled() {
return WifiTracker.sVerboseLogging || Log.isLoggable(TAG, Log.VERBOSE);
}
@@ -427,10 +429,17 @@ public class WifiSettings extends RestrictedSettingsFragment
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Only handle request comes from AddNetworkFragment
if (requestCode == ADD_NETWORK_REQUEST) {
handleAddNetworkRequest(resultCode, data);
return;
} else if (requestCode == REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER) {
if (resultCode == Activity.RESULT_OK) {
if (mDialog != null) {
mDialog.dismiss();
}
mWifiTracker.resumeScanning();
}
return;
}
final boolean formerlyRestricted = mIsRestricted;
@@ -1065,6 +1074,13 @@ public class WifiSettings extends RestrictedSettingsFragment
}
}
@Override
public void onScan(WifiDialog dialog, String ssid) {
// Launch QR code scanner to join a network.
startActivityForResult(WifiDppUtils.getEnrolleeQrCodeScannerIntent(ssid),
REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER);
}
/* package */ void submit(WifiConfigController configController) {
final WifiConfiguration config = configController.getConfig();

View File

@@ -31,7 +31,6 @@ import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.util.Size;
@@ -48,6 +47,7 @@ import android.widget.TextView;
import androidx.lifecycle.ViewModelProviders;
import com.android.settings.R;
import com.android.settings.wifi.WifiDialogActivity;
import com.android.settings.wifi.qrcode.QrCamera;
import com.android.settings.wifi.qrcode.QrDecorateView;
@@ -77,6 +77,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
// Key for Bundle usage
private static final String KEY_IS_CONFIGURATOR_MODE = "key_is_configurator_mode";
private static final String KEY_LATEST_ERROR_CODE = "key_latest_error_code";
private static final String KEY_WIFI_CONFIGURATION = "key_wifi_configuration";
private ProgressBar mProgressBar;
private QrCamera mCamera;
@@ -93,6 +94,9 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
/** QR code data scanned by camera */
private WifiQrCode mWifiQrCode;
/** The WifiConfiguration connecting for enrollee usage */
private WifiConfiguration mWifiConfiguration;
private int mLatestStatusCode = WifiDppUtils.EASY_CONNECT_EVENT_FAILURE_NONE;
@Override
@@ -102,6 +106,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
if (savedInstanceState != null) {
mIsConfiguratorMode = savedInstanceState.getBoolean(KEY_IS_CONFIGURATOR_MODE);
mLatestStatusCode = savedInstanceState.getInt(KEY_LATEST_ERROR_CODE);
mWifiConfiguration = savedInstanceState.getParcelable(KEY_WIFI_CONFIGURATION);
}
final WifiDppInitiatorViewModel model =
@@ -417,6 +422,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
mErrorMessage.setVisibility(View.INVISIBLE);
final WifiNetworkConfig wifiNetworkConfig = (WifiNetworkConfig)msg.obj;
mWifiConfiguration = wifiNetworkConfig.getWifiConfigurationOrNull();
wifiNetworkConfig.connect(getContext(),
/* listener */ WifiDppQrCodeScannerFragment.this);
break;
@@ -431,6 +437,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
public void onSaveInstanceState(Bundle outState) {
outState.putBoolean(KEY_IS_CONFIGURATOR_MODE, mIsConfiguratorMode);
outState.putInt(KEY_LATEST_ERROR_CODE, mLatestStatusCode);
outState.putParcelable(KEY_WIFI_CONFIGURATION, mWifiConfiguration);
super.onSaveInstanceState(outState);
}
@@ -446,6 +453,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
for (WifiConfiguration wifiConfig : wifiConfigs) {
if (wifiConfig.networkId == newNetworkId) {
mLatestStatusCode = WifiDppUtils.EASY_CONNECT_EVENT_SUCCESS;
mWifiConfiguration = wifiConfig;
wifiManager.connect(wifiConfig, WifiDppQrCodeScannerFragment.this);
return;
}
@@ -539,9 +547,11 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
@Override
public void onSuccess() {
startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
final Intent resultIntent = new Intent();
resultIntent.putExtra(WifiDialogActivity.KEY_WIFI_CONFIGURATION, mWifiConfiguration);
final Activity hostActivity = getActivity();
hostActivity.setResult(Activity.RESULT_OK);
hostActivity.setResult(Activity.RESULT_OK, resultIntent);
hostActivity.finish();
}

View File

@@ -95,6 +95,11 @@ public class WifiDppUtils {
/**
* Returns an intent to launch QR code scanner for Wi-Fi DPP enrollee.
*
* After enrollee success, the callee activity will return connecting WifiConfiguration by
* putExtra {@code WifiDialogActivity.KEY_WIFI_CONFIGURATION} for
* {@code Activity#setResult(int resultCode, Intent data)}. The calling object should check
* if it's available before using it.
*
* @param ssid The data corresponding to {@code WifiConfiguration} SSID
* @return Intent for launching QR code scanner
*/

View File

@@ -228,7 +228,7 @@ public class WifiNetworkConfig {
/**
* This is a simplified method from {@code WifiConfigController.getConfig()}
*/
private WifiConfiguration getWifiConfigurationOrNull() {
WifiConfiguration getWifiConfigurationOrNull() {
if (!isValidConfig(this)) {
return null;
}