[Settings] Add QR code for EID and enable text copy

1. Add QR code for EID (when available)
2. Enable text copy

Bug: 260540995
Test: local
Change-Id: Iba7eace2ca3142a065219a3e65371af52df1511c
This commit is contained in:
Bonian Chen
2022-12-09 07:27:08 +00:00
parent 160dacf9ad
commit 6a383db74b
3 changed files with 63 additions and 5 deletions

View File

@@ -17,6 +17,7 @@
<ScrollView <ScrollView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
@@ -168,6 +169,11 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textIsSelectable="true" android:textIsSelectable="true"
android:text="@string/device_info_not_available"/> android:text="@string/device_info_not_available"/>
<ImageView
android:id="@+id/esim_id_qrcode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="ContentDescription" />
<TextView <TextView
style="@style/device_info_dialog_label" style="@style/device_info_dialog_label"

View File

@@ -22,6 +22,7 @@ import android.annotation.Nullable;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.ServiceConnection; import android.content.ServiceConnection;
@@ -72,7 +73,8 @@ import java.util.concurrent.atomic.AtomicReference;
/** /**
* Controller for Sim Status information within the About Phone Settings page. * Controller for Sim Status information within the About Phone Settings page.
*/ */
public class SimStatusDialogController implements LifecycleObserver { public class SimStatusDialogController implements LifecycleObserver,
DialogInterface.OnShowListener {
private final static String TAG = "SimStatusDialogCtrl"; private final static String TAG = "SimStatusDialogCtrl";
@@ -107,6 +109,8 @@ public class SimStatusDialogController implements LifecycleObserver {
@VisibleForTesting @VisibleForTesting
final static int EID_INFO_VALUE_ID = R.id.esim_id_value; final static int EID_INFO_VALUE_ID = R.id.esim_id_value;
@VisibleForTesting @VisibleForTesting
final static int EID_INFO_QRCODE_ID = R.id.esim_id_qrcode;
@VisibleForTesting
final static int IMS_REGISTRATION_STATE_LABEL_ID = R.id.ims_reg_state_label; final static int IMS_REGISTRATION_STATE_LABEL_ID = R.id.ims_reg_state_label;
@VisibleForTesting @VisibleForTesting
final static int IMS_REGISTRATION_STATE_VALUE_ID = R.id.ims_reg_state_value; final static int IMS_REGISTRATION_STATE_VALUE_ID = R.id.ims_reg_state_value;
@@ -158,6 +162,7 @@ public class SimStatusDialogController implements LifecycleObserver {
private boolean mShowLatestAreaInfo; private boolean mShowLatestAreaInfo;
private boolean mIsRegisteredListener = false; private boolean mIsRegisteredListener = false;
private AtomicReference<String> mEid = null;
private final BroadcastReceiver mAreaInfoReceiver = new BroadcastReceiver() { private final BroadcastReceiver mAreaInfoReceiver = new BroadcastReceiver() {
@Override @Override
@@ -263,6 +268,19 @@ public class SimStatusDialogController implements LifecycleObserver {
updateImsRegistrationState(); updateImsRegistrationState();
} }
/**
* Callback when dialog end of show().
*/
public void onShow(DialogInterface dialog) {
if (mEid != null) {
String eidText = mEid.get();
if (eidText != null) {
// Present QR code after the completion of layout
mDialog.setQrCode(EID_INFO_QRCODE_ID, eidText);
}
}
}
/** /**
* Deinitialization works * Deinitialization works
*/ */
@@ -618,8 +636,8 @@ public class SimStatusDialogController implements LifecycleObserver {
@VisibleForTesting @VisibleForTesting
protected void requestForUpdateEid() { protected void requestForUpdateEid() {
ThreadUtils.postOnBackgroundThread(() -> { ThreadUtils.postOnBackgroundThread(() -> {
final AtomicReference<String> eid = getEid(mSlotIndex); mEid = getEid(mSlotIndex);
ThreadUtils.postOnMainThread(() -> updateEid(eid)); ThreadUtils.postOnMainThread(() -> updateEid(mEid));
}); });
} }
@@ -663,11 +681,20 @@ public class SimStatusDialogController implements LifecycleObserver {
@VisibleForTesting @VisibleForTesting
protected void updateEid(AtomicReference<String> eid) { protected void updateEid(AtomicReference<String> eid) {
boolean removeQrCode = true;
if (eid == null) { if (eid == null) {
mDialog.removeSettingFromScreen(EID_INFO_LABEL_ID); mDialog.removeSettingFromScreen(EID_INFO_LABEL_ID);
mDialog.removeSettingFromScreen(EID_INFO_VALUE_ID); mDialog.removeSettingFromScreen(EID_INFO_VALUE_ID);
} else if (eid.get() != null) { mDialog.removeSettingFromScreen(EID_INFO_QRCODE_ID);
mDialog.setText(EID_INFO_VALUE_ID, eid.get()); } else {
String eidText = eid.get();
if (eidText != null) {
mDialog.setText(EID_INFO_VALUE_ID, eidText);
removeQrCode = (eidText == "");
}
}
if (removeQrCode) {
mDialog.removeSettingFromScreen(EID_INFO_QRCODE_ID);
} }
} }

View File

@@ -19,11 +19,14 @@ package com.android.settings.deviceinfo.simstatus;
import android.app.Dialog; import android.app.Dialog;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.os.Bundle; import android.os.Bundle;
import android.graphics.Bitmap;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.util.Log;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
@@ -32,6 +35,7 @@ import androidx.fragment.app.FragmentManager;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.deviceinfo.PhoneNumberUtil; import com.android.settings.deviceinfo.PhoneNumberUtil;
import com.android.settingslib.qrcode.QrCodeGenerator;
import java.util.Arrays; import java.util.Arrays;
import java.util.stream.IntStream; import java.util.stream.IntStream;
@@ -80,6 +84,7 @@ public class SimStatusDialogFragment extends InstrumentedDialogFragment {
Dialog dlg = builder.setView(mRootView).create(); Dialog dlg = builder.setView(mRootView).create();
dlg.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, dlg.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE); WindowManager.LayoutParams.FLAG_SECURE);
dlg.setOnShowListener(mController);
return dlg; return dlg;
} }
@@ -107,6 +112,10 @@ public class SimStatusDialogFragment extends InstrumentedDialogFragment {
.sorted().toArray(); .sorted().toArray();
public void setText(int viewId, CharSequence text) { public void setText(int viewId, CharSequence text) {
setText(viewId, text, true);
}
public void setText(int viewId, CharSequence text, boolean enableCopy) {
final TextView textView = mRootView.findViewById(viewId); final TextView textView = mRootView.findViewById(viewId);
if (textView == null) { if (textView == null) {
return; return;
@@ -117,5 +126,21 @@ public class SimStatusDialogFragment extends InstrumentedDialogFragment {
text = PhoneNumberUtil.expandByTts(text); text = PhoneNumberUtil.expandByTts(text);
} }
textView.setText(text); textView.setText(text);
textView.setTextIsSelectable(enableCopy);
}
public void setQrCode(int viewId, String qrcodeText) {
ImageView qrCodeView = (ImageView) mRootView.findViewById(viewId);
Bitmap qrCodeBitmap = null;
try {
qrCodeBitmap = QrCodeGenerator.encodeQrCode(qrcodeText, qrCodeView.getWidth());
} catch (Exception exception) {
Log.w(TAG, "Error when presenting QR code in + " + qrCodeView, exception);
}
if (qrCodeBitmap == null) {
return;
}
qrCodeView.setImageBitmap(qrCodeBitmap);
} }
} }