From a7d51370c83962b02294c8a816eabd59243eff36 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Wed, 9 Jan 2019 11:54:38 +0800 Subject: [PATCH 1/2] Implement Wi-Fi DPP flow 1. Wi-Fi DPP hanshake fail UI 2. Show Wi-Fi DPP QR code information field on WifiDppAddDeviceFragment if it's available. 3. Click 'Choose Different Network' button will show WifiDppChooseSavedWifiNetworkFragment 4. After QR code scanner scans success, WifiDppConfiguratorActivity caches WifiQrCode instead of just a QR code string Bug: 122429170 Test: manual test Change-Id: I1ce1b014ff86903b5a7a8f3575cc98eb1079583c --- res/values/strings.xml | 6 +++ .../wifi/dpp/WifiDppAddDeviceFragment.java | 48 +++++++++++++++++-- .../wifi/dpp/WifiDppConfiguratorActivity.java | 28 +++++------ .../wifi/dpp/WifiDppEnrolleeActivity.java | 5 +- .../dpp/WifiDppQrCodeScannerFragment.java | 38 +++++++-------- .../android/settings/wifi/dpp/WifiQrCode.java | 12 +---- .../dpp/WifiDppConfiguratorActivityTest.java | 8 ++++ 7 files changed, 92 insertions(+), 53 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 88fe4eb6a53..aec18854521 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2104,6 +2104,12 @@ Add another device Choose different network + + Couldn\u2019t add device + + Device found + + Retry Share with other device users diff --git a/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java b/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java index 9264ad91d1a..0821ec074c2 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java +++ b/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java @@ -21,6 +21,7 @@ import android.app.Activity; import android.content.Context; import android.net.wifi.WifiManager; import android.os.Bundle; +import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -55,6 +56,7 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment { // Update success UI. mTitle.setText(R.string.wifi_dpp_wifi_shared_with_device); mSummary.setVisibility(View.INVISIBLE); + mChooseDifferentNetwork.setVisibility(View.INVISIBLE); mButtonLeft.setText(R.string.wifi_dpp_add_another_device); mButtonLeft.setOnClickListener(v -> getFragmentManager().popBackStack()); mButtonRight.setText(R.string.done); @@ -63,8 +65,13 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment { @Override public void onFailure(int code) { - //TODO(b/122429170): Show DPP configuration error state UI Log.d(TAG, "DppStatusCallback.onFailure " + code); + + // Update fail UI. + mTitle.setText(R.string.wifi_dpp_could_not_add_device); + mSummary.setVisibility(View.INVISIBLE); + mChooseDifferentNetwork.setVisibility(View.INVISIBLE); + mButtonRight.setText(R.string.retry); } @Override @@ -99,6 +106,15 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment { public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + final WifiQrCode wifiQrCode = ((WifiDppConfiguratorActivity) getActivity()) + .getWifiDppQrCode(); + final String information = wifiQrCode.getInformation(); + if (TextUtils.isEmpty(information)) { + mTitle.setText(R.string.wifi_dpp_device_found); + } else { + mTitle.setText(information); + } + final WifiNetworkConfig wifiNetworkConfig = ((WifiDppConfiguratorActivity) getActivity()) .getWifiNetworkConfig(); if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) { @@ -110,7 +126,8 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment { mWifiApPictureView = view.findViewById(R.id.wifi_ap_picture_view); mChooseDifferentNetwork = view.findViewById(R.id.choose_different_network); - mChooseDifferentNetwork.setOnClickListener(v -> getFragmentManager().popBackStack()); + mChooseDifferentNetwork.setOnClickListener(v -> + mClickChooseDifferentNetworkListener.onClickChooseDifferentNetwork()); mButtonLeft = view.findViewById(R.id.button_left); mButtonLeft.setText(R.string.cancel); @@ -125,11 +142,34 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment { } private void startWifiDppInitiator() { - final String enrolleeUri = ((WifiDppConfiguratorActivity) getActivity()).getDppUri(); + final WifiQrCode wifiQrCode = ((WifiDppConfiguratorActivity) getActivity()) + .getWifiDppQrCode(); + final String qrCode = wifiQrCode.getQrCode(); final int networkId = ((WifiDppConfiguratorActivity) getActivity()).getWifiNetworkConfig().getNetworkId(); final WifiManager wifiManager = getContext().getSystemService(WifiManager.class); - wifiManager.startDppAsConfiguratorInitiator(enrolleeUri, networkId, + + wifiManager.startDppAsConfiguratorInitiator(qrCode, networkId, WifiManager.DPP_NETWORK_ROLE_STA, /* handler */ null, new DppStatusCallback()); } + + // Container Activity must implement this interface + public interface OnClickChooseDifferentNetworkListener { + public void onClickChooseDifferentNetwork(); + } + OnClickChooseDifferentNetworkListener mClickChooseDifferentNetworkListener; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + + mClickChooseDifferentNetworkListener = (OnClickChooseDifferentNetworkListener) context; + } + + @Override + public void onDetach() { + mClickChooseDifferentNetworkListener = null; + + super.onDetach(); + } } diff --git a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java index b08546cc484..8aa9d8fef06 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java +++ b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java @@ -51,7 +51,8 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements WifiNetworkConfig.Retriever, WifiDppQrCodeGeneratorFragment.OnQrCodeGeneratorFragmentAddButtonClickedListener, WifiDppQrCodeScannerFragment.OnScanWifiDppSuccessListener, - WifiDppQrCodeScannerFragment.OnScanZxingWifiFormatSuccessListener { + WifiDppQrCodeScannerFragment.OnScanZxingWifiFormatSuccessListener, + WifiDppAddDeviceFragment.OnClickChooseDifferentNetworkListener { private static final String TAG = "WifiDppConfiguratorActivity"; public static final String ACTION_CONFIGURATOR_QR_CODE_SCANNER = @@ -66,9 +67,6 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements /** The Wi-Fi network which will be configured */ private WifiNetworkConfig mWifiNetworkConfig; - /** The uri from Wi-Fi DPP QR code */ - private String mDppUri; - /** The Wi-Fi DPP QR code from intent ACTION_PROCESS_WIFI_DPP_QR_CODE */ private WifiQrCode mWifiDppQrCode; @@ -117,7 +115,7 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements break; case ACTION_PROCESS_WIFI_DPP_QR_CODE: String qrCode = intent.getStringExtra(WifiDppUtils.EXTRA_QR_CODE); - mWifiDppQrCode = getValidWiFiDppQrCodeOrNull(qrCode); + mWifiDppQrCode = getValidWifiDppQrCodeOrNull(qrCode); if (mWifiDppQrCode == null) { cancelActivity = true; } else { @@ -205,7 +203,7 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements fragmentTransaction.commit(); } - private WifiQrCode getValidWiFiDppQrCodeOrNull(String qrCode) { + private WifiQrCode getValidWifiDppQrCodeOrNull(String qrCode) { WifiQrCode wifiQrCode; try { wifiQrCode = new WifiQrCode(qrCode); @@ -225,10 +223,6 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements return mWifiNetworkConfig; } - public String getDppUri() { - return mDppUri; - } - public WifiQrCode getWifiDppQrCode() { return mWifiDppQrCode; } @@ -263,17 +257,21 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements } @Override - public void onScanWifiDppSuccess(String uri) { - mDppUri = uri; + public void onScanWifiDppSuccess(WifiQrCode wifiQrCode) { + mWifiDppQrCode = wifiQrCode; showAddDeviceFragment(/* addToBackStack */ true); } @Override public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig) { - mDppUri = null; - mWifiNetworkConfig = new WifiNetworkConfig(wifiNetworkConfig); + // Do nothing, it's impossible to be a configurator without a Wi-Fi DPP QR code + } - showAddDeviceFragment(/* addToBackStack */ true); + @Override + public void onClickChooseDifferentNetwork() { + mWifiNetworkConfig = null; + + showChooseSavedWifiNetworkFragment(/* addToBackStack */ true); } } diff --git a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java index 8c0e1f050d0..3a1b6bce351 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java +++ b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java @@ -145,9 +145,10 @@ public class WifiDppEnrolleeActivity extends InstrumentedActivity implements } @Override - public void onScanWifiDppSuccess(String uri) { + public void onScanWifiDppSuccess(WifiQrCode wifiQrCode) { final WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); - wifiManager.startDppAsEnrolleeInitiator(uri, /* handler */ null, new DppStatusCallback()); + wifiManager.startDppAsEnrolleeInitiator(wifiQrCode.getQrCode(), /* handler */ null, + new DppStatusCallback()); } @Override diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java index 45d753cdf15..21534dc8e53 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java +++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java @@ -100,7 +100,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl // Container Activity must implement this interface public interface OnScanWifiDppSuccessListener { - public void onScanWifiDppSuccess(String uri); + public void onScanWifiDppSuccess(WifiQrCode wifiQrCode); } OnScanWifiDppSuccessListener mScanWifiDppSuccessListener; @@ -108,7 +108,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl public interface OnScanZxingWifiFormatSuccessListener { public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig); } - OnScanZxingWifiFormatSuccessListener mScanScanZxingWifiFormatSuccessListener; + OnScanZxingWifiFormatSuccessListener mScanZxingWifiFormatSuccessListener; /** * Configurator container activity of the fragment should create instance with this constructor. @@ -146,13 +146,13 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl super.onAttach(context); mScanWifiDppSuccessListener = (OnScanWifiDppSuccessListener) context; - mScanScanZxingWifiFormatSuccessListener = (OnScanZxingWifiFormatSuccessListener) context; + mScanZxingWifiFormatSuccessListener = (OnScanZxingWifiFormatSuccessListener) context; } @Override public void onDetach() { mScanWifiDppSuccessListener = null; - mScanScanZxingWifiFormatSuccessListener = null; + mScanZxingWifiFormatSuccessListener = null; super.onDetach(); } @@ -272,17 +272,17 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl } /** - * This method is only called when QrCamera.ScannerCallback.isValid returns true; + * This method is only called when QrCamera.ScannerCallback.isValid returns true; */ @Override public void handleSuccessfulResult(String qrCode) { switch (mWifiQrCode.getScheme()) { case WifiQrCode.SCHEME_DPP: - handleWifiDpp(qrCode); + handleWifiDpp(); break; case WifiQrCode.SCHEME_ZXING_WIFI_NETWORK_CONFIG: - handleZxingWifiFormat(mWifiQrCode.getWifiNetworkConfig()); + handleZxingWifiFormat(); break; default: @@ -290,25 +290,22 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl } } - private void handleWifiDpp(String uri) { + private void handleWifiDpp() { destroyCamera(); mDecorateView.setFocused(true); - final Bundle bundle = new Bundle(); - bundle.putString(KEY_PUBLIC_URI, uri); - Message message = mHandler.obtainMessage(MESSAGE_SCAN_WIFI_DPP_SUCCESS); - message.setData(bundle); + message.obj = new WifiQrCode(mWifiQrCode.getQrCode()); mHandler.sendMessageDelayed(message, SHOW_SUCCESS_SQUARE_INTERVAL); } - private void handleZxingWifiFormat(WifiNetworkConfig wifiNetworkConfig) { + private void handleZxingWifiFormat() { destroyCamera(); mDecorateView.setFocused(true); Message message = mHandler.obtainMessage(MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS); - message.obj = wifiNetworkConfig; + message.obj = new WifiQrCode(mWifiQrCode.getQrCode()).getWifiNetworkConfig(); mHandler.sendMessageDelayed(message, SHOW_SUCCESS_SQUARE_INTERVAL); } @@ -359,17 +356,14 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl if (mScanWifiDppSuccessListener == null) { return; } - final Bundle bundle = msg.getData(); - final String uri = bundle.getString(KEY_PUBLIC_URI); - - mScanWifiDppSuccessListener.onScanWifiDppSuccess(uri); + mScanWifiDppSuccessListener.onScanWifiDppSuccess((WifiQrCode)msg.obj); break; case MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS: - if (mScanScanZxingWifiFormatSuccessListener == null) { + if (mScanZxingWifiFormatSuccessListener == null) { return; } - mScanScanZxingWifiFormatSuccessListener.onScanZxingWifiFormatSuccess( + mScanZxingWifiFormatSuccessListener.onScanZxingWifiFormatSuccess( (WifiNetworkConfig)msg.obj); break; @@ -381,8 +375,8 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl @Override public void onSaveInstanceState(Bundle outState) { - outState.putBoolean(KEY_IS_CONFIGURATOR_MODE, mIsConfiguratorMode); + outState.putBoolean(KEY_IS_CONFIGURATOR_MODE, mIsConfiguratorMode); - super.onSaveInstanceState(outState); + super.onSaveInstanceState(outState); } } diff --git a/src/com/android/settings/wifi/dpp/WifiQrCode.java b/src/com/android/settings/wifi/dpp/WifiQrCode.java index 8eae3a455a2..b60289f130b 100644 --- a/src/com/android/settings/wifi/dpp/WifiQrCode.java +++ b/src/com/android/settings/wifi/dpp/WifiQrCode.java @@ -20,7 +20,6 @@ import android.content.Intent; import android.net.wifi.WifiConfiguration; import android.text.TextUtils; -import androidx.annotation.Keep; import androidx.annotation.VisibleForTesting; import java.util.Arrays; @@ -49,7 +48,6 @@ import java.util.regex.Pattern; * H true Optional. True if the network SSID is hidden. * */ -@Keep public class WifiQrCode { public static final String SCHEME_DPP = "DPP"; public static final String SCHEME_ZXING_WIFI_NETWORK_CONFIG = "WIFI"; @@ -86,7 +84,6 @@ public class WifiQrCode { // Data from parsed ZXing reader library's Wi-Fi Network config format private WifiNetworkConfig mWifiNetworkConfig; - @Keep public WifiQrCode(String qrCode) throws IllegalArgumentException { if (TextUtils.isEmpty(qrCode)) { throw new IllegalArgumentException("Empty QR code"); @@ -172,7 +169,6 @@ public class WifiQrCode { return null; } - @Keep @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) protected String removeBackSlash(String input) { if (input == null) { @@ -199,7 +195,6 @@ public class WifiQrCode { return sb.toString(); } - @Keep public String getQrCode() { return mQrCode; } @@ -210,25 +205,22 @@ public class WifiQrCode { * SCHEME_DPP for standard Wi-Fi device provision protocol; SCHEME_ZXING_WIFI_NETWORK_CONFIG * for ZXing reader library' Wi-Fi Network config format */ - @Keep public String getScheme() { return mScheme; } /** Available when {@code getScheme()} returns SCHEME_DPP */ - @Keep - public String getPublicKey() { + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + protected String getPublicKey() { return mPublicKey; } /** May be available when {@code getScheme()} returns SCHEME_DPP */ - @Keep public String getInformation() { return mInformation; } /** Available when {@code getScheme()} returns SCHEME_ZXING_WIFI_NETWORK_CONFIG */ - @Keep public WifiNetworkConfig getWifiNetworkConfig() { if (mWifiNetworkConfig == null) { return null; diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java index 8e64f5fd22c..62a7c07e8e3 100644 --- a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java +++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java @@ -101,4 +101,12 @@ public class WifiDppConfiguratorActivityTest { assertThat(activity instanceof WifiDppQrCodeScannerFragment .OnScanZxingWifiFormatSuccessListener).isEqualTo(true); } + + @Test + public void testActivity_shouldImplementsOnClickChooseDifferentNetworkCallback() { + WifiDppConfiguratorActivity activity = mActivityRule.getActivity(); + + assertThat(activity instanceof WifiDppAddDeviceFragment + .OnClickChooseDifferentNetworkListener).isEqualTo(true); + } } From dcf3f2906faf196be81f339313eb4338d6ac471b Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Wed, 9 Jan 2019 15:51:16 +0800 Subject: [PATCH 2/2] Fix Wi-Fi DPP activity crash after configuration change. Both QR code and Wi-Fi network data may not come from intent. After configuration change, the null data will crash the activity. Bug: 120243131 Test: atest WifiDppConfiguratorActivityTest Change-Id: I6abbfc5d25431789e8ac9f6ee9dfaaef15b2de33 --- .../wifi/dpp/WifiDppConfiguratorActivity.java | 59 ++++++++++++++++++- .../settings/wifi/dpp/WifiNetworkConfig.java | 7 ++- .../dpp/WifiDppConfiguratorActivityTest.java | 56 +++++++++++++++++- 3 files changed, 114 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java index 8aa9d8fef06..97ee71ab93e 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java +++ b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.os.Bundle; import android.util.Log; +import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; @@ -62,6 +63,14 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements public static final String ACTION_PROCESS_WIFI_DPP_QR_CODE = "android.settings.PROCESS_WIFI_DPP_QR_CODE"; + // Key for Bundle usage + private static final String KEY_QR_CODE = "key_qr_code"; + private static final String KEY_WIFI_SECURITY = "key_wifi_security"; + private static final String KEY_WIFI_SSID = "key_wifi_ssid"; + private static final String KEY_WIFI_PRESHARED_KEY = "key_wifi_preshared_key"; + private static final String KEY_WIFI_HIDDEN_SSID = "key_wifi_hidden_ssid"; + private static final String KEY_WIFI_NETWORK_ID = "key_wifi_network_id"; + private FragmentManager mFragmentManager; /** The Wi-Fi network which will be configured */ @@ -79,6 +88,21 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + String qrCode = savedInstanceState.getString(KEY_QR_CODE); + + mWifiDppQrCode = getValidWifiDppQrCodeOrNull(qrCode); + + String security = savedInstanceState.getString(KEY_WIFI_SECURITY); + String ssid = savedInstanceState.getString(KEY_WIFI_SSID); + String preSharedKey = savedInstanceState.getString(KEY_WIFI_PRESHARED_KEY); + boolean hiddenSsid = savedInstanceState.getBoolean(KEY_WIFI_HIDDEN_SSID); + int networkId = savedInstanceState.getInt(KEY_WIFI_NETWORK_ID); + + mWifiNetworkConfig = WifiNetworkConfig.getValidConfigOrNull(security, ssid, + preSharedKey, hiddenSsid, networkId); + } + setContentView(R.layout.wifi_dpp_activity); mFragmentManager = getSupportFragmentManager(); @@ -227,8 +251,8 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements return mWifiDppQrCode; } - @Override - public boolean setWifiNetworkConfig(WifiNetworkConfig config) { + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + protected boolean setWifiNetworkConfig(WifiNetworkConfig config) { if(!WifiNetworkConfig.isValidConfig(config)) { return false; } else { @@ -237,6 +261,20 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements } } + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + protected boolean setWifiDppQrCode(WifiQrCode wifiQrCode) { + if (wifiQrCode == null) { + return false; + } + + if (!WifiQrCode.SCHEME_DPP.equals(wifiQrCode.getScheme())) { + return false; + } + + mWifiDppQrCode = new WifiQrCode(wifiQrCode.getQrCode()); + return true; + } + @Override public boolean onNavigateUp() { Fragment fragment = mFragmentManager.findFragmentById(R.id.fragment_container); @@ -274,4 +312,21 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements showChooseSavedWifiNetworkFragment(/* addToBackStack */ true); } + + @Override + public void onSaveInstanceState(Bundle outState) { + if (mWifiDppQrCode != null) { + outState.putString(KEY_QR_CODE, mWifiDppQrCode.getQrCode()); + } + + if (mWifiNetworkConfig != null) { + outState.putString(KEY_WIFI_SECURITY, mWifiNetworkConfig.getSecurity()); + outState.putString(KEY_WIFI_SSID, mWifiNetworkConfig.getSsid()); + outState.putString(KEY_WIFI_PRESHARED_KEY, mWifiNetworkConfig.getPreSharedKey()); + outState.putBoolean(KEY_WIFI_HIDDEN_SSID, mWifiNetworkConfig.getHiddenSsid()); + outState.putInt(KEY_WIFI_NETWORK_ID, mWifiNetworkConfig.getNetworkId()); + } + + super.onSaveInstanceState(outState); + } } diff --git a/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java b/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java index a9e88a9f0a8..915e90def21 100644 --- a/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java +++ b/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java @@ -30,6 +30,7 @@ import android.text.TextUtils; import android.util.Log; import androidx.annotation.Keep; +import androidx.annotation.VisibleForTesting; /** * Wraps the parameters of ZXing reader library's Wi-Fi Network config format. @@ -48,8 +49,9 @@ public class WifiNetworkConfig { private boolean mHiddenSsid; private int mNetworkId; - private WifiNetworkConfig(String security, String ssid, String preSharedKey, boolean hiddenSsid, - int networkId) { + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + protected WifiNetworkConfig(String security, String ssid, String preSharedKey, + boolean hiddenSsid, int networkId) { mSecurity = security; mSsid = ssid; mPreSharedKey = preSharedKey; @@ -71,7 +73,6 @@ public class WifiNetworkConfig { */ public interface Retriever { public WifiNetworkConfig getWifiNetworkConfig(); - public boolean setWifiNetworkConfig(WifiNetworkConfig config); } /** diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java index 62a7c07e8e3..215b7e2dc31 100644 --- a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java +++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java @@ -19,6 +19,7 @@ package com.android.settings.wifi.dpp; import static com.google.common.truth.Truth.assertThat; import android.content.Intent; +import android.content.pm.ActivityInfo; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; @@ -29,6 +30,10 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class WifiDppConfiguratorActivityTest { + // Valid Wi-Fi DPP QR code & it's parameters + private static final String VALID_WIFI_DPP_QR_CODE = "DPP:I:SN=4774LH2b4044;M:010203040506;K:" + + "MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgADURzxmttZoIRIPWGoQMV00XHWCAQIhXruVWOz0NjlkIA=;;"; + @Rule public final ActivityTestRule mActivityRule = new ActivityTestRule<>(WifiDppConfiguratorActivity.class); @@ -62,9 +67,7 @@ public class WifiDppConfiguratorActivityTest { public void launchActivity_chooseSavedWifiNetwork_shouldNotAutoFinish() { Intent intent = new Intent( WifiDppConfiguratorActivity.ACTION_PROCESS_WIFI_DPP_QR_CODE); - String qrCode = "DPP:I:SN=4774LH2b4044;M:010203040506;K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD" - + "IgADURzxmttZoIRIPWGoQMV00XHWCAQIhXruVWOz0NjlkIA=;;"; - intent.putExtra(WifiDppUtils.EXTRA_QR_CODE, qrCode); + intent.putExtra(WifiDppUtils.EXTRA_QR_CODE, VALID_WIFI_DPP_QR_CODE); mActivityRule.launchActivity(intent); @@ -109,4 +112,51 @@ public class WifiDppConfiguratorActivityTest { assertThat(activity instanceof WifiDppAddDeviceFragment .OnClickChooseDifferentNetworkListener).isEqualTo(true); } + + @Test + public void rotateScreen_shouldGetCorrectWifiDppQrCode() { + WifiQrCode wifiQrCode = new WifiQrCode(VALID_WIFI_DPP_QR_CODE); + Intent intent = new Intent(WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_SCANNER); + intent.putExtra(WifiDppUtils.EXTRA_WIFI_SECURITY, "WEP"); + intent.putExtra(WifiDppUtils.EXTRA_WIFI_SSID, "GoogleGuest"); + intent.putExtra(WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY, "password"); + + // setWifiDppQrCode and check if getWifiDppQrCode correctly after rotation + mActivityRule.launchActivity(intent); + mActivityRule.getActivity().setWifiDppQrCode(wifiQrCode); + mActivityRule.getActivity().setRequestedOrientation( + ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + mActivityRule.getActivity().setRequestedOrientation( + ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + WifiQrCode restoredWifiDppQrCode = mActivityRule.getActivity().getWifiDppQrCode(); + + assertThat(restoredWifiDppQrCode).isNotNull(); + assertThat(restoredWifiDppQrCode.getQrCode()).isEqualTo(VALID_WIFI_DPP_QR_CODE); + } + + @Test + public void rotateScreen_shouldGetCorrectWifiNetworkConfig() { + WifiNetworkConfig wifiNetworkConfig = new WifiNetworkConfig("WPA", "WifiSsid", "password", + /* hiddenSsid */ false, /* networkId */ 0); + Intent intent = new Intent( + WifiDppConfiguratorActivity.ACTION_PROCESS_WIFI_DPP_QR_CODE); + intent.putExtra(WifiDppUtils.EXTRA_QR_CODE, VALID_WIFI_DPP_QR_CODE); + + // setWifiNetworkConfig and check if getWifiNetworkConfig correctly after rotation + mActivityRule.launchActivity(intent); + mActivityRule.getActivity().setWifiNetworkConfig(wifiNetworkConfig); + mActivityRule.getActivity().setRequestedOrientation( + ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + mActivityRule.getActivity().setRequestedOrientation( + ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + WifiNetworkConfig restoredWifiNetworkConfig = + mActivityRule.getActivity().getWifiNetworkConfig(); + + assertThat(restoredWifiNetworkConfig).isNotNull(); + assertThat(restoredWifiNetworkConfig.getSecurity()).isEqualTo("WPA"); + assertThat(restoredWifiNetworkConfig.getSsid()).isEqualTo("WifiSsid"); + assertThat(restoredWifiNetworkConfig.getPreSharedKey()).isEqualTo("password"); + assertThat(restoredWifiNetworkConfig.getHiddenSsid()).isFalse(); + assertThat(restoredWifiNetworkConfig.getNetworkId()).isEqualTo(0); + } }