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

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

Merge "Show QR Code picture for WiFi sharing"

parents 20e6b013 74145436
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -25,9 +25,10 @@
    <include layout="@layout/wifi_dpp_fragment_header"/>

    <ImageView
        android:id="@+id/barcode_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/qrcode_view"
        android:layout_width="@dimen/qrcode_size"
        android:layout_height="@dimen/qrcode_size"
        android:src="@android:color/transparent"
        android:layout_gravity="center"/>

</LinearLayout>
+3 −0
Original line number Diff line number Diff line
@@ -366,4 +366,7 @@
    <dimen name="homepage_condition_header_icon_width_height">24dp</dimen>
    <dimen name="homepage_condition_header_icon_margin_end">24dp</dimen>

    <!-- QR code picture size -->
    <dimen name="qrcode_size">264dp</dimen>

</resources>
+2 −2
Original line number Diff line number Diff line
@@ -549,8 +549,8 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
     * Show QR code to share the network represented by this preference.
     */
    public void launchQRCodeGenerator() {
        Intent intent = WifiDppUtils.getConfiguratorQrCodeGeneratorIntent(mAccessPoint.getSsidStr(),
                mAccessPoint.getSecurityString(/* concise */ false));
        Intent intent = WifiDppUtils.getConfiguratorQrCodeGeneratorIntent(mContext, mWifiManager,
                mAccessPoint);
        mContext.startActivity(intent);
    }

+32 −0
Original line number Diff line number Diff line
@@ -18,19 +18,31 @@ package com.android.settings.wifi.dpp;

import android.app.ActionBar;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;

import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.wifi.qrcode.QrCodeGenerator;

import com.google.zxing.WriterException;

/**
 * After sharing a saved Wi-Fi network, {@code WifiDppConfiguratorActivity} start with this fragment
 * to generate a Wi-Fi DPP QR code for other device to initiate as an enrollee.
 */
public class WifiDppQrCodeGeneratorFragment extends WifiDppQrCodeBaseFragment {
    private static final String TAG = "WifiDppQrCodeGeneratorFragment";

    private ImageView mQrCodeView;
    private String mQrCode;

    @Override
    protected int getLayout() {
        return R.layout.wifi_dpp_qrcode_generator_fragment;
@@ -67,6 +79,9 @@ public class WifiDppQrCodeGeneratorFragment extends WifiDppQrCodeBaseFragment {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.show();
        }

        mQrCode = wifiNetworkConfig.getQrCode();
        setQrCode();
    }

    @Override
@@ -102,4 +117,21 @@ public class WifiDppQrCodeGeneratorFragment extends WifiDppQrCodeBaseFragment {
                return super.onOptionsItemSelected(menuItem);
        }
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mQrCodeView = view.findViewById(R.id.qrcode_view);
    }

    private void setQrCode() {
        try {
            final int qrcodeSize = getContext().getResources().getDimensionPixelSize(
                    R.dimen.qrcode_size);
            final Bitmap bmp = QrCodeGenerator.encodeQrCode(mQrCode, qrcodeSize);
            mQrCodeView.setImageBitmap(bmp);
        } catch (WriterException e) {
            Log.e(TAG, "Error generatting QR code bitmap " + e);
        }
    }
}
+72 −8
Original line number Diff line number Diff line
@@ -18,9 +18,15 @@ package com.android.settings.wifi.dpp;

import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;

import com.android.settingslib.wifi.AccessPoint;

import java.util.List;

/**
 * Here are the items shared by both WifiDppConfiguratorActivity & WifiDppEnrolleeActivity
 */
@@ -84,23 +90,81 @@ public class WifiDppUtils {
        return intent;
    }

    private static String getPresharedKey(WifiManager wifiManager, WifiConfiguration config) {
        String preSharedKey = config.preSharedKey;

        final List<WifiConfiguration> wifiConfigs = wifiManager.getPrivilegedConfiguredNetworks();
        for (WifiConfiguration wifiConfig : wifiConfigs) {
            if (wifiConfig.networkId == config.networkId) {
                preSharedKey = wifiConfig.preSharedKey;
                break;
            }
        }

        return preSharedKey;
    }

    private static String removeFirstAndLastDoubleQuotes(String str) {
        if (TextUtils.isEmpty(str)) {
            return str;
        }

        int begin = 0;
        int end = str.length() - 1;
        if (str.charAt(begin) == '\"') {
            begin++;
        }
        if (str.charAt(end) == '\"') {
            end--;
        }
        return str.substring(begin, end+1);
    }

    private static String getSecurityString(AccessPoint accessPoint) {
        switch(accessPoint.getSecurity()) {
            case AccessPoint.SECURITY_WEP:
                return "WEP";
            case AccessPoint.SECURITY_PSK:
                return "WPA";
            default:
                return "nopass";
        }
    }

    /**
     * Returns an intent to launch QR code generator.
     *
     * @param ssid     The data corresponding to {@code WifiConfiguration} SSID
     * @param Security The data is from {@code AccessPoint.securityToString}
     * @param context     The context to use for the content resolver
     * @param wifiManager An instance of {@link WifiManager}
     * @param accessPoint An instance of {@link AccessPoint}
     * @return Intent for launching QR code generator
     */
    public static Intent getConfiguratorQrCodeGeneratorIntent(String ssid, String Security) {
        //TODO: b/118794858#comment6 should put password & hideSsid in intent extra
        final Intent intent = new Intent(
                WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_GENERATOR);
    public static Intent getConfiguratorQrCodeGeneratorIntent(Context context,
            WifiManager wifiManager, AccessPoint accessPoint) {
        final Intent intent = new Intent(context, WifiDppConfiguratorActivity.class);
        intent.setAction(WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_GENERATOR);

        final WifiConfiguration wifiConfig = accessPoint.getConfig();
        final String ssid = removeFirstAndLastDoubleQuotes(wifiConfig.SSID);
        final String security = getSecurityString(accessPoint);
        String preSharedKey = wifiConfig.preSharedKey;

        if (preSharedKey != null) {
            // When the value of this key is read, the actual key is not returned, just a "*".
            // Call privileged system API to obtain actual key.
            preSharedKey = removeFirstAndLastDoubleQuotes(getPresharedKey(wifiManager, wifiConfig));
        }

        if (!TextUtils.isEmpty(ssid)) {
            intent.putExtra(EXTRA_WIFI_SSID, ssid);
        }
        if (!TextUtils.isEmpty(Security)) {
            intent.putExtra(EXTRA_WIFI_SECURITY, Security);
        if (!TextUtils.isEmpty(security)) {
            intent.putExtra(EXTRA_WIFI_SECURITY, security);
        }
        if (!TextUtils.isEmpty(preSharedKey)) {
            intent.putExtra(EXTRA_WIFI_PRE_SHARED_KEY, preSharedKey);
        }

        return intent;
    }
}
Loading