- 28,932 files - Full Java source code - Smali files - Resources Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
272 lines
11 KiB
Java
272 lines
11 KiB
Java
package androidx.biometric;
|
|
|
|
import android.app.Dialog;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.content.res.TypedArray;
|
|
import android.graphics.drawable.AnimatedVectorDrawable;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.os.Bundle;
|
|
import android.os.Handler;
|
|
import android.os.Looper;
|
|
import android.text.TextUtils;
|
|
import android.util.Log;
|
|
import android.util.TypedValue;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.ImageView;
|
|
import android.widget.TextView;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.RequiresApi;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.appcompat.app.AlertDialog;
|
|
import androidx.core.content.ContextCompat;
|
|
import androidx.fragment.app.DialogFragment;
|
|
import androidx.fragment.app.FragmentActivity;
|
|
import androidx.lifecycle.Observer;
|
|
import androidx.lifecycle.ViewModelProvider;
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
/* loaded from: classes.dex */
|
|
public class FingerprintDialogFragment extends DialogFragment {
|
|
private static final int MESSAGE_DISPLAY_TIME_MS = 2000;
|
|
static final int STATE_FINGERPRINT = 1;
|
|
static final int STATE_FINGERPRINT_AUTHENTICATED = 3;
|
|
static final int STATE_FINGERPRINT_ERROR = 2;
|
|
static final int STATE_NONE = 0;
|
|
private static final String TAG = "FingerprintFragment";
|
|
private int mErrorTextColor;
|
|
|
|
@Nullable
|
|
private ImageView mFingerprintIcon;
|
|
|
|
@Nullable
|
|
TextView mHelpMessageView;
|
|
private int mNormalTextColor;
|
|
BiometricViewModel mViewModel;
|
|
final Handler mHandler = new Handler(Looper.getMainLooper());
|
|
final Runnable mResetDialogRunnable = new Runnable() { // from class: androidx.biometric.FingerprintDialogFragment.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
FingerprintDialogFragment.this.resetDialog();
|
|
}
|
|
};
|
|
|
|
private boolean shouldAnimateForTransition(int i, int i2) {
|
|
if (i == 0 && i2 == 1) {
|
|
return false;
|
|
}
|
|
if (i == 1 && i2 == 2) {
|
|
return true;
|
|
}
|
|
return i == 2 && i2 == 1;
|
|
}
|
|
|
|
@NonNull
|
|
public static FingerprintDialogFragment newInstance() {
|
|
return new FingerprintDialogFragment();
|
|
}
|
|
|
|
@Override // androidx.fragment.app.DialogFragment, androidx.fragment.app.Fragment
|
|
public void onCreate(@Nullable Bundle bundle) {
|
|
super.onCreate(bundle);
|
|
connectViewModel();
|
|
this.mErrorTextColor = getThemedColorFor(Api26Impl.getColorErrorAttr());
|
|
this.mNormalTextColor = getThemedColorFor(android.R.attr.textColorSecondary);
|
|
}
|
|
|
|
@Override // androidx.fragment.app.DialogFragment
|
|
@NonNull
|
|
public Dialog onCreateDialog(@Nullable Bundle bundle) {
|
|
CharSequence negativeButtonText;
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
|
|
builder.setTitle(this.mViewModel.getTitle());
|
|
View inflate = LayoutInflater.from(builder.getContext()).inflate(R.layout.fingerprint_dialog_layout, (ViewGroup) null);
|
|
TextView textView = (TextView) inflate.findViewById(R.id.fingerprint_subtitle);
|
|
if (textView != null) {
|
|
CharSequence subtitle = this.mViewModel.getSubtitle();
|
|
if (TextUtils.isEmpty(subtitle)) {
|
|
textView.setVisibility(8);
|
|
} else {
|
|
textView.setVisibility(0);
|
|
textView.setText(subtitle);
|
|
}
|
|
}
|
|
TextView textView2 = (TextView) inflate.findViewById(R.id.fingerprint_description);
|
|
if (textView2 != null) {
|
|
CharSequence description = this.mViewModel.getDescription();
|
|
if (TextUtils.isEmpty(description)) {
|
|
textView2.setVisibility(8);
|
|
} else {
|
|
textView2.setVisibility(0);
|
|
textView2.setText(description);
|
|
}
|
|
}
|
|
this.mFingerprintIcon = (ImageView) inflate.findViewById(R.id.fingerprint_icon);
|
|
this.mHelpMessageView = (TextView) inflate.findViewById(R.id.fingerprint_error);
|
|
if (AuthenticatorUtils.isDeviceCredentialAllowed(this.mViewModel.getAllowedAuthenticators())) {
|
|
negativeButtonText = getString(R.string.confirm_device_credential_password);
|
|
} else {
|
|
negativeButtonText = this.mViewModel.getNegativeButtonText();
|
|
}
|
|
builder.setNegativeButton(negativeButtonText, new DialogInterface.OnClickListener() { // from class: androidx.biometric.FingerprintDialogFragment.2
|
|
@Override // android.content.DialogInterface.OnClickListener
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
FingerprintDialogFragment.this.mViewModel.setNegativeButtonPressPending(true);
|
|
}
|
|
});
|
|
builder.setView(inflate);
|
|
AlertDialog create = builder.create();
|
|
create.setCanceledOnTouchOutside(false);
|
|
return create;
|
|
}
|
|
|
|
@Override // androidx.fragment.app.Fragment
|
|
public void onResume() {
|
|
super.onResume();
|
|
this.mViewModel.setFingerprintDialogPreviousState(0);
|
|
this.mViewModel.setFingerprintDialogState(1);
|
|
this.mViewModel.setFingerprintDialogHelpMessage(getString(R.string.fingerprint_dialog_touch_sensor));
|
|
}
|
|
|
|
@Override // androidx.fragment.app.Fragment
|
|
public void onPause() {
|
|
super.onPause();
|
|
this.mHandler.removeCallbacksAndMessages(null);
|
|
}
|
|
|
|
@Override // androidx.fragment.app.DialogFragment, android.content.DialogInterface.OnCancelListener
|
|
public void onCancel(@NonNull DialogInterface dialogInterface) {
|
|
super.onCancel(dialogInterface);
|
|
this.mViewModel.setFingerprintDialogCancelPending(true);
|
|
}
|
|
|
|
private void connectViewModel() {
|
|
FragmentActivity activity = getActivity();
|
|
if (activity == null) {
|
|
return;
|
|
}
|
|
BiometricViewModel biometricViewModel = (BiometricViewModel) new ViewModelProvider(activity).get(BiometricViewModel.class);
|
|
this.mViewModel = biometricViewModel;
|
|
biometricViewModel.getFingerprintDialogState().observe(this, new Observer<Integer>() { // from class: androidx.biometric.FingerprintDialogFragment.3
|
|
@Override // androidx.lifecycle.Observer
|
|
public void onChanged(Integer num) {
|
|
FingerprintDialogFragment fingerprintDialogFragment = FingerprintDialogFragment.this;
|
|
fingerprintDialogFragment.mHandler.removeCallbacks(fingerprintDialogFragment.mResetDialogRunnable);
|
|
FingerprintDialogFragment.this.updateFingerprintIcon(num.intValue());
|
|
FingerprintDialogFragment.this.updateHelpMessageColor(num.intValue());
|
|
FingerprintDialogFragment fingerprintDialogFragment2 = FingerprintDialogFragment.this;
|
|
fingerprintDialogFragment2.mHandler.postDelayed(fingerprintDialogFragment2.mResetDialogRunnable, 2000L);
|
|
}
|
|
});
|
|
this.mViewModel.getFingerprintDialogHelpMessage().observe(this, new Observer<CharSequence>() { // from class: androidx.biometric.FingerprintDialogFragment.4
|
|
@Override // androidx.lifecycle.Observer
|
|
public void onChanged(CharSequence charSequence) {
|
|
FingerprintDialogFragment fingerprintDialogFragment = FingerprintDialogFragment.this;
|
|
fingerprintDialogFragment.mHandler.removeCallbacks(fingerprintDialogFragment.mResetDialogRunnable);
|
|
FingerprintDialogFragment.this.updateHelpMessageText(charSequence);
|
|
FingerprintDialogFragment fingerprintDialogFragment2 = FingerprintDialogFragment.this;
|
|
fingerprintDialogFragment2.mHandler.postDelayed(fingerprintDialogFragment2.mResetDialogRunnable, 2000L);
|
|
}
|
|
});
|
|
}
|
|
|
|
public void updateFingerprintIcon(int i) {
|
|
int fingerprintDialogPreviousState;
|
|
Drawable assetForTransition;
|
|
if (this.mFingerprintIcon == null || (assetForTransition = getAssetForTransition((fingerprintDialogPreviousState = this.mViewModel.getFingerprintDialogPreviousState()), i)) == null) {
|
|
return;
|
|
}
|
|
this.mFingerprintIcon.setImageDrawable(assetForTransition);
|
|
if (shouldAnimateForTransition(fingerprintDialogPreviousState, i)) {
|
|
Api21Impl.startAnimation(assetForTransition);
|
|
}
|
|
this.mViewModel.setFingerprintDialogPreviousState(i);
|
|
}
|
|
|
|
public void updateHelpMessageColor(int i) {
|
|
TextView textView = this.mHelpMessageView;
|
|
if (textView != null) {
|
|
textView.setTextColor(i == 2 ? this.mErrorTextColor : this.mNormalTextColor);
|
|
}
|
|
}
|
|
|
|
public void updateHelpMessageText(@Nullable CharSequence charSequence) {
|
|
TextView textView = this.mHelpMessageView;
|
|
if (textView != null) {
|
|
textView.setText(charSequence);
|
|
}
|
|
}
|
|
|
|
public void resetDialog() {
|
|
Context context = getContext();
|
|
if (context == null) {
|
|
Log.w(TAG, "Not resetting the dialog. Context is null.");
|
|
} else {
|
|
this.mViewModel.setFingerprintDialogState(1);
|
|
this.mViewModel.setFingerprintDialogHelpMessage(context.getString(R.string.fingerprint_dialog_touch_sensor));
|
|
}
|
|
}
|
|
|
|
private int getThemedColorFor(int i) {
|
|
Context context = getContext();
|
|
FragmentActivity activity = getActivity();
|
|
if (context == null || activity == null) {
|
|
Log.w(TAG, "Unable to get themed color. Context or activity is null.");
|
|
return 0;
|
|
}
|
|
TypedValue typedValue = new TypedValue();
|
|
context.getTheme().resolveAttribute(i, typedValue, true);
|
|
TypedArray obtainStyledAttributes = activity.obtainStyledAttributes(typedValue.data, new int[]{i});
|
|
int color = obtainStyledAttributes.getColor(0, 0);
|
|
obtainStyledAttributes.recycle();
|
|
return color;
|
|
}
|
|
|
|
private Drawable getAssetForTransition(int i, int i2) {
|
|
int i3;
|
|
Context context = getContext();
|
|
if (context == null) {
|
|
Log.w(TAG, "Unable to get asset. Context is null.");
|
|
return null;
|
|
}
|
|
if (i == 0 && i2 == 1) {
|
|
i3 = R.drawable.fingerprint_dialog_fp_icon;
|
|
} else if (i == 1 && i2 == 2) {
|
|
i3 = R.drawable.fingerprint_dialog_error;
|
|
} else if (i == 2 && i2 == 1) {
|
|
i3 = R.drawable.fingerprint_dialog_fp_icon;
|
|
} else {
|
|
if (i != 1 || i2 != 3) {
|
|
return null;
|
|
}
|
|
i3 = R.drawable.fingerprint_dialog_fp_icon;
|
|
}
|
|
return ContextCompat.getDrawable(context, i3);
|
|
}
|
|
|
|
@RequiresApi(26)
|
|
public static class Api26Impl {
|
|
public static int getColorErrorAttr() {
|
|
return R.attr.colorError;
|
|
}
|
|
|
|
private Api26Impl() {
|
|
}
|
|
}
|
|
|
|
@RequiresApi(21)
|
|
public static class Api21Impl {
|
|
private Api21Impl() {
|
|
}
|
|
|
|
public static void startAnimation(@NonNull Drawable drawable) {
|
|
if (drawable instanceof AnimatedVectorDrawable) {
|
|
((AnimatedVectorDrawable) drawable).start();
|
|
}
|
|
}
|
|
}
|
|
}
|