Merge "Improve UX of Wi-Fi QR code scanner enrollee flow"
This commit is contained in:
committed by
Android (Google) Code Review
commit
9d741c4f47
@@ -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();
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
*/
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user