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

Commit 13f37337 authored by Arc Wang's avatar Arc Wang
Browse files

Improve UX of Wi-Fi QR code scanner enrollee flow

1. Do not start WifiSettings after enrollee success
2. Return WifiConfiguration to the calling object after enrollee success
3. In WifiDialog, do not show scan button if Save button is not visible to users
4. Fix scanner button may not respond problem by setting listener for scanner
   button of ssid field and password field
5. If SSID is assigned, only allow to enrollee for the network of assigned SSID

Bug: 124416152
Test: manual test
Change-Id: Ic5241c4767eaa8ea01782817d8302d8b0572ab36
parent 5f321d79
Loading
Loading
Loading
Loading
+39 −7
Original line number Diff line number Diff line
@@ -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();
    }
+34 −13
Original line number Diff line number Diff line
@@ -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();
+26 −1
Original line number Diff line number Diff line
@@ -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();
        }
    }
}
+17 −1
Original line number Diff line number Diff line
@@ -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();
+13 −3
Original line number Diff line number Diff line
@@ -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();
    }

Loading