Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c092dda authored by Johnson Lu's avatar Johnson Lu Committed by Android (Google) Code Review
Browse files

Merge "Implement Wi-Fi DPP flow"

parents 532c3d72 7bdf8b3d
Loading
Loading
Loading
Loading
+40 −1
Original line number Diff line number Diff line
@@ -18,7 +18,10 @@ package com.android.settings.wifi.dpp;

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 @@ import com.android.settings.R;
 * 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 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
    }

    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());
    }
}
+7 −16
Original line number Diff line number Diff line
@@ -66,11 +66,8 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
    /** 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 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
        return mWifiNetworkConfig;
    }

    public String getPublicKey() {
        return mPublicKey;
    }

    public String getInformation() {
        return mInformation;
    public String getDppUri() {
        return mDppUri;
    }

    public WifiQrCode getWifiDppQrCode() {
@@ -270,17 +263,15 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
    }

    @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);
+40 −2
Original line number Diff line number Diff line
@@ -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.internal.logging.nano.MetricsProto;
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 @@ public class WifiDppEnrolleeActivity extends InstrumentedActivity implements

    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 @@ public class WifiDppEnrolleeActivity extends InstrumentedActivity implements
    }

    @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
+8 −11
Original line number Diff line number Diff line
@@ -62,9 +62,8 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
    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 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl

    // 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 class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
    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 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
        }
    }

    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 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
                        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:
+8 −0
Original line number Diff line number Diff line
@@ -64,6 +64,9 @@ public class WifiDppUtils {
    /** 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 @@ public class WifiDppUtils {
        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;
    }
Loading