From 13f37337ed84082f7c2a2b49bdcc361a6ec13f3c Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Thu, 21 Feb 2019 19:41:23 +0800 Subject: [PATCH] Improve UX of Wi-Fi QR code scanner enrollee flow 1. Do not start WifiSettings after enrollee success 2. Return WifiConfiguration to the calling object after enrollee success 3. In WifiDialog, do not show scan button if Save button is not visible to users 4. Fix scanner button may not respond problem by setting listener for scanner button of ssid field and password field 5. If SSID is assigned, only allow to enrollee for the network of assigned SSID Bug: 124416152 Test: manual test Change-Id: Ic5241c4767eaa8ea01782817d8302d8b0572ab36 --- .../android/settings/wifi/AddNetworkFragment.java | 46 +++++++++++++++++---- src/com/android/settings/wifi/WifiDialog.java | 47 ++++++++++++++++------ .../android/settings/wifi/WifiDialogActivity.java | 27 ++++++++++++- src/com/android/settings/wifi/WifiSettings.java | 18 ++++++++- .../wifi/dpp/WifiDppQrCodeScannerFragment.java | 16 ++++++-- .../android/settings/wifi/dpp/WifiDppUtils.java | 5 +++ .../settings/wifi/dpp/WifiNetworkConfig.java | 2 +- 7 files changed, 135 insertions(+), 26 deletions(-) diff --git a/src/com/android/settings/wifi/AddNetworkFragment.java b/src/com/android/settings/wifi/AddNetworkFragment.java index 656f8efe6a..b93a197395 100644 --- a/src/com/android/settings/wifi/AddNetworkFragment.java +++ b/src/com/android/settings/wifi/AddNetworkFragment.java @@ -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; @@ -63,10 +68,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; @@ -80,6 +87,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(); @@ -87,15 +96,34 @@ 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; } @@ -153,9 +181,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(); } diff --git a/src/com/android/settings/wifi/WifiDialog.java b/src/com/android/settings/wifi/WifiDialog.java index 7d5f3b30f4..fbea824a00 100644 --- a/src/com/android/settings/wifi/WifiDialog.java +++ b/src/com/android/settings/wifi/WifiDialog.java @@ -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(); diff --git a/src/com/android/settings/wifi/WifiDialogActivity.java b/src/com/android/settings/wifi/WifiDialogActivity.java index c32bcf3d0c..35de66e265 100644 --- a/src/com/android/settings/wifi/WifiDialogActivity.java +++ b/src/com/android/settings/wifi/WifiDialogActivity.java @@ -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(); + } + } } diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index 4ca9f8680c..27c495ed3d 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -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(); diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java index c88313b84e..9af559a6b4 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java +++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java @@ -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; @@ -47,6 +46,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; @@ -76,6 +76,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 QrCamera mCamera; private TextureView mTextureView; @@ -91,6 +92,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 @@ -100,6 +104,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 = @@ -410,6 +415,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; @@ -424,6 +430,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); } @@ -439,6 +446,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; } @@ -530,9 +538,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(); } diff --git a/src/com/android/settings/wifi/dpp/WifiDppUtils.java b/src/com/android/settings/wifi/dpp/WifiDppUtils.java index 24cd1d75a6..6c991cffdb 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppUtils.java +++ b/src/com/android/settings/wifi/dpp/WifiDppUtils.java @@ -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 */ diff --git a/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java b/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java index 979e602bf4..6135cba190 100644 --- a/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java +++ b/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java @@ -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; } -- 2.11.0