diff --git a/src/com/android/settings/wifi/AddNetworkFragment.java b/src/com/android/settings/wifi/AddNetworkFragment.java index 656f8efe6a4..b93a1973959 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,14 +96,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; @@ -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 7d5f3b30f4f..fbea824a00d 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 c32bcf3d0c6..35de66e265d 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 4ca9f8680c0..27c495ed3db 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 c88313b84e8..9af559a6b4f 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 24cd1d75a63..6c991cffdbe 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 979e602bf4a..6135cba190e 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; }