Merge "Implement Wi-Fi DPP flow"
diff --git a/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java b/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
index 12814f8..8fa58f3 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
@@ -18,7 +18,10 @@
import android.app.ActionBar;
import android.app.Activity;
+import android.content.Context;
+import android.net.wifi.WifiManager;
import android.os.Bundle;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -35,11 +38,42 @@
* to the Wi-Fi network.
*/
public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
+ private static final String TAG = "WifiDppAddDeviceFragment";
+
private ImageView mWifiApPictureView;
private TextView mChooseDifferentNetwork;
private Button mButtonLeft;
private Button mButtonRight;
+ private class DppStatusCallback extends android.net.wifi.DppStatusCallback {
+ @Override
+ public void onEnrolleeSuccess(int newNetworkId) {
+ // Do nothing
+ }
+
+ @Override
+ public void onConfiguratorSuccess(int code) {
+ // Update success UI.
+ mTitle.setText(R.string.wifi_dpp_wifi_shared_with_device);
+ mSummary.setVisibility(View.INVISIBLE);
+ mButtonLeft.setText(R.string.wifi_dpp_add_another_device);
+ mButtonLeft.setOnClickListener(v -> getFragmentManager().popBackStack());
+ mButtonRight.setText(R.string.done);
+ mButtonRight.setOnClickListener(v -> getActivity().finish());
+ }
+
+ @Override
+ public void onFailure(int code) {
+ //TODO(b/122429170): Show DPP configuration error state UI
+ Log.d(TAG, "DppStatusCallback.onFailure " + code);
+ }
+
+ @Override
+ public void onProgress(int code) {
+ // Do nothing
+ }
+ }
+
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_CONFIGURATOR;
@@ -86,6 +120,11 @@
}
private void startWifiDppInitiator() {
- //TODO(b/122331217): starts Wi-Fi DPP initiator handshake here
+ final String enrolleeUri = ((WifiDppConfiguratorActivity) getActivity()).getDppUri();
+ final int networkId =
+ ((WifiDppConfiguratorActivity) getActivity()).getWifiNetworkConfig().getNetworkId();
+ final WifiManager wifiManager = getContext().getSystemService(WifiManager.class);
+ wifiManager.startDppAsConfiguratorInitiator(enrolleeUri, networkId,
+ WifiManager.DPP_NETWORK_ROLE_STA, /* handler */ null, new DppStatusCallback());
}
}
diff --git a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
index 9c65d10..b08546c 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
@@ -66,11 +66,8 @@
/** The Wi-Fi network which will be configured */
private WifiNetworkConfig mWifiNetworkConfig;
- /** The public key from Wi-Fi DPP QR code */
- private String mPublicKey;
-
- /** The information from Wi-Fi DPP QR code */
- private String mInformation;
+ /** 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;
@@ -228,12 +225,8 @@
return mWifiNetworkConfig;
}
- public String getPublicKey() {
- return mPublicKey;
- }
-
- public String getInformation() {
- return mInformation;
+ public String getDppUri() {
+ return mDppUri;
}
public WifiQrCode getWifiDppQrCode() {
@@ -270,17 +263,15 @@
}
@Override
- public void onScanWifiDppSuccess(String publicKey, String information) {
- mPublicKey = publicKey;
- mInformation = information;
+ public void onScanWifiDppSuccess(String uri) {
+ mDppUri = uri;
showAddDeviceFragment(/* addToBackStack */ true);
}
@Override
public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig) {
- mPublicKey = null;
- mInformation = null;
+ mDppUri = null;
mWifiNetworkConfig = new WifiNetworkConfig(wifiNetworkConfig);
showAddDeviceFragment(/* addToBackStack */ true);
diff --git a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
index 584a819..8c0e1f0 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
@@ -16,6 +16,8 @@
package com.android.settings.wifi.dpp;
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
import android.provider.Settings;
import android.app.ActionBar;
import android.app.Activity;
@@ -32,6 +34,8 @@
import com.android.settings.core.InstrumentedActivity;
import com.android.settings.R;
+import java.util.List;
+
/**
* To provision "this" device with specified Wi-Fi network.
*
@@ -49,6 +53,39 @@
private FragmentManager mFragmentManager;
+ private class DppStatusCallback extends android.net.wifi.DppStatusCallback {
+ @Override
+ public void onEnrolleeSuccess(int newNetworkId) {
+ // Connect to the new network.
+ final WifiManager wifiManager = getSystemService(WifiManager.class);
+ final List<WifiConfiguration> wifiConfigs = wifiManager.getPrivilegedConfiguredNetworks();
+ for (WifiConfiguration wifiConfig : wifiConfigs) {
+ if (wifiConfig.networkId == newNetworkId) {
+ wifiManager.connect(wifiConfig, WifiDppEnrolleeActivity.this);
+ return;
+ }
+ }
+ Log.e(TAG, "Invalid networkId " + newNetworkId);
+ WifiDppEnrolleeActivity.this.onFailure(WifiManager.ERROR_AUTHENTICATING);
+ }
+
+ @Override
+ public void onConfiguratorSuccess(int code) {
+ // Do nothing
+ }
+
+ @Override
+ public void onFailure(int code) {
+ //TODO(b/122429170): Show DPP enrollee error state UI
+ Log.d(TAG, "DppStatusCallback.onFailure " + code);
+ }
+
+ @Override
+ public void onProgress(int code) {
+ // Do nothing
+ }
+ }
+
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_ENROLLEE;
@@ -108,8 +145,9 @@
}
@Override
- public void onScanWifiDppSuccess(String publicKey, String information) {
- // TODO(b/1023597): starts DPP enrollee handshake here
+ public void onScanWifiDppSuccess(String uri) {
+ final WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
+ wifiManager.startDppAsEnrolleeInitiator(uri, /* 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 c7c1461..2f59e18 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
@@ -62,9 +62,8 @@
private static final long SHOW_ERROR_MESSAGE_INTERVAL = 2000;
private static final long SHOW_SUCCESS_SQUARE_INTERVAL = 1000;
- // Keys for Bundle usage
- private static final String KEY_PUBLIC_KEY = "key_public_key";
- private static final String KEY_INFORMATION = "key_information";
+ // Key for Bundle usage
+ private static final String KEY_PUBLIC_URI = "key_public_uri";
private QrCamera mCamera;
private TextureView mTextureView;
@@ -91,7 +90,7 @@
// Container Activity must implement this interface
public interface OnScanWifiDppSuccessListener {
- public void onScanWifiDppSuccess(String publicKey, String information);
+ public void onScanWifiDppSuccess(String uri);
}
OnScanWifiDppSuccessListener mScanWifiDppSuccessListener;
@@ -269,7 +268,7 @@
public void handleSuccessfulResult(String qrCode) {
switch (mWifiQrCode.getScheme()) {
case WifiQrCode.SCHEME_DPP:
- handleWifiDpp(mWifiQrCode.getPublicKey(), mWifiQrCode.getInformation());
+ handleWifiDpp(qrCode);
break;
case WifiQrCode.SCHEME_ZXING_WIFI_NETWORK_CONFIG:
@@ -281,13 +280,12 @@
}
}
- private void handleWifiDpp(String publicKey, String information) {
+ private void handleWifiDpp(String uri) {
destroyCamera();
mDecorateView.setFocused(true);
final Bundle bundle = new Bundle();
- bundle.putString(KEY_PUBLIC_KEY, publicKey);
- bundle.putString(KEY_INFORMATION, information);
+ bundle.putString(KEY_PUBLIC_URI, uri);
Message message = mHandler.obtainMessage(MESSAGE_SCAN_WIFI_DPP_SUCCESS);
message.setData(bundle);
@@ -352,10 +350,9 @@
return;
}
final Bundle bundle = msg.getData();
- final String publicKey = bundle.getString(KEY_PUBLIC_KEY);
- final String information = bundle.getString(KEY_INFORMATION);
+ final String uri = bundle.getString(KEY_PUBLIC_URI);
- mScanWifiDppSuccessListener.onScanWifiDppSuccess(publicKey, information);
+ mScanWifiDppSuccessListener.onScanWifiDppSuccess(uri);
break;
case MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS:
diff --git a/src/com/android/settings/wifi/dpp/WifiDppUtils.java b/src/com/android/settings/wifi/dpp/WifiDppUtils.java
index 3a40e25..0205ec1 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppUtils.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppUtils.java
@@ -64,6 +64,9 @@
/** The data corresponding to {@code WifiConfiguration} hiddenSSID */
public static final String EXTRA_WIFI_HIDDEN_SSID = "hiddenSsid";
+ /** The data corresponding to {@code WifiConfiguration} networkId */
+ public static final String EXTRA_WIFI_NETWORK_ID = "networkId";
+
/** @see WifiQrCode */
public static final String EXTRA_QR_CODE = "qrCode";
@@ -164,6 +167,11 @@
if (!TextUtils.isEmpty(preSharedKey)) {
intent.putExtra(EXTRA_WIFI_PRE_SHARED_KEY, preSharedKey);
}
+ if (wifiConfig.networkId == WifiConfiguration.INVALID_NETWORK_ID) {
+ throw new IllegalArgumentException("Invalid network ID");
+ } else {
+ intent.putExtra(EXTRA_WIFI_NETWORK_ID, wifiConfig.networkId);
+ }
return intent;
}
diff --git a/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java b/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java
index c9bfbd6..a9e88a9 100644
--- a/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java
+++ b/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java
@@ -46,13 +46,15 @@
private String mSsid;
private String mPreSharedKey;
private boolean mHiddenSsid;
+ private int mNetworkId;
- private WifiNetworkConfig(String security, String ssid, String preSharedKey,
- boolean hiddenSsid) {
+ private WifiNetworkConfig(String security, String ssid, String preSharedKey, boolean hiddenSsid,
+ int networkId) {
mSecurity = security;
mSsid = ssid;
mPreSharedKey = preSharedKey;
mHiddenSsid = hiddenSsid;
+ mNetworkId = networkId;
}
public WifiNetworkConfig(WifiNetworkConfig config) {
@@ -60,6 +62,7 @@
mSsid = config.mSsid;
mPreSharedKey = config.mPreSharedKey;
mHiddenSsid = config.mHiddenSsid;
+ mNetworkId = config.mNetworkId;
}
/**
@@ -82,17 +85,19 @@
String ssid = intent.getStringExtra(WifiDppUtils.EXTRA_WIFI_SSID);
String preSharedKey = intent.getStringExtra(WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY);
boolean hiddenSsid = intent.getBooleanExtra(WifiDppUtils.EXTRA_WIFI_HIDDEN_SSID, false);
+ int networkId = intent.getIntExtra(WifiDppUtils.EXTRA_WIFI_NETWORK_ID,
+ WifiConfiguration.INVALID_NETWORK_ID);
- return getValidConfigOrNull(security, ssid, preSharedKey, hiddenSsid);
+ return getValidConfigOrNull(security, ssid, preSharedKey, hiddenSsid, networkId);
}
public static WifiNetworkConfig getValidConfigOrNull(String security, String ssid,
- String preSharedKey, boolean hiddenSsid) {
+ String preSharedKey, boolean hiddenSsid, int networkId) {
if (!isValidConfig(security, ssid, preSharedKey, hiddenSsid)) {
return null;
}
- return new WifiNetworkConfig(security, ssid, preSharedKey, hiddenSsid);
+ return new WifiNetworkConfig(security, ssid, preSharedKey, hiddenSsid, networkId);
}
public static boolean isValidConfig(WifiNetworkConfig config) {
@@ -184,6 +189,11 @@
return mHiddenSsid;
}
+ @Keep
+ public int getNetworkId() {
+ return mNetworkId;
+ }
+
public void connect(Context context, WifiManager.ActionListener listener) {
WifiConfiguration wifiConfiguration = getWifiConfigurationOrNull();
if (wifiConfiguration == null) {
@@ -208,6 +218,7 @@
final WifiConfiguration wifiConfiguration = new WifiConfiguration();
wifiConfiguration.SSID = addQuotationIfNeeded(mSsid);
wifiConfiguration.hiddenSSID = mHiddenSsid;
+ wifiConfiguration.networkId = mNetworkId;
if (TextUtils.isEmpty(mSecurity) || SECURITY_NO_PASSWORD.equals(mSecurity)) {
wifiConfiguration.allowedKeyManagement.set(KeyMgmt.NONE);
diff --git a/src/com/android/settings/wifi/dpp/WifiQrCode.java b/src/com/android/settings/wifi/dpp/WifiQrCode.java
index a8562bb..8eae3a4 100644
--- a/src/com/android/settings/wifi/dpp/WifiQrCode.java
+++ b/src/com/android/settings/wifi/dpp/WifiQrCode.java
@@ -17,6 +17,7 @@
package com.android.settings.wifi.dpp;
import android.content.Intent;
+import android.net.wifi.WifiConfiguration;
import android.text.TextUtils;
import androidx.annotation.Keep;
@@ -135,7 +136,7 @@
password = removeBackSlash(password);
mWifiNetworkConfig = WifiNetworkConfig.getValidConfigOrNull(security, ssid, password,
- hiddenSsid);
+ hiddenSsid, WifiConfiguration.INVALID_NETWORK_ID);
if (mWifiNetworkConfig == null) {
throw new IllegalArgumentException("Invalid format");