Implement Wi-Fi DPP flow

1. As DPP configurator initiator.
2. As DPP enrollee initiator.
3. Pass whole DPP url to DPP API due to API cahnged.

Bug: 122331217
Test: manual test
Change-Id: I8005b78b82453badf253dbde8022ff20722b39fd
This commit is contained in:
Johnson Lu
2019-01-07 11:44:21 +08:00
parent ad9874e14e
commit 7bdf8b3d37
7 changed files with 121 additions and 36 deletions

View File

@@ -18,7 +18,10 @@ package com.android.settings.wifi.dpp;
import android.app.ActionBar; import android.app.ActionBar;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -35,11 +38,42 @@ import com.android.settings.R;
* to the Wi-Fi network. * to the Wi-Fi network.
*/ */
public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment { public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
private static final String TAG = "WifiDppAddDeviceFragment";
private ImageView mWifiApPictureView; private ImageView mWifiApPictureView;
private TextView mChooseDifferentNetwork; private TextView mChooseDifferentNetwork;
private Button mButtonLeft; private Button mButtonLeft;
private Button mButtonRight; 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 @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_CONFIGURATOR; return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_CONFIGURATOR;
@@ -86,6 +120,11 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
} }
private void startWifiDppInitiator() { 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());
} }
} }

View File

@@ -66,11 +66,8 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
/** The Wi-Fi network which will be configured */ /** The Wi-Fi network which will be configured */
private WifiNetworkConfig mWifiNetworkConfig; private WifiNetworkConfig mWifiNetworkConfig;
/** The public key from Wi-Fi DPP QR code */ /** The uri from Wi-Fi DPP QR code */
private String mPublicKey; private String mDppUri;
/** The information from Wi-Fi DPP QR code */
private String mInformation;
/** The Wi-Fi DPP QR code from intent ACTION_PROCESS_WIFI_DPP_QR_CODE */ /** The Wi-Fi DPP QR code from intent ACTION_PROCESS_WIFI_DPP_QR_CODE */
private WifiQrCode mWifiDppQrCode; private WifiQrCode mWifiDppQrCode;
@@ -228,12 +225,8 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
return mWifiNetworkConfig; return mWifiNetworkConfig;
} }
public String getPublicKey() { public String getDppUri() {
return mPublicKey; return mDppUri;
}
public String getInformation() {
return mInformation;
} }
public WifiQrCode getWifiDppQrCode() { public WifiQrCode getWifiDppQrCode() {
@@ -270,17 +263,15 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
} }
@Override @Override
public void onScanWifiDppSuccess(String publicKey, String information) { public void onScanWifiDppSuccess(String uri) {
mPublicKey = publicKey; mDppUri = uri;
mInformation = information;
showAddDeviceFragment(/* addToBackStack */ true); showAddDeviceFragment(/* addToBackStack */ true);
} }
@Override @Override
public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig) { public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig) {
mPublicKey = null; mDppUri = null;
mInformation = null;
mWifiNetworkConfig = new WifiNetworkConfig(wifiNetworkConfig); mWifiNetworkConfig = new WifiNetworkConfig(wifiNetworkConfig);
showAddDeviceFragment(/* addToBackStack */ true); showAddDeviceFragment(/* addToBackStack */ true);

View File

@@ -16,6 +16,8 @@
package com.android.settings.wifi.dpp; package com.android.settings.wifi.dpp;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.provider.Settings; import android.provider.Settings;
import android.app.ActionBar; import android.app.ActionBar;
import android.app.Activity; import android.app.Activity;
@@ -32,6 +34,8 @@ import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.core.InstrumentedActivity; import com.android.settings.core.InstrumentedActivity;
import com.android.settings.R; import com.android.settings.R;
import java.util.List;
/** /**
* To provision "this" device with specified Wi-Fi network. * To provision "this" device with specified Wi-Fi network.
* *
@@ -49,6 +53,39 @@ public class WifiDppEnrolleeActivity extends InstrumentedActivity implements
private FragmentManager mFragmentManager; 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 @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_ENROLLEE; return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_ENROLLEE;
@@ -108,8 +145,9 @@ public class WifiDppEnrolleeActivity extends InstrumentedActivity implements
} }
@Override @Override
public void onScanWifiDppSuccess(String publicKey, String information) { public void onScanWifiDppSuccess(String uri) {
// TODO(b/1023597): starts DPP enrollee handshake here final WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifiManager.startDppAsEnrolleeInitiator(uri, /* handler */ null, new DppStatusCallback());
} }
@Override @Override

View File

@@ -62,9 +62,8 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
private static final long SHOW_ERROR_MESSAGE_INTERVAL = 2000; private static final long SHOW_ERROR_MESSAGE_INTERVAL = 2000;
private static final long SHOW_SUCCESS_SQUARE_INTERVAL = 1000; private static final long SHOW_SUCCESS_SQUARE_INTERVAL = 1000;
// Keys for Bundle usage // Key for Bundle usage
private static final String KEY_PUBLIC_KEY = "key_public_key"; private static final String KEY_PUBLIC_URI = "key_public_uri";
private static final String KEY_INFORMATION = "key_information";
private QrCamera mCamera; private QrCamera mCamera;
private TextureView mTextureView; private TextureView mTextureView;
@@ -91,7 +90,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
// Container Activity must implement this interface // Container Activity must implement this interface
public interface OnScanWifiDppSuccessListener { public interface OnScanWifiDppSuccessListener {
public void onScanWifiDppSuccess(String publicKey, String information); public void onScanWifiDppSuccess(String uri);
} }
OnScanWifiDppSuccessListener mScanWifiDppSuccessListener; OnScanWifiDppSuccessListener mScanWifiDppSuccessListener;
@@ -269,7 +268,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
public void handleSuccessfulResult(String qrCode) { public void handleSuccessfulResult(String qrCode) {
switch (mWifiQrCode.getScheme()) { switch (mWifiQrCode.getScheme()) {
case WifiQrCode.SCHEME_DPP: case WifiQrCode.SCHEME_DPP:
handleWifiDpp(mWifiQrCode.getPublicKey(), mWifiQrCode.getInformation()); handleWifiDpp(qrCode);
break; break;
case WifiQrCode.SCHEME_ZXING_WIFI_NETWORK_CONFIG: case WifiQrCode.SCHEME_ZXING_WIFI_NETWORK_CONFIG:
@@ -281,13 +280,12 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
} }
} }
private void handleWifiDpp(String publicKey, String information) { private void handleWifiDpp(String uri) {
destroyCamera(); destroyCamera();
mDecorateView.setFocused(true); mDecorateView.setFocused(true);
final Bundle bundle = new Bundle(); final Bundle bundle = new Bundle();
bundle.putString(KEY_PUBLIC_KEY, publicKey); bundle.putString(KEY_PUBLIC_URI, uri);
bundle.putString(KEY_INFORMATION, information);
Message message = mHandler.obtainMessage(MESSAGE_SCAN_WIFI_DPP_SUCCESS); Message message = mHandler.obtainMessage(MESSAGE_SCAN_WIFI_DPP_SUCCESS);
message.setData(bundle); message.setData(bundle);
@@ -352,10 +350,9 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
return; return;
} }
final Bundle bundle = msg.getData(); final Bundle bundle = msg.getData();
final String publicKey = bundle.getString(KEY_PUBLIC_KEY); final String uri = bundle.getString(KEY_PUBLIC_URI);
final String information = bundle.getString(KEY_INFORMATION);
mScanWifiDppSuccessListener.onScanWifiDppSuccess(publicKey, information); mScanWifiDppSuccessListener.onScanWifiDppSuccess(uri);
break; break;
case MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS: case MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS:

View File

@@ -64,6 +64,9 @@ public class WifiDppUtils {
/** The data corresponding to {@code WifiConfiguration} hiddenSSID */ /** The data corresponding to {@code WifiConfiguration} hiddenSSID */
public static final String EXTRA_WIFI_HIDDEN_SSID = "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 */ /** @see WifiQrCode */
public static final String EXTRA_QR_CODE = "qrCode"; public static final String EXTRA_QR_CODE = "qrCode";
@@ -164,6 +167,11 @@ public class WifiDppUtils {
if (!TextUtils.isEmpty(preSharedKey)) { if (!TextUtils.isEmpty(preSharedKey)) {
intent.putExtra(EXTRA_WIFI_PRE_SHARED_KEY, 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; return intent;
} }

View File

@@ -46,13 +46,15 @@ public class WifiNetworkConfig {
private String mSsid; private String mSsid;
private String mPreSharedKey; private String mPreSharedKey;
private boolean mHiddenSsid; private boolean mHiddenSsid;
private int mNetworkId;
private WifiNetworkConfig(String security, String ssid, String preSharedKey, private WifiNetworkConfig(String security, String ssid, String preSharedKey, boolean hiddenSsid,
boolean hiddenSsid) { int networkId) {
mSecurity = security; mSecurity = security;
mSsid = ssid; mSsid = ssid;
mPreSharedKey = preSharedKey; mPreSharedKey = preSharedKey;
mHiddenSsid = hiddenSsid; mHiddenSsid = hiddenSsid;
mNetworkId = networkId;
} }
public WifiNetworkConfig(WifiNetworkConfig config) { public WifiNetworkConfig(WifiNetworkConfig config) {
@@ -60,6 +62,7 @@ public class WifiNetworkConfig {
mSsid = config.mSsid; mSsid = config.mSsid;
mPreSharedKey = config.mPreSharedKey; mPreSharedKey = config.mPreSharedKey;
mHiddenSsid = config.mHiddenSsid; mHiddenSsid = config.mHiddenSsid;
mNetworkId = config.mNetworkId;
} }
/** /**
@@ -82,17 +85,19 @@ public class WifiNetworkConfig {
String ssid = intent.getStringExtra(WifiDppUtils.EXTRA_WIFI_SSID); String ssid = intent.getStringExtra(WifiDppUtils.EXTRA_WIFI_SSID);
String preSharedKey = intent.getStringExtra(WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY); String preSharedKey = intent.getStringExtra(WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY);
boolean hiddenSsid = intent.getBooleanExtra(WifiDppUtils.EXTRA_WIFI_HIDDEN_SSID, false); 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, public static WifiNetworkConfig getValidConfigOrNull(String security, String ssid,
String preSharedKey, boolean hiddenSsid) { String preSharedKey, boolean hiddenSsid, int networkId) {
if (!isValidConfig(security, ssid, preSharedKey, hiddenSsid)) { if (!isValidConfig(security, ssid, preSharedKey, hiddenSsid)) {
return null; return null;
} }
return new WifiNetworkConfig(security, ssid, preSharedKey, hiddenSsid); return new WifiNetworkConfig(security, ssid, preSharedKey, hiddenSsid, networkId);
} }
public static boolean isValidConfig(WifiNetworkConfig config) { public static boolean isValidConfig(WifiNetworkConfig config) {
@@ -184,6 +189,11 @@ public class WifiNetworkConfig {
return mHiddenSsid; return mHiddenSsid;
} }
@Keep
public int getNetworkId() {
return mNetworkId;
}
public void connect(Context context, WifiManager.ActionListener listener) { public void connect(Context context, WifiManager.ActionListener listener) {
WifiConfiguration wifiConfiguration = getWifiConfigurationOrNull(); WifiConfiguration wifiConfiguration = getWifiConfigurationOrNull();
if (wifiConfiguration == null) { if (wifiConfiguration == null) {
@@ -208,6 +218,7 @@ public class WifiNetworkConfig {
final WifiConfiguration wifiConfiguration = new WifiConfiguration(); final WifiConfiguration wifiConfiguration = new WifiConfiguration();
wifiConfiguration.SSID = addQuotationIfNeeded(mSsid); wifiConfiguration.SSID = addQuotationIfNeeded(mSsid);
wifiConfiguration.hiddenSSID = mHiddenSsid; wifiConfiguration.hiddenSSID = mHiddenSsid;
wifiConfiguration.networkId = mNetworkId;
if (TextUtils.isEmpty(mSecurity) || SECURITY_NO_PASSWORD.equals(mSecurity)) { if (TextUtils.isEmpty(mSecurity) || SECURITY_NO_PASSWORD.equals(mSecurity)) {
wifiConfiguration.allowedKeyManagement.set(KeyMgmt.NONE); wifiConfiguration.allowedKeyManagement.set(KeyMgmt.NONE);

View File

@@ -17,6 +17,7 @@
package com.android.settings.wifi.dpp; package com.android.settings.wifi.dpp;
import android.content.Intent; import android.content.Intent;
import android.net.wifi.WifiConfiguration;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.Keep; import androidx.annotation.Keep;
@@ -135,7 +136,7 @@ public class WifiQrCode {
password = removeBackSlash(password); password = removeBackSlash(password);
mWifiNetworkConfig = WifiNetworkConfig.getValidConfigOrNull(security, ssid, password, mWifiNetworkConfig = WifiNetworkConfig.getValidConfigOrNull(security, ssid, password,
hiddenSsid); hiddenSsid, WifiConfiguration.INVALID_NETWORK_ID);
if (mWifiNetworkConfig == null) { if (mWifiNetworkConfig == null) {
throw new IllegalArgumentException("Invalid format"); throw new IllegalArgumentException("Invalid format");