NekoX/TMessagesProj/src/main/java/org/telegram/ui/PassportActivity.java

8004 lines
434 KiB
Java
Raw Normal View History

2018-07-30 04:07:02 +02:00
package org.telegram.ui;
import android.Manifest;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
2019-12-31 14:08:08 +01:00
import android.content.DialogInterface;
2018-07-30 04:07:02 +02:00
import android.content.Intent;
2019-09-10 12:56:11 +02:00
import android.content.SharedPreferences;
2018-07-30 04:07:02 +02:00
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Typeface;
2019-01-23 18:03:33 +01:00
import android.graphics.drawable.Drawable;
2018-07-30 04:07:02 +02:00
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
2019-05-14 14:08:05 +02:00
import android.telephony.PhoneNumberUtils;
2018-07-30 04:07:02 +02:00
import android.telephony.TelephonyManager;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.method.PasswordTransformationMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.util.Base64;
import android.util.TypedValue;
import android.view.ActionMode;
import android.view.Gravity;
2019-01-23 18:03:33 +01:00
import android.view.KeyEvent;
2018-07-30 04:07:02 +02:00
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.inputmethod.EditorInfo;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
2020-07-26 18:07:20 +02:00
import androidx.core.content.FileProvider;
2018-07-30 04:07:02 +02:00
import org.json.JSONArray;
import org.json.JSONObject;
import org.telegram.PhoneFormat.PhoneFormat;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.BuildConfig;
import org.telegram.messenger.DownloadController;
import org.telegram.messenger.FileLoader;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.ImageLoader;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MediaController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.MrzRecognizer;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
2018-08-27 10:33:11 +02:00
import org.telegram.messenger.SRPHelper;
2018-07-30 04:07:02 +02:00
import org.telegram.messenger.SecureDocument;
import org.telegram.messenger.SecureDocumentKey;
import org.telegram.messenger.SendMessagesHelper;
import org.telegram.messenger.SharedConfig;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.UserObject;
import org.telegram.messenger.Utilities;
import org.telegram.messenger.browser.Browser;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.RequestDelegate;
import org.telegram.tgnet.TLObject;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.ActionBar;
import org.telegram.ui.ActionBar.ActionBarMenu;
import org.telegram.ui.ActionBar.ActionBarMenuItem;
import org.telegram.ui.ActionBar.AlertDialog;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ActionBar.ThemeDescription;
import org.telegram.ui.Cells.CheckBoxCell;
import org.telegram.ui.Cells.HeaderCell;
import org.telegram.ui.Cells.ShadowSectionCell;
import org.telegram.ui.Cells.TextDetailSettingsCell;
import org.telegram.ui.Cells.TextInfoPrivacyCell;
import org.telegram.ui.Cells.TextSettingsCell;
import org.telegram.ui.Components.AlertsCreator;
import org.telegram.ui.Components.AvatarDrawable;
import org.telegram.ui.Components.BackupImageView;
2020-07-26 18:07:20 +02:00
import org.telegram.ui.Components.ChatAttachAlert;
2018-07-30 04:07:02 +02:00
import org.telegram.ui.Components.ContextProgressView;
import org.telegram.ui.Components.EditTextBoldCursor;
import org.telegram.ui.Components.EmptyTextProgressView;
import org.telegram.ui.Components.HintEditText;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.RadialProgress;
import org.telegram.ui.Components.SlideView;
import org.telegram.ui.Components.URLSpanNoUnderline;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
2018-08-27 10:33:11 +02:00
import java.util.Iterator;
2018-07-30 04:07:02 +02:00
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import javax.crypto.Cipher;
2020-07-26 18:07:20 +02:00
import tw.nekomimi.nekogram.utils.VibrateUtil;
2020-07-19 02:22:26 +02:00
2018-07-30 04:07:02 +02:00
public class PassportActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
public final static int TYPE_REQUEST = 0;
public final static int TYPE_IDENTITY = 1;
public final static int TYPE_ADDRESS = 2;
public final static int TYPE_PHONE = 3;
public final static int TYPE_EMAIL = 4;
public final static int TYPE_PASSWORD = 5;
public final static int TYPE_EMAIL_VERIFICATION = 6;
public final static int TYPE_PHONE_VERIFICATION = 7;
public final static int TYPE_MANAGE = 8;
private final static int FIELD_NAME = 0;
2018-08-27 10:33:11 +02:00
private final static int FIELD_MIDNAME = 1;
private final static int FIELD_SURNAME = 2;
private final static int FIELD_BIRTHDAY = 3;
private final static int FIELD_GENDER = 4;
private final static int FIELD_CITIZENSHIP = 5;
private final static int FIELD_RESIDENCE = 6;
private final static int FIELD_CARDNUMBER = 7;
private final static int FIELD_EXPIRE = 8;
private final static int FIELD_IDENTITY_COUNT = 9;
private final static int FIELD_IDENTITY_NODOC_COUNT = 7;
private final static int FIELD_NATIVE_NAME = 0;
private final static int FIELD_NATIVE_MIDNAME = 1;
private final static int FIELD_NATIVE_SURNAME = 2;
private final static int FIELD_NATIVE_COUNT = 3;
2018-07-30 04:07:02 +02:00
private final static int FIELD_STREET1 = 0;
private final static int FIELD_STREET2 = 1;
private final static int FIELD_POSTCODE = 2;
private final static int FIELD_CITY = 3;
private final static int FIELD_STATE = 4;
private final static int FIELD_COUNTRY = 5;
private final static int FIELD_ADDRESS_COUNT = 6;
private final static int FIELD_PHONECOUNTRY = 0;
private final static int FIELD_PHONECODE = 1;
private final static int FIELD_PHONE = 2;
private final static int FIELD_EMAIL = 0;
private final static int FIELD_PASSWORD = 0;
private final static int UPLOADING_TYPE_DOCUMENTS = 0;
private final static int UPLOADING_TYPE_SELFIE = 1;
private final static int UPLOADING_TYPE_FRONT = 2;
private final static int UPLOADING_TYPE_REVERSE = 3;
2018-08-27 10:33:11 +02:00
private final static int UPLOADING_TYPE_TRANSLATION = 4;
2018-07-30 04:07:02 +02:00
private String initialValues;
private int currentActivityType;
2021-09-20 00:10:42 +02:00
private long currentBotId;
2018-07-30 04:07:02 +02:00
private String currentPayload;
2018-08-29 00:59:16 +02:00
private String currentNonce;
2018-07-30 04:07:02 +02:00
private boolean useCurrentValue;
private String currentScope;
private String currentCallbackUrl;
private String currentPublicKey;
private String currentCitizeship = "";
private String currentResidence = "";
private String currentGender;
private int[] currentExpireDate = new int[3];
private TLRPC.TL_account_authorizationForm currentForm;
2018-08-27 10:33:11 +02:00
private TLRPC.TL_secureRequiredType currentType;
private TLRPC.TL_secureRequiredType currentDocumentsType;
private ArrayList<TLRPC.TL_secureRequiredType> availableDocumentTypes;
2018-07-30 04:07:02 +02:00
private TLRPC.TL_secureValue currentTypeValue;
private TLRPC.TL_secureValue currentDocumentsTypeValue;
2018-08-27 10:33:11 +02:00
private TLRPC.TL_account_password currentPassword;
2018-07-30 04:07:02 +02:00
private TLRPC.TL_auth_sentCode currentPhoneVerification;
private ActionBarMenuItem doneItem;
private AnimatorSet doneItemAnimation;
private ContextProgressView progressView;
private TextView acceptTextView;
private ContextProgressView progressViewButton;
private FrameLayout bottomLayout;
private TextSettingsCell uploadDocumentCell;
private View extraBackgroundView;
2018-08-27 10:33:11 +02:00
private View extraBackgroundView2;
2018-07-30 04:07:02 +02:00
private TextDetailSettingsCell uploadFrontCell;
private TextDetailSettingsCell uploadReverseCell;
private TextDetailSettingsCell uploadSelfieCell;
2018-08-27 10:33:11 +02:00
private TextSettingsCell uploadTranslationCell;
2018-07-30 04:07:02 +02:00
private EditTextBoldCursor[] inputFields;
private ViewGroup[] inputFieldContainers;
2018-08-27 10:33:11 +02:00
private EditTextBoldCursor[] inputExtraFields;
2018-07-30 04:07:02 +02:00
private ScrollView scrollView;
private LinearLayout linearLayout2;
private LinearLayout documentsLayout;
private LinearLayout frontLayout;
private LinearLayout reverseLayout;
private LinearLayout selfieLayout;
2018-08-27 10:33:11 +02:00
private LinearLayout translationLayout;
2018-07-30 04:07:02 +02:00
private LinearLayout currentPhotoViewerLayout;
private HeaderCell headerCell;
private ArrayList<View> dividers = new ArrayList<>();
private ShadowSectionCell sectionCell;
2018-08-27 10:33:11 +02:00
private ShadowSectionCell sectionCell2;
2018-07-30 04:07:02 +02:00
private TextInfoPrivacyCell bottomCell;
2018-08-27 10:33:11 +02:00
private TextInfoPrivacyCell bottomCellTranslation;
private TextInfoPrivacyCell topErrorCell;
private TextInfoPrivacyCell nativeInfoCell;
2018-07-30 04:07:02 +02:00
private TextSettingsCell scanDocumentCell;
2019-01-23 18:03:33 +01:00
private int scrollHeight;
2018-08-27 10:33:11 +02:00
private boolean[] nonLatinNames = new boolean[3];
private boolean allowNonLatinName = true;
private boolean documentOnly;
2018-07-30 04:07:02 +02:00
private TextView plusTextView;
private TextSettingsCell addDocumentCell;
private TextSettingsCell deletePassportCell;
private ShadowSectionCell addDocumentSectionCell;
private LinearLayout emptyLayout;
private ImageView emptyImageView;
private TextView emptyTextView1;
private TextView emptyTextView2;
private TextView emptyTextView3;
private EmptyTextProgressView emptyView;
private TextInfoPrivacyCell passwordRequestTextView;
private TextInfoPrivacyCell passwordInfoRequestTextView;
private ImageView noPasswordImageView;
private TextView noPasswordTextView;
private TextView noPasswordSetTextView;
private FrameLayout passwordAvatarContainer;
private TextView passwordForgotButton;
private int usingSavedPassword;
private byte[] savedPasswordHash;
private byte[] savedSaltedPassword;
private String currentPicturePath;
private ChatAttachAlert chatAttachAlert;
private int uploadingFileType;
private int emailCodeLength;
private ArrayList<String> countriesArray = new ArrayList<>();
private HashMap<String, String> countriesMap = new HashMap<>();
private HashMap<String, String> codesMap = new HashMap<>();
private HashMap<String, String> phoneFormatMap = new HashMap<>();
private HashMap<String, String> languageMap;
private boolean ignoreOnTextChange;
private boolean ignoreOnPhoneChange;
private static final int info_item = 1;
private static final int done_button = 2;
private final static int attach_photo = 0;
private final static int attach_document = 4;
private long secureSecretId;
private byte[] secureSecret;
private String currentEmail;
private byte[] saltedPassword;
private boolean ignoreOnFailure;
private boolean callbackCalled;
private PassportActivity presentAfterAnimation;
private ArrayList<SecureDocument> documents = new ArrayList<>();
private SecureDocument selfieDocument;
2018-08-27 10:33:11 +02:00
private ArrayList<SecureDocument> translationDocuments = new ArrayList<>();
2018-07-30 04:07:02 +02:00
private SecureDocument frontDocument;
private SecureDocument reverseDocument;
private HashMap<SecureDocument, SecureDocumentCell> documentsCells = new HashMap<>();
private HashMap<String, SecureDocument> uploadingDocuments = new HashMap<>();
2018-08-27 10:33:11 +02:00
private HashMap<TLRPC.TL_secureRequiredType, HashMap<String, String>> typesValues = new HashMap<>();
private HashMap<TLRPC.TL_secureRequiredType, TextDetailSecureCell> typesViews = new HashMap<>();
private HashMap<TLRPC.TL_secureRequiredType, TLRPC.TL_secureRequiredType> documentsToTypesLink = new HashMap<>();
2018-07-30 04:07:02 +02:00
private HashMap<String, String> currentValues;
2018-08-27 10:33:11 +02:00
private HashMap<String, String> currentDocumentValues;
2018-07-30 04:07:02 +02:00
private HashMap<String, HashMap<String, String>> errorsMap = new HashMap<>();
2018-08-27 10:33:11 +02:00
private HashMap<String, String> mainErrorsMap = new HashMap<>();
2018-07-30 04:07:02 +02:00
private HashMap<String, String> fieldsErrors;
private HashMap<String, String> documentsErrors;
private HashMap<String, String> errorsValues = new HashMap<>();
private CharSequence noAllDocumentsErrorText;
2018-08-27 10:33:11 +02:00
private CharSequence noAllTranslationErrorText;
2018-07-30 04:07:02 +02:00
private PassportActivityDelegate delegate;
private boolean needActivityResult;
private interface PassportActivityDelegate {
2018-08-27 10:33:11 +02:00
void saveValue(TLRPC.TL_secureRequiredType type, String text, String json, TLRPC.TL_secureRequiredType documentType, String documentsJson, ArrayList<SecureDocument> documents, SecureDocument selfie, ArrayList<SecureDocument> translationDocuments, SecureDocument front, SecureDocument reverse, Runnable finishRunnable, ErrorRunnable errorRunnable);
void deleteValue(TLRPC.TL_secureRequiredType type, TLRPC.TL_secureRequiredType documentType, ArrayList<TLRPC.TL_secureRequiredType> documentRequiredTypes, boolean deleteType, Runnable finishRunnable, ErrorRunnable errorRunnable);
2018-07-30 04:07:02 +02:00
SecureDocument saveFile(TLRPC.TL_secureFile secureFile);
}
private interface ErrorRunnable {
void onError(String error, String text);
}
private PhotoViewer.PhotoViewerProvider provider = new PhotoViewer.EmptyPhotoViewerProvider() {
@Override
2019-03-03 21:40:48 +01:00
public PhotoViewer.PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index, boolean needPreview) {
2018-07-30 04:07:02 +02:00
if (index < 0 || index >= currentPhotoViewerLayout.getChildCount()) {
return null;
}
SecureDocumentCell cell = (SecureDocumentCell) currentPhotoViewerLayout.getChildAt(index);
2019-05-14 14:08:05 +02:00
int[] coords = new int[2];
2018-07-30 04:07:02 +02:00
cell.imageView.getLocationInWindow(coords);
PhotoViewer.PlaceProviderObject object = new PhotoViewer.PlaceProviderObject();
object.viewX = coords[0];
object.viewY = coords[1] - (Build.VERSION.SDK_INT >= 21 ? 0 : AndroidUtilities.statusBarHeight);
object.parentView = currentPhotoViewerLayout;
object.imageReceiver = cell.imageView.getImageReceiver();
object.thumb = object.imageReceiver.getBitmapSafe();
return object;
}
@Override
public void deleteImageAtIndex(int index) {
SecureDocument document;
if (uploadingFileType == UPLOADING_TYPE_SELFIE) {
document = selfieDocument;
2018-08-27 10:33:11 +02:00
} else if (uploadingFileType == UPLOADING_TYPE_TRANSLATION) {
document = translationDocuments.get(index);
2018-07-30 04:07:02 +02:00
} else if (uploadingFileType == UPLOADING_TYPE_FRONT) {
document = frontDocument;
} else if (uploadingFileType == UPLOADING_TYPE_REVERSE) {
document = reverseDocument;
} else {
document = documents.get(index);
}
SecureDocumentCell cell = documentsCells.remove(document);
if (cell == null) {
return;
}
String key = null;
String hash = getDocumentHash(document);
if (uploadingFileType == UPLOADING_TYPE_SELFIE) {
selfieDocument = null;
key = "selfie" + hash;
2018-08-27 10:33:11 +02:00
} else if (uploadingFileType == UPLOADING_TYPE_TRANSLATION) {
key = "translation" + hash;
2018-07-30 04:07:02 +02:00
} else if (uploadingFileType == UPLOADING_TYPE_FRONT) {
frontDocument = null;
key = "front" + hash;
} else if (uploadingFileType == UPLOADING_TYPE_REVERSE) {
reverseDocument = null;
key = "reverse" + hash;
} else if (uploadingFileType == UPLOADING_TYPE_DOCUMENTS) {
key = "files" + hash;
}
if (key != null) {
if (documentsErrors != null) {
documentsErrors.remove(key);
}
if (errorsValues != null) {
errorsValues.remove(key);
}
}
updateUploadText(uploadingFileType);
currentPhotoViewerLayout.removeView(cell);
}
@Override
public String getDeleteMessageString() {
if (uploadingFileType == UPLOADING_TYPE_SELFIE) {
return LocaleController.formatString("PassportDeleteSelfieAlert", R.string.PassportDeleteSelfieAlert);
} else {
return LocaleController.formatString("PassportDeleteScanAlert", R.string.PassportDeleteScanAlert);
}
}
};
public class LinkSpan extends ClickableSpan {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(true);
ds.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
}
@Override
public void onClick(View widget) {
Browser.openUrl(getParentActivity(), currentForm.privacy_policy_url);
}
}
public class TextDetailSecureCell extends FrameLayout {
private TextView textView;
private TextView valueTextView;
private ImageView checkImageView;
private boolean needDivider;
public TextDetailSecureCell(Context context) {
super(context);
2019-01-23 18:03:33 +01:00
int padding = currentActivityType == TYPE_MANAGE ? 21 : 51;
2018-07-30 04:07:02 +02:00
textView = new TextView(context);
textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
textView.setLines(1);
textView.setMaxLines(1);
textView.setSingleLine(true);
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
2019-01-23 18:03:33 +01:00
addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? padding : 21), 10, (LocaleController.isRTL ? 21 : padding), 0));
2018-07-30 04:07:02 +02:00
valueTextView = new TextView(context);
valueTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2));
valueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
valueTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
valueTextView.setLines(1);
valueTextView.setMaxLines(1);
valueTextView.setSingleLine(true);
valueTextView.setEllipsize(TextUtils.TruncateAt.END);
valueTextView.setPadding(0, 0, 0, 0);
2019-01-23 18:03:33 +01:00
addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? padding : 21), 35, (LocaleController.isRTL ? 21 : padding), 0));
2018-07-30 04:07:02 +02:00
checkImageView = new ImageView(context);
2020-06-25 17:12:58 +02:00
checkImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_featuredStickers_addedIcon), PorterDuff.Mode.SRC_IN));
2018-07-30 04:07:02 +02:00
checkImageView.setImageResource(R.drawable.sticker_added);
2019-01-23 18:03:33 +01:00
addView(checkImageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.TOP, 21, 25, 21, 0));
2018-07-30 04:07:02 +02:00
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(64) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY));
}
public void setTextAndValue(String text, CharSequence value, boolean divider) {
textView.setText(text);
valueTextView.setText(value);
needDivider = divider;
setWillNotDraw(!divider);
}
public void setChecked(boolean checked) {
checkImageView.setVisibility(checked ? VISIBLE : INVISIBLE);
}
public void setValue(CharSequence value) {
valueTextView.setText(value);
}
public void setNeedDivider(boolean value) {
needDivider = value;
setWillNotDraw(!needDivider);
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
if (needDivider) {
2020-06-26 03:47:42 +02:00
canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint);
2018-07-30 04:07:02 +02:00
}
}
}
public class SecureDocumentCell extends FrameLayout implements DownloadController.FileDownloadProgressListener {
private TextView textView;
private TextView valueTextView;
private BackupImageView imageView;
private RadialProgress radialProgress;
private int buttonState;
private SecureDocument currentSecureDocument;
private int TAG;
public SecureDocumentCell(Context context) {
super(context);
TAG = DownloadController.getInstance(currentAccount).generateObserverTag();
radialProgress = new RadialProgress(this);
imageView = new BackupImageView(context);
2019-01-23 18:03:33 +01:00
addView(imageView, LayoutHelper.createFrame(48, 48, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 21, 8, 21, 0));
2018-07-30 04:07:02 +02:00
textView = new TextView(context);
textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
textView.setLines(1);
textView.setMaxLines(1);
textView.setSingleLine(true);
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
2019-01-23 18:03:33 +01:00
addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 21 : 81), 10, (LocaleController.isRTL ? 81 : 21), 0));
2018-07-30 04:07:02 +02:00
valueTextView = new TextView(context);
valueTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2));
valueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
valueTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
valueTextView.setLines(1);
valueTextView.setMaxLines(1);
valueTextView.setSingleLine(true);
valueTextView.setPadding(0, 0, 0, 0);
2019-01-23 18:03:33 +01:00
addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 21 : 81), 35, (LocaleController.isRTL ? 81 : 21), 0));
2018-07-30 04:07:02 +02:00
setWillNotDraw(false);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(64) + 1, MeasureSpec.EXACTLY));
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
int x = imageView.getLeft() + (imageView.getMeasuredWidth() - AndroidUtilities.dp(24)) / 2;
int y = imageView.getTop() + (imageView.getMeasuredHeight() - AndroidUtilities.dp(24)) / 2;
radialProgress.setProgressRect(x, y, x + AndroidUtilities.dp(24), y + AndroidUtilities.dp(24));
}
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
boolean result = super.drawChild(canvas, child, drawingTime);
if (child == imageView) {
radialProgress.draw(canvas);
}
return result;
}
public void setTextAndValueAndImage(String text, CharSequence value, SecureDocument document) {
textView.setText(text);
valueTextView.setText(value);
imageView.setImage(document, "48_48");
currentSecureDocument = document;
updateButtonState(false);
}
public void setValue(CharSequence value) {
valueTextView.setText(value);
}
public void updateButtonState(boolean animated) {
String fileName = FileLoader.getAttachFileName(currentSecureDocument);
2022-06-21 04:51:00 +02:00
File path = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(currentSecureDocument);
2018-07-30 04:07:02 +02:00
boolean fileExists = path.exists();
if (TextUtils.isEmpty(fileName)) {
radialProgress.setBackground(null, false, false);
return;
}
if (currentSecureDocument.path != null) {
if (currentSecureDocument.inputFile != null) {
DownloadController.getInstance(currentAccount).removeLoadingFileObserver(this);
radialProgress.setBackground(null, false, animated);
buttonState = -1;
} else {
DownloadController.getInstance(currentAccount).addLoadingFileObserver(currentSecureDocument.path, this);
buttonState = 1;
Float progress = ImageLoader.getInstance().getFileProgress(currentSecureDocument.path);
radialProgress.setBackground(Theme.chat_photoStatesDrawables[5][0], true, animated);
radialProgress.setProgress(progress != null ? progress : 0, false);
invalidate();
}
} else {
if (fileExists) {
DownloadController.getInstance(currentAccount).removeLoadingFileObserver(this);
buttonState = -1;
radialProgress.setBackground(null, false, animated);
invalidate();
} else {
DownloadController.getInstance(currentAccount).addLoadingFileObserver(fileName, this);
buttonState = 1;
Float progress = ImageLoader.getInstance().getFileProgress(fileName);
radialProgress.setBackground(Theme.chat_photoStatesDrawables[5][0], true, animated);
radialProgress.setProgress(progress != null ? progress : 0, animated);
invalidate();
}
}
}
@Override
public void invalidate() {
super.invalidate();
textView.invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
2020-06-26 03:47:42 +02:00
canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint);
2018-07-30 04:07:02 +02:00
}
@Override
2019-01-23 18:03:33 +01:00
public void onFailedDownload(String fileName, boolean canceled) {
2018-07-30 04:07:02 +02:00
updateButtonState(false);
}
@Override
public void onSuccessDownload(String fileName) {
radialProgress.setProgress(1, true);
updateButtonState(true);
}
@Override
2020-01-23 07:15:40 +01:00
public void onProgressDownload(String fileName, long downloadedSize, long totalSize) {
radialProgress.setProgress(Math.min(1f, downloadedSize / (float) totalSize), true);
2018-07-30 04:07:02 +02:00
if (buttonState != 1) {
updateButtonState(false);
}
}
@Override
2020-01-23 07:15:40 +01:00
public void onProgressUpload(String fileName, long uploadedSize, long totalSize, boolean isEncrypted) {
radialProgress.setProgress(Math.min(1f, uploadedSize / (float) totalSize), true);
2018-07-30 04:07:02 +02:00
}
@Override
public int getObserverTag() {
return TAG;
}
}
2021-09-20 00:10:42 +02:00
public PassportActivity(int type, long botId, String scope, String publicKey, String payload, String nonce, String callbackUrl, TLRPC.TL_account_authorizationForm form, TLRPC.TL_account_password accountPassword) {
2018-08-27 10:33:11 +02:00
this(type, form, accountPassword, null, null, null, null, null, null);
2018-07-30 04:07:02 +02:00
currentBotId = botId;
currentPayload = payload;
2018-08-29 00:59:16 +02:00
currentNonce = nonce;
2018-07-30 04:07:02 +02:00
currentScope = scope;
currentPublicKey = publicKey;
currentCallbackUrl = callbackUrl;
if (type == TYPE_REQUEST) {
if (!form.errors.isEmpty()) {
try {
2018-08-27 10:33:11 +02:00
Collections.sort(form.errors, new Comparator<TLRPC.SecureValueError>() {
int getErrorValue(TLRPC.SecureValueError error) {
if (error instanceof TLRPC.TL_secureValueError) {
return 0;
} else if (error instanceof TLRPC.TL_secureValueErrorFrontSide) {
return 1;
} else if (error instanceof TLRPC.TL_secureValueErrorReverseSide) {
return 2;
} else if (error instanceof TLRPC.TL_secureValueErrorSelfie) {
return 3;
} else if (error instanceof TLRPC.TL_secureValueErrorTranslationFile) {
return 4;
} else if (error instanceof TLRPC.TL_secureValueErrorTranslationFiles) {
return 5;
} else if (error instanceof TLRPC.TL_secureValueErrorFile) {
return 6;
} else if (error instanceof TLRPC.TL_secureValueErrorFiles) {
return 7;
} else if (error instanceof TLRPC.TL_secureValueErrorData) {
TLRPC.TL_secureValueErrorData errorData = (TLRPC.TL_secureValueErrorData) error;
return getFieldCost(errorData.field);
}
return 100;
}
@Override
public int compare(TLRPC.SecureValueError e1, TLRPC.SecureValueError e2) {
int val1 = getErrorValue(e1);
int val2 = getErrorValue(e2);
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
}
return 0;
}
});
2018-07-30 04:07:02 +02:00
for (int a = 0, size = form.errors.size(); a < size; a++) {
TLRPC.SecureValueError secureValueError = form.errors.get(a);
String key;
String description;
String target;
String field = null;
byte[] file_hash = null;
if (secureValueError instanceof TLRPC.TL_secureValueErrorFrontSide) {
TLRPC.TL_secureValueErrorFrontSide secureValueErrorFrontSide = (TLRPC.TL_secureValueErrorFrontSide) secureValueError;
key = getNameForType(secureValueErrorFrontSide.type);
description = secureValueErrorFrontSide.text;
file_hash = secureValueErrorFrontSide.file_hash;
target = "front";
} else if (secureValueError instanceof TLRPC.TL_secureValueErrorReverseSide) {
TLRPC.TL_secureValueErrorReverseSide secureValueErrorReverseSide = (TLRPC.TL_secureValueErrorReverseSide) secureValueError;
key = getNameForType(secureValueErrorReverseSide.type);
description = secureValueErrorReverseSide.text;
file_hash = secureValueErrorReverseSide.file_hash;
target = "reverse";
} else if (secureValueError instanceof TLRPC.TL_secureValueErrorSelfie) {
TLRPC.TL_secureValueErrorSelfie secureValueErrorSelfie = (TLRPC.TL_secureValueErrorSelfie) secureValueError;
key = getNameForType(secureValueErrorSelfie.type);
description = secureValueErrorSelfie.text;
file_hash = secureValueErrorSelfie.file_hash;
target = "selfie";
2018-08-27 10:33:11 +02:00
} else if (secureValueError instanceof TLRPC.TL_secureValueErrorTranslationFile) {
TLRPC.TL_secureValueErrorTranslationFile secureValueErrorTranslationFile = (TLRPC.TL_secureValueErrorTranslationFile) secureValueError;
key = getNameForType(secureValueErrorTranslationFile.type);
description = secureValueErrorTranslationFile.text;
file_hash = secureValueErrorTranslationFile.file_hash;
target = "translation";
} else if (secureValueError instanceof TLRPC.TL_secureValueErrorTranslationFiles) {
TLRPC.TL_secureValueErrorTranslationFiles secureValueErrorTranslationFiles = (TLRPC.TL_secureValueErrorTranslationFiles) secureValueError;
key = getNameForType(secureValueErrorTranslationFiles.type);
description = secureValueErrorTranslationFiles.text;
target = "translation";
2018-07-30 04:07:02 +02:00
} else if (secureValueError instanceof TLRPC.TL_secureValueErrorFile) {
TLRPC.TL_secureValueErrorFile secureValueErrorFile = (TLRPC.TL_secureValueErrorFile) secureValueError;
key = getNameForType(secureValueErrorFile.type);
description = secureValueErrorFile.text;
file_hash = secureValueErrorFile.file_hash;
target = "files";
} else if (secureValueError instanceof TLRPC.TL_secureValueErrorFiles) {
TLRPC.TL_secureValueErrorFiles secureValueErrorFiles = (TLRPC.TL_secureValueErrorFiles) secureValueError;
key = getNameForType(secureValueErrorFiles.type);
description = secureValueErrorFiles.text;
target = "files";
2018-08-27 10:33:11 +02:00
} else if (secureValueError instanceof TLRPC.TL_secureValueError) {
TLRPC.TL_secureValueError secureValueErrorAll = (TLRPC.TL_secureValueError) secureValueError;
key = getNameForType(secureValueErrorAll.type);
description = secureValueErrorAll.text;
file_hash = secureValueErrorAll.hash;
target = "error_all";
2018-07-30 04:07:02 +02:00
} else if (secureValueError instanceof TLRPC.TL_secureValueErrorData) {
TLRPC.TL_secureValueErrorData secureValueErrorData = (TLRPC.TL_secureValueErrorData) secureValueError;
boolean found = false;
for (int b = 0; b < form.values.size(); b++) {
TLRPC.TL_secureValue value = form.values.get(b);
if (value.data != null && Arrays.equals(value.data.data_hash, secureValueErrorData.data_hash)) {
found = true;
break;
}
}
if (!found) {
continue;
}
key = getNameForType(secureValueErrorData.type);
description = secureValueErrorData.text;
field = secureValueErrorData.field;
file_hash = secureValueErrorData.data_hash;
target = "data";
} else {
continue;
}
HashMap<String, String> vals = errorsMap.get(key);
if (vals == null) {
vals = new HashMap<>();
errorsMap.put(key, vals);
2018-08-27 10:33:11 +02:00
mainErrorsMap.put(key, description);
2018-07-30 04:07:02 +02:00
}
String hash;
if (file_hash != null) {
hash = Base64.encodeToString(file_hash, Base64.NO_WRAP);
} else {
hash = "";
}
2019-07-18 15:01:39 +02:00
switch (target) {
case "data":
if (field != null) {
vals.put(field, description);
}
break;
case "files":
if (file_hash != null) {
vals.put("files" + hash, description);
} else {
vals.put("files_all", description);
}
break;
case "selfie":
vals.put("selfie" + hash, description);
break;
case "translation":
if (file_hash != null) {
vals.put("translation" + hash, description);
} else {
vals.put("translation_all", description);
}
break;
case "front":
vals.put("front" + hash, description);
break;
case "reverse":
vals.put("reverse" + hash, description);
break;
case "error_all":
vals.put("error_all", description);
break;
2018-07-30 04:07:02 +02:00
}
}
} catch (Exception ignore) {
}
}
}
}
2018-08-27 10:33:11 +02:00
public PassportActivity(int type, TLRPC.TL_account_authorizationForm form, TLRPC.TL_account_password accountPassword, TLRPC.TL_secureRequiredType secureType, TLRPC.TL_secureValue secureValue, TLRPC.TL_secureRequiredType secureDocumentsType, TLRPC.TL_secureValue secureDocumentsValue, HashMap<String, String> values, HashMap<String, String> documentValues) {
2018-07-30 04:07:02 +02:00
super();
currentActivityType = type;
currentForm = form;
currentType = secureType;
2018-08-27 10:33:11 +02:00
if (currentType != null) {
allowNonLatinName = currentType.native_names;
}
2018-07-30 04:07:02 +02:00
currentTypeValue = secureValue;
currentDocumentsType = secureDocumentsType;
currentDocumentsTypeValue = secureDocumentsValue;
currentPassword = accountPassword;
currentValues = values;
2018-08-27 10:33:11 +02:00
currentDocumentValues = documentValues;
2018-07-30 04:07:02 +02:00
if (currentActivityType == TYPE_PHONE) {
permissionsItems = new ArrayList<>();
} else if (currentActivityType == TYPE_PHONE_VERIFICATION) {
views = new SlideView[3];
}
if (currentValues == null) {
currentValues = new HashMap<>();
}
2018-08-27 10:33:11 +02:00
if (currentDocumentValues == null) {
currentDocumentValues = new HashMap<>();
}
2018-07-30 04:07:02 +02:00
if (type == TYPE_PASSWORD) {
if (UserConfig.getInstance(currentAccount).savedPasswordHash != null && UserConfig.getInstance(currentAccount).savedSaltedPassword != null) {
usingSavedPassword = 1;
savedPasswordHash = UserConfig.getInstance(currentAccount).savedPasswordHash;
savedSaltedPassword = UserConfig.getInstance(currentAccount).savedSaltedPassword;
}
if (currentPassword == null) {
loadPasswordInfo();
} else {
2018-08-27 10:33:11 +02:00
TwoStepVerificationActivity.initPasswordNewAlgo(currentPassword);
if (usingSavedPassword == 1) {
onPasswordDone(true);
}
}
if (!SharedConfig.isPassportConfigLoaded()) {
TLRPC.TL_help_getPassportConfig req = new TLRPC.TL_help_getPassportConfig();
req.hash = SharedConfig.passportConfigHash;
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (response instanceof TLRPC.TL_help_passportConfig) {
TLRPC.TL_help_passportConfig res = (TLRPC.TL_help_passportConfig) response;
SharedConfig.setPassportConfig(res.countries_langs.data, res.hash);
} else {
SharedConfig.getCountryLangs();
}
}));
2018-07-30 04:07:02 +02:00
}
}
}
@Override
public void onResume() {
super.onResume();
if (chatAttachAlert != null) {
chatAttachAlert.onResume();
}
if (currentActivityType == TYPE_PASSWORD && inputFieldContainers != null && inputFieldContainers[FIELD_PASSWORD] != null && inputFieldContainers[FIELD_PASSWORD].getVisibility() == View.VISIBLE) {
inputFields[FIELD_PASSWORD].requestFocus();
AndroidUtilities.showKeyboard(inputFields[FIELD_PASSWORD]);
2018-08-27 10:33:11 +02:00
AndroidUtilities.runOnUIThread(() -> {
if (inputFieldContainers != null && inputFieldContainers[FIELD_PASSWORD] != null && inputFieldContainers[FIELD_PASSWORD].getVisibility() == View.VISIBLE) {
inputFields[FIELD_PASSWORD].requestFocus();
AndroidUtilities.showKeyboard(inputFields[FIELD_PASSWORD]);
2018-07-30 04:07:02 +02:00
}
}, 200);
}
AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid);
}
@Override
public void onPause() {
super.onPause();
if (chatAttachAlert != null) {
chatAttachAlert.onPause();
}
}
@Override
public boolean onFragmentCreate() {
2021-06-25 02:43:10 +02:00
NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileUploaded);
NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileUploadFailed);
NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.twoStepPasswordChanged);
2019-01-23 18:03:33 +01:00
NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.didRemoveTwoStepPassword);
2018-07-30 04:07:02 +02:00
return super.onFragmentCreate();
}
@Override
public void onFragmentDestroy() {
super.onFragmentDestroy();
2021-06-25 02:43:10 +02:00
NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileUploaded);
NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileUploadFailed);
NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.twoStepPasswordChanged);
2019-01-23 18:03:33 +01:00
NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.didRemoveTwoStepPassword);
2018-07-30 04:07:02 +02:00
callCallback(false);
if (chatAttachAlert != null) {
chatAttachAlert.dismissInternal();
chatAttachAlert.onDestroy();
}
if (currentActivityType == TYPE_PHONE_VERIFICATION) {
for (int a = 0; a < views.length; a++) {
if (views[a] != null) {
views[a].onDestroyActivity();
}
}
if (progressDialog != null) {
try {
progressDialog.dismiss();
} catch (Exception e) {
FileLog.e(e);
}
progressDialog = null;
}
}
}
@Override
public View createView(Context context) {
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
actionBar.setAllowOverlayTitle(true);
actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
2018-08-27 10:33:11 +02:00
private boolean onIdentityDone(Runnable finishRunnable, ErrorRunnable errorRunnable) {
if (!uploadingDocuments.isEmpty() || checkFieldsForError()) {
return false;
}
if (allowNonLatinName) {
allowNonLatinName = false;
boolean error = false;
for (int a = 0; a < nonLatinNames.length; a++) {
if (nonLatinNames[a]) {
inputFields[a].setErrorText(LocaleController.getString("PassportUseLatinOnly", R.string.PassportUseLatinOnly));
if (!error) {
error = true;
String firstName = nonLatinNames[0] ? getTranslitString(inputExtraFields[FIELD_NATIVE_NAME].getText().toString()) : inputFields[FIELD_NAME].getText().toString();
String middleName = nonLatinNames[1] ? getTranslitString(inputExtraFields[FIELD_NATIVE_MIDNAME].getText().toString()) : inputFields[FIELD_MIDNAME].getText().toString();
String lastName = nonLatinNames[2] ? getTranslitString(inputExtraFields[FIELD_NATIVE_SURNAME].getText().toString()) : inputFields[FIELD_SURNAME].getText().toString();
if (!TextUtils.isEmpty(firstName) && !TextUtils.isEmpty(middleName) && !TextUtils.isEmpty(lastName)) {
int num = a;
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setMessage(LocaleController.formatString("PassportNameCheckAlert", R.string.PassportNameCheckAlert, firstName, middleName, lastName));
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setPositiveButton(LocaleController.getString("Done", R.string.Done), (dialogInterface, i) -> {
inputFields[FIELD_NAME].setText(firstName);
inputFields[FIELD_MIDNAME].setText(middleName);
inputFields[FIELD_SURNAME].setText(lastName);
showEditDoneProgress(true, true);
onIdentityDone(finishRunnable, errorRunnable);
});
builder.setNegativeButton(LocaleController.getString("Edit", R.string.Edit), (dialogInterface, i) -> onFieldError(inputFields[num]));
showDialog(builder.create());
} else {
onFieldError(inputFields[a]);
}
}
}
}
if (error) {
return false;
}
}
if (isHasNotAnyChanges()) {
finishFragment();
return false;
}
JSONObject json = null;
JSONObject documentsJson = null;
try {
if (!documentOnly) {
HashMap<String, String> valuesToSave = new HashMap<>(currentValues);
if (currentType.native_names) {
if (nativeInfoCell.getVisibility() == View.VISIBLE) {
valuesToSave.put("first_name_native", inputExtraFields[FIELD_NATIVE_NAME].getText().toString());
valuesToSave.put("middle_name_native", inputExtraFields[FIELD_NATIVE_MIDNAME].getText().toString());
valuesToSave.put("last_name_native", inputExtraFields[FIELD_NATIVE_SURNAME].getText().toString());
} else {
valuesToSave.put("first_name_native", inputFields[FIELD_NATIVE_NAME].getText().toString());
valuesToSave.put("middle_name_native", inputFields[FIELD_NATIVE_MIDNAME].getText().toString());
valuesToSave.put("last_name_native", inputFields[FIELD_NATIVE_SURNAME].getText().toString());
}
}
valuesToSave.put("first_name", inputFields[FIELD_NAME].getText().toString());
valuesToSave.put("middle_name", inputFields[FIELD_MIDNAME].getText().toString());
valuesToSave.put("last_name", inputFields[FIELD_SURNAME].getText().toString());
valuesToSave.put("birth_date", inputFields[FIELD_BIRTHDAY].getText().toString());
valuesToSave.put("gender", currentGender);
valuesToSave.put("country_code", currentCitizeship);
valuesToSave.put("residence_country_code", currentResidence);
json = new JSONObject();
ArrayList<String> keys = new ArrayList<>(valuesToSave.keySet());
Collections.sort(keys, (key1, key2) -> {
int val1 = getFieldCost(key1);
int val2 = getFieldCost(key2);
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
}
return 0;
});
for (int a = 0, size = keys.size(); a < size; a++) {
String key = keys.get(a);
json.put(key, valuesToSave.get(key));
}
}
if (currentDocumentsType != null) {
HashMap<String, String> valuesToSave = new HashMap<>(currentDocumentValues);
valuesToSave.put("document_no", inputFields[FIELD_CARDNUMBER].getText().toString());
if (currentExpireDate[0] != 0) {
valuesToSave.put("expiry_date", String.format(Locale.US, "%02d.%02d.%d", currentExpireDate[2], currentExpireDate[1], currentExpireDate[0]));
} else {
valuesToSave.put("expiry_date", "");
}
documentsJson = new JSONObject();
ArrayList<String> keys = new ArrayList<>(valuesToSave.keySet());
Collections.sort(keys, (key1, key2) -> {
int val1 = getFieldCost(key1);
int val2 = getFieldCost(key2);
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
}
return 0;
});
for (int a = 0, size = keys.size(); a < size; a++) {
String key = keys.get(a);
documentsJson.put(key, valuesToSave.get(key));
}
}
} catch (Exception ignore) {
}
if (fieldsErrors != null) {
fieldsErrors.clear();
}
if (documentsErrors != null) {
documentsErrors.clear();
}
delegate.saveValue(currentType, null, json != null ? json.toString() : null, currentDocumentsType, documentsJson != null ? documentsJson.toString() : null, null, selfieDocument, translationDocuments, frontDocument, reverseLayout != null && reverseLayout.getVisibility() == View.VISIBLE ? reverseDocument : null, finishRunnable, errorRunnable);
return true;
}
2018-07-30 04:07:02 +02:00
@Override
public void onItemClick(int id) {
if (id == -1) {
if (checkDiscard()) {
return;
}
if (currentActivityType == TYPE_REQUEST || currentActivityType == TYPE_PASSWORD) {
callCallback(false);
}
finishFragment();
} else if (id == info_item) {
if (getParentActivity() == null) {
return;
}
final TextView message = new TextView(getParentActivity());
2019-01-23 18:03:33 +01:00
String str2 = LocaleController.getString("PassportInfo2", R.string.PassportInfo2);
SpannableStringBuilder spanned = new SpannableStringBuilder(str2);
int index1 = str2.indexOf('*');
int index2 = str2.lastIndexOf('*');
if (index1 != -1 && index2 != -1) {
spanned.replace(index2, index2 + 1, "");
spanned.replace(index1, index1 + 1, "");
spanned.setSpan(new URLSpanNoUnderline(LocaleController.getString("PassportInfoUrl", R.string.PassportInfoUrl)) {
2018-07-30 04:07:02 +02:00
@Override
public void onClick(View widget) {
2020-07-26 10:03:38 +02:00
dismissCurrentDialog();
2018-07-30 04:07:02 +02:00
super.onClick(widget);
}
2019-01-23 18:03:33 +01:00
}, index1, index2 - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
2018-07-30 04:07:02 +02:00
}
message.setText(spanned);
message.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
message.setLinkTextColor(Theme.getColor(Theme.key_dialogTextLink));
message.setHighlightColor(Theme.getColor(Theme.key_dialogLinkSelection));
message.setPadding(AndroidUtilities.dp(23), 0, AndroidUtilities.dp(23), 0);
2019-01-23 18:03:33 +01:00
message.setMovementMethod(new AndroidUtilities.LinkMovementMethodMy());
2018-07-30 04:07:02 +02:00
message.setTextColor(Theme.getColor(Theme.key_dialogTextBlack));
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setView(message);
builder.setTitle(LocaleController.getString("PassportInfoTitle", R.string.PassportInfoTitle));
builder.setNegativeButton(LocaleController.getString("Close", R.string.Close), null);
showDialog(builder.create());
} else if (id == done_button) {
if (currentActivityType == TYPE_PASSWORD) {
onPasswordDone(false);
return;
}
2019-01-23 18:03:33 +01:00
if (currentActivityType == TYPE_PHONE_VERIFICATION) {
2021-12-07 14:02:02 +01:00
views[currentViewNum].onNextPressed(null);
2019-01-23 18:03:33 +01:00
} else {
final Runnable finishRunnable = () -> finishFragment();
final ErrorRunnable errorRunnable = new ErrorRunnable() {
@Override
public void onError(String error, String text) {
if ("PHONE_VERIFICATION_NEEDED".equals(error)) {
startPhoneVerification(true, text, finishRunnable, this, delegate);
} else {
showEditDoneProgress(true, false);
}
}
};
if (currentActivityType == TYPE_EMAIL) {
String value;
if (useCurrentValue) {
value = currentEmail;
2018-07-30 04:07:02 +02:00
} else {
2019-01-23 18:03:33 +01:00
if (checkFieldsForError()) {
return;
}
value = inputFields[FIELD_EMAIL].getText().toString();
2018-07-30 04:07:02 +02:00
}
2019-01-23 18:03:33 +01:00
delegate.saveValue(currentType, value, null, null, null, null, null, null, null, null, finishRunnable, errorRunnable);
} else if (currentActivityType == TYPE_PHONE) {
String value;
if (useCurrentValue) {
value = UserConfig.getInstance(currentAccount).getCurrentUser().phone;
} else {
if (checkFieldsForError()) {
return;
}
value = inputFields[FIELD_PHONECODE].getText().toString() + inputFields[FIELD_PHONE].getText().toString();
2018-07-30 04:07:02 +02:00
}
2019-01-23 18:03:33 +01:00
delegate.saveValue(currentType, value, null, null, null, null, null, null, null, null, finishRunnable, errorRunnable);
} else if (currentActivityType == TYPE_ADDRESS) {
if (!uploadingDocuments.isEmpty() || checkFieldsForError()) {
2018-07-30 04:07:02 +02:00
return;
}
2019-01-23 18:03:33 +01:00
if (isHasNotAnyChanges()) {
finishFragment();
return;
2018-08-27 10:33:11 +02:00
}
2019-01-23 18:03:33 +01:00
JSONObject json = null;
try {
if (!documentOnly) {
json = new JSONObject();
json.put("street_line1", inputFields[FIELD_STREET1].getText().toString());
json.put("street_line2", inputFields[FIELD_STREET2].getText().toString());
json.put("post_code", inputFields[FIELD_POSTCODE].getText().toString());
json.put("city", inputFields[FIELD_CITY].getText().toString());
json.put("state", inputFields[FIELD_STATE].getText().toString());
json.put("country_code", currentCitizeship);
}
} catch (Exception ignore) {
2018-07-30 04:07:02 +02:00
}
2019-01-23 18:03:33 +01:00
if (fieldsErrors != null) {
fieldsErrors.clear();
}
if (documentsErrors != null) {
documentsErrors.clear();
}
delegate.saveValue(currentType, null, json != null ? json.toString() : null, currentDocumentsType, null, documents, selfieDocument, translationDocuments, null, null, finishRunnable, errorRunnable);
} else if (currentActivityType == TYPE_IDENTITY) {
if (!onIdentityDone(finishRunnable, errorRunnable)) {
return;
}
} else if (currentActivityType == TYPE_EMAIL_VERIFICATION) {
final TLRPC.TL_account_verifyEmail req = new TLRPC.TL_account_verifyEmail();
req.email = currentValues.get("email");
req.code = inputFields[FIELD_EMAIL].getText().toString();
int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (error == null) {
delegate.saveValue(currentType, currentValues.get("email"), null, null, null, null, null, null, null, null, finishRunnable, errorRunnable);
} else {
AlertsCreator.processError(currentAccount, error, PassportActivity.this, req);
errorRunnable.onError(null, null);
}
}));
ConnectionsManager.getInstance(currentAccount).bindRequestToGuid(reqId, classGuid);
}
showEditDoneProgress(true, true);
2018-07-30 04:07:02 +02:00
}
}
}
});
if (currentActivityType == TYPE_PHONE_VERIFICATION) {
fragmentView = scrollView = new ScrollView(context) {
@Override
protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
return false;
}
2019-01-23 18:03:33 +01:00
@Override
public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) {
if (currentViewNum == 1 || currentViewNum == 2 || currentViewNum == 4) {
rectangle.bottom += AndroidUtilities.dp(40);
}
return super.requestChildRectangleOnScreen(child, rectangle, immediate);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
scrollHeight = MeasureSpec.getSize(heightMeasureSpec) - AndroidUtilities.dp(30);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
2018-07-30 04:07:02 +02:00
};
scrollView.setFillViewport(true);
AndroidUtilities.setScrollViewEdgeEffectColor(scrollView, Theme.getColor(Theme.key_actionBarDefault));
} else {
fragmentView = new FrameLayout(context);
FrameLayout frameLayout = (FrameLayout) fragmentView;
fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray));
scrollView = new ScrollView(context) {
@Override
protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
return false;
}
@Override
public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) {
rectangle.offset(child.getLeft() - child.getScrollX(), child.getTop() - child.getScrollY());
rectangle.top += AndroidUtilities.dp(20);
rectangle.bottom += AndroidUtilities.dp(50);
return super.requestChildRectangleOnScreen(child, rectangle, immediate);
}
};
scrollView.setFillViewport(true);
AndroidUtilities.setScrollViewEdgeEffectColor(scrollView, Theme.getColor(Theme.key_actionBarDefault));
frameLayout.addView(scrollView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, currentActivityType == TYPE_REQUEST ? 48 : 0));
linearLayout2 = new LinearLayout(context);
linearLayout2.setOrientation(LinearLayout.VERTICAL);
scrollView.addView(linearLayout2, new ScrollView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
}
if (currentActivityType != TYPE_REQUEST && currentActivityType != TYPE_MANAGE) {
ActionBarMenu menu = actionBar.createMenu();
2022-06-21 04:51:00 +02:00
doneItem = menu.addItemWithWidth(done_button, R.drawable.ic_ab_done, AndroidUtilities.dp(56), LocaleController.getString("Done", R.string.Done));
2018-07-30 04:07:02 +02:00
progressView = new ContextProgressView(context, 1);
2019-01-23 18:03:33 +01:00
progressView.setAlpha(0.0f);
progressView.setScaleX(0.1f);
progressView.setScaleY(0.1f);
2018-07-30 04:07:02 +02:00
progressView.setVisibility(View.INVISIBLE);
2019-01-23 18:03:33 +01:00
doneItem.addView(progressView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
2018-07-30 04:07:02 +02:00
if (currentActivityType == TYPE_IDENTITY || currentActivityType == TYPE_ADDRESS) {
if (chatAttachAlert != null) {
try {
if (chatAttachAlert.isShowing()) {
chatAttachAlert.dismiss();
}
} catch (Exception ignore) {
}
chatAttachAlert.onDestroy();
chatAttachAlert = null;
}
}
}
if (currentActivityType == TYPE_PASSWORD) {
createPasswordInterface(context);
} else if (currentActivityType == TYPE_REQUEST) {
createRequestInterface(context);
} else if (currentActivityType == TYPE_IDENTITY) {
createIdentityInterface(context);
fillInitialValues();
} else if (currentActivityType == TYPE_ADDRESS) {
createAddressInterface(context);
fillInitialValues();
} else if (currentActivityType == TYPE_PHONE) {
createPhoneInterface(context);
} else if (currentActivityType == TYPE_EMAIL) {
createEmailInterface(context);
} else if (currentActivityType == TYPE_EMAIL_VERIFICATION) {
createEmailVerificationInterface(context);
} else if (currentActivityType == TYPE_PHONE_VERIFICATION) {
createPhoneVerificationInterface(context);
} else if (currentActivityType == TYPE_MANAGE) {
createManageInterface(context);
}
return fragmentView;
}
@Override
public boolean dismissDialogOnPause(Dialog dialog) {
return dialog != chatAttachAlert && super.dismissDialogOnPause(dialog);
}
@Override
2020-07-26 10:03:38 +02:00
public void dismissCurrentDialog() {
2018-07-30 04:07:02 +02:00
if (chatAttachAlert != null && visibleDialog == chatAttachAlert) {
2020-04-24 11:21:58 +02:00
chatAttachAlert.getPhotoLayout().closeCamera(false);
2018-07-30 04:07:02 +02:00
chatAttachAlert.dismissInternal();
2020-04-24 11:21:58 +02:00
chatAttachAlert.getPhotoLayout().hideCamera(true);
2018-07-30 04:07:02 +02:00
return;
}
2020-07-26 10:03:38 +02:00
super.dismissCurrentDialog();
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
private String getTranslitString(String value) {
return LocaleController.getInstance().getTranslitString(value, true);
}
private int getFieldCost(String key) {
switch (key) {
case "first_name":
case "first_name_native":
return 20;
case "middle_name":
case "middle_name_native":
return 21;
case "last_name":
case "last_name_native":
return 22;
case "birth_date":
return 23;
case "gender":
return 24;
case "country_code":
return 25;
case "residence_country_code":
return 26;
case "document_no":
return 27;
case "expiry_date":
return 28;
case "street_line1":
return 29;
case "street_line2":
return 30;
case "post_code":
return 31;
case "city":
return 32;
case "state":
return 33;
}
return 100;
}
2018-07-30 04:07:02 +02:00
private void createPhoneVerificationInterface(Context context) {
actionBar.setTitle(LocaleController.getString("PassportPhone", R.string.PassportPhone));
FrameLayout frameLayout = new FrameLayout(context);
scrollView.addView(frameLayout, LayoutHelper.createScroll(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT));
for (int a = 0; a < 3; a++) {
views[a] = new PhoneConfirmationView(context, a + 2);
views[a].setVisibility(View.GONE);
frameLayout.addView(views[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, AndroidUtilities.isTablet() ? 26 : 18, 30, AndroidUtilities.isTablet() ? 26 : 18, 0));
}
final Bundle params = new Bundle();
params.putString("phone", currentValues.get("phone"));
fillNextCodeParams(params, currentPhoneVerification, false);
}
private void loadPasswordInfo() {
TLRPC.TL_account_getPassword req = new TLRPC.TL_account_getPassword();
2018-08-27 10:33:11 +02:00
int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (response != null) {
currentPassword = (TLRPC.TL_account_password) response;
if (!TwoStepVerificationActivity.canHandleCurrentPassword(currentPassword, false)) {
AlertsCreator.showUpdateAppAlert(getParentActivity(), LocaleController.getString("UpdateAppAlert", R.string.UpdateAppAlert), true);
return;
}
TwoStepVerificationActivity.initPasswordNewAlgo(currentPassword);
updatePasswordInterface();
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
if (inputFieldContainers[FIELD_PASSWORD].getVisibility() == View.VISIBLE) {
inputFields[FIELD_PASSWORD].requestFocus();
AndroidUtilities.showKeyboard(inputFields[FIELD_PASSWORD]);
}
if (usingSavedPassword == 1) {
onPasswordDone(true);
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}));
2018-07-30 04:07:02 +02:00
ConnectionsManager.getInstance(currentAccount).bindRequestToGuid(reqId, classGuid);
}
private void createEmailVerificationInterface(Context context) {
actionBar.setTitle(LocaleController.getString("PassportEmail", R.string.PassportEmail));
inputFields = new EditTextBoldCursor[1];
for (int a = 0; a < 1; a++) {
ViewGroup container = new FrameLayout(context);
2019-01-23 18:03:33 +01:00
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
2018-07-30 04:07:02 +02:00
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
inputFields[a] = new EditTextBoldCursor(context);
inputFields[a].setTag(a);
inputFields[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
inputFields[a].setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText));
inputFields[a].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setBackgroundDrawable(null);
inputFields[a].setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setCursorSize(AndroidUtilities.dp(20));
inputFields[a].setCursorWidth(1.5f);
inputFields[a].setInputType(InputType.TYPE_CLASS_PHONE);
inputFields[a].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
2019-07-18 15:01:39 +02:00
inputFields[a].setHint(LocaleController.getString("PassportEmailCode", R.string.PassportEmailCode));
2018-07-30 04:07:02 +02:00
inputFields[a].setSelection(inputFields[a].length());
inputFields[a].setPadding(0, 0, 0, AndroidUtilities.dp(6));
inputFields[a].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
2019-01-23 18:03:33 +01:00
container.addView(inputFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 21, 12, 21, 6));
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
inputFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_DONE || i == EditorInfo.IME_ACTION_NEXT) {
doneItem.callOnClick();
return true;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
return false;
2018-07-30 04:07:02 +02:00
});
inputFields[a].addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (ignoreOnTextChange) {
return;
}
if (emailCodeLength != 0 && inputFields[FIELD_EMAIL].length() == emailCodeLength) {
doneItem.callOnClick();
}
}
});
}
bottomCell = new TextInfoPrivacyCell(context);
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
bottomCell.setText(LocaleController.formatString("PassportEmailVerifyInfo", R.string.PassportEmailVerifyInfo, currentValues.get("email")));
linearLayout2.addView(bottomCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
private void createPasswordInterface(Context context) {
TLRPC.User botUser = null;
if (currentForm != null) {
for (int a = 0; a < currentForm.users.size(); a++) {
TLRPC.User user = currentForm.users.get(a);
if (user.id == currentBotId) {
botUser = user;
break;
}
}
} else {
botUser = UserConfig.getInstance(currentAccount).getCurrentUser();
}
FrameLayout frameLayout = (FrameLayout) fragmentView;
actionBar.setTitle(LocaleController.getString("TelegramPassport", R.string.TelegramPassport));
emptyView = new EmptyTextProgressView(context);
emptyView.showProgress();
frameLayout.addView(emptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
passwordAvatarContainer = new FrameLayout(context);
linearLayout2.addView(passwordAvatarContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 100));
BackupImageView avatarImageView = new BackupImageView(context);
avatarImageView.setRoundRadius(AndroidUtilities.dp(32));
passwordAvatarContainer.addView(avatarImageView, LayoutHelper.createFrame(64, 64, Gravity.CENTER, 0, 8, 0, 0));
AvatarDrawable avatarDrawable = new AvatarDrawable(botUser);
2021-04-17 01:59:59 +02:00
avatarImageView.setForUserOrChat(botUser, avatarDrawable);
2018-07-30 04:07:02 +02:00
passwordRequestTextView = new TextInfoPrivacyCell(context);
passwordRequestTextView.getTextView().setGravity(Gravity.CENTER_HORIZONTAL);
if (currentBotId == 0) {
passwordRequestTextView.setText(LocaleController.getString("PassportSelfRequest", R.string.PassportSelfRequest));
} else {
passwordRequestTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("PassportRequest", R.string.PassportRequest, UserObject.getFirstName(botUser))));
}
((FrameLayout.LayoutParams) passwordRequestTextView.getTextView().getLayoutParams()).gravity = Gravity.CENTER_HORIZONTAL;
2019-01-23 18:03:33 +01:00
linearLayout2.addView(passwordRequestTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 21, 0, 21, 0));
2018-07-30 04:07:02 +02:00
noPasswordImageView = new ImageView(context);
noPasswordImageView.setImageResource(R.drawable.no_password);
2020-06-25 17:12:58 +02:00
noPasswordImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.SRC_IN));
2018-07-30 04:07:02 +02:00
linearLayout2.addView(noPasswordImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 13, 0, 0));
noPasswordTextView = new TextView(context);
noPasswordTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
noPasswordTextView.setGravity(Gravity.CENTER_HORIZONTAL);
2019-01-23 18:03:33 +01:00
noPasswordTextView.setPadding(AndroidUtilities.dp(21), AndroidUtilities.dp(10), AndroidUtilities.dp(21), AndroidUtilities.dp(17));
2018-07-30 04:07:02 +02:00
noPasswordTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText4));
noPasswordTextView.setText(LocaleController.getString("TelegramPassportCreatePasswordInfo", R.string.TelegramPassportCreatePasswordInfo));
2019-01-23 18:03:33 +01:00
linearLayout2.addView(noPasswordTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 21, 10, 21, 0));
2018-07-30 04:07:02 +02:00
noPasswordSetTextView = new TextView(context);
noPasswordSetTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText5));
noPasswordSetTextView.setGravity(Gravity.CENTER);
noPasswordSetTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
noPasswordSetTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
noPasswordSetTextView.setText(LocaleController.getString("TelegramPassportCreatePassword", R.string.TelegramPassportCreatePassword));
2019-01-23 18:03:33 +01:00
linearLayout2.addView(noPasswordSetTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 24, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 21, 9, 21, 0));
2018-08-27 10:33:11 +02:00
noPasswordSetTextView.setOnClickListener(v -> {
2022-03-11 17:49:54 +01:00
TwoStepVerificationSetupActivity activity = new TwoStepVerificationSetupActivity(currentAccount, TwoStepVerificationSetupActivity.TYPE_CREATE_PASSWORD_STEP_1, currentPassword);
2018-08-27 10:33:11 +02:00
activity.setCloseAfterSet(true);
presentFragment(activity);
2018-07-30 04:07:02 +02:00
});
inputFields = new EditTextBoldCursor[1];
inputFieldContainers = new ViewGroup[1];
for (int a = 0; a < 1; a++) {
inputFieldContainers[a] = new FrameLayout(context);
2019-01-23 18:03:33 +01:00
linearLayout2.addView(inputFieldContainers[a], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
2018-07-30 04:07:02 +02:00
inputFieldContainers[a].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
inputFields[a] = new EditTextBoldCursor(context);
inputFields[a].setTag(a);
inputFields[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
inputFields[a].setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText));
inputFields[a].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setBackgroundDrawable(null);
inputFields[a].setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setCursorSize(AndroidUtilities.dp(20));
inputFields[a].setCursorWidth(1.5f);
inputFields[a].setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
inputFields[a].setMaxLines(1);
inputFields[a].setLines(1);
inputFields[a].setSingleLine(true);
inputFields[a].setTransformationMethod(PasswordTransformationMethod.getInstance());
inputFields[a].setTypeface(Typeface.DEFAULT);
inputFields[a].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
inputFields[a].setPadding(0, 0, 0, AndroidUtilities.dp(6));
inputFields[a].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
2019-01-23 18:03:33 +01:00
inputFieldContainers[a].addView(inputFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 21, 12, 21, 6));
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
inputFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_NEXT || i == EditorInfo.IME_ACTION_DONE) {
doneItem.callOnClick();
return true;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
return false;
2018-07-30 04:07:02 +02:00
});
inputFields[a].setCustomSelectionActionModeCallback(new ActionMode.Callback() {
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
public void onDestroyActionMode(ActionMode mode) {
}
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return false;
}
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
});
}
passwordInfoRequestTextView = new TextInfoPrivacyCell(context);
passwordInfoRequestTextView.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
passwordInfoRequestTextView.setText(LocaleController.formatString("PassportRequestPasswordInfo", R.string.PassportRequestPasswordInfo));
linearLayout2.addView(passwordInfoRequestTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
passwordForgotButton = new TextView(context);
passwordForgotButton.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4));
passwordForgotButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
passwordForgotButton.setText(LocaleController.getString("ForgotPassword", R.string.ForgotPassword));
passwordForgotButton.setPadding(0, 0, 0, 0);
2019-01-23 18:03:33 +01:00
linearLayout2.addView(passwordForgotButton, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, 30, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 21, 0, 21, 0));
2018-08-27 10:33:11 +02:00
passwordForgotButton.setOnClickListener(v -> {
if (currentPassword.has_recovery) {
needShowProgress();
TLRPC.TL_auth_requestPasswordRecovery req = new TLRPC.TL_auth_requestPasswordRecovery();
int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
needHideProgress();
if (error == null) {
final TLRPC.TL_auth_passwordRecovery res = (TLRPC.TL_auth_passwordRecovery) response;
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setMessage(LocaleController.formatString("RestoreEmailSent", R.string.RestoreEmailSent, res.email_pattern));
2019-12-31 14:08:08 +01:00
builder.setTitle(LocaleController.getString("RestoreEmailSentTitle", R.string.RestoreEmailSentTitle));
2018-08-27 10:33:11 +02:00
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialogInterface, i) -> {
currentPassword.email_unconfirmed_pattern = res.email_pattern;
TwoStepVerificationSetupActivity fragment = new TwoStepVerificationSetupActivity(currentAccount, TwoStepVerificationSetupActivity.TYPE_EMAIL_RECOVERY, currentPassword);
2018-08-27 10:33:11 +02:00
presentFragment(fragment);
});
Dialog dialog = showDialog(builder.create());
if (dialog != null) {
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
} else {
if (error.text.startsWith("FLOOD_WAIT")) {
int time = Utilities.parseInt(error.text);
String timeString;
if (time < 60) {
timeString = LocaleController.formatPluralString("Seconds", time);
} else {
timeString = LocaleController.formatPluralString("Minutes", time / 60);
}
showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString));
} else {
showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}
}), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin);
ConnectionsManager.getInstance(currentAccount).bindRequestToGuid(reqId, classGuid);
} else {
if (getParentActivity() == null) {
return;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
builder.setNegativeButton(LocaleController.getString("RestorePasswordResetAccount", R.string.RestorePasswordResetAccount), (dialog, which) -> Browser.openUrl(getParentActivity(), "https://telegram.org/deactivate?phone=" + UserConfig.getInstance(currentAccount).getClientPhone()));
builder.setTitle(LocaleController.getString("RestorePasswordNoEmailTitle", R.string.RestorePasswordNoEmailTitle));
builder.setMessage(LocaleController.getString("RestorePasswordNoEmailText", R.string.RestorePasswordNoEmailText));
showDialog(builder.create());
2018-07-30 04:07:02 +02:00
}
});
updatePasswordInterface();
}
private void onPasswordDone(final boolean saved) {
final String textPassword;
if (saved) {
textPassword = null;
} else {
textPassword = inputFields[FIELD_PASSWORD].getText().toString();
if (TextUtils.isEmpty(textPassword)) {
onPasscodeError(false);
return;
}
showEditDoneProgress(true, true);
}
2018-08-27 10:33:11 +02:00
Utilities.globalQueue.postRunnable(() -> {
TLRPC.TL_account_getPasswordSettings req = new TLRPC.TL_account_getPasswordSettings();
2018-07-30 04:07:02 +02:00
2019-05-14 14:08:05 +02:00
final byte[] x_bytes;
2018-08-27 10:33:11 +02:00
if (saved) {
x_bytes = savedPasswordHash;
} else if (currentPassword.current_algo instanceof TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) {
byte[] passwordBytes = AndroidUtilities.getStringBytes(textPassword);
TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow algo = (TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) currentPassword.current_algo;
x_bytes = SRPHelper.getX(passwordBytes, algo);
} else {
x_bytes = null;
}
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
RequestDelegate requestDelegate = new RequestDelegate() {
private void openRequestInterface() {
if (inputFields == null) {
return;
}
if (!saved) {
UserConfig.getInstance(currentAccount).savePassword(x_bytes, saltedPassword);
}
AndroidUtilities.hideKeyboard(inputFields[FIELD_PASSWORD]);
ignoreOnFailure = true;
int type;
if (currentBotId == 0) {
type = TYPE_MANAGE;
} else {
type = TYPE_REQUEST;
}
2018-08-29 00:59:16 +02:00
PassportActivity activity = new PassportActivity(type, currentBotId, currentScope, currentPublicKey, currentPayload, currentNonce, currentCallbackUrl, currentForm, currentPassword);
2018-08-27 10:33:11 +02:00
activity.currentEmail = currentEmail;
activity.currentAccount = currentAccount;
activity.saltedPassword = saltedPassword;
activity.secureSecret = secureSecret;
activity.secureSecretId = secureSecretId;
activity.needActivityResult = needActivityResult;
if (parentLayout == null || !parentLayout.checkTransitionAnimation()) {
presentFragment(activity, true);
} else {
presentAfterAnimation = activity;
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
private void resetSecret() {
TLRPC.TL_account_updatePasswordSettings req2 = new TLRPC.TL_account_updatePasswordSettings();
if (currentPassword.current_algo instanceof TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) {
TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow algo = (TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) currentPassword.current_algo;
req2.password = SRPHelper.startCheck(x_bytes, currentPassword.srp_id, currentPassword.srp_B, algo);
}
req2.new_settings = new TLRPC.TL_account_passwordInputSettings();
req2.new_settings.new_secure_settings = new TLRPC.TL_secureSecretSettings();
req2.new_settings.new_secure_settings.secure_secret = new byte[0];
req2.new_settings.new_secure_settings.secure_algo = new TLRPC.TL_securePasswordKdfAlgoUnknown();
req2.new_settings.new_secure_settings.secure_secret_id = 0;
req2.new_settings.flags |= 4;
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (error != null && "SRP_ID_INVALID".equals(error.text)) {
TLRPC.TL_account_getPassword getPasswordReq = new TLRPC.TL_account_getPassword();
ConnectionsManager.getInstance(currentAccount).sendRequest(getPasswordReq, (response2, error2) -> AndroidUtilities.runOnUIThread(() -> {
if (error2 == null) {
currentPassword = (TLRPC.TL_account_password) response2;
TwoStepVerificationActivity.initPasswordNewAlgo(currentPassword);
resetSecret();
}
}), ConnectionsManager.RequestFlagWithoutLogin);
return;
}
generateNewSecret();
}));
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
private void generateNewSecret() {
Utilities.globalQueue.postRunnable(() -> {
Utilities.random.setSeed(currentPassword.secure_random);
TLRPC.TL_account_updatePasswordSettings req1 = new TLRPC.TL_account_updatePasswordSettings();
if (currentPassword.current_algo instanceof TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) {
TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow algo = (TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) currentPassword.current_algo;
req1.password = SRPHelper.startCheck(x_bytes, currentPassword.srp_id, currentPassword.srp_B, algo);
}
req1.new_settings = new TLRPC.TL_account_passwordInputSettings();
secureSecret = getRandomSecret();
secureSecretId = Utilities.bytesToLong(Utilities.computeSHA256(secureSecret));
if (currentPassword.new_secure_algo instanceof TLRPC.TL_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000) {
TLRPC.TL_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000 newAlgo = (TLRPC.TL_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000) currentPassword.new_secure_algo;
saltedPassword = Utilities.computePBKDF2(AndroidUtilities.getStringBytes(textPassword), newAlgo.salt);
byte[] key = new byte[32];
System.arraycopy(saltedPassword, 0, key, 0, 32);
byte[] iv = new byte[16];
System.arraycopy(saltedPassword, 32, iv, 0, 16);
Utilities.aesCbcEncryptionByteArraySafe(secureSecret, key, iv, 0, secureSecret.length, 0, 1);
req1.new_settings.new_secure_settings = new TLRPC.TL_secureSecretSettings();
req1.new_settings.new_secure_settings.secure_algo = newAlgo;
req1.new_settings.new_secure_settings.secure_secret = secureSecret;
req1.new_settings.new_secure_settings.secure_secret_id = secureSecretId;
req1.new_settings.flags |= 4;
}
ConnectionsManager.getInstance(currentAccount).sendRequest(req1, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (error != null && "SRP_ID_INVALID".equals(error.text)) {
TLRPC.TL_account_getPassword getPasswordReq = new TLRPC.TL_account_getPassword();
ConnectionsManager.getInstance(currentAccount).sendRequest(getPasswordReq, (response2, error2) -> AndroidUtilities.runOnUIThread(() -> {
if (error2 == null) {
currentPassword = (TLRPC.TL_account_password) response2;
TwoStepVerificationActivity.initPasswordNewAlgo(currentPassword);
generateNewSecret();
}
}), ConnectionsManager.RequestFlagWithoutLogin);
return;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (currentForm == null) {
currentForm = new TLRPC.TL_account_authorizationForm();
}
openRequestInterface();
}));
});
}
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
@Override
public void run(final TLObject response, final TLRPC.TL_error error) {
if (error != null && "SRP_ID_INVALID".equals(error.text)) {
TLRPC.TL_account_getPassword getPasswordReq = new TLRPC.TL_account_getPassword();
ConnectionsManager.getInstance(currentAccount).sendRequest(getPasswordReq, (response2, error2) -> AndroidUtilities.runOnUIThread(() -> {
if (error2 == null) {
currentPassword = (TLRPC.TL_account_password) response2;
TwoStepVerificationActivity.initPasswordNewAlgo(currentPassword);
onPasswordDone(saved);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}), ConnectionsManager.RequestFlagWithoutLogin);
return;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (error == null) {
Utilities.globalQueue.postRunnable(() -> {
2018-07-30 04:07:02 +02:00
TLRPC.TL_account_passwordSettings settings = (TLRPC.TL_account_passwordSettings) response;
2018-08-27 10:33:11 +02:00
byte[] secure_salt;
if (settings.secure_settings != null) {
secureSecret = settings.secure_settings.secure_secret;
secureSecretId = settings.secure_settings.secure_secret_id;
if (settings.secure_settings.secure_algo instanceof TLRPC.TL_securePasswordKdfAlgoSHA512) {
TLRPC.TL_securePasswordKdfAlgoSHA512 algo = (TLRPC.TL_securePasswordKdfAlgoSHA512) settings.secure_settings.secure_algo;
secure_salt = algo.salt;
saltedPassword = Utilities.computeSHA512(secure_salt, AndroidUtilities.getStringBytes(textPassword), secure_salt);
} else if (settings.secure_settings.secure_algo instanceof TLRPC.TL_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000) {
TLRPC.TL_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000 algo = (TLRPC.TL_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000) settings.secure_settings.secure_algo;
secure_salt = algo.salt;
saltedPassword = Utilities.computePBKDF2(AndroidUtilities.getStringBytes(textPassword), algo.salt);
} else if (settings.secure_settings.secure_algo instanceof TLRPC.TL_securePasswordKdfAlgoUnknown) {
AndroidUtilities.runOnUIThread(() -> AlertsCreator.showUpdateAppAlert(getParentActivity(), LocaleController.getString("UpdateAppAlert", R.string.UpdateAppAlert), true));
return;
} else {
secure_salt = new byte[0];
}
2018-07-30 04:07:02 +02:00
} else {
2018-08-27 10:33:11 +02:00
if (currentPassword.new_secure_algo instanceof TLRPC.TL_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000) {
TLRPC.TL_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000 algo = (TLRPC.TL_securePasswordKdfAlgoPBKDF2HMACSHA512iter100000) currentPassword.new_secure_algo;
secure_salt = algo.salt;
saltedPassword = Utilities.computePBKDF2(AndroidUtilities.getStringBytes(textPassword), algo.salt);
} else {
secure_salt = new byte[0];
}
secureSecret = null;
secureSecretId = 0;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
AndroidUtilities.runOnUIThread(() -> {
currentEmail = settings.email;
2018-07-30 04:07:02 +02:00
if (saved) {
2018-08-27 10:33:11 +02:00
saltedPassword = savedSaltedPassword;
}
if (!checkSecret(decryptSecret(secureSecret, saltedPassword), secureSecretId) || secure_salt.length == 0 || secureSecretId == 0) {
if (saved) {
UserConfig.getInstance(currentAccount).resetSavedPassword();
usingSavedPassword = 0;
updatePasswordInterface();
2018-07-30 04:07:02 +02:00
} else {
2018-08-27 10:33:11 +02:00
if (currentForm != null) {
currentForm.values.clear();
currentForm.errors.clear();
}
if (secureSecret == null || secureSecret.length == 0) {
generateNewSecret();
} else {
resetSecret();
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
} else if (currentBotId == 0) {
TLRPC.TL_account_getAllSecureValues req12 = new TLRPC.TL_account_getAllSecureValues();
ConnectionsManager.getInstance(currentAccount).sendRequest(req12, (response1, error1) -> AndroidUtilities.runOnUIThread(() -> {
if (response1 != null) {
currentForm = new TLRPC.TL_account_authorizationForm();
TLRPC.Vector vector = (TLRPC.Vector) response1;
for (int a = 0, size = vector.objects.size(); a < size; a++) {
currentForm.values.add((TLRPC.TL_secureValue) vector.objects.get(a));
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
openRequestInterface();
} else {
if ("APP_VERSION_OUTDATED".equals(error1.text)) {
AlertsCreator.showUpdateAppAlert(getParentActivity(), LocaleController.getString("UpdateAppAlert", R.string.UpdateAppAlert), true);
} else {
showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error1.text);
}
showEditDoneProgress(true, false);
}
}));
} else {
openRequestInterface();
}
});
});
} else {
AndroidUtilities.runOnUIThread(() -> {
if (saved) {
UserConfig.getInstance(currentAccount).resetSavedPassword();
usingSavedPassword = 0;
updatePasswordInterface();
if (inputFieldContainers != null && inputFieldContainers[FIELD_PASSWORD].getVisibility() == View.VISIBLE) {
inputFields[FIELD_PASSWORD].requestFocus();
AndroidUtilities.showKeyboard(inputFields[FIELD_PASSWORD]);
}
} else {
2018-07-30 04:07:02 +02:00
showEditDoneProgress(true, false);
if (error.text.equals("PASSWORD_HASH_INVALID")) {
onPasscodeError(true);
} else if (error.text.startsWith("FLOOD_WAIT")) {
int time = Utilities.parseInt(error.text);
String timeString;
if (time < 60) {
timeString = LocaleController.formatPluralString("Seconds", time);
} else {
timeString = LocaleController.formatPluralString("Minutes", time / 60);
}
showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString));
} else {
showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text);
}
}
2018-08-27 10:33:11 +02:00
});
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}
};
if (currentPassword.current_algo instanceof TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) {
TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow algo = (TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) currentPassword.current_algo;
req.password = SRPHelper.startCheck(x_bytes, currentPassword.srp_id, currentPassword.srp_B, algo);
if (req.password == null) {
TLRPC.TL_error error = new TLRPC.TL_error();
error.text = "ALGO_INVALID";
requestDelegate.run(null, error);
return;
}
int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, requestDelegate, ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin);
ConnectionsManager.getInstance(currentAccount).bindRequestToGuid(reqId, classGuid);
} else {
TLRPC.TL_error error = new TLRPC.TL_error();
error.text = "PASSWORD_HASH_INVALID";
requestDelegate.run(null, error);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
});
}
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
private boolean isPersonalDocument(TLRPC.SecureValueType type) {
return type instanceof TLRPC.TL_secureValueTypeDriverLicense ||
type instanceof TLRPC.TL_secureValueTypePassport ||
type instanceof TLRPC.TL_secureValueTypeInternalPassport ||
type instanceof TLRPC.TL_secureValueTypeIdentityCard;
}
private boolean isAddressDocument(TLRPC.SecureValueType type) {
return type instanceof TLRPC.TL_secureValueTypeUtilityBill ||
type instanceof TLRPC.TL_secureValueTypeBankStatement ||
type instanceof TLRPC.TL_secureValueTypePassportRegistration ||
type instanceof TLRPC.TL_secureValueTypeTemporaryRegistration ||
type instanceof TLRPC.TL_secureValueTypeRentalAgreement;
2018-07-30 04:07:02 +02:00
}
private void createRequestInterface(Context context) {
TLRPC.User botUser = null;
if (currentForm != null) {
for (int a = 0; a < currentForm.users.size(); a++) {
TLRPC.User user = currentForm.users.get(a);
if (user.id == currentBotId) {
botUser = user;
break;
}
}
}
FrameLayout frameLayout = (FrameLayout) fragmentView;
actionBar.setTitle(LocaleController.getString("TelegramPassport", R.string.TelegramPassport));
2022-06-21 04:51:00 +02:00
actionBar.createMenu().addItem(info_item, R.drawable.msg_info);
2018-07-30 04:07:02 +02:00
if (botUser != null) {
FrameLayout avatarContainer = new FrameLayout(context);
linearLayout2.addView(avatarContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 100));
BackupImageView avatarImageView = new BackupImageView(context);
avatarImageView.setRoundRadius(AndroidUtilities.dp(32));
avatarContainer.addView(avatarImageView, LayoutHelper.createFrame(64, 64, Gravity.CENTER, 0, 8, 0, 0));
AvatarDrawable avatarDrawable = new AvatarDrawable(botUser);
2021-04-17 01:59:59 +02:00
avatarImageView.setForUserOrChat(botUser, avatarDrawable);
2018-07-30 04:07:02 +02:00
bottomCell = new TextInfoPrivacyCell(context);
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_top, Theme.key_windowBackgroundGrayShadow));
bottomCell.setText(AndroidUtilities.replaceTags(LocaleController.formatString("PassportRequest", R.string.PassportRequest, UserObject.getFirstName(botUser))));
bottomCell.getTextView().setGravity(Gravity.CENTER_HORIZONTAL);
((FrameLayout.LayoutParams) bottomCell.getTextView().getLayoutParams()).gravity = Gravity.CENTER_HORIZONTAL;
linearLayout2.addView(bottomCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
headerCell = new HeaderCell(context);
headerCell.setText(LocaleController.getString("PassportRequestedInformation", R.string.PassportRequestedInformation));
headerCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(headerCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
if (currentForm != null) {
2018-08-27 10:33:11 +02:00
int size = currentForm.required_types.size();
ArrayList<TLRPC.TL_secureRequiredType> personalDocuments = new ArrayList<>();
ArrayList<TLRPC.TL_secureRequiredType> addressDocuments = new ArrayList<>();
int personalCount = 0;
int addressCount = 0;
boolean hasPersonalInfo = false;
boolean hasAddressInfo = false;
for (int a = 0; a < size; a++) {
TLRPC.SecureRequiredType secureRequiredType = currentForm.required_types.get(a);
if (secureRequiredType instanceof TLRPC.TL_secureRequiredType) {
TLRPC.TL_secureRequiredType requiredType = (TLRPC.TL_secureRequiredType) secureRequiredType;
if (isPersonalDocument(requiredType.type)) {
personalDocuments.add(requiredType);
personalCount++;
} else if (isAddressDocument(requiredType.type)) {
addressDocuments.add(requiredType);
addressCount++;
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
hasPersonalInfo = true;
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypeAddress) {
hasAddressInfo = true;
}
} else if (secureRequiredType instanceof TLRPC.TL_secureRequiredTypeOneOf) {
TLRPC.TL_secureRequiredTypeOneOf requiredTypeOneOf = (TLRPC.TL_secureRequiredTypeOneOf) secureRequiredType;
if (requiredTypeOneOf.types.isEmpty()) {
continue;
}
TLRPC.SecureRequiredType innerType = requiredTypeOneOf.types.get(0);
if (!(innerType instanceof TLRPC.TL_secureRequiredType)) {
continue;
}
TLRPC.TL_secureRequiredType requiredType = (TLRPC.TL_secureRequiredType) innerType;
if (isPersonalDocument(requiredType.type)) {
for (int b = 0, size2 = requiredTypeOneOf.types.size(); b < size2; b++) {
innerType = requiredTypeOneOf.types.get(b);
if (!(innerType instanceof TLRPC.TL_secureRequiredType)) {
continue;
}
personalDocuments.add((TLRPC.TL_secureRequiredType) innerType);
}
personalCount++;
} else if (isAddressDocument(requiredType.type)) {
for (int b = 0, size2 = requiredTypeOneOf.types.size(); b < size2; b++) {
innerType = requiredTypeOneOf.types.get(b);
if (!(innerType instanceof TLRPC.TL_secureRequiredType)) {
continue;
}
addressDocuments.add((TLRPC.TL_secureRequiredType) innerType);
}
addressCount++;
}
}
}
boolean separatePersonal = !hasPersonalInfo || personalCount > 1;
boolean separateAddress = !hasAddressInfo || addressCount > 1;
for (int a = 0; a < size; a++) {
TLRPC.SecureRequiredType secureRequiredType = currentForm.required_types.get(a);
ArrayList<TLRPC.TL_secureRequiredType> documentTypes;
TLRPC.TL_secureRequiredType requiredType;
boolean documentOnly;
if (secureRequiredType instanceof TLRPC.TL_secureRequiredType) {
requiredType = (TLRPC.TL_secureRequiredType) secureRequiredType;
if (requiredType.type instanceof TLRPC.TL_secureValueTypePhone || requiredType.type instanceof TLRPC.TL_secureValueTypeEmail) {
documentTypes = null;
documentOnly = false;
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
if (separatePersonal) {
documentTypes = null;
} else {
documentTypes = personalDocuments;
}
documentOnly = false;
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypeAddress) {
if (separateAddress) {
documentTypes = null;
} else {
documentTypes = addressDocuments;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
documentOnly = false;
} else if (separatePersonal && isPersonalDocument(requiredType.type)) {
documentTypes = new ArrayList<>();
documentTypes.add(requiredType);
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = new TLRPC.TL_secureValueTypePersonalDetails();
documentOnly = true;
} else if (separateAddress && isAddressDocument(requiredType.type)) {
documentTypes = new ArrayList<>();
documentTypes.add(requiredType);
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = new TLRPC.TL_secureValueTypeAddress();
documentOnly = true;
} else {
continue;
}
} else if (secureRequiredType instanceof TLRPC.TL_secureRequiredTypeOneOf) {
TLRPC.TL_secureRequiredTypeOneOf requiredTypeOneOf = (TLRPC.TL_secureRequiredTypeOneOf) secureRequiredType;
if (requiredTypeOneOf.types.isEmpty()) {
continue;
}
TLRPC.SecureRequiredType innerType = requiredTypeOneOf.types.get(0);
if (!(innerType instanceof TLRPC.TL_secureRequiredType)) {
continue;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
requiredType = (TLRPC.TL_secureRequiredType) innerType;
if (separatePersonal && isPersonalDocument(requiredType.type) || separateAddress && isAddressDocument(requiredType.type)) {
documentTypes = new ArrayList<>();
for (int b = 0, size2 = requiredTypeOneOf.types.size(); b < size2; b++) {
innerType = requiredTypeOneOf.types.get(b);
if (!(innerType instanceof TLRPC.TL_secureRequiredType)) {
continue;
}
documentTypes.add((TLRPC.TL_secureRequiredType) innerType);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (isPersonalDocument(requiredType.type)) {
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = new TLRPC.TL_secureValueTypePersonalDetails();
} else {
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = new TLRPC.TL_secureValueTypeAddress();
}
documentOnly = true;
} else {
continue;
2018-07-30 04:07:02 +02:00
}
} else {
continue;
}
2018-08-27 10:33:11 +02:00
addField(context, requiredType, documentTypes, documentOnly, a == size - 1);
2018-07-30 04:07:02 +02:00
}
}
if (botUser != null) {
bottomCell = new TextInfoPrivacyCell(context);
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
bottomCell.setLinkTextColorKey(Theme.key_windowBackgroundWhiteGrayText4);
if (!TextUtils.isEmpty(currentForm.privacy_policy_url)) {
String str2 = LocaleController.formatString("PassportPolicy", R.string.PassportPolicy, UserObject.getFirstName(botUser), botUser.username);
SpannableStringBuilder text = new SpannableStringBuilder(str2);
int index1 = str2.indexOf('*');
int index2 = str2.lastIndexOf('*');
if (index1 != -1 && index2 != -1) {
bottomCell.getTextView().setMovementMethod(new AndroidUtilities.LinkMovementMethodMy());
text.replace(index2, index2 + 1, "");
text.replace(index1, index1 + 1, "");
text.setSpan(new LinkSpan(), index1, index2 - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
bottomCell.setText(text);
} else {
bottomCell.setText(AndroidUtilities.replaceTags(LocaleController.formatString("PassportNoPolicy", R.string.PassportNoPolicy, UserObject.getFirstName(botUser), botUser.username)));
}
bottomCell.getTextView().setHighlightColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText4));
bottomCell.getTextView().setGravity(Gravity.CENTER_HORIZONTAL);
linearLayout2.addView(bottomCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
bottomLayout = new FrameLayout(context);
bottomLayout.setBackgroundDrawable(Theme.createSelectorWithBackgroundDrawable(Theme.getColor(Theme.key_passport_authorizeBackground), Theme.getColor(Theme.key_passport_authorizeBackgroundSelected)));
frameLayout.addView(bottomLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM));
2018-08-27 10:33:11 +02:00
bottomLayout.setOnClickListener(view -> {
class ValueToSend {
TLRPC.TL_secureValue value;
boolean selfie_required;
boolean translation_required;
public ValueToSend(TLRPC.TL_secureValue v, boolean s, boolean t) {
value = v;
selfie_required = s;
translation_required = t;
}
}
ArrayList<ValueToSend> valuesToSend = new ArrayList<>();
for (int a = 0, size = currentForm.required_types.size(); a < size; a++) {
TLRPC.TL_secureRequiredType requiredType;
TLRPC.SecureRequiredType secureRequiredType = currentForm.required_types.get(a);
if (secureRequiredType instanceof TLRPC.TL_secureRequiredType) {
requiredType = (TLRPC.TL_secureRequiredType) secureRequiredType;
} else if (secureRequiredType instanceof TLRPC.TL_secureRequiredTypeOneOf) {
TLRPC.TL_secureRequiredTypeOneOf requiredTypeOneOf = (TLRPC.TL_secureRequiredTypeOneOf) secureRequiredType;
if (requiredTypeOneOf.types.isEmpty()) {
2018-07-30 04:07:02 +02:00
continue;
}
2018-08-27 10:33:11 +02:00
secureRequiredType = requiredTypeOneOf.types.get(0);
if (!(secureRequiredType instanceof TLRPC.TL_secureRequiredType)) {
continue;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
requiredType = (TLRPC.TL_secureRequiredType) secureRequiredType;
for (int b = 0, size2 = requiredTypeOneOf.types.size(); b < size2; b++) {
secureRequiredType = requiredTypeOneOf.types.get(b);
if (!(secureRequiredType instanceof TLRPC.TL_secureRequiredType)) {
continue;
}
TLRPC.TL_secureRequiredType innerType = (TLRPC.TL_secureRequiredType) secureRequiredType;
if (getValueByType(innerType, true) != null) {
requiredType = innerType;
break;
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
} else {
continue;
}
TLRPC.TL_secureValue value = getValueByType(requiredType, true);
if (value == null) {
2020-07-26 18:07:20 +02:00
VibrateUtil.vibrate();
2018-08-27 10:33:11 +02:00
AndroidUtilities.shakeView(getViewByType(requiredType), 2, 0);
return;
}
String key = getNameForType(requiredType.type);
HashMap<String, String> errors = errorsMap.get(key);
if (errors != null && !errors.isEmpty()) {
2020-07-26 18:07:20 +02:00
VibrateUtil.vibrate();
2018-08-27 10:33:11 +02:00
AndroidUtilities.shakeView(getViewByType(requiredType), 2, 0);
return;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
valuesToSend.add(new ValueToSend(value, requiredType.selfie_required, requiredType.translation_required));
}
showEditDoneProgress(false, true);
TLRPC.TL_account_acceptAuthorization req = new TLRPC.TL_account_acceptAuthorization();
req.bot_id = currentBotId;
req.scope = currentScope;
req.public_key = currentPublicKey;
JSONObject jsonObject = new JSONObject();
for (int a = 0, size = valuesToSend.size(); a < size; a++) {
ValueToSend valueToSend = valuesToSend.get(a);
TLRPC.TL_secureValue secureValue = valueToSend.value;
JSONObject data = new JSONObject();
if (secureValue.plain_data != null) {
if (secureValue.plain_data instanceof TLRPC.TL_securePlainEmail) {
TLRPC.TL_securePlainEmail securePlainEmail = (TLRPC.TL_securePlainEmail) secureValue.plain_data;
} else if (secureValue.plain_data instanceof TLRPC.TL_securePlainPhone) {
TLRPC.TL_securePlainPhone securePlainPhone = (TLRPC.TL_securePlainPhone) secureValue.plain_data;
}
} else {
try {
JSONObject result = new JSONObject();
if (secureValue.data != null) {
byte[] decryptedSecret = decryptValueSecret(secureValue.data.secret, secureValue.data.data_hash);
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
data.put("data_hash", Base64.encodeToString(secureValue.data.data_hash, Base64.NO_WRAP));
data.put("secret", Base64.encodeToString(decryptedSecret, Base64.NO_WRAP));
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
result.put("data", data);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (!secureValue.files.isEmpty()) {
JSONArray files = new JSONArray();
for (int b = 0, size2 = secureValue.files.size(); b < size2; b++) {
TLRPC.TL_secureFile secureFile = (TLRPC.TL_secureFile) secureValue.files.get(b);
2018-07-30 04:07:02 +02:00
byte[] decryptedSecret = decryptValueSecret(secureFile.secret, secureFile.file_hash);
2018-08-27 10:33:11 +02:00
JSONObject file = new JSONObject();
file.put("file_hash", Base64.encodeToString(secureFile.file_hash, Base64.NO_WRAP));
file.put("secret", Base64.encodeToString(decryptedSecret, Base64.NO_WRAP));
files.put(file);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
result.put("files", files);
}
if (secureValue.front_side instanceof TLRPC.TL_secureFile) {
TLRPC.TL_secureFile secureFile = (TLRPC.TL_secureFile) secureValue.front_side;
byte[] decryptedSecret = decryptValueSecret(secureFile.secret, secureFile.file_hash);
JSONObject front = new JSONObject();
front.put("file_hash", Base64.encodeToString(secureFile.file_hash, Base64.NO_WRAP));
front.put("secret", Base64.encodeToString(decryptedSecret, Base64.NO_WRAP));
result.put("front_side", front);
}
if (secureValue.reverse_side instanceof TLRPC.TL_secureFile) {
TLRPC.TL_secureFile secureFile = (TLRPC.TL_secureFile) secureValue.reverse_side;
byte[] decryptedSecret = decryptValueSecret(secureFile.secret, secureFile.file_hash);
JSONObject reverse = new JSONObject();
reverse.put("file_hash", Base64.encodeToString(secureFile.file_hash, Base64.NO_WRAP));
reverse.put("secret", Base64.encodeToString(decryptedSecret, Base64.NO_WRAP));
result.put("reverse_side", reverse);
}
if (valueToSend.selfie_required && secureValue.selfie instanceof TLRPC.TL_secureFile) {
TLRPC.TL_secureFile secureFile = (TLRPC.TL_secureFile) secureValue.selfie;
byte[] decryptedSecret = decryptValueSecret(secureFile.secret, secureFile.file_hash);
JSONObject selfie = new JSONObject();
selfie.put("file_hash", Base64.encodeToString(secureFile.file_hash, Base64.NO_WRAP));
selfie.put("secret", Base64.encodeToString(decryptedSecret, Base64.NO_WRAP));
result.put("selfie", selfie);
}
if (valueToSend.translation_required && !secureValue.translation.isEmpty()) {
JSONArray translation = new JSONArray();
for (int b = 0, size2 = secureValue.translation.size(); b < size2; b++) {
TLRPC.TL_secureFile secureFile = (TLRPC.TL_secureFile) secureValue.translation.get(b);
2018-07-30 04:07:02 +02:00
byte[] decryptedSecret = decryptValueSecret(secureFile.secret, secureFile.file_hash);
2018-08-27 10:33:11 +02:00
JSONObject file = new JSONObject();
file.put("file_hash", Base64.encodeToString(secureFile.file_hash, Base64.NO_WRAP));
file.put("secret", Base64.encodeToString(decryptedSecret, Base64.NO_WRAP));
translation.put(file);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
result.put("translation", translation);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
jsonObject.put(getNameForType(secureValue.type), result);
2018-07-30 04:07:02 +02:00
} catch (Exception ignore) {
}
}
2018-08-27 10:33:11 +02:00
TLRPC.TL_secureValueHash hash = new TLRPC.TL_secureValueHash();
hash.type = secureValue.type;
hash.hash = secureValue.hash;
req.value_hashes.add(hash);
}
JSONObject result = new JSONObject();
try {
result.put("secure_data", jsonObject);
} catch (Exception ignore) {
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
}
if (currentPayload != null) {
2018-07-30 04:07:02 +02:00
try {
2018-08-27 10:33:11 +02:00
result.put("payload", currentPayload);
} catch (Exception ignore) {
2018-07-30 04:07:02 +02:00
}
}
2018-08-29 00:59:16 +02:00
if (currentNonce != null) {
try {
result.put("nonce", currentNonce);
} catch (Exception ignore) {
}
}
2018-08-27 10:33:11 +02:00
String json = result.toString();
EncryptionResult encryptionResult = encryptData(AndroidUtilities.getStringBytes(json));
req.credentials = new TLRPC.TL_secureCredentialsEncrypted();
req.credentials.hash = encryptionResult.fileHash;
req.credentials.data = encryptionResult.encryptedData;
try {
String key = currentPublicKey.replaceAll("\\n", "").replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
KeyFactory kf = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.decode(key, Base64.DEFAULT));
RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509);
2019-12-31 14:08:08 +01:00
Cipher c = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding");
2018-08-27 10:33:11 +02:00
c.init(Cipher.ENCRYPT_MODE, pubKey);
req.credentials.secret = c.doFinal(encryptionResult.decrypyedFileSecret);
} catch (Exception e) {
FileLog.e(e);
}
int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (error == null) {
ignoreOnFailure = true;
callCallback(true);
finishFragment();
} else {
showEditDoneProgress(false, false);
if ("APP_VERSION_OUTDATED".equals(error.text)) {
AlertsCreator.showUpdateAppAlert(getParentActivity(), LocaleController.getString("UpdateAppAlert", R.string.UpdateAppAlert), true);
} else {
showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text);
}
}
}));
ConnectionsManager.getInstance(currentAccount).bindRequestToGuid(reqId, classGuid);
2018-07-30 04:07:02 +02:00
});
acceptTextView = new TextView(context);
acceptTextView.setCompoundDrawablePadding(AndroidUtilities.dp(8));
acceptTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.authorize, 0, 0, 0);
acceptTextView.setTextColor(Theme.getColor(Theme.key_passport_authorizeText));
acceptTextView.setText(LocaleController.getString("PassportAuthorize", R.string.PassportAuthorize));
acceptTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
acceptTextView.setGravity(Gravity.CENTER);
acceptTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
bottomLayout.addView(acceptTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.CENTER));
progressViewButton = new ContextProgressView(context, 0);
progressViewButton.setVisibility(View.INVISIBLE);
bottomLayout.addView(progressViewButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
View shadow = new View(context);
shadow.setBackgroundResource(R.drawable.header_shadow_reverse);
frameLayout.addView(shadow, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 3, Gravity.LEFT | Gravity.BOTTOM, 0, 0, 0, 48));
}
private void createManageInterface(Context context) {
FrameLayout frameLayout = (FrameLayout) fragmentView;
actionBar.setTitle(LocaleController.getString("TelegramPassport", R.string.TelegramPassport));
2022-06-21 04:51:00 +02:00
actionBar.createMenu().addItem(info_item, R.drawable.msg_info);
2018-07-30 04:07:02 +02:00
headerCell = new HeaderCell(context);
headerCell.setText(LocaleController.getString("PassportProvidedInformation", R.string.PassportProvidedInformation));
headerCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(headerCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
sectionCell = new ShadowSectionCell(context);
sectionCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(sectionCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
addDocumentCell = new TextSettingsCell(context);
addDocumentCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
addDocumentCell.setText(LocaleController.getString("PassportNoDocumentsAdd", R.string.PassportNoDocumentsAdd), true);
linearLayout2.addView(addDocumentCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
addDocumentCell.setOnClickListener(v -> openAddDocumentAlert());
2018-07-30 04:07:02 +02:00
deletePassportCell = new TextSettingsCell(context);
deletePassportCell.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText3));
deletePassportCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
deletePassportCell.setText(LocaleController.getString("TelegramPassportDelete", R.string.TelegramPassportDelete), false);
linearLayout2.addView(deletePassportCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
deletePassportCell.setOnClickListener(v -> {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
2019-12-31 14:08:08 +01:00
builder.setTitle(LocaleController.getString("TelegramPassportDeleteTitle", R.string.TelegramPassportDeleteTitle));
builder.setMessage(LocaleController.getString("TelegramPassportDeleteAlert", R.string.TelegramPassportDeleteAlert));
builder.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), (dialog, which) -> {
2018-08-27 10:33:11 +02:00
TLRPC.TL_account_deleteSecureValue req = new TLRPC.TL_account_deleteSecureValue();
for (int a = 0; a < currentForm.values.size(); a++) {
req.types.add(currentForm.values.get(a).type);
}
needShowProgress();
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
for (int a = 0; a < linearLayout2.getChildCount(); a++) {
View child = linearLayout2.getChildAt(a);
if (child instanceof TextDetailSecureCell) {
linearLayout2.removeView(child);
a--;
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
needHideProgress();
typesViews.clear();
typesValues.clear();
currentForm.values.clear();
updateManageVisibility();
}));
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
2019-12-31 14:08:08 +01:00
AlertDialog alertDialog = builder.create();
showDialog(alertDialog);
TextView button = (TextView) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
if (button != null) {
button.setTextColor(Theme.getColor(Theme.key_dialogTextRed2));
}
2018-07-30 04:07:02 +02:00
});
addDocumentSectionCell = new ShadowSectionCell(context);
addDocumentSectionCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(addDocumentSectionCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
emptyLayout = new LinearLayout(context);
emptyLayout.setOrientation(LinearLayout.VERTICAL);
emptyLayout.setGravity(Gravity.CENTER);
emptyLayout.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
2018-08-27 10:33:11 +02:00
if (AndroidUtilities.isTablet()) {
linearLayout2.addView(emptyLayout, new LinearLayout.LayoutParams(LayoutHelper.MATCH_PARENT, AndroidUtilities.dp(528) - ActionBar.getCurrentActionBarHeight()));
} else {
linearLayout2.addView(emptyLayout, new LinearLayout.LayoutParams(LayoutHelper.MATCH_PARENT, AndroidUtilities.displaySize.y - ActionBar.getCurrentActionBarHeight()));
}
2018-07-30 04:07:02 +02:00
emptyImageView = new ImageView(context);
emptyImageView.setImageResource(R.drawable.no_passport);
2020-06-25 17:12:58 +02:00
emptyImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_sessions_devicesImage), PorterDuff.Mode.SRC_IN));
2018-07-30 04:07:02 +02:00
emptyLayout.addView(emptyImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT));
emptyTextView1 = new TextView(context);
emptyTextView1.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2));
emptyTextView1.setGravity(Gravity.CENTER);
emptyTextView1.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
emptyTextView1.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
emptyTextView1.setText(LocaleController.getString("PassportNoDocuments", R.string.PassportNoDocuments));
emptyLayout.addView(emptyTextView1, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 0, 16, 0, 0));
emptyTextView2 = new TextView(context);
emptyTextView2.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2));
emptyTextView2.setGravity(Gravity.CENTER);
emptyTextView2.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
emptyTextView2.setPadding(AndroidUtilities.dp(20), 0, AndroidUtilities.dp(20), 0);
emptyTextView2.setText(LocaleController.getString("PassportNoDocumentsInfo", R.string.PassportNoDocumentsInfo));
emptyLayout.addView(emptyTextView2, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 0, 14, 0, 0));
emptyTextView3 = new TextView(context);
emptyTextView3.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4));
emptyTextView3.setGravity(Gravity.CENTER);
emptyTextView3.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
emptyTextView3.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
emptyTextView3.setGravity(Gravity.CENTER);
emptyTextView3.setText(LocaleController.getString("PassportNoDocumentsAdd", R.string.PassportNoDocumentsAdd).toUpperCase());
emptyLayout.addView(emptyTextView3, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, 30, Gravity.CENTER, 0, 16, 0, 0));
2018-08-27 10:33:11 +02:00
emptyTextView3.setOnClickListener(v -> openAddDocumentAlert());
2018-07-30 04:07:02 +02:00
for (int a = 0, size = currentForm.values.size(); a < size; a++) {
TLRPC.TL_secureValue value = currentForm.values.get(a);
2018-08-27 10:33:11 +02:00
TLRPC.TL_secureRequiredType requiredType;
ArrayList<TLRPC.TL_secureRequiredType> documentTypes;
boolean documentOnly;
if (isPersonalDocument(value.type)) {
2018-07-30 04:07:02 +02:00
documentTypes = new ArrayList<>();
2018-08-27 10:33:11 +02:00
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = value.type;
requiredType.selfie_required = true;
requiredType.translation_required = true;
documentTypes.add(requiredType);
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = new TLRPC.TL_secureValueTypePersonalDetails();
documentOnly = true;
} else if (isAddressDocument(value.type)) {
2018-07-30 04:07:02 +02:00
documentTypes = new ArrayList<>();
2018-08-27 10:33:11 +02:00
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = value.type;
requiredType.translation_required = true;
documentTypes.add(requiredType);
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = new TLRPC.TL_secureValueTypeAddress();
documentOnly = true;
2018-07-30 04:07:02 +02:00
} else {
2018-08-27 10:33:11 +02:00
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = value.type;
2018-07-30 04:07:02 +02:00
documentTypes = null;
2018-08-27 10:33:11 +02:00
documentOnly = false;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
addField(context, requiredType, documentTypes, documentOnly, a == size - 1);
2018-07-30 04:07:02 +02:00
}
updateManageVisibility();
}
private boolean hasNotValueForType(Class<? extends TLRPC.SecureValueType> type) {
for (int a = 0, count = currentForm.values.size(); a < count; a++) {
if (currentForm.values.get(a).type.getClass() == type) {
return false;
}
}
return true;
}
private boolean hasUnfilledValues() {
return hasNotValueForType(TLRPC.TL_secureValueTypePhone.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypeEmail.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypePersonalDetails.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypePassport.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypeInternalPassport.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypeIdentityCard.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypeDriverLicense.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypeAddress.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypeUtilityBill.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypePassportRegistration.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypeTemporaryRegistration.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypeBankStatement.class) ||
hasNotValueForType(TLRPC.TL_secureValueTypeRentalAgreement.class);
}
private void openAddDocumentAlert() {
ArrayList<CharSequence> values = new ArrayList<>();
final ArrayList<Class<? extends TLRPC.SecureValueType>> types = new ArrayList<>();
if (hasNotValueForType(TLRPC.TL_secureValueTypePhone.class)) {
values.add(LocaleController.getString("ActionBotDocumentPhone", R.string.ActionBotDocumentPhone));
types.add(TLRPC.TL_secureValueTypePhone.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypeEmail.class)) {
values.add(LocaleController.getString("ActionBotDocumentEmail", R.string.ActionBotDocumentEmail));
types.add(TLRPC.TL_secureValueTypeEmail.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypePersonalDetails.class)) {
values.add(LocaleController.getString("ActionBotDocumentIdentity", R.string.ActionBotDocumentIdentity));
types.add(TLRPC.TL_secureValueTypePersonalDetails.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypePassport.class)) {
values.add(LocaleController.getString("ActionBotDocumentPassport", R.string.ActionBotDocumentPassport));
types.add(TLRPC.TL_secureValueTypePassport.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypeInternalPassport.class)) {
values.add(LocaleController.getString("ActionBotDocumentInternalPassport", R.string.ActionBotDocumentInternalPassport));
types.add(TLRPC.TL_secureValueTypeInternalPassport.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypePassportRegistration.class)) {
values.add(LocaleController.getString("ActionBotDocumentPassportRegistration", R.string.ActionBotDocumentPassportRegistration));
types.add(TLRPC.TL_secureValueTypePassportRegistration.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypeTemporaryRegistration.class)) {
values.add(LocaleController.getString("ActionBotDocumentTemporaryRegistration", R.string.ActionBotDocumentTemporaryRegistration));
types.add(TLRPC.TL_secureValueTypeTemporaryRegistration.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypeIdentityCard.class)) {
values.add(LocaleController.getString("ActionBotDocumentIdentityCard", R.string.ActionBotDocumentIdentityCard));
types.add(TLRPC.TL_secureValueTypeIdentityCard.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypeDriverLicense.class)) {
values.add(LocaleController.getString("ActionBotDocumentDriverLicence", R.string.ActionBotDocumentDriverLicence));
types.add(TLRPC.TL_secureValueTypeDriverLicense.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypeAddress.class)) {
values.add(LocaleController.getString("ActionBotDocumentAddress", R.string.ActionBotDocumentAddress));
types.add(TLRPC.TL_secureValueTypeAddress.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypeUtilityBill.class)) {
values.add(LocaleController.getString("ActionBotDocumentUtilityBill", R.string.ActionBotDocumentUtilityBill));
types.add(TLRPC.TL_secureValueTypeUtilityBill.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypeBankStatement.class)) {
values.add(LocaleController.getString("ActionBotDocumentBankStatement", R.string.ActionBotDocumentBankStatement));
types.add(TLRPC.TL_secureValueTypeBankStatement.class);
}
if (hasNotValueForType(TLRPC.TL_secureValueTypeRentalAgreement.class)) {
values.add(LocaleController.getString("ActionBotDocumentRentalAgreement", R.string.ActionBotDocumentRentalAgreement));
types.add(TLRPC.TL_secureValueTypeRentalAgreement.class);
}
if (getParentActivity() == null || values.isEmpty()) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("PassportNoDocumentsAdd", R.string.PassportNoDocumentsAdd));
2019-05-14 14:08:05 +02:00
builder.setItems(values.toArray(new CharSequence[0]), (dialog, which) -> {
2018-08-27 10:33:11 +02:00
TLRPC.TL_secureRequiredType requiredType = null;
TLRPC.TL_secureRequiredType documentRequiredType = null;
try {
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = types.get(which).newInstance();
} catch (Exception ignore) {
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
}
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
if (isPersonalDocument(requiredType.type)) {
documentRequiredType = requiredType;
documentRequiredType.selfie_required = true;
documentRequiredType.translation_required = true;
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = new TLRPC.TL_secureValueTypePersonalDetails();
} else if (isAddressDocument(requiredType.type)) {
documentRequiredType = requiredType;
requiredType = new TLRPC.TL_secureRequiredType();
requiredType.type = new TLRPC.TL_secureValueTypeAddress();
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
openTypeActivity(requiredType, documentRequiredType, new ArrayList<>(), documentRequiredType != null);
2018-07-30 04:07:02 +02:00
});
showDialog(builder.create());
}
private void updateManageVisibility() {
if (currentForm.values.isEmpty()) {
emptyLayout.setVisibility(View.VISIBLE);
sectionCell.setVisibility(View.GONE);
headerCell.setVisibility(View.GONE);
addDocumentCell.setVisibility(View.GONE);
deletePassportCell.setVisibility(View.GONE);
addDocumentSectionCell.setVisibility(View.GONE);
} else {
emptyLayout.setVisibility(View.GONE);
sectionCell.setVisibility(View.VISIBLE);
headerCell.setVisibility(View.VISIBLE);
deletePassportCell.setVisibility(View.VISIBLE);
addDocumentSectionCell.setVisibility(View.VISIBLE);
if (hasUnfilledValues()) {
addDocumentCell.setVisibility(View.VISIBLE);
} else {
addDocumentCell.setVisibility(View.GONE);
}
}
}
private void callCallback(boolean success) {
if (!callbackCalled) {
if (!TextUtils.isEmpty(currentCallbackUrl)) {
if (success) {
Browser.openUrl(getParentActivity(), Uri.parse(currentCallbackUrl + "&tg_passport=success"));
} else if (!ignoreOnFailure && (currentActivityType == TYPE_PASSWORD || currentActivityType == TYPE_REQUEST)) {
Browser.openUrl(getParentActivity(), Uri.parse(currentCallbackUrl + "&tg_passport=cancel"));
}
callbackCalled = true;
} else if (needActivityResult) {
if (success || (!ignoreOnFailure && (currentActivityType == TYPE_PASSWORD || currentActivityType == TYPE_REQUEST))) {
getParentActivity().setResult(success ? Activity.RESULT_OK : Activity.RESULT_CANCELED);
}
callbackCalled = true;
}
}
}
private void createEmailInterface(Context context) {
actionBar.setTitle(LocaleController.getString("PassportEmail", R.string.PassportEmail));
if (!TextUtils.isEmpty(currentEmail)) {
TextSettingsCell settingsCell1 = new TextSettingsCell(context);
settingsCell1.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4));
settingsCell1.setBackgroundDrawable(Theme.getSelectorDrawable(true));
settingsCell1.setText(LocaleController.formatString("PassportPhoneUseSame", R.string.PassportPhoneUseSame, currentEmail), false);
linearLayout2.addView(settingsCell1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
settingsCell1.setOnClickListener(v -> {
useCurrentValue = true;
doneItem.callOnClick();
useCurrentValue = false;
2018-07-30 04:07:02 +02:00
});
bottomCell = new TextInfoPrivacyCell(context);
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
bottomCell.setText(LocaleController.getString("PassportPhoneUseSameEmailInfo", R.string.PassportPhoneUseSameEmailInfo));
linearLayout2.addView(bottomCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
inputFields = new EditTextBoldCursor[1];
for (int a = 0; a < 1; a++) {
ViewGroup container = new FrameLayout(context);
2019-01-23 18:03:33 +01:00
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
2018-07-30 04:07:02 +02:00
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
inputFields[a] = new EditTextBoldCursor(context);
inputFields[a].setTag(a);
inputFields[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
inputFields[a].setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText));
inputFields[a].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setBackgroundDrawable(null);
inputFields[a].setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setCursorSize(AndroidUtilities.dp(20));
inputFields[a].setCursorWidth(1.5f);
inputFields[a].setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
inputFields[a].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
2019-07-18 15:01:39 +02:00
inputFields[a].setHint(LocaleController.getString("PaymentShippingEmailPlaceholder", R.string.PaymentShippingEmailPlaceholder));
if (currentTypeValue != null && currentTypeValue.plain_data instanceof TLRPC.TL_securePlainEmail) {
TLRPC.TL_securePlainEmail securePlainEmail = (TLRPC.TL_securePlainEmail) currentTypeValue.plain_data;
if (!TextUtils.isEmpty(securePlainEmail.email)) {
inputFields[a].setText(securePlainEmail.email);
}
2018-07-30 04:07:02 +02:00
}
inputFields[a].setSelection(inputFields[a].length());
inputFields[a].setPadding(0, 0, 0, AndroidUtilities.dp(6));
inputFields[a].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
2019-01-23 18:03:33 +01:00
container.addView(inputFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 21, 12, 21, 6));
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
inputFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_DONE || i == EditorInfo.IME_ACTION_NEXT) {
doneItem.callOnClick();
return true;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
return false;
2018-07-30 04:07:02 +02:00
});
}
bottomCell = new TextInfoPrivacyCell(context);
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
bottomCell.setText(LocaleController.getString("PassportEmailUploadInfo", R.string.PassportEmailUploadInfo));
linearLayout2.addView(bottomCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
private void createPhoneInterface(Context context) {
actionBar.setTitle(LocaleController.getString("PassportPhone", R.string.PassportPhone));
languageMap = new HashMap<>();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(context.getResources().getAssets().open("countries.txt")));
String line;
while ((line = reader.readLine()) != null) {
String[] args = line.split(";");
countriesArray.add(0, args[2]);
countriesMap.put(args[2], args[0]);
codesMap.put(args[0], args[2]);
if (args.length > 3) {
phoneFormatMap.put(args[0], args[3]);
}
languageMap.put(args[1], args[2]);
}
reader.close();
} catch (Exception e) {
FileLog.e(e);
}
2018-08-27 10:33:11 +02:00
Collections.sort(countriesArray, String::compareTo);
2018-07-30 04:07:02 +02:00
String currentPhone = UserConfig.getInstance(currentAccount).getCurrentUser().phone;
TextSettingsCell settingsCell1 = new TextSettingsCell(context);
settingsCell1.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4));
settingsCell1.setBackgroundDrawable(Theme.getSelectorDrawable(true));
settingsCell1.setText(LocaleController.formatString("PassportPhoneUseSame", R.string.PassportPhoneUseSame, PhoneFormat.getInstance().format("+" + currentPhone)), false);
linearLayout2.addView(settingsCell1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
settingsCell1.setOnClickListener(v -> {
useCurrentValue = true;
doneItem.callOnClick();
useCurrentValue = false;
2018-07-30 04:07:02 +02:00
});
bottomCell = new TextInfoPrivacyCell(context);
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
bottomCell.setText(LocaleController.getString("PassportPhoneUseSameInfo", R.string.PassportPhoneUseSameInfo));
linearLayout2.addView(bottomCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
headerCell = new HeaderCell(context);
headerCell.setText(LocaleController.getString("PassportPhoneUseOther", R.string.PassportPhoneUseOther));
headerCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(headerCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
inputFields = new EditTextBoldCursor[3];
for (int a = 0; a < 3; a++) {
if (a == FIELD_PHONE) {
inputFields[a] = new HintEditText(context);
} else {
inputFields[a] = new EditTextBoldCursor(context);
}
ViewGroup container;
if (a == FIELD_PHONECODE) {
container = new LinearLayout(context);
((LinearLayout) container).setOrientation(LinearLayout.HORIZONTAL);
2019-01-23 18:03:33 +01:00
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
2018-07-30 04:07:02 +02:00
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
} else if (a == FIELD_PHONE) {
container = (ViewGroup) inputFields[FIELD_PHONECODE].getParent();
} else {
container = new FrameLayout(context);
2019-01-23 18:03:33 +01:00
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
2018-07-30 04:07:02 +02:00
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
}
inputFields[a].setTag(a);
inputFields[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
inputFields[a].setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText));
inputFields[a].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setBackgroundDrawable(null);
inputFields[a].setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setCursorSize(AndroidUtilities.dp(20));
inputFields[a].setCursorWidth(1.5f);
if (a == FIELD_PHONECOUNTRY) {
2018-08-27 10:33:11 +02:00
inputFields[a].setOnTouchListener((v, event) -> {
if (getParentActivity() == null) {
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
CountrySelectActivity fragment = new CountrySelectActivity(false);
2021-09-20 00:10:42 +02:00
fragment.setCountrySelectActivityDelegate(country -> {
inputFields[FIELD_PHONECOUNTRY].setText(country.name);
int index = countriesArray.indexOf(country.name);
2018-08-27 10:33:11 +02:00
if (index != -1) {
ignoreOnTextChange = true;
2021-09-20 00:10:42 +02:00
String code = countriesMap.get(country.name);
2018-08-27 10:33:11 +02:00
inputFields[FIELD_PHONECODE].setText(code);
String hint = phoneFormatMap.get(code);
inputFields[FIELD_PHONE].setHintText(hint != null ? hint.replace('X', '') : null);
ignoreOnTextChange = false;
}
AndroidUtilities.runOnUIThread(() -> AndroidUtilities.showKeyboard(inputFields[FIELD_PHONE]), 300);
inputFields[FIELD_PHONE].requestFocus();
inputFields[FIELD_PHONE].setSelection(inputFields[FIELD_PHONE].length());
});
presentFragment(fragment);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
return true;
2018-07-30 04:07:02 +02:00
});
inputFields[a].setText(LocaleController.getString("ChooseCountry", R.string.ChooseCountry));
inputFields[a].setInputType(0);
inputFields[a].setFocusable(false);
} else {
inputFields[a].setInputType(InputType.TYPE_CLASS_PHONE);
if (a == FIELD_PHONE) {
inputFields[a].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
} else {
inputFields[a].setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
}
}
inputFields[a].setSelection(inputFields[a].length());
if (a == FIELD_PHONECODE) {
plusTextView = new TextView(context);
plusTextView.setText("+");
plusTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
plusTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
2019-01-23 18:03:33 +01:00
container.addView(plusTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 21, 12, 0, 6));
2018-07-30 04:07:02 +02:00
inputFields[a].setPadding(AndroidUtilities.dp(10), 0, 0, 0);
InputFilter[] inputFilters = new InputFilter[1];
inputFilters[0] = new InputFilter.LengthFilter(5);
inputFields[a].setFilters(inputFilters);
inputFields[a].setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
container.addView(inputFields[a], LayoutHelper.createLinear(55, LayoutHelper.WRAP_CONTENT, 0, 12, 16, 6));
inputFields[a].addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void afterTextChanged(Editable editable) {
if (ignoreOnTextChange) {
return;
}
ignoreOnTextChange = true;
String text = PhoneFormat.stripExceptNumbers(inputFields[FIELD_PHONECODE].getText().toString());
inputFields[FIELD_PHONECODE].setText(text);
HintEditText phoneField = (HintEditText) inputFields[FIELD_PHONE];
if (text.length() == 0) {
phoneField.setHintText(null);
phoneField.setHint(LocaleController.getString("PaymentShippingPhoneNumber", R.string.PaymentShippingPhoneNumber));
inputFields[FIELD_PHONECOUNTRY].setText(LocaleController.getString("ChooseCountry", R.string.ChooseCountry));
} else {
String country;
boolean ok = false;
String textToSet = null;
if (text.length() > 4) {
for (int a = 4; a >= 1; a--) {
String sub = text.substring(0, a);
country = codesMap.get(sub);
if (country != null) {
ok = true;
2019-01-23 18:03:33 +01:00
textToSet = text.substring(a) + inputFields[FIELD_PHONE].getText().toString();
2018-07-30 04:07:02 +02:00
inputFields[FIELD_PHONECODE].setText(text = sub);
break;
}
}
if (!ok) {
2019-01-23 18:03:33 +01:00
textToSet = text.substring(1) + inputFields[FIELD_PHONE].getText().toString();
2018-07-30 04:07:02 +02:00
inputFields[FIELD_PHONECODE].setText(text = text.substring(0, 1));
}
}
country = codesMap.get(text);
boolean set = false;
if (country != null) {
int index = countriesArray.indexOf(country);
if (index != -1) {
inputFields[FIELD_PHONECOUNTRY].setText(countriesArray.get(index));
String hint = phoneFormatMap.get(text);
set = true;
if (hint != null) {
phoneField.setHintText(hint.replace('X', ''));
phoneField.setHint(null);
}
}
}
if (!set) {
phoneField.setHintText(null);
phoneField.setHint(LocaleController.getString("PaymentShippingPhoneNumber", R.string.PaymentShippingPhoneNumber));
inputFields[FIELD_PHONECOUNTRY].setText(LocaleController.getString("WrongCountry", R.string.WrongCountry));
}
if (!ok) {
inputFields[FIELD_PHONECODE].setSelection(inputFields[FIELD_PHONECODE].getText().length());
}
if (textToSet != null) {
phoneField.requestFocus();
phoneField.setText(textToSet);
phoneField.setSelection(phoneField.length());
}
}
ignoreOnTextChange = false;
}
});
} else if (a == FIELD_PHONE) {
inputFields[a].setPadding(0, 0, 0, 0);
inputFields[a].setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
inputFields[a].setHintText(null);
inputFields[a].setHint(LocaleController.getString("PaymentShippingPhoneNumber", R.string.PaymentShippingPhoneNumber));
2019-01-23 18:03:33 +01:00
container.addView(inputFields[a], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 12, 21, 6));
2018-07-30 04:07:02 +02:00
inputFields[a].addTextChangedListener(new TextWatcher() {
private int characterAction = -1;
private int actionPosition;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (count == 0 && after == 1) {
characterAction = 1;
} else if (count == 1 && after == 0) {
if (s.charAt(start) == ' ' && start > 0) {
characterAction = 3;
actionPosition = start - 1;
} else {
characterAction = 2;
}
} else {
characterAction = -1;
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (ignoreOnPhoneChange) {
return;
}
HintEditText phoneField = (HintEditText) inputFields[FIELD_PHONE];
int start = phoneField.getSelectionStart();
String phoneChars = "0123456789";
String str = phoneField.getText().toString();
if (characterAction == 3) {
2019-01-23 18:03:33 +01:00
str = str.substring(0, actionPosition) + str.substring(actionPosition + 1);
2018-07-30 04:07:02 +02:00
start--;
}
StringBuilder builder = new StringBuilder(str.length());
for (int a = 0; a < str.length(); a++) {
String ch = str.substring(a, a + 1);
if (phoneChars.contains(ch)) {
builder.append(ch);
}
}
ignoreOnPhoneChange = true;
String hint = phoneField.getHintText();
if (hint != null) {
for (int a = 0; a < builder.length(); a++) {
if (a < hint.length()) {
if (hint.charAt(a) == ' ') {
builder.insert(a, ' ');
a++;
if (start == a && characterAction != 2 && characterAction != 3) {
start++;
}
}
} else {
builder.insert(a, ' ');
if (start == a + 1 && characterAction != 2 && characterAction != 3) {
start++;
}
break;
}
}
}
phoneField.setText(builder);
if (start >= 0) {
2020-04-24 11:21:58 +02:00
phoneField.setSelection(Math.min(start, phoneField.length()));
2018-07-30 04:07:02 +02:00
}
phoneField.onTextChange();
ignoreOnPhoneChange = false;
}
});
} else {
inputFields[a].setPadding(0, 0, 0, AndroidUtilities.dp(6));
inputFields[a].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
2019-01-23 18:03:33 +01:00
container.addView(inputFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 21, 12, 21, 6));
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
inputFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_NEXT) {
inputFields[FIELD_PHONE].requestFocus();
return true;
} else if (i == EditorInfo.IME_ACTION_DONE) {
doneItem.callOnClick();
return true;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
return false;
2018-07-30 04:07:02 +02:00
});
2019-01-23 18:03:33 +01:00
if (a == FIELD_PHONE) {
inputFields[a].setOnKeyListener((v, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_DEL && inputFields[FIELD_PHONE].length() == 0) {
inputFields[FIELD_PHONECODE].requestFocus();
inputFields[FIELD_PHONECODE].setSelection(inputFields[FIELD_PHONECODE].length());
inputFields[FIELD_PHONECODE].dispatchKeyEvent(event);
return true;
}
return false;
});
}
2018-07-30 04:07:02 +02:00
if (a == FIELD_PHONECOUNTRY) {
View divider = new View(context);
dividers.add(divider);
divider.setBackgroundColor(Theme.getColor(Theme.key_divider));
container.addView(divider, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1, Gravity.LEFT | Gravity.BOTTOM));
}
}
String country = null;
try {
TelephonyManager telephonyManager = (TelephonyManager) ApplicationLoader.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
if (telephonyManager != null) {
country = telephonyManager.getSimCountryIso().toUpperCase();
}
} catch (Exception e) {
FileLog.e(e);
}
if (country != null) {
String countryName = languageMap.get(country);
if (countryName != null) {
int index = countriesArray.indexOf(countryName);
if (index != -1) {
inputFields[FIELD_PHONECODE].setText(countriesMap.get(countryName));
}
}
}
bottomCell = new TextInfoPrivacyCell(context);
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
bottomCell.setText(LocaleController.getString("PassportPhoneUploadInfo", R.string.PassportPhoneUploadInfo));
linearLayout2.addView(bottomCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
private void createAddressInterface(Context context) {
languageMap = new HashMap<>();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(context.getResources().getAssets().open("countries.txt")));
String line;
while ((line = reader.readLine()) != null) {
String[] args = line.split(";");
languageMap.put(args[1], args[2]);
}
reader.close();
} catch (Exception e) {
FileLog.e(e);
}
2018-08-27 10:33:11 +02:00
topErrorCell = new TextInfoPrivacyCell(context);
topErrorCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_top, Theme.key_windowBackgroundGrayShadow));
topErrorCell.setPadding(0, AndroidUtilities.dp(7), 0, 0);
linearLayout2.addView(topErrorCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
checkTopErrorCell(true);
2018-07-30 04:07:02 +02:00
if (currentDocumentsType != null) {
2018-08-27 10:33:11 +02:00
if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeRentalAgreement) {
actionBar.setTitle(LocaleController.getString("ActionBotDocumentRentalAgreement", R.string.ActionBotDocumentRentalAgreement));
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeBankStatement) {
actionBar.setTitle(LocaleController.getString("ActionBotDocumentBankStatement", R.string.ActionBotDocumentBankStatement));
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeUtilityBill) {
actionBar.setTitle(LocaleController.getString("ActionBotDocumentUtilityBill", R.string.ActionBotDocumentUtilityBill));
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypePassportRegistration) {
actionBar.setTitle(LocaleController.getString("ActionBotDocumentPassportRegistration", R.string.ActionBotDocumentPassportRegistration));
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeTemporaryRegistration) {
actionBar.setTitle(LocaleController.getString("ActionBotDocumentTemporaryRegistration", R.string.ActionBotDocumentTemporaryRegistration));
}
2018-07-30 04:07:02 +02:00
headerCell = new HeaderCell(context);
headerCell.setText(LocaleController.getString("PassportDocuments", R.string.PassportDocuments));
headerCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(headerCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
documentsLayout = new LinearLayout(context);
documentsLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout2.addView(documentsLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
uploadDocumentCell = new TextSettingsCell(context);
uploadDocumentCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
linearLayout2.addView(uploadDocumentCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
uploadDocumentCell.setOnClickListener(v -> {
uploadingFileType = UPLOADING_TYPE_DOCUMENTS;
openAttachMenu();
2018-07-30 04:07:02 +02:00
});
bottomCell = new TextInfoPrivacyCell(context);
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
if (currentBotId != 0) {
noAllDocumentsErrorText = LocaleController.getString("PassportAddAddressUploadInfo", R.string.PassportAddAddressUploadInfo);
} else {
2018-08-27 10:33:11 +02:00
if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeRentalAgreement) {
2018-07-30 04:07:02 +02:00
noAllDocumentsErrorText = LocaleController.getString("PassportAddAgreementInfo", R.string.PassportAddAgreementInfo);
2018-08-27 10:33:11 +02:00
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeUtilityBill) {
2018-07-30 04:07:02 +02:00
noAllDocumentsErrorText = LocaleController.getString("PassportAddBillInfo", R.string.PassportAddBillInfo);
2018-08-27 10:33:11 +02:00
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypePassportRegistration) {
2018-07-30 04:07:02 +02:00
noAllDocumentsErrorText = LocaleController.getString("PassportAddPassportRegistrationInfo", R.string.PassportAddPassportRegistrationInfo);
2018-08-27 10:33:11 +02:00
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeTemporaryRegistration) {
2018-07-30 04:07:02 +02:00
noAllDocumentsErrorText = LocaleController.getString("PassportAddTemporaryRegistrationInfo", R.string.PassportAddTemporaryRegistrationInfo);
2018-08-27 10:33:11 +02:00
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeBankStatement) {
2018-07-30 04:07:02 +02:00
noAllDocumentsErrorText = LocaleController.getString("PassportAddBankInfo", R.string.PassportAddBankInfo);
} else {
noAllDocumentsErrorText = "";
}
}
CharSequence text = noAllDocumentsErrorText;
if (documentsErrors != null) {
String errorText;
if ((errorText = documentsErrors.get("files_all")) != null) {
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(errorText);
stringBuilder.append("\n\n");
stringBuilder.append(noAllDocumentsErrorText);
text = stringBuilder;
stringBuilder.setSpan(new ForegroundColorSpan(Theme.getColor(Theme.key_windowBackgroundWhiteRedText3)), 0, errorText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
errorsValues.put("files_all", "");
}
}
bottomCell.setText(text);
linearLayout2.addView(bottomCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
if (currentDocumentsType.translation_required) {
headerCell = new HeaderCell(context);
headerCell.setText(LocaleController.getString("PassportTranslation", R.string.PassportTranslation));
headerCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(headerCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
translationLayout = new LinearLayout(context);
translationLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout2.addView(translationLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
uploadTranslationCell = new TextSettingsCell(context);
uploadTranslationCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
linearLayout2.addView(uploadTranslationCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
uploadTranslationCell.setOnClickListener(v -> {
uploadingFileType = UPLOADING_TYPE_TRANSLATION;
openAttachMenu();
});
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
bottomCellTranslation = new TextInfoPrivacyCell(context);
bottomCellTranslation.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
if (currentBotId != 0) {
noAllTranslationErrorText = LocaleController.getString("PassportAddTranslationUploadInfo", R.string.PassportAddTranslationUploadInfo);
} else {
if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeRentalAgreement) {
noAllTranslationErrorText = LocaleController.getString("PassportAddTranslationAgreementInfo", R.string.PassportAddTranslationAgreementInfo);
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeUtilityBill) {
noAllTranslationErrorText = LocaleController.getString("PassportAddTranslationBillInfo", R.string.PassportAddTranslationBillInfo);
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypePassportRegistration) {
noAllTranslationErrorText = LocaleController.getString("PassportAddTranslationPassportRegistrationInfo", R.string.PassportAddTranslationPassportRegistrationInfo);
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeTemporaryRegistration) {
noAllTranslationErrorText = LocaleController.getString("PassportAddTranslationTemporaryRegistrationInfo", R.string.PassportAddTranslationTemporaryRegistrationInfo);
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeBankStatement) {
noAllTranslationErrorText = LocaleController.getString("PassportAddTranslationBankInfo", R.string.PassportAddTranslationBankInfo);
} else {
noAllTranslationErrorText = "";
}
}
text = noAllTranslationErrorText;
if (documentsErrors != null) {
String errorText;
if ((errorText = documentsErrors.get("translation_all")) != null) {
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(errorText);
stringBuilder.append("\n\n");
stringBuilder.append(noAllTranslationErrorText);
text = stringBuilder;
stringBuilder.setSpan(new ForegroundColorSpan(Theme.getColor(Theme.key_windowBackgroundWhiteRedText3)), 0, errorText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
errorsValues.put("translation_all", "");
}
}
bottomCellTranslation.setText(text);
linearLayout2.addView(bottomCellTranslation, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
} else {
actionBar.setTitle(LocaleController.getString("PassportAddress", R.string.PassportAddress));
}
headerCell = new HeaderCell(context);
headerCell.setText(LocaleController.getString("PassportAddressHeader", R.string.PassportAddressHeader));
headerCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(headerCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
inputFields = new EditTextBoldCursor[FIELD_ADDRESS_COUNT];
for (int a = 0; a < FIELD_ADDRESS_COUNT; a++) {
final EditTextBoldCursor field = new EditTextBoldCursor(context);
inputFields[a] = field;
ViewGroup container = new FrameLayout(context) {
private StaticLayout errorLayout;
float offsetX;
2018-07-30 04:07:02 +02:00
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(34);
errorLayout = field.getErrorLayout(width);
if (errorLayout != null) {
int lineCount = errorLayout.getLineCount();
if (lineCount > 1) {
int height = AndroidUtilities.dp(64) + (errorLayout.getLineBottom(lineCount - 1) - errorLayout.getLineBottom(0));
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
}
if (LocaleController.isRTL) {
float maxW = 0;
for (int a = 0; a < lineCount; a++) {
float l = errorLayout.getLineLeft(a);
if (l != 0) {
offsetX = 0;
break;
}
maxW = Math.max(maxW, errorLayout.getLineWidth(a));
if (a == lineCount - 1) {
offsetX = width - maxW;
}
}
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
if (errorLayout != null) {
canvas.save();
2019-01-23 18:03:33 +01:00
canvas.translate(AndroidUtilities.dp(21) + offsetX, field.getLineY() + AndroidUtilities.dp(3));
2018-07-30 04:07:02 +02:00
errorLayout.draw(canvas);
canvas.restore();
}
}
};
container.setWillNotDraw(false);
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
if (a == FIELD_ADDRESS_COUNT - 1) {
extraBackgroundView = new View(context);
extraBackgroundView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(extraBackgroundView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 6));
}
2018-08-27 10:33:11 +02:00
if (documentOnly && currentDocumentsType != null) {
2018-07-30 04:07:02 +02:00
container.setVisibility(View.GONE);
if (extraBackgroundView != null) {
extraBackgroundView.setVisibility(View.GONE);
}
}
inputFields[a].setTag(a);
inputFields[a].setSupportRtlHint(true);
inputFields[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
inputFields[a].setHintColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText));
inputFields[a].setHeaderHintColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueHeader));
inputFields[a].setTransformHintToHeader(true);
inputFields[a].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setBackgroundDrawable(null);
inputFields[a].setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setCursorSize(AndroidUtilities.dp(20));
inputFields[a].setCursorWidth(1.5f);
inputFields[a].setLineColors(Theme.getColor(Theme.key_windowBackgroundWhiteInputField), Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated), Theme.getColor(Theme.key_windowBackgroundWhiteRedText3));
if (a == FIELD_COUNTRY) {
2018-08-27 10:33:11 +02:00
inputFields[a].setOnTouchListener((v, event) -> {
if (getParentActivity() == null) {
return false;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (event.getAction() == MotionEvent.ACTION_UP) {
CountrySelectActivity fragment = new CountrySelectActivity(false);
2021-09-20 00:10:42 +02:00
fragment.setCountrySelectActivityDelegate((country) -> {
inputFields[FIELD_COUNTRY].setText(country.name);
currentCitizeship = country.shortname;
2018-08-27 10:33:11 +02:00
});
presentFragment(fragment);
}
return true;
2018-07-30 04:07:02 +02:00
});
inputFields[a].setInputType(0);
inputFields[a].setFocusable(false);
} else {
inputFields[a].setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
inputFields[a].setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
}
String value;
final String key;
switch (a) {
case FIELD_STREET1:
inputFields[a].setHintText(LocaleController.getString("PassportStreet1", R.string.PassportStreet1));
key = "street_line1";
break;
case FIELD_STREET2:
inputFields[a].setHintText(LocaleController.getString("PassportStreet2", R.string.PassportStreet2));
key = "street_line2";
break;
case FIELD_CITY:
inputFields[a].setHintText(LocaleController.getString("PassportCity", R.string.PassportCity));
key = "city";
break;
case FIELD_STATE:
inputFields[a].setHintText(LocaleController.getString("PassportState", R.string.PassportState));
key = "state";
break;
case FIELD_COUNTRY:
inputFields[a].setHintText(LocaleController.getString("PassportCountry", R.string.PassportCountry));
key = "country_code";
break;
case FIELD_POSTCODE:
inputFields[a].setHintText(LocaleController.getString("PassportPostcode", R.string.PassportPostcode));
key = "post_code";
break;
default:
continue;
}
2018-08-27 10:33:11 +02:00
setFieldValues(currentValues, inputFields[a], key);
2018-07-30 04:07:02 +02:00
if (a == FIELD_POSTCODE) {
inputFields[a].addTextChangedListener(new TextWatcher() {
private boolean ignore;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (ignore) {
return;
}
ignore = true;
boolean error = false;
for (int a = 0; a < s.length(); a++) {
char ch = s.charAt(a);
if (!(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch >= '0' && ch <= '9' || ch == '-' || ch == ' ')) {
error = true;
break;
}
}
ignore = false;
if (error) {
field.setErrorText(LocaleController.getString("PassportUseLatinOnly", R.string.PassportUseLatinOnly));
} else {
2018-08-27 10:33:11 +02:00
checkFieldForError(field, key, s, false);
2018-07-30 04:07:02 +02:00
}
}
});
InputFilter[] inputFilters = new InputFilter[1];
inputFilters[0] = new InputFilter.LengthFilter(10);
inputFields[a].setFilters(inputFilters);
} else {
inputFields[a].addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
2018-08-27 10:33:11 +02:00
checkFieldForError(field, key, s, false);
2018-07-30 04:07:02 +02:00
}
});
}
inputFields[a].setSelection(inputFields[a].length());
inputFields[a].setPadding(0, 0, 0, 0);
inputFields[a].setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
2019-01-23 18:03:33 +01:00
container.addView(inputFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 64, Gravity.LEFT | Gravity.TOP, 21, 0, 21, 0));
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
inputFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_NEXT) {
int num = (Integer) textView.getTag();
num++;
if (num < inputFields.length) {
if (inputFields[num].isFocusable()) {
inputFields[num].requestFocus();
} else {
inputFields[num].dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0, 0, 0));
textView.clearFocus();
AndroidUtilities.hideKeyboard(textView);
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
return true;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
return false;
2018-07-30 04:07:02 +02:00
});
}
sectionCell = new ShadowSectionCell(context);
linearLayout2.addView(sectionCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
if (documentOnly && currentDocumentsType != null) {
2018-07-30 04:07:02 +02:00
headerCell.setVisibility(View.GONE);
sectionCell.setVisibility(View.GONE);
}
2018-08-27 10:33:11 +02:00
if ((currentBotId != 0 || currentDocumentsType == null) && currentTypeValue != null && !documentOnly || currentDocumentsTypeValue != null) {
2018-07-30 04:07:02 +02:00
if (currentDocumentsTypeValue != null) {
addDocumentViews(currentDocumentsTypeValue.files);
2018-08-27 10:33:11 +02:00
addTranslationDocumentViews(currentDocumentsTypeValue.translation);
2018-07-30 04:07:02 +02:00
}
sectionCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
TextSettingsCell settingsCell1 = new TextSettingsCell(context);
settingsCell1.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText3));
settingsCell1.setBackgroundDrawable(Theme.getSelectorDrawable(true));
2018-08-27 10:33:11 +02:00
if (currentDocumentsType == null) {
2018-07-30 04:07:02 +02:00
settingsCell1.setText(LocaleController.getString("PassportDeleteInfo", R.string.PassportDeleteInfo), false);
} else {
settingsCell1.setText(LocaleController.getString("PassportDeleteDocument", R.string.PassportDeleteDocument), false);
}
linearLayout2.addView(settingsCell1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
settingsCell1.setOnClickListener(v -> createDocumentDeleteAlert());
2018-07-30 04:07:02 +02:00
sectionCell = new ShadowSectionCell(context);
sectionCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(sectionCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else {
sectionCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
2018-08-27 10:33:11 +02:00
if (documentOnly && currentDocumentsType != null) {
2018-07-30 04:07:02 +02:00
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
}
}
updateUploadText(UPLOADING_TYPE_DOCUMENTS);
2018-08-27 10:33:11 +02:00
updateUploadText(UPLOADING_TYPE_TRANSLATION);
2018-07-30 04:07:02 +02:00
}
private void createDocumentDeleteAlert() {
2019-05-14 14:08:05 +02:00
final boolean[] checks = new boolean[]{true};
2018-07-30 04:07:02 +02:00
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
2018-08-27 10:33:11 +02:00
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialog, which) -> {
if (!documentOnly) {
2018-07-30 04:07:02 +02:00
currentValues.clear();
}
2018-08-27 10:33:11 +02:00
currentDocumentValues.clear();
delegate.deleteValue(currentType, currentDocumentsType, availableDocumentTypes, checks[0], null, null);
finishFragment();
2018-07-30 04:07:02 +02:00
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
2018-08-27 10:33:11 +02:00
if (documentOnly && currentDocumentsType == null && currentType.type instanceof TLRPC.TL_secureValueTypeAddress) {
2018-07-30 04:07:02 +02:00
builder.setMessage(LocaleController.getString("PassportDeleteAddressAlert", R.string.PassportDeleteAddressAlert));
2018-08-27 10:33:11 +02:00
} else if (documentOnly && currentDocumentsType == null && currentType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
2018-07-30 04:07:02 +02:00
builder.setMessage(LocaleController.getString("PassportDeletePersonalAlert", R.string.PassportDeletePersonalAlert));
} else {
builder.setMessage(LocaleController.getString("PassportDeleteDocumentAlert", R.string.PassportDeleteDocumentAlert));
}
2018-08-27 10:33:11 +02:00
if (!documentOnly && currentDocumentsType != null) {
2018-07-30 04:07:02 +02:00
FrameLayout frameLayout = new FrameLayout(getParentActivity());
CheckBoxCell cell = new CheckBoxCell(getParentActivity(), 1);
cell.setBackgroundDrawable(Theme.getSelectorDrawable(false));
2018-08-27 10:33:11 +02:00
if (currentType.type instanceof TLRPC.TL_secureValueTypeAddress) {
2018-07-30 04:07:02 +02:00
cell.setText(LocaleController.getString("PassportDeleteDocumentAddress", R.string.PassportDeleteDocumentAddress), "", true, false);
2018-08-27 10:33:11 +02:00
} else if (currentType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
2018-07-30 04:07:02 +02:00
cell.setText(LocaleController.getString("PassportDeleteDocumentPersonal", R.string.PassportDeleteDocumentPersonal), "", true, false);
}
cell.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(16) : AndroidUtilities.dp(8), 0, LocaleController.isRTL ? AndroidUtilities.dp(8) : AndroidUtilities.dp(16), 0);
frameLayout.addView(cell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.TOP | Gravity.LEFT));
2018-08-27 10:33:11 +02:00
cell.setOnClickListener(v -> {
if (!v.isEnabled()) {
return;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
CheckBoxCell cell1 = (CheckBoxCell) v;
checks[0] = !checks[0];
cell1.setChecked(checks[0], true);
2018-07-30 04:07:02 +02:00
});
builder.setView(frameLayout);
}
showDialog(builder.create());
}
private void onFieldError(View field) {
if (field == null) {
return;
}
2020-07-26 18:07:20 +02:00
VibrateUtil.vibrate();
2018-07-30 04:07:02 +02:00
AndroidUtilities.shakeView(field, 2, 0);
2018-08-27 10:33:11 +02:00
scrollToField(field);
}
private void scrollToField(View field) {
2018-07-30 04:07:02 +02:00
while (field != null && linearLayout2.indexOfChild(field) < 0) {
field = (View) field.getParent();
}
if (field != null) {
scrollView.smoothScrollTo(0, field.getTop() - (scrollView.getMeasuredHeight() - field.getMeasuredHeight()) / 2);
}
}
private String getDocumentHash(SecureDocument document) {
if (document != null) {
if (document.secureFile != null && document.secureFile.file_hash != null) {
return Base64.encodeToString(document.secureFile.file_hash, Base64.NO_WRAP);
} else if (document.fileHash != null) {
return Base64.encodeToString(document.fileHash, Base64.NO_WRAP);
}
}
return "";
}
2018-08-27 10:33:11 +02:00
private void checkFieldForError(EditTextBoldCursor field, String key, Editable s, boolean document) {
2018-07-30 04:07:02 +02:00
String value;
if (errorsValues != null && (value = errorsValues.get(key)) != null) {
if (TextUtils.equals(value, s)) {
if (fieldsErrors != null && (value = fieldsErrors.get(key)) != null) {
field.setErrorText(value);
} else if (documentsErrors != null && (value = documentsErrors.get(key)) != null) {
field.setErrorText(value);
}
} else {
field.setErrorText(null);
}
} else {
field.setErrorText(null);
}
2018-08-27 10:33:11 +02:00
String errorKey = document ? "error_document_all" : "error_all";
if (errorsValues != null && errorsValues.containsKey(errorKey)) {
errorsValues.remove(errorKey);
checkTopErrorCell(false);
}
2018-07-30 04:07:02 +02:00
}
private boolean checkFieldsForError() {
if (currentDocumentsType != null) {
2018-08-27 10:33:11 +02:00
if (errorsValues.containsKey("error_all") || errorsValues.containsKey("error_document_all")) {
onFieldError(topErrorCell);
return true;
}
2018-07-30 04:07:02 +02:00
if (uploadDocumentCell != null) {
if (documents.isEmpty()) {
onFieldError(uploadDocumentCell);
return true;
} else {
for (int a = 0, size = documents.size(); a < size; a++) {
SecureDocument document = documents.get(a);
String key = "files" + getDocumentHash(document);
if (key != null && errorsValues.containsKey(key)) {
onFieldError(documentsCells.get(document));
return true;
}
}
}
}
2018-08-27 10:33:11 +02:00
if (errorsValues.containsKey("files_all") || errorsValues.containsKey("translation_all")) {
2018-07-30 04:07:02 +02:00
onFieldError(bottomCell);
return true;
}
if (uploadFrontCell != null) {
if (frontDocument == null) {
onFieldError(uploadFrontCell);
return true;
} else {
String key = "front" + getDocumentHash(frontDocument);
if (errorsValues.containsKey(key)) {
onFieldError(documentsCells.get(frontDocument));
return true;
}
}
}
2018-08-27 10:33:11 +02:00
if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeIdentityCard || currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeDriverLicense) {
2018-07-30 04:07:02 +02:00
if (uploadReverseCell != null) {
if (reverseDocument == null) {
onFieldError(uploadReverseCell);
return true;
} else {
String key = "reverse" + getDocumentHash(reverseDocument);
if (errorsValues.containsKey(key)) {
onFieldError(documentsCells.get(reverseDocument));
return true;
}
}
}
}
2018-08-27 10:33:11 +02:00
if (uploadSelfieCell != null && currentBotId != 0) {
2018-07-30 04:07:02 +02:00
if (selfieDocument == null) {
onFieldError(uploadSelfieCell);
return true;
} else {
String key = "selfie" + getDocumentHash(selfieDocument);
if (errorsValues.containsKey(key)) {
onFieldError(documentsCells.get(selfieDocument));
return true;
}
}
}
2018-08-27 10:33:11 +02:00
if (uploadTranslationCell != null && currentBotId != 0) {
if (translationDocuments.isEmpty()) {
onFieldError(uploadTranslationCell);
return true;
2018-07-30 04:07:02 +02:00
} else {
2018-08-27 10:33:11 +02:00
for (int a = 0, size = translationDocuments.size(); a < size; a++) {
SecureDocument document = translationDocuments.get(a);
String key = "translation" + getDocumentHash(document);
2021-09-20 00:10:42 +02:00
if (errorsValues.containsKey(key)) {
2018-08-27 10:33:11 +02:00
onFieldError(documentsCells.get(document));
return true;
2018-07-30 04:07:02 +02:00
}
}
}
}
2018-08-27 10:33:11 +02:00
}
for (int i = 0; i < 2; i++) {
EditTextBoldCursor[] fields;
if (i == 0) {
fields = inputFields;
} else {
fields = nativeInfoCell != null && nativeInfoCell.getVisibility() == View.VISIBLE ? inputExtraFields : null;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (fields == null) {
continue;
}
for (int a = 0; a < fields.length; a++) {
boolean error = false;
if (fields[a].hasErrorText()) {
error = true;
}
if (!errorsValues.isEmpty()) {
String key;
if (currentType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
if (i == 0) {
switch (a) {
case FIELD_NAME:
key = "first_name";
break;
case FIELD_MIDNAME:
key = "middle_name";
break;
case FIELD_SURNAME:
key = "last_name";
break;
case FIELD_BIRTHDAY:
key = "birth_date";
break;
case FIELD_GENDER:
key = "gender";
break;
case FIELD_CITIZENSHIP:
key = "country_code";
break;
case FIELD_RESIDENCE:
key = "residence_country_code";
break;
case FIELD_CARDNUMBER:
key = "document_no";
break;
case FIELD_EXPIRE:
key = "expiry_date";
break;
default:
key = null;
break;
}
} else {
switch (a) {
case FIELD_NATIVE_NAME:
key = "first_name_native";
break;
case FIELD_NATIVE_MIDNAME:
key = "middle_name_native";
break;
case FIELD_NATIVE_SURNAME:
key = "last_name_native";
break;
default:
key = null;
break;
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
} else if (currentType.type instanceof TLRPC.TL_secureValueTypeAddress) {
switch (a) {
case FIELD_STREET1:
key = "street_line1";
break;
case FIELD_STREET2:
key = "street_line2";
break;
case FIELD_CITY:
key = "city";
break;
case FIELD_STATE:
key = "state";
break;
case FIELD_COUNTRY:
key = "country_code";
break;
case FIELD_POSTCODE:
key = "post_code";
break;
default:
key = null;
break;
}
} else {
key = null;
}
if (key != null) {
String value = errorsValues.get(key);
if (!TextUtils.isEmpty(value)) {
if (value.equals(fields[a].getText().toString())) {
error = true;
}
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
}
if (documentOnly) {
if (currentDocumentsType != null && a < FIELD_CARDNUMBER) {
2018-07-30 04:07:02 +02:00
continue;
2018-08-27 10:33:11 +02:00
}
}
if (!error) {
int len = fields[a].length();
boolean allowZeroLength = false;
if (currentActivityType == TYPE_IDENTITY) {
if (a == FIELD_EXPIRE) {
continue;
} else if (i == 0 && (a == FIELD_NAME || a == FIELD_SURNAME || a == FIELD_MIDNAME) ||
i == 1 && (a == FIELD_NATIVE_NAME || a == FIELD_NATIVE_MIDNAME || a == FIELD_NATIVE_SURNAME)) {
if (len > 255) {
error = true;
}
if (i == 0 && a == FIELD_MIDNAME || i == 1 && a == FIELD_NATIVE_MIDNAME) {
allowZeroLength = true;
}
} else if (a == FIELD_CARDNUMBER) {
if (len > 24) {
error = true;
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
} else if (currentActivityType == TYPE_ADDRESS) {
if (a == FIELD_STREET2) {
continue;
} else if (a == FIELD_CITY) {
2018-07-30 04:07:02 +02:00
if (len < 2) {
error = true;
}
2018-08-27 10:33:11 +02:00
} else if (a == FIELD_STATE) {
if ("US".equals(currentCitizeship)) {
if (len < 2) {
error = true;
}
} else {
continue;
}
} else if (a == FIELD_POSTCODE) {
if (len < 2 || len > 10) {
error = true;
}
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
if (!error && !allowZeroLength && len == 0) {
error = true;
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (error) {
onFieldError(fields[a]);
return true;
2018-07-30 04:07:02 +02:00
}
}
}
return false;
}
private void createIdentityInterface(final Context context) {
languageMap = new HashMap<>();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(context.getResources().getAssets().open("countries.txt")));
String line;
while ((line = reader.readLine()) != null) {
String[] args = line.split(";");
languageMap.put(args[1], args[2]);
}
reader.close();
} catch (Exception e) {
FileLog.e(e);
}
2018-08-27 10:33:11 +02:00
topErrorCell = new TextInfoPrivacyCell(context);
topErrorCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_top, Theme.key_windowBackgroundGrayShadow));
topErrorCell.setPadding(0, AndroidUtilities.dp(7), 0, 0);
linearLayout2.addView(topErrorCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
checkTopErrorCell(true);
2018-07-30 04:07:02 +02:00
if (currentDocumentsType != null) {
headerCell = new HeaderCell(context);
2018-08-27 10:33:11 +02:00
if (documentOnly) {
2018-07-30 04:07:02 +02:00
headerCell.setText(LocaleController.getString("PassportDocuments", R.string.PassportDocuments));
} else {
headerCell.setText(LocaleController.getString("PassportRequiredDocuments", R.string.PassportRequiredDocuments));
}
headerCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(headerCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
frontLayout = new LinearLayout(context);
frontLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout2.addView(frontLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
uploadFrontCell = new TextDetailSettingsCell(context);
uploadFrontCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
linearLayout2.addView(uploadFrontCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
uploadFrontCell.setOnClickListener(v -> {
uploadingFileType = UPLOADING_TYPE_FRONT;
openAttachMenu();
2018-07-30 04:07:02 +02:00
});
reverseLayout = new LinearLayout(context);
reverseLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout2.addView(reverseLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
boolean divider = currentDocumentsType.selfie_required;
2018-07-30 04:07:02 +02:00
uploadReverseCell = new TextDetailSettingsCell(context);
uploadReverseCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
2018-08-27 10:33:11 +02:00
uploadReverseCell.setTextAndValue(LocaleController.getString("PassportReverseSide", R.string.PassportReverseSide), LocaleController.getString("PassportReverseSideInfo", R.string.PassportReverseSideInfo), divider);
2018-07-30 04:07:02 +02:00
linearLayout2.addView(uploadReverseCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
uploadReverseCell.setOnClickListener(v -> {
uploadingFileType = UPLOADING_TYPE_REVERSE;
openAttachMenu();
2018-07-30 04:07:02 +02:00
});
2018-08-27 10:33:11 +02:00
if (currentDocumentsType.selfie_required) {
2018-07-30 04:07:02 +02:00
selfieLayout = new LinearLayout(context);
selfieLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout2.addView(selfieLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
uploadSelfieCell = new TextDetailSettingsCell(context);
uploadSelfieCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
2018-08-27 10:33:11 +02:00
uploadSelfieCell.setTextAndValue(LocaleController.getString("PassportSelfie", R.string.PassportSelfie), LocaleController.getString("PassportSelfieInfo", R.string.PassportSelfieInfo), currentType.translation_required);
2018-07-30 04:07:02 +02:00
linearLayout2.addView(uploadSelfieCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
uploadSelfieCell.setOnClickListener(v -> {
uploadingFileType = UPLOADING_TYPE_SELFIE;
openAttachMenu();
2018-07-30 04:07:02 +02:00
});
}
bottomCell = new TextInfoPrivacyCell(context);
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
bottomCell.setText(LocaleController.getString("PassportPersonalUploadInfo", R.string.PassportPersonalUploadInfo));
linearLayout2.addView(bottomCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
if (currentDocumentsType.translation_required) {
headerCell = new HeaderCell(context);
headerCell.setText(LocaleController.getString("PassportTranslation", R.string.PassportTranslation));
headerCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(headerCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
translationLayout = new LinearLayout(context);
translationLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout2.addView(translationLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
uploadTranslationCell = new TextSettingsCell(context);
uploadTranslationCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
linearLayout2.addView(uploadTranslationCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
uploadTranslationCell.setOnClickListener(v -> {
uploadingFileType = UPLOADING_TYPE_TRANSLATION;
openAttachMenu();
});
bottomCellTranslation = new TextInfoPrivacyCell(context);
bottomCellTranslation.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
if (currentBotId != 0) {
noAllTranslationErrorText = LocaleController.getString("PassportAddTranslationUploadInfo", R.string.PassportAddTranslationUploadInfo);
} else {
if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypePassport) {
noAllTranslationErrorText = LocaleController.getString("PassportAddPassportInfo", R.string.PassportAddPassportInfo);
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeInternalPassport) {
noAllTranslationErrorText = LocaleController.getString("PassportAddInternalPassportInfo", R.string.PassportAddInternalPassportInfo);
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeIdentityCard) {
noAllTranslationErrorText = LocaleController.getString("PassportAddIdentityCardInfo", R.string.PassportAddIdentityCardInfo);
} else if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeDriverLicense) {
noAllTranslationErrorText = LocaleController.getString("PassportAddDriverLicenceInfo", R.string.PassportAddDriverLicenceInfo);
} else {
noAllTranslationErrorText = "";
}
}
CharSequence text = noAllTranslationErrorText;
if (documentsErrors != null) {
String errorText;
if ((errorText = documentsErrors.get("translation_all")) != null) {
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(errorText);
stringBuilder.append("\n\n");
stringBuilder.append(noAllTranslationErrorText);
text = stringBuilder;
stringBuilder.setSpan(new ForegroundColorSpan(Theme.getColor(Theme.key_windowBackgroundWhiteRedText3)), 0, errorText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
errorsValues.put("translation_all", "");
}
}
bottomCellTranslation.setText(text);
linearLayout2.addView(bottomCellTranslation, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
2018-07-30 04:07:02 +02:00
} else if (Build.VERSION.SDK_INT >= 18) {
scanDocumentCell = new TextSettingsCell(context);
scanDocumentCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
scanDocumentCell.setText(LocaleController.getString("PassportScanPassport", R.string.PassportScanPassport), false);
linearLayout2.addView(scanDocumentCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
scanDocumentCell.setOnClickListener(v -> {
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
getParentActivity().requestPermissions(new String[]{Manifest.permission.CAMERA}, 22);
return;
}
2019-12-31 14:08:08 +01:00
CameraScanActivity fragment = new CameraScanActivity(org.telegram.ui.CameraScanActivity.TYPE_MRZ);
fragment.setDelegate(new CameraScanActivity.CameraScanActivityDelegate() {
@Override
public void didFindMrzInfo(MrzRecognizer.Result result) {
if (!TextUtils.isEmpty(result.firstName)) {
inputFields[FIELD_NAME].setText(result.firstName);
2018-07-30 04:07:02 +02:00
}
2019-12-31 14:08:08 +01:00
if (!TextUtils.isEmpty(result.middleName)) {
inputFields[FIELD_MIDNAME].setText(result.middleName);
2018-08-27 10:33:11 +02:00
}
2019-12-31 14:08:08 +01:00
if (!TextUtils.isEmpty(result.lastName)) {
inputFields[FIELD_SURNAME].setText(result.lastName);
}
if (result.gender != MrzRecognizer.Result.GENDER_UNKNOWN) {
switch (result.gender) {
case MrzRecognizer.Result.GENDER_MALE:
currentGender = "male";
inputFields[FIELD_GENDER].setText(LocaleController.getString("PassportMale", R.string.PassportMale));
break;
case MrzRecognizer.Result.GENDER_FEMALE:
currentGender = "female";
inputFields[FIELD_GENDER].setText(LocaleController.getString("PassportFemale", R.string.PassportFemale));
break;
}
}
if (!TextUtils.isEmpty(result.nationality)) {
currentCitizeship = result.nationality;
String country = languageMap.get(currentCitizeship);
if (country != null) {
inputFields[FIELD_CITIZENSHIP].setText(country);
}
}
if (!TextUtils.isEmpty(result.issuingCountry)) {
currentResidence = result.issuingCountry;
String country = languageMap.get(currentResidence);
if (country != null) {
inputFields[FIELD_RESIDENCE].setText(country);
}
}
if (result.birthDay > 0 && result.birthMonth > 0 && result.birthYear > 0) {
inputFields[FIELD_BIRTHDAY].setText(String.format(Locale.US, "%02d.%02d.%d", result.birthDay, result.birthMonth, result.birthYear));
2018-08-27 10:33:11 +02:00
}
}
});
presentFragment(fragment);
2018-07-30 04:07:02 +02:00
});
bottomCell = new TextInfoPrivacyCell(context);
bottomCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
bottomCell.setText(LocaleController.getString("PassportScanPassportInfo", R.string.PassportScanPassportInfo));
linearLayout2.addView(bottomCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
headerCell = new HeaderCell(context);
2018-08-27 10:33:11 +02:00
if (documentOnly) {
headerCell.setText(LocaleController.getString("PassportDocument", R.string.PassportDocument));
} else {
headerCell.setText(LocaleController.getString("PassportPersonal", R.string.PassportPersonal));
}
2018-07-30 04:07:02 +02:00
headerCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(headerCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
int count = currentDocumentsType != null ? FIELD_IDENTITY_COUNT : FIELD_IDENTITY_NODOC_COUNT;
inputFields = new EditTextBoldCursor[count];
for (int a = 0; a < count; a++) {
final EditTextBoldCursor field = new EditTextBoldCursor(context);
inputFields[a] = field;
ViewGroup container = new FrameLayout(context) {
private StaticLayout errorLayout;
private float offsetX;
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(34);
errorLayout = field.getErrorLayout(width);
if (errorLayout != null) {
int lineCount = errorLayout.getLineCount();
if (lineCount > 1) {
int height = AndroidUtilities.dp(64) + (errorLayout.getLineBottom(lineCount - 1) - errorLayout.getLineBottom(0));
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
}
if (LocaleController.isRTL) {
float maxW = 0;
for (int a = 0; a < lineCount; a++) {
float l = errorLayout.getLineLeft(a);
if (l != 0) {
offsetX = 0;
break;
}
maxW = Math.max(maxW, errorLayout.getLineWidth(a));
if (a == lineCount - 1) {
offsetX = width - maxW;
}
}
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
if (errorLayout != null) {
canvas.save();
2019-01-23 18:03:33 +01:00
canvas.translate(AndroidUtilities.dp(21) + offsetX, field.getLineY() + AndroidUtilities.dp(3));
2018-07-30 04:07:02 +02:00
errorLayout.draw(canvas);
canvas.restore();
}
}
};
container.setWillNotDraw(false);
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 64));
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
if (a == count - 1) {
extraBackgroundView = new View(context);
extraBackgroundView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(extraBackgroundView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 6));
}
2018-08-27 10:33:11 +02:00
if (documentOnly && currentDocumentsType != null && a < FIELD_CARDNUMBER) {
2018-07-30 04:07:02 +02:00
container.setVisibility(View.GONE);
if (extraBackgroundView != null) {
extraBackgroundView.setVisibility(View.GONE);
}
}
inputFields[a].setTag(a);
inputFields[a].setSupportRtlHint(true);
inputFields[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
inputFields[a].setHintColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText));
inputFields[a].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setHeaderHintColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueHeader));
inputFields[a].setTransformHintToHeader(true);
inputFields[a].setBackgroundDrawable(null);
inputFields[a].setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputFields[a].setCursorSize(AndroidUtilities.dp(20));
inputFields[a].setCursorWidth(1.5f);
inputFields[a].setLineColors(Theme.getColor(Theme.key_windowBackgroundWhiteInputField), Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated), Theme.getColor(Theme.key_windowBackgroundWhiteRedText3));
if (a == FIELD_CITIZENSHIP || a == FIELD_RESIDENCE) {
2018-08-27 10:33:11 +02:00
inputFields[a].setOnTouchListener((v, event) -> {
if (getParentActivity() == null) {
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
CountrySelectActivity fragment = new CountrySelectActivity(false);
2021-09-20 00:10:42 +02:00
fragment.setCountrySelectActivityDelegate((country) -> {
2018-08-27 10:33:11 +02:00
int field12 = (Integer) v.getTag();
final EditTextBoldCursor editText = inputFields[field12];
if (field12 == FIELD_CITIZENSHIP) {
2021-09-20 00:10:42 +02:00
currentCitizeship = country.shortname;
2018-08-27 10:33:11 +02:00
} else {
2021-09-20 00:10:42 +02:00
currentResidence = country.shortname;
2018-08-27 10:33:11 +02:00
}
2021-09-20 00:10:42 +02:00
editText.setText(country.name);
2018-08-27 10:33:11 +02:00
});
presentFragment(fragment);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
return true;
2018-07-30 04:07:02 +02:00
});
inputFields[a].setInputType(0);
} else if (a == FIELD_BIRTHDAY || a == FIELD_EXPIRE) {
2018-08-27 10:33:11 +02:00
inputFields[a].setOnTouchListener((v, event) -> {
if (getParentActivity() == null) {
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
2020-12-17 06:45:19 +01:00
Calendar calendar = Calendar.getInstance();
2018-08-27 10:33:11 +02:00
int year = calendar.get(Calendar.YEAR);
int monthOfYear = calendar.get(Calendar.MONTH);
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
try {
final EditTextBoldCursor field1 = (EditTextBoldCursor) v;
int num = (Integer) field1.getTag();
int minYear;
int maxYear;
int currentYearDiff;
String title;
if (num == FIELD_EXPIRE) {
title = LocaleController.getString("PassportSelectExpiredDate", R.string.PassportSelectExpiredDate);
minYear = 0;
maxYear = 20;
currentYearDiff = 0;
} else {
title = LocaleController.getString("PassportSelectBithdayDate", R.string.PassportSelectBithdayDate);
minYear = -120;
maxYear = 0;
currentYearDiff = -18;
}
int selectedDay = -1;
int selectedMonth = -1;
int selectedYear = -1;
2019-05-14 14:08:05 +02:00
String[] args = field1.getText().toString().split("\\.");
2018-08-27 10:33:11 +02:00
if (args.length == 3) {
selectedDay = Utilities.parseInt(args[0]);
selectedMonth = Utilities.parseInt(args[1]);
selectedYear = Utilities.parseInt(args[2]);
}
AlertDialog.Builder builder = AlertsCreator.createDatePickerDialog(context, minYear, maxYear, currentYearDiff, selectedDay, selectedMonth, selectedYear, title, num == FIELD_EXPIRE, (year1, month, dayOfMonth1) -> {
2018-07-30 04:07:02 +02:00
if (num == FIELD_EXPIRE) {
2018-08-27 10:33:11 +02:00
currentExpireDate[0] = year1;
currentExpireDate[1] = month + 1;
currentExpireDate[2] = dayOfMonth1;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
field1.setText(String.format(Locale.US, "%02d.%02d.%d", dayOfMonth1, month + 1, year1));
});
if (num == FIELD_EXPIRE) {
builder.setNegativeButton(LocaleController.getString("PassportSelectNotExpire", R.string.PassportSelectNotExpire), (dialog, which) -> {
currentExpireDate[0] = currentExpireDate[1] = currentExpireDate[2] = 0;
field1.setText(LocaleController.getString("PassportNoExpireDate", R.string.PassportNoExpireDate));
2018-07-30 04:07:02 +02:00
});
}
2018-08-27 10:33:11 +02:00
showDialog(builder.create());
} catch (Exception e) {
FileLog.e(e);
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
return true;
2018-07-30 04:07:02 +02:00
});
inputFields[a].setInputType(0);
inputFields[a].setFocusable(false);
} else if (a == FIELD_GENDER) {
2018-08-27 10:33:11 +02:00
inputFields[a].setOnTouchListener((v, event) -> {
if (getParentActivity() == null) {
return false;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (event.getAction() == MotionEvent.ACTION_UP) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("PassportSelectGender", R.string.PassportSelectGender));
builder.setItems(new CharSequence[]{
LocaleController.getString("PassportMale", R.string.PassportMale),
LocaleController.getString("PassportFemale", R.string.PassportFemale)
}, (dialogInterface, i) -> {
if (i == 0) {
currentGender = "male";
inputFields[FIELD_GENDER].setText(LocaleController.getString("PassportMale", R.string.PassportMale));
} else if (i == 1) {
currentGender = "female";
inputFields[FIELD_GENDER].setText(LocaleController.getString("PassportFemale", R.string.PassportFemale));
}
});
builder.setPositiveButton(LocaleController.getString("Cancel", R.string.Cancel), null);
showDialog(builder.create());
}
return true;
2018-07-30 04:07:02 +02:00
});
inputFields[a].setInputType(0);
inputFields[a].setFocusable(false);
} else {
inputFields[a].setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
inputFields[a].setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
}
String value;
final String key;
2018-08-27 10:33:11 +02:00
HashMap<String, String> values;
2018-07-30 04:07:02 +02:00
switch (a) {
case FIELD_NAME:
2018-08-27 10:33:11 +02:00
if (currentType.native_names) {
inputFields[a].setHintText(LocaleController.getString("PassportNameLatin", R.string.PassportNameLatin));
} else {
inputFields[a].setHintText(LocaleController.getString("PassportName", R.string.PassportName));
}
2018-07-30 04:07:02 +02:00
key = "first_name";
2018-08-27 10:33:11 +02:00
values = currentValues;
break;
case FIELD_MIDNAME:
if (currentType.native_names) {
inputFields[a].setHintText(LocaleController.getString("PassportMidnameLatin", R.string.PassportMidnameLatin));
} else {
inputFields[a].setHintText(LocaleController.getString("PassportMidname", R.string.PassportMidname));
}
key = "middle_name";
values = currentValues;
2018-07-30 04:07:02 +02:00
break;
case FIELD_SURNAME:
2018-08-27 10:33:11 +02:00
if (currentType.native_names) {
inputFields[a].setHintText(LocaleController.getString("PassportSurnameLatin", R.string.PassportSurnameLatin));
} else {
inputFields[a].setHintText(LocaleController.getString("PassportSurname", R.string.PassportSurname));
}
2018-07-30 04:07:02 +02:00
key = "last_name";
2018-08-27 10:33:11 +02:00
values = currentValues;
2018-07-30 04:07:02 +02:00
break;
case FIELD_BIRTHDAY:
inputFields[a].setHintText(LocaleController.getString("PassportBirthdate", R.string.PassportBirthdate));
key = "birth_date";
2018-08-27 10:33:11 +02:00
values = currentValues;
2018-07-30 04:07:02 +02:00
break;
case FIELD_GENDER:
inputFields[a].setHintText(LocaleController.getString("PassportGender", R.string.PassportGender));
key = "gender";
2018-08-27 10:33:11 +02:00
values = currentValues;
2018-07-30 04:07:02 +02:00
break;
case FIELD_CITIZENSHIP:
inputFields[a].setHintText(LocaleController.getString("PassportCitizenship", R.string.PassportCitizenship));
key = "country_code";
2018-08-27 10:33:11 +02:00
values = currentValues;
2018-07-30 04:07:02 +02:00
break;
case FIELD_RESIDENCE:
inputFields[a].setHintText(LocaleController.getString("PassportResidence", R.string.PassportResidence));
key = "residence_country_code";
2018-08-27 10:33:11 +02:00
values = currentValues;
2018-07-30 04:07:02 +02:00
break;
case FIELD_CARDNUMBER:
inputFields[a].setHintText(LocaleController.getString("PassportDocumentNumber", R.string.PassportDocumentNumber));
key = "document_no";
2018-08-27 10:33:11 +02:00
values = currentDocumentValues;
2018-07-30 04:07:02 +02:00
break;
case FIELD_EXPIRE:
inputFields[a].setHintText(LocaleController.getString("PassportExpired", R.string.PassportExpired));
key = "expiry_date";
2018-08-27 10:33:11 +02:00
values = currentDocumentValues;
2018-07-30 04:07:02 +02:00
break;
default:
continue;
}
2018-08-27 10:33:11 +02:00
setFieldValues(values, inputFields[a], key);
2018-07-30 04:07:02 +02:00
inputFields[a].setSelection(inputFields[a].length());
2018-08-27 10:33:11 +02:00
if (a == FIELD_NAME || a == FIELD_SURNAME || a == FIELD_MIDNAME) {
2018-07-30 04:07:02 +02:00
inputFields[a].addTextChangedListener(new TextWatcher() {
private boolean ignore;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (ignore) {
return;
}
2018-08-27 10:33:11 +02:00
int num = (Integer) field.getTag();
2018-07-30 04:07:02 +02:00
boolean error = false;
for (int a = 0; a < s.length(); a++) {
char ch = s.charAt(a);
if (!(ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch == ' ' || ch == '\'' || ch == ',' || ch == '.' || ch == '&' || ch == '-' || ch == '/')) {
error = true;
break;
}
}
2018-08-27 10:33:11 +02:00
if (error && !allowNonLatinName) {
2018-07-30 04:07:02 +02:00
field.setErrorText(LocaleController.getString("PassportUseLatinOnly", R.string.PassportUseLatinOnly));
} else {
2018-08-27 10:33:11 +02:00
nonLatinNames[num] = error;
checkFieldForError(field, key, s, false);
2018-07-30 04:07:02 +02:00
}
}
});
} else {
inputFields[a].addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
2018-08-27 10:33:11 +02:00
checkFieldForError(field, key, s, values == currentDocumentValues);
int field12 = (Integer) field.getTag();
final EditTextBoldCursor editText = inputFields[field12];
if (field12 == FIELD_RESIDENCE) {
checkNativeFields(true);
}
2018-07-30 04:07:02 +02:00
}
});
}
inputFields[a].setPadding(0, 0, 0, 0);
inputFields[a].setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
2019-01-23 18:03:33 +01:00
container.addView(inputFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 21, 0, 21, 0));
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
inputFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_NEXT) {
int num = (Integer) textView.getTag();
num++;
if (num < inputFields.length) {
if (inputFields[num].isFocusable()) {
inputFields[num].requestFocus();
} else {
inputFields[num].dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0, 0, 0));
textView.clearFocus();
AndroidUtilities.hideKeyboard(textView);
}
}
return true;
}
return false;
});
}
sectionCell2 = new ShadowSectionCell(context);
linearLayout2.addView(sectionCell2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
headerCell = new HeaderCell(context);
headerCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(headerCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
inputExtraFields = new EditTextBoldCursor[FIELD_NATIVE_COUNT];
for (int a = 0; a < FIELD_NATIVE_COUNT; a++) {
final EditTextBoldCursor field = new EditTextBoldCursor(context);
inputExtraFields[a] = field;
ViewGroup container = new FrameLayout(context) {
private StaticLayout errorLayout;
private float offsetX;
2018-07-30 04:07:02 +02:00
@Override
2018-08-27 10:33:11 +02:00
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(34);
errorLayout = field.getErrorLayout(width);
if (errorLayout != null) {
int lineCount = errorLayout.getLineCount();
if (lineCount > 1) {
int height = AndroidUtilities.dp(64) + (errorLayout.getLineBottom(lineCount - 1) - errorLayout.getLineBottom(0));
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
}
if (LocaleController.isRTL) {
float maxW = 0;
for (int a = 0; a < lineCount; a++) {
float l = errorLayout.getLineLeft(a);
if (l != 0) {
offsetX = 0;
break;
}
maxW = Math.max(maxW, errorLayout.getLineWidth(a));
if (a == lineCount - 1) {
offsetX = width - maxW;
}
2018-07-30 04:07:02 +02:00
}
}
}
2018-08-27 10:33:11 +02:00
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
if (errorLayout != null) {
canvas.save();
2019-01-23 18:03:33 +01:00
canvas.translate(AndroidUtilities.dp(21) + offsetX, field.getLineY() + AndroidUtilities.dp(3));
2018-08-27 10:33:11 +02:00
errorLayout.draw(canvas);
canvas.restore();
}
}
};
container.setWillNotDraw(false);
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 64));
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
if (a == FIELD_NATIVE_COUNT - 1) {
extraBackgroundView2 = new View(context);
extraBackgroundView2.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout2.addView(extraBackgroundView2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 6));
}
inputExtraFields[a].setTag(a);
inputExtraFields[a].setSupportRtlHint(true);
inputExtraFields[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
inputExtraFields[a].setHintColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText));
inputExtraFields[a].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputExtraFields[a].setHeaderHintColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueHeader));
inputExtraFields[a].setTransformHintToHeader(true);
inputExtraFields[a].setBackgroundDrawable(null);
inputExtraFields[a].setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
inputExtraFields[a].setCursorSize(AndroidUtilities.dp(20));
inputExtraFields[a].setCursorWidth(1.5f);
inputExtraFields[a].setLineColors(Theme.getColor(Theme.key_windowBackgroundWhiteInputField), Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated), Theme.getColor(Theme.key_windowBackgroundWhiteRedText3));
inputExtraFields[a].setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
inputExtraFields[a].setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
String value;
final String key;
HashMap<String, String> values;
switch (a) {
case FIELD_NATIVE_NAME:
key = "first_name_native";
values = currentValues;
break;
case FIELD_NATIVE_MIDNAME:
key = "middle_name_native";
values = currentValues;
break;
case FIELD_NATIVE_SURNAME:
key = "last_name_native";
values = currentValues;
break;
default:
continue;
}
setFieldValues(values, inputExtraFields[a], key);
inputExtraFields[a].setSelection(inputExtraFields[a].length());
if (a == FIELD_NATIVE_NAME || a == FIELD_NATIVE_SURNAME || a == FIELD_NATIVE_MIDNAME) {
inputExtraFields[a].addTextChangedListener(new TextWatcher() {
private boolean ignore;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (ignore) {
return;
}
checkFieldForError(field, key, s, false);
}
});
}
inputExtraFields[a].setPadding(0, 0, 0, 0);
inputExtraFields[a].setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
2019-01-23 18:03:33 +01:00
container.addView(inputExtraFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 21, 0, 21, 0));
2018-08-27 10:33:11 +02:00
inputExtraFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_NEXT) {
int num = (Integer) textView.getTag();
num++;
if (num < inputExtraFields.length) {
if (inputExtraFields[num].isFocusable()) {
inputExtraFields[num].requestFocus();
} else {
inputExtraFields[num].dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0, 0, 0));
textView.clearFocus();
AndroidUtilities.hideKeyboard(textView);
}
}
return true;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
return false;
2018-07-30 04:07:02 +02:00
});
}
2018-08-27 10:33:11 +02:00
nativeInfoCell = new TextInfoPrivacyCell(context);
linearLayout2.addView(nativeInfoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
if ((currentBotId != 0 || currentDocumentsType == null) && currentTypeValue != null && !documentOnly || currentDocumentsTypeValue != null) {
2018-07-30 04:07:02 +02:00
if (currentDocumentsTypeValue != null) {
addDocumentViews(currentDocumentsTypeValue.files);
if (currentDocumentsTypeValue.front_side instanceof TLRPC.TL_secureFile) {
addDocumentViewInternal((TLRPC.TL_secureFile) currentDocumentsTypeValue.front_side, UPLOADING_TYPE_FRONT);
}
if (currentDocumentsTypeValue.reverse_side instanceof TLRPC.TL_secureFile) {
addDocumentViewInternal((TLRPC.TL_secureFile) currentDocumentsTypeValue.reverse_side, UPLOADING_TYPE_REVERSE);
}
if (currentDocumentsTypeValue.selfie instanceof TLRPC.TL_secureFile) {
addDocumentViewInternal((TLRPC.TL_secureFile) currentDocumentsTypeValue.selfie, UPLOADING_TYPE_SELFIE);
}
2018-08-27 10:33:11 +02:00
addTranslationDocumentViews(currentDocumentsTypeValue.translation);
2018-07-30 04:07:02 +02:00
}
TextSettingsCell settingsCell1 = new TextSettingsCell(context);
settingsCell1.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText3));
settingsCell1.setBackgroundDrawable(Theme.getSelectorDrawable(true));
2018-08-27 10:33:11 +02:00
if (currentDocumentsType == null) {
2018-07-30 04:07:02 +02:00
settingsCell1.setText(LocaleController.getString("PassportDeleteInfo", R.string.PassportDeleteInfo), false);
} else {
settingsCell1.setText(LocaleController.getString("PassportDeleteDocument", R.string.PassportDeleteDocument), false);
}
linearLayout2.addView(settingsCell1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
2018-08-27 10:33:11 +02:00
settingsCell1.setOnClickListener(v -> createDocumentDeleteAlert());
nativeInfoCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
2018-07-30 04:07:02 +02:00
sectionCell = new ShadowSectionCell(context);
sectionCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(sectionCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else {
2018-08-27 10:33:11 +02:00
nativeInfoCell.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
2018-07-30 04:07:02 +02:00
updateInterfaceStringsForDocumentType();
2018-08-27 10:33:11 +02:00
checkNativeFields(false);
2018-07-30 04:07:02 +02:00
}
private void updateInterfaceStringsForDocumentType() {
2018-08-27 10:33:11 +02:00
if (currentDocumentsType != null) {
actionBar.setTitle(getTextForType(currentDocumentsType.type));
2018-07-30 04:07:02 +02:00
} else {
actionBar.setTitle(LocaleController.getString("PassportPersonal", R.string.PassportPersonal));
}
updateUploadText(UPLOADING_TYPE_FRONT);
updateUploadText(UPLOADING_TYPE_REVERSE);
updateUploadText(UPLOADING_TYPE_SELFIE);
2018-08-27 10:33:11 +02:00
updateUploadText(UPLOADING_TYPE_TRANSLATION);
2018-07-30 04:07:02 +02:00
}
private void updateUploadText(int type) {
if (type == UPLOADING_TYPE_DOCUMENTS) {
if (uploadDocumentCell == null) {
return;
}
if (documents.size() >= 1) {
uploadDocumentCell.setText(LocaleController.getString("PassportUploadAdditinalDocument", R.string.PassportUploadAdditinalDocument), false);
} else {
uploadDocumentCell.setText(LocaleController.getString("PassportUploadDocument", R.string.PassportUploadDocument), false);
}
} else if (type == UPLOADING_TYPE_SELFIE) {
if (uploadSelfieCell == null) {
return;
}
uploadSelfieCell.setVisibility(selfieDocument != null ? View.GONE : View.VISIBLE);
2018-08-27 10:33:11 +02:00
} else if (type == UPLOADING_TYPE_TRANSLATION) {
if (uploadTranslationCell == null) {
return;
}
if (translationDocuments.size() >= 1) {
uploadTranslationCell.setText(LocaleController.getString("PassportUploadAdditinalDocument", R.string.PassportUploadAdditinalDocument), false);
} else {
uploadTranslationCell.setText(LocaleController.getString("PassportUploadDocument", R.string.PassportUploadDocument), false);
}
2018-07-30 04:07:02 +02:00
} else if (type == UPLOADING_TYPE_FRONT) {
if (uploadFrontCell == null) {
return;
}
2018-08-27 10:33:11 +02:00
boolean divider = currentDocumentsType != null && (
currentDocumentsType.selfie_required ||
currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeIdentityCard ||
currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeDriverLicense);
if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypePassport || currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeInternalPassport) {
2018-07-30 04:07:02 +02:00
uploadFrontCell.setTextAndValue(LocaleController.getString("PassportMainPage", R.string.PassportMainPage), LocaleController.getString("PassportMainPageInfo", R.string.PassportMainPageInfo), divider);
} else {
uploadFrontCell.setTextAndValue(LocaleController.getString("PassportFrontSide", R.string.PassportFrontSide), LocaleController.getString("PassportFrontSideInfo", R.string.PassportFrontSideInfo), divider);
}
uploadFrontCell.setVisibility(frontDocument != null ? View.GONE : View.VISIBLE);
} else if (type == UPLOADING_TYPE_REVERSE) {
if (uploadReverseCell == null) {
return;
}
2018-08-27 10:33:11 +02:00
if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeIdentityCard || currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeDriverLicense) {
reverseLayout.setVisibility(View.VISIBLE);
uploadReverseCell.setVisibility(reverseDocument != null ? View.GONE : View.VISIBLE);
} else {
reverseLayout.setVisibility(View.GONE);
uploadReverseCell.setVisibility(View.GONE);
}
}
}
private void checkTopErrorCell(boolean init) {
if (topErrorCell == null) {
return;
}
SpannableStringBuilder stringBuilder = null;
if (fieldsErrors != null && (init || errorsValues.containsKey("error_all"))) {
String errorText = fieldsErrors.get("error_all");
if (errorText != null) {
stringBuilder = new SpannableStringBuilder(errorText);
if (init) {
errorsValues.put("error_all", "");
}
}
}
if (documentsErrors != null && (init || errorsValues.containsKey("error_document_all"))) {
String errorText = documentsErrors.get("error_all");
if (errorText != null) {
if (stringBuilder == null) {
stringBuilder = new SpannableStringBuilder(errorText);
} else {
stringBuilder.append("\n\n").append(errorText);
}
if (init) {
errorsValues.put("error_document_all", "");
}
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
if (stringBuilder != null) {
stringBuilder.setSpan(new ForegroundColorSpan(Theme.getColor(Theme.key_windowBackgroundWhiteRedText3)), 0, stringBuilder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
topErrorCell.setText(stringBuilder);
topErrorCell.setVisibility(View.VISIBLE);
} else if (topErrorCell.getVisibility() != View.GONE) {
topErrorCell.setVisibility(View.GONE);
}
2018-07-30 04:07:02 +02:00
}
private void addDocumentViewInternal(TLRPC.TL_secureFile f, int uploadingType) {
SecureDocumentKey secureDocumentKey = getSecureDocumentKey(f.secret, f.file_hash);
SecureDocument secureDocument = new SecureDocument(secureDocumentKey, f, null, null, null);
addDocumentView(secureDocument, uploadingType);
}
private void addDocumentViews(ArrayList<TLRPC.SecureFile> files) {
documents.clear();
for (int a = 0, size = files.size(); a < size; a++) {
TLRPC.SecureFile secureFile = files.get(a);
if (secureFile instanceof TLRPC.TL_secureFile) {
addDocumentViewInternal((TLRPC.TL_secureFile) secureFile, UPLOADING_TYPE_DOCUMENTS);
}
}
}
2018-08-27 10:33:11 +02:00
private void addTranslationDocumentViews(ArrayList<TLRPC.SecureFile> files) {
translationDocuments.clear();
for (int a = 0, size = files.size(); a < size; a++) {
TLRPC.SecureFile secureFile = files.get(a);
if (secureFile instanceof TLRPC.TL_secureFile) {
addDocumentViewInternal((TLRPC.TL_secureFile) secureFile, UPLOADING_TYPE_TRANSLATION);
}
}
}
private void setFieldValues(HashMap<String, String> values, EditTextBoldCursor editText, String key) {
2018-07-30 04:07:02 +02:00
String value;
2018-08-27 10:33:11 +02:00
if ((value = values.get(key)) != null) {
2018-07-30 04:07:02 +02:00
switch (key) {
case "country_code": {
currentCitizeship = value;
String country = languageMap.get(currentCitizeship);
if (country != null) {
editText.setText(country);
}
break;
}
case "residence_country_code": {
currentResidence = value;
String country = languageMap.get(currentResidence);
if (country != null) {
editText.setText(country);
}
break;
}
case "gender":
if ("male".equals(value)) {
currentGender = value;
editText.setText(LocaleController.getString("PassportMale", R.string.PassportMale));
} else if ("female".equals(value)) {
currentGender = value;
editText.setText(LocaleController.getString("PassportFemale", R.string.PassportFemale));
}
break;
case "expiry_date":
boolean ok = false;
if (!TextUtils.isEmpty(value)) {
2019-05-14 14:08:05 +02:00
String[] args = value.split("\\.");
2018-07-30 04:07:02 +02:00
if (args.length == 3) {
currentExpireDate[0] = Utilities.parseInt(args[2]);
currentExpireDate[1] = Utilities.parseInt(args[1]);
currentExpireDate[2] = Utilities.parseInt(args[0]);
editText.setText(value);
ok = true;
}
}
if (!ok) {
currentExpireDate[0] = currentExpireDate[1] = currentExpireDate[2] = 0;
editText.setText(LocaleController.getString("PassportNoExpireDate", R.string.PassportNoExpireDate));
}
break;
default:
editText.setText(value);
break;
}
}
if (fieldsErrors != null && (value = fieldsErrors.get(key)) != null) {
editText.setErrorText(value);
errorsValues.put(key, editText.getText().toString());
} else if (documentsErrors != null && (value = documentsErrors.get(key)) != null) {
editText.setErrorText(value);
errorsValues.put(key, editText.getText().toString());
}
}
private void addDocumentView(final SecureDocument document, final int type) {
if (type == UPLOADING_TYPE_SELFIE) {
selfieDocument = document;
if (selfieLayout == null) {
return;
}
2018-08-27 10:33:11 +02:00
} else if (type == UPLOADING_TYPE_TRANSLATION) {
translationDocuments.add(document);
if (translationLayout == null) {
return;
}
2018-07-30 04:07:02 +02:00
} else if (type == UPLOADING_TYPE_FRONT) {
frontDocument = document;
if (frontLayout == null) {
return;
}
} else if (type == UPLOADING_TYPE_REVERSE) {
reverseDocument = document;
if (reverseLayout == null) {
return;
}
} else {
documents.add(document);
if (documentsLayout == null) {
return;
}
}
if (getParentActivity() == null) {
return;
}
final SecureDocumentCell cell = new SecureDocumentCell(getParentActivity());
String value;
final String key;
cell.setTag(document);
cell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
String text;
documentsCells.put(document, cell);
String hash = getDocumentHash(document);
if (type == UPLOADING_TYPE_SELFIE) {
text = LocaleController.getString("PassportSelfie", R.string.PassportSelfie);
selfieLayout.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
key = "selfie" + hash;
2018-08-27 10:33:11 +02:00
} else if (type == UPLOADING_TYPE_TRANSLATION) {
text = LocaleController.getString("AttachPhoto", R.string.AttachPhoto);
translationLayout.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
key = "translation" + hash;
2018-07-30 04:07:02 +02:00
} else if (type == UPLOADING_TYPE_FRONT) {
2018-08-27 10:33:11 +02:00
if (currentDocumentsType.type instanceof TLRPC.TL_secureValueTypePassport || currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeInternalPassport) {
2018-07-30 04:07:02 +02:00
text = LocaleController.getString("PassportMainPage", R.string.PassportMainPage);
} else {
text = LocaleController.getString("PassportFrontSide", R.string.PassportFrontSide);
}
frontLayout.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
key = "front" + hash;
} else if (type == UPLOADING_TYPE_REVERSE) {
text = LocaleController.getString("PassportReverseSide", R.string.PassportReverseSide);
reverseLayout.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
key = "reverse" + hash;
} else {
text = LocaleController.getString("AttachPhoto", R.string.AttachPhoto);
documentsLayout.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
key = "files" + hash;
}
if (key == null || documentsErrors == null || (value = documentsErrors.get(key)) == null) {
value = LocaleController.formatDateForBan(document.secureFile.date);
} else {
cell.valueTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText3));
errorsValues.put(key, "");
}
cell.setTextAndValueAndImage(text, value, document);
2018-08-27 10:33:11 +02:00
cell.setOnClickListener(v -> {
uploadingFileType = type;
if (type == UPLOADING_TYPE_SELFIE) {
currentPhotoViewerLayout = selfieLayout;
} else if (type == UPLOADING_TYPE_TRANSLATION) {
currentPhotoViewerLayout = translationLayout;
} else if (type == UPLOADING_TYPE_FRONT) {
currentPhotoViewerLayout = frontLayout;
} else if (type == UPLOADING_TYPE_REVERSE) {
currentPhotoViewerLayout = reverseLayout;
} else {
currentPhotoViewerLayout = documentsLayout;
}
SecureDocument document1 = (SecureDocument) v.getTag();
PhotoViewer.getInstance().setParentActivity(getParentActivity());
2021-04-09 15:17:32 +02:00
if (type == UPLOADING_TYPE_SELFIE) {
ArrayList<SecureDocument> arrayList = new ArrayList<>();
arrayList.add(selfieDocument);
PhotoViewer.getInstance().openPhoto(arrayList, 0, provider);
} else if (type == UPLOADING_TYPE_FRONT) {
ArrayList<SecureDocument> arrayList = new ArrayList<>();
arrayList.add(frontDocument);
PhotoViewer.getInstance().openPhoto(arrayList, 0, provider);
} else if (type == UPLOADING_TYPE_REVERSE) {
ArrayList<SecureDocument> arrayList = new ArrayList<>();
arrayList.add(reverseDocument);
PhotoViewer.getInstance().openPhoto(arrayList, 0, provider);
} else if (type == UPLOADING_TYPE_DOCUMENTS) {
2018-08-27 10:33:11 +02:00
PhotoViewer.getInstance().openPhoto(documents, documents.indexOf(document1), provider);
} else {
2019-01-23 18:03:33 +01:00
PhotoViewer.getInstance().openPhoto(translationDocuments, translationDocuments.indexOf(document1), provider);
2018-07-30 04:07:02 +02:00
}
});
2018-08-27 10:33:11 +02:00
cell.setOnLongClickListener(v -> {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
if (type == UPLOADING_TYPE_SELFIE) {
builder.setMessage(LocaleController.getString("PassportDeleteSelfie", R.string.PassportDeleteSelfie));
} else {
builder.setMessage(LocaleController.getString("PassportDeleteScan", R.string.PassportDeleteScan));
}
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialog, which) -> {
documentsCells.remove(document);
2018-07-30 04:07:02 +02:00
if (type == UPLOADING_TYPE_SELFIE) {
2018-08-27 10:33:11 +02:00
selfieDocument = null;
selfieLayout.removeView(cell);
} else if (type == UPLOADING_TYPE_TRANSLATION) {
translationDocuments.remove(document);
translationLayout.removeView(cell);
} else if (type == UPLOADING_TYPE_FRONT) {
frontDocument = null;
frontLayout.removeView(cell);
} else if (type == UPLOADING_TYPE_REVERSE) {
reverseDocument = null;
reverseLayout.removeView(cell);
2018-07-30 04:07:02 +02:00
} else {
2018-08-27 10:33:11 +02:00
documents.remove(document);
documentsLayout.removeView(cell);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (key != null) {
if (documentsErrors != null) {
documentsErrors.remove(key);
}
if (errorsValues != null) {
errorsValues.remove(key);
}
}
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
updateUploadText(type);
if (document.path != null && uploadingDocuments.remove(document.path) != null) {
if (uploadingDocuments.isEmpty()) {
doneItem.setEnabled(true);
doneItem.setAlpha(1.0f);
2018-07-30 04:07:02 +02:00
}
2021-06-25 02:43:10 +02:00
FileLoader.getInstance(currentAccount).cancelFileUpload(document.path, false);
2018-08-27 10:33:11 +02:00
}
});
showDialog(builder.create());
return true;
2018-07-30 04:07:02 +02:00
});
}
private String getNameForType(TLRPC.SecureValueType type) {
if (type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
return "personal_details";
} else if (type instanceof TLRPC.TL_secureValueTypePassport) {
return "passport";
} else if (type instanceof TLRPC.TL_secureValueTypeInternalPassport) {
return "internal_passport";
} else if (type instanceof TLRPC.TL_secureValueTypeDriverLicense) {
return "driver_license";
} else if (type instanceof TLRPC.TL_secureValueTypeIdentityCard) {
return "identity_card";
} else if (type instanceof TLRPC.TL_secureValueTypeUtilityBill) {
return "utility_bill";
} else if (type instanceof TLRPC.TL_secureValueTypeAddress) {
return "address";
} else if (type instanceof TLRPC.TL_secureValueTypeBankStatement) {
return "bank_statement";
} else if (type instanceof TLRPC.TL_secureValueTypeRentalAgreement) {
return "rental_agreement";
} else if (type instanceof TLRPC.TL_secureValueTypeTemporaryRegistration) {
return "temporary_registration";
} else if (type instanceof TLRPC.TL_secureValueTypePassportRegistration) {
return "passport_registration";
} else if (type instanceof TLRPC.TL_secureValueTypeEmail) {
return "email";
} else if (type instanceof TLRPC.TL_secureValueTypePhone) {
return "phone";
}
return "";
}
2018-08-27 10:33:11 +02:00
private TextDetailSecureCell getViewByType(TLRPC.TL_secureRequiredType requiredType) {
TextDetailSecureCell view = typesViews.get(requiredType);
if (view == null) {
requiredType = documentsToTypesLink.get(requiredType);
if (requiredType != null) {
view = typesViews.get(requiredType);
}
}
return view;
}
private String getTextForType(TLRPC.SecureValueType type) {
if (type instanceof TLRPC.TL_secureValueTypePassport) {
return LocaleController.getString("ActionBotDocumentPassport", R.string.ActionBotDocumentPassport);
} else if (type instanceof TLRPC.TL_secureValueTypeDriverLicense) {
return LocaleController.getString("ActionBotDocumentDriverLicence", R.string.ActionBotDocumentDriverLicence);
} else if (type instanceof TLRPC.TL_secureValueTypeIdentityCard) {
return LocaleController.getString("ActionBotDocumentIdentityCard", R.string.ActionBotDocumentIdentityCard);
} else if (type instanceof TLRPC.TL_secureValueTypeUtilityBill) {
return LocaleController.getString("ActionBotDocumentUtilityBill", R.string.ActionBotDocumentUtilityBill);
} else if (type instanceof TLRPC.TL_secureValueTypeBankStatement) {
return LocaleController.getString("ActionBotDocumentBankStatement", R.string.ActionBotDocumentBankStatement);
} else if (type instanceof TLRPC.TL_secureValueTypeRentalAgreement) {
return LocaleController.getString("ActionBotDocumentRentalAgreement", R.string.ActionBotDocumentRentalAgreement);
} else if (type instanceof TLRPC.TL_secureValueTypeInternalPassport) {
return LocaleController.getString("ActionBotDocumentInternalPassport", R.string.ActionBotDocumentInternalPassport);
} else if (type instanceof TLRPC.TL_secureValueTypePassportRegistration) {
return LocaleController.getString("ActionBotDocumentPassportRegistration", R.string.ActionBotDocumentPassportRegistration);
} else if (type instanceof TLRPC.TL_secureValueTypeTemporaryRegistration) {
return LocaleController.getString("ActionBotDocumentTemporaryRegistration", R.string.ActionBotDocumentTemporaryRegistration);
} else if (type instanceof TLRPC.TL_secureValueTypePhone) {
return LocaleController.getString("ActionBotDocumentPhone", R.string.ActionBotDocumentPhone);
} else if (type instanceof TLRPC.TL_secureValueTypeEmail) {
return LocaleController.getString("ActionBotDocumentEmail", R.string.ActionBotDocumentEmail);
}
return "";
}
private void setTypeValue(TLRPC.TL_secureRequiredType requiredType, String text, String json, TLRPC.TL_secureRequiredType documentRequiredType, String documentsJson, boolean documentOnly, int availableDocumentTypesCount) {
TextDetailSecureCell view = typesViews.get(requiredType);
2018-07-30 04:07:02 +02:00
if (view == null) {
if (currentActivityType == TYPE_MANAGE) {
2018-08-27 10:33:11 +02:00
ArrayList<TLRPC.TL_secureRequiredType> documentTypes = new ArrayList<>();
if (documentRequiredType != null) {
documentTypes.add(documentRequiredType);
2018-07-30 04:07:02 +02:00
}
View prev = linearLayout2.getChildAt(linearLayout2.getChildCount() - 6);
if (prev instanceof TextDetailSecureCell) {
((TextDetailSecureCell) prev).setNeedDivider(true);
}
2018-08-27 10:33:11 +02:00
view = addField(getParentActivity(), requiredType, documentTypes, true, true);
2018-07-30 04:07:02 +02:00
updateManageVisibility();
} else {
return;
}
}
2018-08-27 10:33:11 +02:00
HashMap<String, String> values = typesValues.get(requiredType);
HashMap<String, String> documentValues = documentRequiredType != null ? typesValues.get(documentRequiredType) : null;
TLRPC.TL_secureValue requiredTypeValue = getValueByType(requiredType, true);
TLRPC.TL_secureValue documentRequiredTypeValue = getValueByType(documentRequiredType, true);
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
if (json != null && languageMap == null) {
2018-07-30 04:07:02 +02:00
languageMap = new HashMap<>();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(ApplicationLoader.applicationContext.getResources().getAssets().open("countries.txt")));
String line;
while ((line = reader.readLine()) != null) {
String[] args = line.split(";");
languageMap.put(args[1], args[2]);
}
reader.close();
} catch (Exception e) {
FileLog.e(e);
}
} else {
languageMap = null;
}
String value = null;
2018-08-27 10:33:11 +02:00
if (text != null) {
if (requiredType.type instanceof TLRPC.TL_secureValueTypePhone) {
value = PhoneFormat.getInstance().format("+" + text);
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypeEmail) {
value = text;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
} else {
StringBuilder stringBuilder = null;
if (currentActivityType != TYPE_MANAGE && documentRequiredType != null && (!TextUtils.isEmpty(documentsJson) || documentRequiredTypeValue != null)) {
if (stringBuilder == null) {
stringBuilder = new StringBuilder();
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (availableDocumentTypesCount > 1) {
stringBuilder.append(getTextForType(documentRequiredType.type));
} else if (TextUtils.isEmpty(documentsJson)) {
stringBuilder.append(LocaleController.getString("PassportDocuments", R.string.PassportDocuments));
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
if (json != null || documentsJson != null) {
if (values == null) {
return;
}
values.clear();
2019-05-14 14:08:05 +02:00
String[] keys = null;
String[] documentKeys = null;
2018-08-27 10:33:11 +02:00
if (requiredType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
if (currentActivityType == TYPE_REQUEST && !documentOnly || currentActivityType == TYPE_MANAGE && documentRequiredType == null) {
keys = new String[]{
"first_name",
"middle_name",
"last_name",
"first_name_native",
"middle_name_native",
"last_name_native",
"birth_date",
"gender",
"country_code",
"residence_country_code"
};
}
if (currentActivityType == TYPE_REQUEST || currentActivityType == TYPE_MANAGE && documentRequiredType != null) {
documentKeys = new String[]{
"document_no",
"expiry_date"
};
}
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypeAddress) {
if (currentActivityType == TYPE_REQUEST && !documentOnly || currentActivityType == TYPE_MANAGE && documentRequiredType == null) {
keys = new String[]{
"street_line1",
"street_line2",
"post_code",
"city",
"state",
"country_code"
};
}
}
if (keys != null || documentKeys != null) {
try {
JSONObject jsonObject = null;
2019-05-14 14:08:05 +02:00
String[] currentKeys = null;
2018-08-27 10:33:11 +02:00
for (int b = 0; b < 2; b++) {
if (b == 0) {
if (json != null) {
jsonObject = new JSONObject(json);
currentKeys = keys;
}
} else {
if (documentValues == null) {
continue;
}
if (documentsJson != null) {
jsonObject = new JSONObject(documentsJson);
currentKeys = documentKeys;
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (currentKeys == null || jsonObject == null) {
continue;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
try {
Iterator<String> iter = jsonObject.keys();
while (iter.hasNext()) {
String key = iter.next();
if (b == 0) {
values.put(key, jsonObject.getString(key));
} else {
documentValues.put(key, jsonObject.getString(key));
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
} catch (Throwable e) {
FileLog.e(e);
}
for (int a = 0; a < currentKeys.length; a++) {
if (jsonObject.has(currentKeys[a])) {
if (stringBuilder == null) {
stringBuilder = new StringBuilder();
}
String jsonValue = jsonObject.getString(currentKeys[a]);
if (jsonValue != null) {
if (!TextUtils.isEmpty(jsonValue)) {
if ("first_name_native".equals(currentKeys[a]) ||
"middle_name_native".equals(currentKeys[a]) ||
"last_name_native".equals(currentKeys[a])) {
continue;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
if (stringBuilder.length() > 0) {
if ("last_name".equals(currentKeys[a]) || "last_name_native".equals(currentKeys[a]) || "middle_name".equals(currentKeys[a]) || "middle_name_native".equals(currentKeys[a])) {
stringBuilder.append(" ");
} else {
stringBuilder.append(", ");
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}
switch (currentKeys[a]) {
case "country_code":
case "residence_country_code":
String country = languageMap.get(jsonValue);
if (country != null) {
stringBuilder.append(country);
}
break;
case "gender":
if ("male".equals(jsonValue)) {
stringBuilder.append(LocaleController.getString("PassportMale", R.string.PassportMale));
} else if ("female".equals(jsonValue)) {
stringBuilder.append(LocaleController.getString("PassportFemale", R.string.PassportFemale));
}
break;
default:
stringBuilder.append(jsonValue);
break;
}
2018-07-30 04:07:02 +02:00
}
}
}
}
}
2018-08-27 10:33:11 +02:00
} catch (Exception ignore) {
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
}
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
if (stringBuilder != null) {
value = stringBuilder.toString();
2018-07-30 04:07:02 +02:00
}
}
boolean isError = false;
2018-08-27 10:33:11 +02:00
HashMap<String, String> errors = !documentOnly ? errorsMap.get(getNameForType(requiredType.type)) : null;
HashMap<String, String> documentsErrors = documentRequiredType != null ? errorsMap.get(getNameForType(documentRequiredType.type)) : null;
2018-07-30 04:07:02 +02:00
if (errors != null && errors.size() > 0 || documentsErrors != null && documentsErrors.size() > 0) {
2018-08-27 10:33:11 +02:00
value = null;
if (!documentOnly) {
value = mainErrorsMap.get(getNameForType(requiredType.type));
}
if (value == null) {
value = mainErrorsMap.get(getNameForType(documentRequiredType.type));
}
2018-07-30 04:07:02 +02:00
isError = true;
} else {
2018-08-27 10:33:11 +02:00
if (requiredType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
2018-07-30 04:07:02 +02:00
if (TextUtils.isEmpty(value)) {
2018-08-27 10:33:11 +02:00
if (documentRequiredType == null) {
2018-07-30 04:07:02 +02:00
value = LocaleController.getString("PassportPersonalDetailsInfo", R.string.PassportPersonalDetailsInfo);
} else {
if (currentActivityType == TYPE_MANAGE) {
value = LocaleController.getString("PassportDocuments", R.string.PassportDocuments);
} else {
2018-08-27 10:33:11 +02:00
if (availableDocumentTypesCount == 1) {
if (documentRequiredType.type instanceof TLRPC.TL_secureValueTypePassport) {
value = LocaleController.getString("PassportIdentityPassport", R.string.PassportIdentityPassport);
} else if (documentRequiredType.type instanceof TLRPC.TL_secureValueTypeInternalPassport) {
value = LocaleController.getString("PassportIdentityInternalPassport", R.string.PassportIdentityInternalPassport);
} else if (documentRequiredType.type instanceof TLRPC.TL_secureValueTypeDriverLicense) {
value = LocaleController.getString("PassportIdentityDriverLicence", R.string.PassportIdentityDriverLicence);
} else if (documentRequiredType.type instanceof TLRPC.TL_secureValueTypeIdentityCard) {
value = LocaleController.getString("PassportIdentityID", R.string.PassportIdentityID);
}
} else {
value = LocaleController.getString("PassportIdentityDocumentInfo", R.string.PassportIdentityDocumentInfo);
}
2018-07-30 04:07:02 +02:00
}
}
}
2018-08-27 10:33:11 +02:00
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypeAddress) {
2018-07-30 04:07:02 +02:00
if (TextUtils.isEmpty(value)) {
2018-08-27 10:33:11 +02:00
if (documentRequiredType == null) {
2018-07-30 04:07:02 +02:00
value = LocaleController.getString("PassportAddressNoUploadInfo", R.string.PassportAddressNoUploadInfo);
} else {
if (currentActivityType == TYPE_MANAGE) {
value = LocaleController.getString("PassportDocuments", R.string.PassportDocuments);
} else {
2018-08-27 10:33:11 +02:00
if (availableDocumentTypesCount == 1) {
if (documentRequiredType.type instanceof TLRPC.TL_secureValueTypeRentalAgreement) {
value = LocaleController.getString("PassportAddAgreementInfo", R.string.PassportAddAgreementInfo);
} else if (documentRequiredType.type instanceof TLRPC.TL_secureValueTypeUtilityBill) {
value = LocaleController.getString("PassportAddBillInfo", R.string.PassportAddBillInfo);
} else if (documentRequiredType.type instanceof TLRPC.TL_secureValueTypePassportRegistration) {
value = LocaleController.getString("PassportAddPassportRegistrationInfo", R.string.PassportAddPassportRegistrationInfo);
} else if (documentRequiredType.type instanceof TLRPC.TL_secureValueTypeTemporaryRegistration) {
value = LocaleController.getString("PassportAddTemporaryRegistrationInfo", R.string.PassportAddTemporaryRegistrationInfo);
} else if (documentRequiredType.type instanceof TLRPC.TL_secureValueTypeBankStatement) {
value = LocaleController.getString("PassportAddBankInfo", R.string.PassportAddBankInfo);
}
} else {
value = LocaleController.getString("PassportAddressInfo", R.string.PassportAddressInfo);
}
2018-07-30 04:07:02 +02:00
}
}
}
2018-08-27 10:33:11 +02:00
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypePhone) {
2018-07-30 04:07:02 +02:00
if (TextUtils.isEmpty(value)) {
value = LocaleController.getString("PassportPhoneInfo", R.string.PassportPhoneInfo);
}
2018-08-27 10:33:11 +02:00
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypeEmail) {
2018-07-30 04:07:02 +02:00
if (TextUtils.isEmpty(value)) {
value = LocaleController.getString("PassportEmailInfo", R.string.PassportEmailInfo);
}
}
}
view.setValue(value);
view.valueTextView.setTextColor(Theme.getColor(isError ? Theme.key_windowBackgroundWhiteRedText3 : Theme.key_windowBackgroundWhiteGrayText2));
2018-08-27 10:33:11 +02:00
view.setChecked(!isError && currentActivityType != TYPE_MANAGE && (documentOnly && documentRequiredType != null || !documentOnly && requiredTypeValue != null) && (documentRequiredType == null || documentRequiredTypeValue != null));
}
private void checkNativeFields(boolean byEdit) {
if (inputExtraFields == null) {
return;
}
String country = languageMap.get(currentResidence);
HashMap<String, String> map = SharedConfig.getCountryLangs();
String lang = map.get(currentResidence);
if (!currentType.native_names || TextUtils.isEmpty(currentResidence) || "EN".equals(lang)) {
if (nativeInfoCell.getVisibility() != View.GONE) {
nativeInfoCell.setVisibility(View.GONE);
headerCell.setVisibility(View.GONE);
extraBackgroundView2.setVisibility(View.GONE);
for (int a = 0; a < inputExtraFields.length; a++) {
((View) inputExtraFields[a].getParent()).setVisibility(View.GONE);
}
if ((currentBotId != 0 || currentDocumentsType == null) && currentTypeValue != null && !documentOnly || currentDocumentsTypeValue != null) {
sectionCell2.setBackgroundDrawable(Theme.getThemedDrawable(getParentActivity(), R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
} else {
sectionCell2.setBackgroundDrawable(Theme.getThemedDrawable(getParentActivity(), R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
}
}
} else {
if (nativeInfoCell.getVisibility() != View.VISIBLE) {
nativeInfoCell.setVisibility(View.VISIBLE);
headerCell.setVisibility(View.VISIBLE);
extraBackgroundView2.setVisibility(View.VISIBLE);
for (int a = 0; a < inputExtraFields.length; a++) {
((View) inputExtraFields[a].getParent()).setVisibility(View.VISIBLE);
}
if (inputExtraFields[FIELD_NATIVE_NAME].length() == 0 && inputExtraFields[FIELD_NATIVE_MIDNAME].length() == 0 && inputExtraFields[FIELD_NATIVE_SURNAME].length() == 0) {
for (int a = 0; a < nonLatinNames.length; a++) {
if (nonLatinNames[a]) {
inputExtraFields[FIELD_NATIVE_NAME].setText(inputFields[FIELD_NAME].getText());
inputExtraFields[FIELD_NATIVE_MIDNAME].setText(inputFields[FIELD_MIDNAME].getText());
inputExtraFields[FIELD_NATIVE_SURNAME].setText(inputFields[FIELD_SURNAME].getText());
break;
}
}
}
sectionCell2.setBackgroundDrawable(Theme.getThemedDrawable(getParentActivity(), R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
}
nativeInfoCell.setText(LocaleController.formatString("PassportNativeInfo", R.string.PassportNativeInfo, country));
String header = lang != null ? LocaleController.getServerString("PassportLanguage_" + lang) : null;
if (header != null) {
headerCell.setText(LocaleController.formatString("PassportNativeHeaderLang", R.string.PassportNativeHeaderLang, header));
} else {
headerCell.setText(LocaleController.getString("PassportNativeHeader", R.string.PassportNativeHeader));
}
for (int a = 0; a < FIELD_NATIVE_COUNT; a++) {
switch (a) {
case FIELD_NATIVE_NAME:
if (header != null) {
inputExtraFields[a].setHintText(LocaleController.getString("PassportName", R.string.PassportName));
} else {
inputExtraFields[a].setHintText(LocaleController.formatString("PassportNameCountry", R.string.PassportNameCountry, country));
}
break;
case FIELD_NATIVE_MIDNAME:
if (header != null) {
inputExtraFields[a].setHintText(LocaleController.getString("PassportMidname", R.string.PassportMidname));
} else {
inputExtraFields[a].setHintText(LocaleController.formatString("PassportMidnameCountry", R.string.PassportMidnameCountry, country));
}
break;
case FIELD_NATIVE_SURNAME:
if (header != null) {
inputExtraFields[a].setHintText(LocaleController.getString("PassportSurname", R.string.PassportSurname));
} else {
inputExtraFields[a].setHintText(LocaleController.formatString("PassportSurnameCountry", R.string.PassportSurnameCountry, country));
}
break;
}
}
if (byEdit) {
AndroidUtilities.runOnUIThread(() -> {
if (inputExtraFields != null) {
scrollToField(inputExtraFields[FIELD_NATIVE_NAME]);
}
});
}
}
2018-07-30 04:07:02 +02:00
}
private String getErrorsString(HashMap<String, String> errors, HashMap<String, String> documentErrors) {
StringBuilder stringBuilder = new StringBuilder();
for (int a = 0; a < 2; a++) {
HashMap<String, String> hashMap;
if (a == 0) {
hashMap = errors;
} else {
hashMap = documentErrors;
}
if (hashMap == null) {
continue;
}
for (HashMap.Entry<String, String> entry : hashMap.entrySet()) {
String value = entry.getValue();
if (stringBuilder.length() > 0) {
stringBuilder.append(", ");
value = value.toLowerCase();
}
if (value.endsWith(".")) {
value = value.substring(0, value.length() - 1);
}
stringBuilder.append(value);
}
}
if (stringBuilder.length() > 0) {
stringBuilder.append('.');
}
return stringBuilder.toString();
}
2018-08-27 10:33:11 +02:00
private TLRPC.TL_secureValue getValueByType(TLRPC.TL_secureRequiredType requiredType, boolean check) {
if (requiredType == null) {
2018-07-30 04:07:02 +02:00
return null;
}
for (int a = 0, size = currentForm.values.size(); a < size; a++) {
TLRPC.TL_secureValue secureValue = currentForm.values.get(a);
2018-08-27 10:33:11 +02:00
if (requiredType.type.getClass() == secureValue.type.getClass()) {
2018-07-30 04:07:02 +02:00
if (check) {
2018-08-27 10:33:11 +02:00
if (requiredType.selfie_required) {
2018-07-30 04:07:02 +02:00
if (!(secureValue.selfie instanceof TLRPC.TL_secureFile)) {
return null;
}
}
2018-08-27 10:33:11 +02:00
if (requiredType.translation_required) {
if (secureValue.translation.isEmpty()) {
return null;
}
}
if (isAddressDocument(requiredType.type)) {
2018-07-30 04:07:02 +02:00
if (secureValue.files.isEmpty()) {
return null;
}
}
2018-08-27 10:33:11 +02:00
if (isPersonalDocument(requiredType.type)) {
2018-07-30 04:07:02 +02:00
if (!(secureValue.front_side instanceof TLRPC.TL_secureFile)) {
return null;
}
}
2018-08-27 10:33:11 +02:00
if (requiredType.type instanceof TLRPC.TL_secureValueTypeDriverLicense || requiredType.type instanceof TLRPC.TL_secureValueTypeIdentityCard) {
2018-07-30 04:07:02 +02:00
if (!(secureValue.reverse_side instanceof TLRPC.TL_secureFile)) {
return null;
}
}
2018-08-27 10:33:11 +02:00
if (requiredType.type instanceof TLRPC.TL_secureValueTypePersonalDetails || requiredType.type instanceof TLRPC.TL_secureValueTypeAddress) {
String[] keys;
if (requiredType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
if (requiredType.native_names) {
keys = new String[]{
"first_name_native",
"last_name_native",
"birth_date",
"gender",
"country_code",
"residence_country_code"
};
} else {
keys = new String[]{
"first_name",
"last_name",
"birth_date",
"gender",
"country_code",
"residence_country_code"
};
}
} else {
keys = new String[]{
"street_line1",
"street_line2",
"post_code",
"city",
"state",
"country_code"
};
}
try {
JSONObject jsonObject = new JSONObject(decryptData(secureValue.data.data, decryptValueSecret(secureValue.data.secret, secureValue.data.data_hash), secureValue.data.data_hash));
for (int b = 0; b < keys.length; b++) {
if (!jsonObject.has(keys[b]) || TextUtils.isEmpty(jsonObject.getString(keys[b]))) {
return null;
}
}
} catch (Throwable ignore) {
return null;
}
}
2018-07-30 04:07:02 +02:00
}
return secureValue;
}
}
return null;
}
2018-08-27 10:33:11 +02:00
private void openTypeActivity(TLRPC.TL_secureRequiredType requiredType, TLRPC.TL_secureRequiredType documentRequiredType, ArrayList<TLRPC.TL_secureRequiredType> availableDocumentTypes, boolean documentOnly) {
2018-07-30 04:07:02 +02:00
int activityType = -1;
2018-08-27 10:33:11 +02:00
final int availableDocumentTypesCount = availableDocumentTypes != null ? availableDocumentTypes.size() : 0;
TLRPC.SecureValueType type = requiredType.type;
TLRPC.SecureValueType documentType = documentRequiredType != null ? documentRequiredType.type : null;
2018-07-30 04:07:02 +02:00
if (type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
activityType = TYPE_IDENTITY;
} else if (type instanceof TLRPC.TL_secureValueTypeAddress) {
activityType = TYPE_ADDRESS;
} else if (type instanceof TLRPC.TL_secureValueTypePhone) {
activityType = TYPE_PHONE;
} else if (type instanceof TLRPC.TL_secureValueTypeEmail) {
activityType = TYPE_EMAIL;
}
if (activityType != -1) {
2018-08-27 10:33:11 +02:00
HashMap<String, String> errors = !documentOnly ? errorsMap.get(getNameForType(type)) : null;
HashMap<String, String> documentsErrors = errorsMap.get(getNameForType(documentType));
TLRPC.TL_secureValue value = getValueByType(requiredType, false);
TLRPC.TL_secureValue documentsValue = getValueByType(documentRequiredType, false);
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
final PassportActivity activity = new PassportActivity(activityType, currentForm, currentPassword, requiredType, value, documentRequiredType, documentsValue, typesValues.get(requiredType), documentRequiredType != null ? typesValues.get(documentRequiredType) : null);
2018-07-30 04:07:02 +02:00
activity.delegate = new PassportActivityDelegate() {
private TLRPC.InputSecureFile getInputSecureFile(SecureDocument document) {
if (document.inputFile != null) {
TLRPC.TL_inputSecureFileUploaded inputSecureFileUploaded = new TLRPC.TL_inputSecureFileUploaded();
inputSecureFileUploaded.id = document.inputFile.id;
inputSecureFileUploaded.parts = document.inputFile.parts;
inputSecureFileUploaded.md5_checksum = document.inputFile.md5_checksum;
inputSecureFileUploaded.file_hash = document.fileHash;
inputSecureFileUploaded.secret = document.fileSecret;
return inputSecureFileUploaded;
} else {
TLRPC.TL_inputSecureFile inputSecureFile = new TLRPC.TL_inputSecureFile();
inputSecureFile.id = document.secureFile.id;
inputSecureFile.access_hash = document.secureFile.access_hash;
return inputSecureFile;
}
}
private void renameFile(SecureDocument oldDocument, TLRPC.TL_secureFile newSecureFile) {
2022-06-21 04:51:00 +02:00
File oldFile = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(oldDocument);
2018-07-30 04:07:02 +02:00
String oldKey = oldDocument.secureFile.dc_id + "_" + oldDocument.secureFile.id;
2022-06-21 04:51:00 +02:00
File newFile = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(newSecureFile);
2018-07-30 04:07:02 +02:00
String newKey = newSecureFile.dc_id + "_" + newSecureFile.id;
oldFile.renameTo(newFile);
ImageLoader.getInstance().replaceImageInCache(oldKey, newKey, null, false);
}
@Override
2018-08-27 10:33:11 +02:00
public void saveValue(final TLRPC.TL_secureRequiredType requiredType, final String text, final String json, final TLRPC.TL_secureRequiredType documentRequiredType, final String documentsJson, final ArrayList<SecureDocument> documents, final SecureDocument selfie, final ArrayList<SecureDocument> translationDocuments, final SecureDocument front, final SecureDocument reverse, final Runnable finishRunnable, final ErrorRunnable errorRunnable) {
2018-07-30 04:07:02 +02:00
TLRPC.TL_inputSecureValue inputSecureValue = null;
if (!TextUtils.isEmpty(json)) {
inputSecureValue = new TLRPC.TL_inputSecureValue();
2018-08-27 10:33:11 +02:00
inputSecureValue.type = requiredType.type;
2018-07-30 04:07:02 +02:00
inputSecureValue.flags |= 1;
EncryptionResult result = encryptData(AndroidUtilities.getStringBytes(json));
inputSecureValue.data = new TLRPC.TL_secureData();
inputSecureValue.data.data = result.encryptedData;
inputSecureValue.data.data_hash = result.fileHash;
inputSecureValue.data.secret = result.fileSecret;
} else if (!TextUtils.isEmpty(text)) {
TLRPC.SecurePlainData plainData;
if (type instanceof TLRPC.TL_secureValueTypeEmail) {
TLRPC.TL_securePlainEmail securePlainEmail = new TLRPC.TL_securePlainEmail();
securePlainEmail.email = text;
plainData = securePlainEmail;
} else if (type instanceof TLRPC.TL_secureValueTypePhone) {
TLRPC.TL_securePlainPhone securePlainPhone = new TLRPC.TL_securePlainPhone();
securePlainPhone.phone = text;
plainData = securePlainPhone;
} else {
return;
}
inputSecureValue = new TLRPC.TL_inputSecureValue();
2018-08-27 10:33:11 +02:00
inputSecureValue.type = requiredType.type;
2018-07-30 04:07:02 +02:00
inputSecureValue.flags |= 32;
inputSecureValue.plain_data = plainData;
}
2018-08-27 10:33:11 +02:00
if (!documentOnly && inputSecureValue == null) {
2018-07-30 04:07:02 +02:00
if (errorRunnable != null) {
errorRunnable.onError(null, null);
}
return;
}
TLRPC.TL_inputSecureValue fileInputSecureValue;
2018-08-27 10:33:11 +02:00
if (documentRequiredType != null) {
2018-07-30 04:07:02 +02:00
fileInputSecureValue = new TLRPC.TL_inputSecureValue();
2018-08-27 10:33:11 +02:00
fileInputSecureValue.type = documentRequiredType.type;
2018-07-30 04:07:02 +02:00
if (!TextUtils.isEmpty(documentsJson)) {
fileInputSecureValue.flags |= 1;
EncryptionResult result = encryptData(AndroidUtilities.getStringBytes(documentsJson));
fileInputSecureValue.data = new TLRPC.TL_secureData();
fileInputSecureValue.data.data = result.encryptedData;
fileInputSecureValue.data.data_hash = result.fileHash;
fileInputSecureValue.data.secret = result.fileSecret;
}
if (front != null) {
fileInputSecureValue.front_side = getInputSecureFile(front);
fileInputSecureValue.flags |= 2;
}
if (reverse != null) {
fileInputSecureValue.reverse_side = getInputSecureFile(reverse);
fileInputSecureValue.flags |= 4;
}
if (selfie != null) {
fileInputSecureValue.selfie = getInputSecureFile(selfie);
fileInputSecureValue.flags |= 8;
}
2018-08-27 10:33:11 +02:00
if (translationDocuments != null && !translationDocuments.isEmpty()) {
fileInputSecureValue.flags |= 64;
for (int a = 0, size = translationDocuments.size(); a < size; a++) {
fileInputSecureValue.translation.add(getInputSecureFile(translationDocuments.get(a)));
}
}
2018-07-30 04:07:02 +02:00
if (documents != null && !documents.isEmpty()) {
fileInputSecureValue.flags |= 16;
for (int a = 0, size = documents.size(); a < size; a++) {
fileInputSecureValue.files.add(getInputSecureFile(documents.get(a)));
}
}
2018-08-27 10:33:11 +02:00
if (documentOnly) {
2018-07-30 04:07:02 +02:00
inputSecureValue = fileInputSecureValue;
fileInputSecureValue = null;
}
} else {
fileInputSecureValue = null;
}
final PassportActivityDelegate currentDelegate = this;
final TLRPC.TL_inputSecureValue finalFileInputSecureValue = fileInputSecureValue;
final TLRPC.TL_account_saveSecureValue req = new TLRPC.TL_account_saveSecureValue();
req.value = inputSecureValue;
req.secure_secret_id = secureSecretId;
ConnectionsManager.getInstance(currentAccount).sendRequest(req, new RequestDelegate() {
private void onResult(final TLRPC.TL_error error, final TLRPC.TL_secureValue newValue, final TLRPC.TL_secureValue newPendingValue) {
2018-08-27 10:33:11 +02:00
AndroidUtilities.runOnUIThread(() -> {
if (error != null) {
if (errorRunnable != null) {
errorRunnable.onError(error.text, text);
}
AlertsCreator.processError(currentAccount, error, PassportActivity.this, req, text);
} else {
if (documentOnly) {
if (documentRequiredType != null) {
removeValue(documentRequiredType);
2018-07-30 04:07:02 +02:00
} else {
2018-08-27 10:33:11 +02:00
removeValue(requiredType);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
} else {
removeValue(requiredType);
removeValue(documentRequiredType);
}
if (newValue != null) {
currentForm.values.add(newValue);
}
if (newPendingValue != null) {
currentForm.values.add(newPendingValue);
}
if (documents != null && !documents.isEmpty()) {
for (int a = 0, size = documents.size(); a < size; a++) {
SecureDocument document = documents.get(a);
if (document.inputFile != null) {
for (int b = 0, size2 = newValue.files.size(); b < size2; b++) {
TLRPC.SecureFile file = newValue.files.get(b);
if (file instanceof TLRPC.TL_secureFile) {
TLRPC.TL_secureFile secureFile = (TLRPC.TL_secureFile) file;
if (Utilities.arraysEquals(document.fileSecret, 0, secureFile.secret, 0)) {
renameFile(document, secureFile);
break;
2018-07-30 04:07:02 +02:00
}
}
}
}
}
2018-08-27 10:33:11 +02:00
}
if (selfie != null && selfie.inputFile != null && newValue.selfie instanceof TLRPC.TL_secureFile) {
TLRPC.TL_secureFile secureFile = (TLRPC.TL_secureFile) newValue.selfie;
if (Utilities.arraysEquals(selfie.fileSecret, 0, secureFile.secret, 0)) {
renameFile(selfie, secureFile);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}
if (front != null && front.inputFile != null && newValue.front_side instanceof TLRPC.TL_secureFile) {
TLRPC.TL_secureFile secureFile = (TLRPC.TL_secureFile) newValue.front_side;
if (Utilities.arraysEquals(front.fileSecret, 0, secureFile.secret, 0)) {
renameFile(front, secureFile);
}
}
if (reverse != null && reverse.inputFile != null && newValue.reverse_side instanceof TLRPC.TL_secureFile) {
TLRPC.TL_secureFile secureFile = (TLRPC.TL_secureFile) newValue.reverse_side;
if (Utilities.arraysEquals(reverse.fileSecret, 0, secureFile.secret, 0)) {
renameFile(reverse, secureFile);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}
if (translationDocuments != null && !translationDocuments.isEmpty()) {
for (int a = 0, size = translationDocuments.size(); a < size; a++) {
SecureDocument document = translationDocuments.get(a);
if (document.inputFile != null) {
for (int b = 0, size2 = newValue.translation.size(); b < size2; b++) {
TLRPC.SecureFile file = newValue.translation.get(b);
if (file instanceof TLRPC.TL_secureFile) {
TLRPC.TL_secureFile secureFile = (TLRPC.TL_secureFile) file;
if (Utilities.arraysEquals(document.fileSecret, 0, secureFile.secret, 0)) {
renameFile(document, secureFile);
break;
}
}
}
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
}
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
setTypeValue(requiredType, text, json, documentRequiredType, documentsJson, documentOnly, availableDocumentTypesCount);
if (finishRunnable != null) {
finishRunnable.run();
2018-07-30 04:07:02 +02:00
}
}
});
}
@Override
public void run(final TLObject response, final TLRPC.TL_error error) {
if (error != null) {
if (error.text.equals("EMAIL_VERIFICATION_NEEDED")) {
TLRPC.TL_account_sendVerifyEmailCode req = new TLRPC.TL_account_sendVerifyEmailCode();
req.email = text;
2018-08-27 10:33:11 +02:00
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response1, error1) -> AndroidUtilities.runOnUIThread(() -> {
if (response1 != null) {
TLRPC.TL_account_sentEmailCode res = (TLRPC.TL_account_sentEmailCode) response1;
HashMap<String, String> values = new HashMap<>();
values.put("email", text);
values.put("pattern", res.email_pattern);
PassportActivity activity1 = new PassportActivity(TYPE_EMAIL_VERIFICATION, currentForm, currentPassword, requiredType, null, null, null, values, null);
activity1.currentAccount = currentAccount;
activity1.emailCodeLength = res.length;
activity1.saltedPassword = saltedPassword;
activity1.secureSecret = secureSecret;
activity1.delegate = currentDelegate;
presentFragment(activity1, true);
} else {
showAlertWithText(LocaleController.getString("PassportEmail", R.string.PassportEmail), error1.text);
if (errorRunnable != null) {
errorRunnable.onError(error1.text, text);
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}));
2018-07-30 04:07:02 +02:00
return;
} else if (error.text.equals("PHONE_VERIFICATION_NEEDED")) {
2018-08-27 10:33:11 +02:00
AndroidUtilities.runOnUIThread(() -> errorRunnable.onError(error.text, text));
2018-07-30 04:07:02 +02:00
return;
}
}
if (error == null && finalFileInputSecureValue != null) {
final TLRPC.TL_secureValue pendingValue = (TLRPC.TL_secureValue) response;
final TLRPC.TL_account_saveSecureValue req = new TLRPC.TL_account_saveSecureValue();
req.value = finalFileInputSecureValue;
req.secure_secret_id = secureSecretId;
2018-08-27 10:33:11 +02:00
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response12, error12) -> onResult(error12, (TLRPC.TL_secureValue) response12, pendingValue));
2018-07-30 04:07:02 +02:00
} else {
onResult(error, (TLRPC.TL_secureValue) response, null);
}
}
});
}
@Override
public SecureDocument saveFile(TLRPC.TL_secureFile secureFile) {
String path = FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + secureFile.dc_id + "_" + secureFile.id + ".jpg";
EncryptionResult result = createSecureDocument(path);
return new SecureDocument(result.secureDocumentKey, secureFile, path, result.fileHash, result.fileSecret);
}
@Override
2018-08-27 10:33:11 +02:00
public void deleteValue(TLRPC.TL_secureRequiredType requiredType, TLRPC.TL_secureRequiredType documentRequiredType, ArrayList<TLRPC.TL_secureRequiredType> documentRequiredTypes, boolean deleteType, Runnable finishRunnable, ErrorRunnable errorRunnable) {
deleteValueInternal(requiredType, documentRequiredType, documentRequiredTypes, deleteType, finishRunnable, errorRunnable, documentOnly);
2018-07-30 04:07:02 +02:00
}
};
activity.currentAccount = currentAccount;
activity.saltedPassword = saltedPassword;
activity.secureSecret = secureSecret;
activity.currentBotId = currentBotId;
activity.fieldsErrors = errors;
2018-08-27 10:33:11 +02:00
activity.documentOnly = documentOnly;
2018-07-30 04:07:02 +02:00
activity.documentsErrors = documentsErrors;
activity.availableDocumentTypes = availableDocumentTypes;
if (activityType == TYPE_EMAIL) {
activity.currentEmail = currentEmail;
}
presentFragment(activity);
}
}
2018-08-27 10:33:11 +02:00
private TLRPC.TL_secureValue removeValue(TLRPC.TL_secureRequiredType requiredType) {
if (requiredType == null) {
2018-07-30 04:07:02 +02:00
return null;
}
for (int a = 0, size = currentForm.values.size(); a < size; a++) {
TLRPC.TL_secureValue secureValue = currentForm.values.get(a);
2018-08-27 10:33:11 +02:00
if (requiredType.type.getClass() == secureValue.type.getClass()) {
2018-07-30 04:07:02 +02:00
return currentForm.values.remove(a);
}
}
return null;
}
2018-08-27 10:33:11 +02:00
private void deleteValueInternal(final TLRPC.TL_secureRequiredType requiredType, final TLRPC.TL_secureRequiredType documentRequiredType, final ArrayList<TLRPC.TL_secureRequiredType> documentRequiredTypes, final boolean deleteType, final Runnable finishRunnable, final ErrorRunnable errorRunnable, boolean documentOnly) {
if (requiredType == null) {
2018-07-30 04:07:02 +02:00
return;
}
TLRPC.TL_account_deleteSecureValue req = new TLRPC.TL_account_deleteSecureValue();
2018-08-27 10:33:11 +02:00
if (documentOnly && documentRequiredType != null) {
req.types.add(documentRequiredType.type);
} else {
if (deleteType) {
req.types.add(requiredType.type);
}
if (documentRequiredType != null) {
req.types.add(documentRequiredType.type);
}
}
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (error != null) {
if (errorRunnable != null) {
errorRunnable.onError(error.text, null);
}
showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text);
} else {
if (documentOnly) {
if (documentRequiredType != null) {
removeValue(documentRequiredType);
} else {
removeValue(requiredType);
}
} else {
if (deleteType) {
removeValue(requiredType);
}
removeValue(documentRequiredType);
}
if (currentActivityType == TYPE_MANAGE) {
TextDetailSecureCell view = typesViews.remove(requiredType);
if (view != null) {
linearLayout2.removeView(view);
View child = linearLayout2.getChildAt(linearLayout2.getChildCount() - 6);
if (child instanceof TextDetailSecureCell) {
((TextDetailSecureCell) child).setNeedDivider(false);
}
}
updateManageVisibility();
} else {
String documentJson = null;
TLRPC.TL_secureRequiredType documentsType = documentRequiredType;
if (documentsType != null && documentRequiredTypes != null && documentRequiredTypes.size() > 1) {
for (int a = 0, count = documentRequiredTypes.size(); a < count; a++) {
TLRPC.TL_secureRequiredType documentType = documentRequiredTypes.get(a);
TLRPC.TL_secureValue documentValue = getValueByType(documentType, false);
if (documentValue != null) {
if (documentValue.data != null) {
documentJson = decryptData(documentValue.data.data, decryptValueSecret(documentValue.data.secret, documentValue.data.data_hash), documentValue.data.data_hash);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
documentsType = documentType;
break;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}
if (documentsType == null) {
documentsType = documentRequiredTypes.get(0);
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
if (deleteType) {
setTypeValue(requiredType, null, null, documentsType, documentJson, documentOnly, documentRequiredTypes != null ? documentRequiredTypes.size() : 0);
} else {
String json = null;
TLRPC.TL_secureValue value = getValueByType(requiredType, false);
if (value != null && value.data != null) {
json = decryptData(value.data.data, decryptValueSecret(value.data.secret, value.data.data_hash), value.data.data_hash);
}
setTypeValue(requiredType, null, json, documentsType, documentJson, documentOnly, documentRequiredTypes != null ? documentRequiredTypes.size() : 0);
}
}
if (finishRunnable != null) {
finishRunnable.run();
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}));
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
private TextDetailSecureCell addField(Context context, final TLRPC.TL_secureRequiredType requiredType, final ArrayList<TLRPC.TL_secureRequiredType> documentRequiredTypes, boolean documentOnly, boolean last) {
final int availableDocumentTypesCount = documentRequiredTypes != null ? documentRequiredTypes.size() : 0;
2018-07-30 04:07:02 +02:00
TextDetailSecureCell view = new TextDetailSecureCell(context);
view.setBackgroundDrawable(Theme.getSelectorDrawable(true));
2018-08-27 10:33:11 +02:00
if (requiredType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
2018-07-30 04:07:02 +02:00
String text;
2018-08-27 10:33:11 +02:00
if (documentRequiredTypes == null || documentRequiredTypes.isEmpty()) {
2018-07-30 04:07:02 +02:00
text = LocaleController.getString("PassportPersonalDetails", R.string.PassportPersonalDetails);
2018-08-27 10:33:11 +02:00
} else if (documentOnly && documentRequiredTypes.size() == 1) {
text = getTextForType(documentRequiredTypes.get(0).type);
} else if (documentOnly && documentRequiredTypes.size() == 2) {
text = LocaleController.formatString("PassportTwoDocuments", R.string.PassportTwoDocuments, getTextForType(documentRequiredTypes.get(0).type), getTextForType(documentRequiredTypes.get(1).type));
2018-07-30 04:07:02 +02:00
} else {
text = LocaleController.getString("PassportIdentityDocument", R.string.PassportIdentityDocument);
}
view.setTextAndValue(text, "", !last);
2018-08-27 10:33:11 +02:00
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypeAddress) {
2018-07-30 04:07:02 +02:00
String text;
2018-08-27 10:33:11 +02:00
if (documentRequiredTypes == null || documentRequiredTypes.isEmpty()) {
2018-07-30 04:07:02 +02:00
text = LocaleController.getString("PassportAddress", R.string.PassportAddress);
2018-08-27 10:33:11 +02:00
} else if (documentOnly && documentRequiredTypes.size() == 1) {
text = getTextForType(documentRequiredTypes.get(0).type);
} else if (documentOnly && documentRequiredTypes.size() == 2) {
text = LocaleController.formatString("PassportTwoDocuments", R.string.PassportTwoDocuments, getTextForType(documentRequiredTypes.get(0).type), getTextForType(documentRequiredTypes.get(1).type));
2018-07-30 04:07:02 +02:00
} else {
text = LocaleController.getString("PassportResidentialAddress", R.string.PassportResidentialAddress);
}
view.setTextAndValue(text, "", !last);
2018-08-27 10:33:11 +02:00
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypePhone) {
2018-07-30 04:07:02 +02:00
view.setTextAndValue(LocaleController.getString("PassportPhone", R.string.PassportPhone), "", !last);
2018-08-27 10:33:11 +02:00
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypeEmail) {
2018-07-30 04:07:02 +02:00
view.setTextAndValue(LocaleController.getString("PassportEmail", R.string.PassportEmail), "", !last);
}
if (currentActivityType == TYPE_MANAGE) {
linearLayout2.addView(view, linearLayout2.getChildCount() - 5, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else {
linearLayout2.addView(view, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
2018-08-27 10:33:11 +02:00
view.setOnClickListener(v -> {
TLRPC.TL_secureRequiredType documentsType = null;
if (documentRequiredTypes != null) {
for (int a = 0, count = documentRequiredTypes.size(); a < count; a++) {
TLRPC.TL_secureRequiredType documentType = documentRequiredTypes.get(a);
if (getValueByType(documentType, false) != null || count == 1) {
documentsType = documentType;
break;
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
}
if (requiredType.type instanceof TLRPC.TL_secureValueTypePersonalDetails || requiredType.type instanceof TLRPC.TL_secureValueTypeAddress) {
if (documentsType == null && documentRequiredTypes != null && !documentRequiredTypes.isEmpty()) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setPositiveButton(LocaleController.getString("Cancel", R.string.Cancel), null);
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
if (requiredType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
builder.setTitle(LocaleController.getString("PassportIdentityDocument", R.string.PassportIdentityDocument));
} else if (requiredType.type instanceof TLRPC.TL_secureValueTypeAddress) {
builder.setTitle(LocaleController.getString("PassportAddress", R.string.PassportAddress));
}
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
ArrayList<String> strings = new ArrayList<>();
for (int a = 0, count = documentRequiredTypes.size(); a < count; a++) {
TLRPC.TL_secureRequiredType documentType = documentRequiredTypes.get(a);
if (documentType.type instanceof TLRPC.TL_secureValueTypeDriverLicense) {
strings.add(LocaleController.getString("PassportAddLicence", R.string.PassportAddLicence));
} else if (documentType.type instanceof TLRPC.TL_secureValueTypePassport) {
strings.add(LocaleController.getString("PassportAddPassport", R.string.PassportAddPassport));
} else if (documentType.type instanceof TLRPC.TL_secureValueTypeInternalPassport) {
strings.add(LocaleController.getString("PassportAddInternalPassport", R.string.PassportAddInternalPassport));
} else if (documentType.type instanceof TLRPC.TL_secureValueTypeIdentityCard) {
strings.add(LocaleController.getString("PassportAddCard", R.string.PassportAddCard));
} else if (documentType.type instanceof TLRPC.TL_secureValueTypeUtilityBill) {
strings.add(LocaleController.getString("PassportAddBill", R.string.PassportAddBill));
} else if (documentType.type instanceof TLRPC.TL_secureValueTypeBankStatement) {
strings.add(LocaleController.getString("PassportAddBank", R.string.PassportAddBank));
} else if (documentType.type instanceof TLRPC.TL_secureValueTypeRentalAgreement) {
strings.add(LocaleController.getString("PassportAddAgreement", R.string.PassportAddAgreement));
} else if (documentType.type instanceof TLRPC.TL_secureValueTypeTemporaryRegistration) {
strings.add(LocaleController.getString("PassportAddTemporaryRegistration", R.string.PassportAddTemporaryRegistration));
} else if (documentType.type instanceof TLRPC.TL_secureValueTypePassportRegistration) {
strings.add(LocaleController.getString("PassportAddPassportRegistration", R.string.PassportAddPassportRegistration));
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}
2018-07-30 04:07:02 +02:00
2019-05-14 14:08:05 +02:00
builder.setItems(strings.toArray(new CharSequence[0]), (dialog, which) -> openTypeActivity(requiredType, documentRequiredTypes.get(which), documentRequiredTypes, documentOnly));
2018-08-27 10:33:11 +02:00
showDialog(builder.create());
return;
}
} else {
boolean phoneField;
if ((phoneField = (requiredType.type instanceof TLRPC.TL_secureValueTypePhone)) || requiredType.type instanceof TLRPC.TL_secureValueTypeEmail) {
final TLRPC.TL_secureValue value = getValueByType(requiredType, false);
if (value != null) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialog, which) -> {
needShowProgress();
deleteValueInternal(requiredType, null, null, true, this::needHideProgress, (error, text) -> needHideProgress(), documentOnly);
2018-07-30 04:07:02 +02:00
});
2018-08-27 10:33:11 +02:00
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setMessage(phoneField ? LocaleController.getString("PassportDeletePhoneAlert", R.string.PassportDeletePhoneAlert) : LocaleController.getString("PassportDeleteEmailAlert", R.string.PassportDeleteEmailAlert));
2018-07-30 04:07:02 +02:00
showDialog(builder.create());
return;
}
}
}
2018-08-27 10:33:11 +02:00
openTypeActivity(requiredType, documentsType, documentRequiredTypes, documentOnly);
2018-07-30 04:07:02 +02:00
});
2018-08-27 10:33:11 +02:00
typesViews.put(requiredType, view);
2018-07-30 04:07:02 +02:00
String text = null;
String json = null;
String documentJson = null;
2018-08-27 10:33:11 +02:00
typesValues.put(requiredType, new HashMap<>());
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
TLRPC.TL_secureValue value = getValueByType(requiredType, false);
2018-07-30 04:07:02 +02:00
if (value != null) {
if (value.plain_data instanceof TLRPC.TL_securePlainEmail) {
text = ((TLRPC.TL_securePlainEmail) value.plain_data).email;
} else if (value.plain_data instanceof TLRPC.TL_securePlainPhone) {
text = ((TLRPC.TL_securePlainPhone) value.plain_data).phone;
} else if (value.data != null) {
json = decryptData(value.data.data, decryptValueSecret(value.data.secret, value.data.data_hash), value.data.data_hash);
}
}
2018-08-27 10:33:11 +02:00
TLRPC.TL_secureRequiredType documentsType = null;
if (documentRequiredTypes != null && !documentRequiredTypes.isEmpty()) {
boolean found = false;
for (int a = 0, count = documentRequiredTypes.size(); a < count; a++) {
TLRPC.TL_secureRequiredType documentType = documentRequiredTypes.get(a);
typesValues.put(documentType, new HashMap<>());
documentsToTypesLink.put(documentType, requiredType);
if (!found) {
TLRPC.TL_secureValue documentValue = getValueByType(documentType, false);
if (documentValue != null) {
if (documentValue.data != null) {
documentJson = decryptData(documentValue.data.data, decryptValueSecret(documentValue.data.secret, documentValue.data.data_hash), documentValue.data.data_hash);
}
documentsType = documentType;
found = true;
2018-07-30 04:07:02 +02:00
}
}
}
if (documentsType == null) {
2018-08-27 10:33:11 +02:00
documentsType = documentRequiredTypes.get(0);
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
setTypeValue(requiredType, text, json, documentsType, documentJson, documentOnly, availableDocumentTypesCount);
2018-07-30 04:07:02 +02:00
return view;
}
2020-04-24 11:21:58 +02:00
private static class EncryptionResult {
2018-07-30 04:07:02 +02:00
byte[] fileSecret;
byte[] decrypyedFileSecret;
byte[] encryptedData;
byte[] fileHash;
SecureDocumentKey secureDocumentKey;
public EncryptionResult(byte[] d, byte[] fs, byte[] dfs, byte[] fh, byte[] fk, byte[] fi) {
encryptedData = d;
fileSecret = fs;
fileHash = fh;
decrypyedFileSecret = dfs;
secureDocumentKey = new SecureDocumentKey(fk, fi);
}
}
private SecureDocumentKey getSecureDocumentKey(byte[] file_secret, byte[] file_hash) {
byte[] decrypted_file_secret = decryptValueSecret(file_secret, file_hash);
byte[] file_secret_hash = Utilities.computeSHA512(decrypted_file_secret, file_hash);
byte[] file_key = new byte[32];
System.arraycopy(file_secret_hash, 0, file_key, 0, 32);
byte[] file_iv = new byte[16];
System.arraycopy(file_secret_hash, 32, file_iv, 0, 16);
return new SecureDocumentKey(file_key, file_iv);
}
private byte[] decryptSecret(byte[] secret, byte[] passwordHash) {
if (secret == null || secret.length != 32) {
return null;
}
byte[] key = new byte[32];
System.arraycopy(passwordHash, 0, key, 0, 32);
byte[] iv = new byte[16];
System.arraycopy(passwordHash, 32, iv, 0, 16);
byte[] decryptedSecret = new byte[32];
System.arraycopy(secret, 0, decryptedSecret, 0, 32);
Utilities.aesCbcEncryptionByteArraySafe(decryptedSecret, key, iv, 0, decryptedSecret.length, 0, 0);
return decryptedSecret;
}
private byte[] decryptValueSecret(byte[] encryptedSecureValueSecret, byte[] hash) {
if (encryptedSecureValueSecret == null || encryptedSecureValueSecret.length != 32 || hash == null || hash.length != 32) {
return null;
}
byte[] key = new byte[32];
System.arraycopy(saltedPassword, 0, key, 0, 32);
byte[] iv = new byte[16];
System.arraycopy(saltedPassword, 32, iv, 0, 16);
byte[] decryptedSecret = new byte[32];
System.arraycopy(secureSecret, 0, decryptedSecret, 0, 32);
Utilities.aesCbcEncryptionByteArraySafe(decryptedSecret, key, iv, 0, decryptedSecret.length, 0, 0);
if (!checkSecret(decryptedSecret, null)) {
return null;
}
byte[] secret_hash = Utilities.computeSHA512(decryptedSecret, hash);
byte[] file_secret_key = new byte[32];
System.arraycopy(secret_hash, 0, file_secret_key, 0, 32);
byte[] file_secret_iv = new byte[16];
System.arraycopy(secret_hash, 32, file_secret_iv, 0, 16);
byte[] result = new byte[32];
System.arraycopy(encryptedSecureValueSecret, 0, result, 0, 32);
Utilities.aesCbcEncryptionByteArraySafe(result, file_secret_key, file_secret_iv, 0, result.length, 0, 0);
return result;
}
private EncryptionResult createSecureDocument(String path) {
File file = new File(path);
int length = (int) file.length();
byte[] b = new byte[length];
RandomAccessFile f = null;
try {
f = new RandomAccessFile(path, "rws");
f.readFully(b);
} catch (Exception ignore) {
}
EncryptionResult result = encryptData(b);
try {
f.seek(0);
f.write(result.encryptedData);
f.close();
} catch (Exception ignore) {
}
return result;
}
private String decryptData(byte[] data, byte[] file_secret, byte[] file_hash) {
if (data == null || file_secret == null || file_secret.length != 32 || file_hash == null || file_hash.length != 32) {
return null;
}
byte[] file_secret_hash = Utilities.computeSHA512(file_secret, file_hash);
byte[] file_key = new byte[32];
System.arraycopy(file_secret_hash, 0, file_key, 0, 32);
byte[] file_iv = new byte[16];
System.arraycopy(file_secret_hash, 32, file_iv, 0, 16);
byte[] decryptedData = new byte[data.length];
System.arraycopy(data, 0, decryptedData, 0, data.length);
Utilities.aesCbcEncryptionByteArraySafe(decryptedData, file_key, file_iv, 0, decryptedData.length, 0, 0);
byte[] hash = Utilities.computeSHA256(decryptedData);
if (!Arrays.equals(hash, file_hash)) {
return null;
}
int dataOffset = decryptedData[0] & 0xff;
return new String(decryptedData, dataOffset, decryptedData.length - dataOffset);
}
2018-08-27 10:33:11 +02:00
public static boolean checkSecret(byte[] secret, Long id) {
2018-07-30 04:07:02 +02:00
if (secret == null || secret.length != 32) {
return false;
}
int sum = 0;
int a;
for (a = 0; a < secret.length; a++) {
sum += secret[a] & 0xff;
}
if (sum % 255 != 239) {
return false;
}
if (id != null && Utilities.bytesToLong(Utilities.computeSHA256(secret)) != id) {
return false;
}
return true;
}
private byte[] getRandomSecret() {
byte[] secret = new byte[32];
Utilities.random.nextBytes(secret);
int sum = 0;
int a;
for (a = 0; a < secret.length; a++) {
sum += secret[a] & 0xff;
}
sum = sum % 255;
if (sum != 239) {
sum = 239 - sum;
a = Utilities.random.nextInt(32);
int val = secret[a] & 0xff;
val += sum;
if (val < 255) {
val = 255 + val;
}
secret[a] = (byte) (val % 255);
}
return secret;
}
private EncryptionResult encryptData(byte[] data) {
byte[] file_secret = getRandomSecret();
int extraLen = 32 + Utilities.random.nextInt(256 - 32 - 16);
while ((data.length + extraLen) % 16 != 0) {
extraLen++;
}
byte[] padding = new byte[extraLen];
Utilities.random.nextBytes(padding);
padding[0] = (byte) extraLen;
byte[] paddedData = new byte[extraLen + data.length];
System.arraycopy(padding, 0, paddedData, 0, extraLen);
System.arraycopy(data, 0, paddedData, extraLen, data.length);
byte[] file_hash = Utilities.computeSHA256(paddedData);
byte[] file_secret_hash = Utilities.computeSHA512(file_secret, file_hash);
byte[] file_key = new byte[32];
System.arraycopy(file_secret_hash, 0, file_key, 0, 32);
byte[] file_iv = new byte[16];
System.arraycopy(file_secret_hash, 32, file_iv, 0, 16);
Utilities.aesCbcEncryptionByteArraySafe(paddedData, file_key, file_iv, 0, paddedData.length, 0, 1);
byte[] key = new byte[32];
System.arraycopy(saltedPassword, 0, key, 0, 32);
byte[] iv = new byte[16];
System.arraycopy(saltedPassword, 32, iv, 0, 16);
byte[] decryptedSecret = new byte[32];
System.arraycopy(secureSecret, 0, decryptedSecret, 0, 32);
Utilities.aesCbcEncryptionByteArraySafe(decryptedSecret, key, iv, 0, decryptedSecret.length, 0, 0);
byte[] secret_hash = Utilities.computeSHA512(decryptedSecret, file_hash);
byte[] file_secret_key = new byte[32];
System.arraycopy(secret_hash, 0, file_secret_key, 0, 32);
byte[] file_secret_iv = new byte[16];
System.arraycopy(secret_hash, 32, file_secret_iv, 0, 16);
byte[] encrypyed_file_secret = new byte[32];
System.arraycopy(file_secret, 0, encrypyed_file_secret, 0, 32);
Utilities.aesCbcEncryptionByteArraySafe(encrypyed_file_secret, file_secret_key, file_secret_iv, 0, encrypyed_file_secret.length, 0, 1);
return new EncryptionResult(paddedData, encrypyed_file_secret, file_secret, file_hash, file_key, file_iv);
}
private void showAlertWithText(String title, String text) {
if (getParentActivity() == null) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
builder.setTitle(title);
builder.setMessage(text);
showDialog(builder.create());
}
private void onPasscodeError(boolean clear) {
if (getParentActivity() == null) {
return;
}
2020-07-26 18:07:20 +02:00
VibrateUtil.vibrate();
2018-07-30 04:07:02 +02:00
if (clear) {
inputFields[FIELD_PASSWORD].setText("");
}
AndroidUtilities.shakeView(inputFields[FIELD_PASSWORD], 2, 0);
}
private void startPhoneVerification(boolean checkPermissions, final String phone, Runnable finishRunnable, ErrorRunnable errorRunnable, final PassportActivityDelegate delegate) {
TelephonyManager tm = (TelephonyManager) ApplicationLoader.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
boolean simcardAvailable = tm.getSimState() != TelephonyManager.SIM_STATE_ABSENT && tm.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE;
boolean allowCall = true;
if (getParentActivity() != null && Build.VERSION.SDK_INT >= 23 && simcardAvailable) {
allowCall = getParentActivity().checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED;
if (checkPermissions) {
permissionsItems.clear();
if (!allowCall) {
permissionsItems.add(Manifest.permission.READ_PHONE_STATE);
}
if (!permissionsItems.isEmpty()) {
2019-01-23 18:03:33 +01:00
if (getParentActivity().shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) {
2018-07-30 04:07:02 +02:00
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
2019-01-23 18:03:33 +01:00
builder.setMessage(LocaleController.getString("AllowReadCall", R.string.AllowReadCall));
2018-07-30 04:07:02 +02:00
permissionsDialog = showDialog(builder.create());
} else {
2019-05-14 14:08:05 +02:00
getParentActivity().requestPermissions(permissionsItems.toArray(new String[0]), 6);
2018-07-30 04:07:02 +02:00
}
pendingPhone = phone;
pendingErrorRunnable = errorRunnable;
pendingFinishRunnable = finishRunnable;
pendingDelegate = delegate;
return;
}
}
}
final TLRPC.TL_account_sendVerifyPhoneCode req = new TLRPC.TL_account_sendVerifyPhoneCode();
req.phone_number = phone;
2019-01-23 18:03:33 +01:00
req.settings = new TLRPC.TL_codeSettings();
req.settings.allow_flashcall = simcardAvailable && allowCall;
2019-09-10 12:56:11 +02:00
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
2019-01-23 18:03:33 +01:00
if (req.settings.allow_flashcall) {
2018-07-30 04:07:02 +02:00
try {
@SuppressLint("HardwareIds")
String number = tm.getLine1Number();
if (!TextUtils.isEmpty(number)) {
2019-05-14 14:08:05 +02:00
req.settings.current_number = PhoneNumberUtils.compare(phone, number);
2019-01-23 18:03:33 +01:00
if (!req.settings.current_number) {
req.settings.allow_flashcall = false;
2018-07-30 04:07:02 +02:00
}
} else {
2019-01-23 18:03:33 +01:00
req.settings.current_number = false;
2018-07-30 04:07:02 +02:00
}
} catch (Exception e) {
2019-01-23 18:03:33 +01:00
req.settings.allow_flashcall = false;
2018-07-30 04:07:02 +02:00
FileLog.e(e);
}
}
2018-08-27 10:33:11 +02:00
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (error == null) {
HashMap<String, String> values = new HashMap<>();
values.put("phone", phone);
PassportActivity activity = new PassportActivity(TYPE_PHONE_VERIFICATION, currentForm, currentPassword, currentType, null, null, null, values, null);
activity.currentAccount = currentAccount;
activity.saltedPassword = saltedPassword;
activity.secureSecret = secureSecret;
activity.delegate = delegate;
activity.currentPhoneVerification = (TLRPC.TL_auth_sentCode) response;
presentFragment(activity, true);
} else {
AlertsCreator.processError(currentAccount, error, PassportActivity.this, req, phone);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}), ConnectionsManager.RequestFlagFailOnServerErrors);
2018-07-30 04:07:02 +02:00
}
private void updatePasswordInterface() {
if (noPasswordImageView == null) {
return;
}
if (currentPassword == null || usingSavedPassword != 0) {
noPasswordImageView.setVisibility(View.GONE);
noPasswordTextView.setVisibility(View.GONE);
noPasswordSetTextView.setVisibility(View.GONE);
passwordAvatarContainer.setVisibility(View.GONE);
inputFieldContainers[FIELD_PASSWORD].setVisibility(View.GONE);
doneItem.setVisibility(View.GONE);
passwordForgotButton.setVisibility(View.GONE);
passwordInfoRequestTextView.setVisibility(View.GONE);
passwordRequestTextView.setVisibility(View.GONE);
emptyView.setVisibility(View.VISIBLE);
2018-08-27 10:33:11 +02:00
} else if (!currentPassword.has_password) {
2018-07-30 04:07:02 +02:00
passwordRequestTextView.setVisibility(View.VISIBLE);
noPasswordImageView.setVisibility(View.VISIBLE);
noPasswordTextView.setVisibility(View.VISIBLE);
noPasswordSetTextView.setVisibility(View.VISIBLE);
passwordAvatarContainer.setVisibility(View.GONE);
inputFieldContainers[FIELD_PASSWORD].setVisibility(View.GONE);
doneItem.setVisibility(View.GONE);
passwordForgotButton.setVisibility(View.GONE);
passwordInfoRequestTextView.setVisibility(View.GONE);
passwordRequestTextView.setLayoutParams(LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 25, 0, 0));
emptyView.setVisibility(View.GONE);
} else {
passwordRequestTextView.setVisibility(View.VISIBLE);
noPasswordImageView.setVisibility(View.GONE);
noPasswordTextView.setVisibility(View.GONE);
noPasswordSetTextView.setVisibility(View.GONE);
emptyView.setVisibility(View.GONE);
passwordAvatarContainer.setVisibility(View.VISIBLE);
inputFieldContainers[FIELD_PASSWORD].setVisibility(View.VISIBLE);
doneItem.setVisibility(View.VISIBLE);
passwordForgotButton.setVisibility(View.VISIBLE);
passwordInfoRequestTextView.setVisibility(View.VISIBLE);
passwordRequestTextView.setLayoutParams(LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 0, 0, 0));
if (inputFields != null) {
if (currentPassword != null && !TextUtils.isEmpty(currentPassword.hint)) {
inputFields[FIELD_PASSWORD].setHint(currentPassword.hint);
} else {
inputFields[FIELD_PASSWORD].setHint(LocaleController.getString("LoginPassword", R.string.LoginPassword));
}
}
}
}
private void showEditDoneProgress(final boolean animateDoneItem, final boolean show) {
if (doneItemAnimation != null) {
doneItemAnimation.cancel();
}
if (animateDoneItem && doneItem != null) {
doneItemAnimation = new AnimatorSet();
if (show) {
progressView.setVisibility(View.VISIBLE);
doneItem.setEnabled(false);
doneItemAnimation.playTogether(
2019-07-18 15:01:39 +02:00
ObjectAnimator.ofFloat(doneItem.getContentView(), View.SCALE_X, 0.1f),
ObjectAnimator.ofFloat(doneItem.getContentView(), View.SCALE_Y, 0.1f),
ObjectAnimator.ofFloat(doneItem.getContentView(), View.ALPHA, 0.0f),
2019-01-23 18:03:33 +01:00
ObjectAnimator.ofFloat(progressView, View.SCALE_X, 1.0f),
ObjectAnimator.ofFloat(progressView, View.SCALE_Y, 1.0f),
ObjectAnimator.ofFloat(progressView, View.ALPHA, 1.0f));
2018-07-30 04:07:02 +02:00
} else {
2019-07-18 15:01:39 +02:00
doneItem.getContentView().setVisibility(View.VISIBLE);
2018-07-30 04:07:02 +02:00
doneItem.setEnabled(true);
doneItemAnimation.playTogether(
2019-01-23 18:03:33 +01:00
ObjectAnimator.ofFloat(progressView, View.SCALE_X, 0.1f),
ObjectAnimator.ofFloat(progressView, View.SCALE_Y, 0.1f),
ObjectAnimator.ofFloat(progressView, View.ALPHA, 0.0f),
2019-07-18 15:01:39 +02:00
ObjectAnimator.ofFloat(doneItem.getContentView(), View.SCALE_X, 1.0f),
ObjectAnimator.ofFloat(doneItem.getContentView(), View.SCALE_Y, 1.0f),
ObjectAnimator.ofFloat(doneItem.getContentView(), View.ALPHA, 1.0f));
2018-07-30 04:07:02 +02:00
}
doneItemAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (doneItemAnimation != null && doneItemAnimation.equals(animation)) {
if (!show) {
progressView.setVisibility(View.INVISIBLE);
} else {
2019-07-18 15:01:39 +02:00
doneItem.getContentView().setVisibility(View.INVISIBLE);
2018-07-30 04:07:02 +02:00
}
}
}
@Override
public void onAnimationCancel(Animator animation) {
if (doneItemAnimation != null && doneItemAnimation.equals(animation)) {
doneItemAnimation = null;
}
}
});
doneItemAnimation.setDuration(150);
doneItemAnimation.start();
} else if (acceptTextView != null) {
doneItemAnimation = new AnimatorSet();
if (show) {
progressViewButton.setVisibility(View.VISIBLE);
bottomLayout.setEnabled(false);
doneItemAnimation.playTogether(
2019-01-23 18:03:33 +01:00
ObjectAnimator.ofFloat(acceptTextView, View.SCALE_X, 0.1f),
ObjectAnimator.ofFloat(acceptTextView, View.SCALE_Y, 0.1f),
ObjectAnimator.ofFloat(acceptTextView, View.ALPHA, 0.0f),
ObjectAnimator.ofFloat(progressViewButton, View.SCALE_X, 1.0f),
ObjectAnimator.ofFloat(progressViewButton, View.SCALE_Y, 1.0f),
ObjectAnimator.ofFloat(progressViewButton, View.ALPHA, 1.0f));
2018-07-30 04:07:02 +02:00
} else {
acceptTextView.setVisibility(View.VISIBLE);
bottomLayout.setEnabled(true);
doneItemAnimation.playTogether(
2019-01-23 18:03:33 +01:00
ObjectAnimator.ofFloat(progressViewButton, View.SCALE_X, 0.1f),
ObjectAnimator.ofFloat(progressViewButton, View.SCALE_Y, 0.1f),
ObjectAnimator.ofFloat(progressViewButton, View.ALPHA, 0.0f),
ObjectAnimator.ofFloat(acceptTextView, View.SCALE_X, 1.0f),
ObjectAnimator.ofFloat(acceptTextView, View.SCALE_Y, 1.0f),
ObjectAnimator.ofFloat(acceptTextView, View.ALPHA, 1.0f));
2018-07-30 04:07:02 +02:00
}
doneItemAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (doneItemAnimation != null && doneItemAnimation.equals(animation)) {
if (!show) {
progressViewButton.setVisibility(View.INVISIBLE);
} else {
acceptTextView.setVisibility(View.INVISIBLE);
}
}
}
@Override
public void onAnimationCancel(Animator animation) {
if (doneItemAnimation != null && doneItemAnimation.equals(animation)) {
doneItemAnimation = null;
}
}
});
doneItemAnimation.setDuration(150);
doneItemAnimation.start();
}
}
@Override
public void didReceivedNotification(int id, int account, Object... args) {
2021-06-25 02:43:10 +02:00
if (id == NotificationCenter.fileUploaded) {
2018-07-30 04:07:02 +02:00
final String location = (String) args[0];
SecureDocument document = uploadingDocuments.get(location);
if (document != null) {
document.inputFile = (TLRPC.TL_inputFile) args[1];
uploadingDocuments.remove(location);
if (uploadingDocuments.isEmpty()) {
if (doneItem != null) {
doneItem.setEnabled(true);
doneItem.setAlpha(1.0f);
}
}
if (documentsCells != null) {
SecureDocumentCell cell = documentsCells.get(document);
if (cell != null) {
cell.updateButtonState(true);
}
}
2018-08-27 10:33:11 +02:00
if (errorsValues != null && errorsValues.containsKey("error_document_all")) {
errorsValues.remove("error_document_all");
checkTopErrorCell(false);
}
if (document.type == UPLOADING_TYPE_DOCUMENTS) {
if (bottomCell != null && !TextUtils.isEmpty(noAllDocumentsErrorText)) {
bottomCell.setText(noAllDocumentsErrorText);
}
errorsValues.remove("files_all");
} else if (document.type == UPLOADING_TYPE_TRANSLATION) {
if (bottomCellTranslation != null && !TextUtils.isEmpty(noAllTranslationErrorText)) {
bottomCellTranslation.setText(noAllTranslationErrorText);
}
errorsValues.remove("translation_all");
2018-07-30 04:07:02 +02:00
}
}
2021-06-25 02:43:10 +02:00
} else if (id == NotificationCenter.fileUploadFailed) {
2018-07-30 04:07:02 +02:00
} else if (id == NotificationCenter.twoStepPasswordChanged) {
2018-07-30 04:07:02 +02:00
if (args != null && args.length > 0) {
if (args[7] != null && inputFields[FIELD_PASSWORD] != null) {
inputFields[FIELD_PASSWORD].setText((String) args[7]);
}
if (args[6] == null) {
currentPassword = new TLRPC.TL_account_password();
2018-08-27 10:33:11 +02:00
currentPassword.current_algo = (TLRPC.PasswordKdfAlgo) args[1];
currentPassword.new_secure_algo = (TLRPC.SecurePasswordKdfAlgo) args[2];
2018-07-30 04:07:02 +02:00
currentPassword.secure_random = (byte[]) args[3];
currentPassword.has_recovery = !TextUtils.isEmpty((String) args[4]);
currentPassword.hint = (String) args[5];
2018-08-27 10:33:11 +02:00
currentPassword.srp_id = -1;
currentPassword.srp_B = new byte[256];
Utilities.random.nextBytes(currentPassword.srp_B);
2018-07-30 04:07:02 +02:00
if (inputFields[FIELD_PASSWORD] != null && inputFields[FIELD_PASSWORD].length() > 0) {
usingSavedPassword = 2;
}
}
} else {
currentPassword = null;
loadPasswordInfo();
}
updatePasswordInterface();
2019-01-23 18:03:33 +01:00
} else if (id == NotificationCenter.didRemoveTwoStepPassword) {
2018-07-30 04:07:02 +02:00
}
}
@Override
public void onTransitionAnimationEnd(boolean isOpen, boolean backward) {
if (presentAfterAnimation != null) {
2018-08-27 10:33:11 +02:00
AndroidUtilities.runOnUIThread(() -> {
presentFragment(presentAfterAnimation, true);
presentAfterAnimation = null;
2018-07-30 04:07:02 +02:00
});
}
if (currentActivityType == TYPE_PASSWORD) {
if (isOpen) {
if (inputFieldContainers[FIELD_PASSWORD].getVisibility() == View.VISIBLE) {
inputFields[FIELD_PASSWORD].requestFocus();
AndroidUtilities.showKeyboard(inputFields[FIELD_PASSWORD]);
}
if (usingSavedPassword == 2) {
onPasswordDone(false);
}
}
} else if (currentActivityType == TYPE_PHONE_VERIFICATION) {
if (isOpen) {
views[currentViewNum].onShow();
}
} else if (currentActivityType == TYPE_EMAIL) {
if (isOpen) {
inputFields[FIELD_EMAIL].requestFocus();
AndroidUtilities.showKeyboard(inputFields[FIELD_EMAIL]);
}
} else if (currentActivityType == TYPE_EMAIL_VERIFICATION) {
if (isOpen) {
inputFields[FIELD_EMAIL].requestFocus();
AndroidUtilities.showKeyboard(inputFields[FIELD_EMAIL]);
}
} else if (currentActivityType == TYPE_ADDRESS || currentActivityType == TYPE_IDENTITY) {
if (Build.VERSION.SDK_INT >= 21) {
createChatAttachView();
}
}
}
private void showAttachmentError() {
if (getParentActivity() == null) {
return;
}
Toast toast = Toast.makeText(getParentActivity(), LocaleController.getString("UnsupportedAttachment", R.string.UnsupportedAttachment), Toast.LENGTH_SHORT);
toast.show();
}
@Override
public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == 0 || requestCode == 2) {
createChatAttachView();
if (chatAttachAlert != null) {
chatAttachAlert.onActivityResultFragment(requestCode, data, currentPicturePath);
}
currentPicturePath = null;
} else if (requestCode == 1) {
if (data == null || data.getData() == null) {
showAttachmentError();
return;
}
ArrayList<SendMessagesHelper.SendingMediaInfo> photos = new ArrayList<>();
SendMessagesHelper.SendingMediaInfo info = new SendMessagesHelper.SendingMediaInfo();
info.uri = data.getData();
photos.add(info);
processSelectedFiles(photos);
}
}
}
@Override
public void onRequestPermissionsResultFragment(int requestCode, String[] permissions, int[] grantResults) {
if ((currentActivityType == TYPE_IDENTITY || currentActivityType == TYPE_ADDRESS) && chatAttachAlert != null) {
2020-07-26 10:03:38 +02:00
if (requestCode == 17) {
2020-04-24 11:21:58 +02:00
chatAttachAlert.getPhotoLayout().checkCamera(false);
2018-07-30 04:07:02 +02:00
} else if (requestCode == 21) {
if (getParentActivity() == null) {
return;
}
if (grantResults != null && grantResults.length != 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
2022-03-11 17:49:54 +01:00
builder.setMessage(LocaleController.getString("PermissionNoAudioVideoWithHint", R.string.PermissionNoAudioVideoWithHint));
2018-08-27 10:33:11 +02:00
builder.setNegativeButton(LocaleController.getString("PermissionOpenSettings", R.string.PermissionOpenSettings), (dialog, which) -> {
try {
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + ApplicationLoader.applicationContext.getPackageName()));
getParentActivity().startActivity(intent);
} catch (Exception e) {
FileLog.e(e);
2018-07-30 04:07:02 +02:00
}
});
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
builder.show();
}
} else if (requestCode == 19 && grantResults != null && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
processSelectedAttach(attach_photo);
} else if (requestCode == 22 && grantResults != null && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (scanDocumentCell != null) {
scanDocumentCell.callOnClick();
}
}
} else if (currentActivityType == TYPE_PHONE && requestCode == 6) {
startPhoneVerification(false, pendingPhone, pendingFinishRunnable, pendingErrorRunnable, pendingDelegate);
}
}
@Override
public void saveSelfArgs(Bundle args) {
if (currentPicturePath != null) {
args.putString("path", currentPicturePath);
}
}
@Override
public void restoreSelfArgs(Bundle args) {
currentPicturePath = args.getString("path");
}
@Override
public boolean onBackPressed() {
if (currentActivityType == TYPE_PHONE_VERIFICATION) {
2019-01-23 18:03:33 +01:00
views[currentViewNum].onBackPressed(true);
2018-07-30 04:07:02 +02:00
for (int a = 0; a < views.length; a++) {
if (views[a] != null) {
views[a].onDestroyActivity();
}
}
} else if (currentActivityType == TYPE_REQUEST || currentActivityType == TYPE_PASSWORD) {
callCallback(false);
} else if (currentActivityType == TYPE_IDENTITY || currentActivityType == TYPE_ADDRESS) {
return !checkDiscard();
}
return true;
}
@Override
protected void onDialogDismiss(Dialog dialog) {
if (currentActivityType == TYPE_PHONE) {
if (Build.VERSION.SDK_INT >= 23 && dialog == permissionsDialog && !permissionsItems.isEmpty()) {
2019-05-14 14:08:05 +02:00
getParentActivity().requestPermissions(permissionsItems.toArray(new String[0]), 6);
2018-07-30 04:07:02 +02:00
}
}
}
//-----phone verification
private String pendingPhone;
private Runnable pendingFinishRunnable;
private ErrorRunnable pendingErrorRunnable;
private PassportActivityDelegate pendingDelegate;
private int currentViewNum;
private SlideView[] views;
private AlertDialog progressDialog;
private Dialog permissionsDialog;
private ArrayList<String> permissionsItems;
public void needShowProgress() {
if (getParentActivity() == null || getParentActivity().isFinishing() || progressDialog != null) {
return;
}
2019-01-23 18:03:33 +01:00
progressDialog = new AlertDialog(getParentActivity(), 3);
2022-03-11 17:49:54 +01:00
progressDialog.setCanCancel(false);
2018-07-30 04:07:02 +02:00
progressDialog.show();
}
public void needHideProgress() {
if (progressDialog == null) {
return;
}
try {
progressDialog.dismiss();
} catch (Exception e) {
FileLog.e(e);
}
progressDialog = null;
}
public void setPage(int page, boolean animated, Bundle params) {
if (page == 3) {
doneItem.setVisibility(View.GONE);
}
final SlideView outView = views[currentViewNum];
final SlideView newView = views[page];
currentViewNum = page;
newView.setParams(params, false);
newView.onShow();
if (animated) {
newView.setTranslationX(AndroidUtilities.displaySize.x);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
animatorSet.setDuration(300);
animatorSet.playTogether(
ObjectAnimator.ofFloat(outView, "translationX", -AndroidUtilities.displaySize.x),
ObjectAnimator.ofFloat(newView, "translationX", 0));
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
newView.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {
outView.setVisibility(View.GONE);
outView.setX(0);
}
});
animatorSet.start();
} else {
newView.setTranslationX(0);
newView.setVisibility(View.VISIBLE);
if (outView != newView) {
outView.setVisibility(View.GONE);
}
}
}
private void fillNextCodeParams(Bundle params, TLRPC.TL_auth_sentCode res, boolean animated) {
params.putString("phoneHash", res.phone_code_hash);
if (res.next_type instanceof TLRPC.TL_auth_codeTypeCall) {
params.putInt("nextType", 4);
} else if (res.next_type instanceof TLRPC.TL_auth_codeTypeFlashCall) {
params.putInt("nextType", 3);
} else if (res.next_type instanceof TLRPC.TL_auth_codeTypeSms) {
params.putInt("nextType", 2);
}
if (res.timeout == 0) {
res.timeout = 60;
}
params.putInt("timeout", res.timeout * 1000);
if (res.type instanceof TLRPC.TL_auth_sentCodeTypeCall) {
params.putInt("type", 4);
params.putInt("length", res.type.length);
setPage(2, animated, params);
} else if (res.type instanceof TLRPC.TL_auth_sentCodeTypeFlashCall) {
params.putInt("type", 3);
params.putString("pattern", res.type.pattern);
setPage(1, animated, params);
} else if (res.type instanceof TLRPC.TL_auth_sentCodeTypeSms) {
params.putInt("type", 2);
params.putInt("length", res.type.length);
setPage(0, animated, params);
}
}
private void openAttachMenu() {
if (getParentActivity() == null) {
return;
}
if (uploadingFileType == UPLOADING_TYPE_DOCUMENTS && documents.size() >= 20) {
showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("PassportUploadMaxReached", R.string.PassportUploadMaxReached, LocaleController.formatPluralString("Files", 20)));
return;
}
createChatAttachView();
chatAttachAlert.setOpenWithFrontFaceCamera(uploadingFileType == UPLOADING_TYPE_SELFIE);
2019-08-22 01:53:26 +02:00
chatAttachAlert.setMaxSelectedPhotos(getMaxSelectedDocuments(), false);
2020-04-24 11:21:58 +02:00
chatAttachAlert.getPhotoLayout().loadGalleryPhotos();
2018-07-30 04:07:02 +02:00
if (Build.VERSION.SDK_INT == 21 || Build.VERSION.SDK_INT == 22) {
AndroidUtilities.hideKeyboard(fragmentView.findFocus());
}
chatAttachAlert.init();
showDialog(chatAttachAlert);
}
private void createChatAttachView() {
if (getParentActivity() == null) {
return;
}
if (chatAttachAlert == null) {
2021-06-25 02:43:10 +02:00
chatAttachAlert = new ChatAttachAlert(getParentActivity(), this, false, false);
2018-07-30 04:07:02 +02:00
chatAttachAlert.setDelegate(new ChatAttachAlert.ChatAttachViewDelegate() {
@Override
2021-06-25 02:43:10 +02:00
public void didPressedButton(int button, boolean arg, boolean notify, int scheduleDate, boolean forceDocument) {
2018-07-30 04:07:02 +02:00
if (getParentActivity() == null || chatAttachAlert == null) {
return;
}
if (button == 8 || button == 7) {
if (button != 8) {
2022-03-20 21:22:37 +01:00
chatAttachAlert.dismiss(true);
2018-07-30 04:07:02 +02:00
}
2020-04-24 11:21:58 +02:00
HashMap<Object, Object> selectedPhotos = chatAttachAlert.getPhotoLayout().getSelectedPhotos();
ArrayList<Object> selectedPhotosOrder = chatAttachAlert.getPhotoLayout().getSelectedPhotosOrder();
2018-07-30 04:07:02 +02:00
if (!selectedPhotos.isEmpty()) {
ArrayList<SendMessagesHelper.SendingMediaInfo> photos = new ArrayList<>();
for (int a = 0; a < selectedPhotosOrder.size(); a++) {
MediaController.PhotoEntry photoEntry = (MediaController.PhotoEntry) selectedPhotos.get(selectedPhotosOrder.get(a));
SendMessagesHelper.SendingMediaInfo info = new SendMessagesHelper.SendingMediaInfo();
if (photoEntry.imagePath != null) {
info.path = photoEntry.imagePath;
} else {
2018-07-30 04:07:02 +02:00
info.path = photoEntry.path;
}
photos.add(info);
photoEntry.reset();
}
processSelectedFiles(photos);
}
return;
} else if (chatAttachAlert != null) {
chatAttachAlert.dismissWithButtonClick(button);
}
processSelectedAttach(button);
}
@Override
public void onCameraOpened() {
AndroidUtilities.hideKeyboard(fragmentView.findFocus());
}
});
}
}
2018-08-27 10:33:11 +02:00
private int getMaxSelectedDocuments() {
if (uploadingFileType == UPLOADING_TYPE_DOCUMENTS) {
return 20 - documents.size();
} else if (uploadingFileType == UPLOADING_TYPE_TRANSLATION) {
return 20 - translationDocuments.size();
} else {
return 1;
}
}
2018-07-30 04:07:02 +02:00
private void processSelectedAttach(int which) {
if (which == attach_photo) {
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
getParentActivity().requestPermissions(new String[]{Manifest.permission.CAMERA}, 19);
return;
}
try {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File image = AndroidUtilities.generatePicturePath();
if (image != null) {
if (Build.VERSION.SDK_INT >= 24) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", image));
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
}
currentPicturePath = image.getAbsolutePath();
}
startActivityForResult(takePictureIntent, 0);
} catch (Exception e) {
FileLog.e(e);
}
2020-04-24 11:21:58 +02:00
}
}
2019-09-10 12:56:11 +02:00
2020-04-24 11:21:58 +02:00
public void didSelectPhotos(ArrayList<SendMessagesHelper.SendingMediaInfo> photos, boolean notify, int scheduleDate) {
processSelectedFiles(photos);
}
2018-07-30 04:07:02 +02:00
2020-04-24 11:21:58 +02:00
public void startDocumentSelectActivity() {
try {
Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
if (Build.VERSION.SDK_INT >= 18) {
photoPickerIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
photoPickerIntent.setType("*/*");
startActivityForResult(photoPickerIntent, 21);
} catch (Exception e) {
FileLog.e(e);
}
}
2019-12-31 14:08:08 +01:00
2020-04-24 11:21:58 +02:00
public void didSelectFiles(ArrayList<String> files, String caption, boolean notify, int scheduleDate) {
ArrayList<SendMessagesHelper.SendingMediaInfo> arrayList = new ArrayList<>();
for (int a = 0, count = files.size(); a < count; a++) {
SendMessagesHelper.SendingMediaInfo info = new SendMessagesHelper.SendingMediaInfo();
info.path = files.get(a);
arrayList.add(info);
2018-07-30 04:07:02 +02:00
}
2020-04-24 11:21:58 +02:00
processSelectedFiles(arrayList);
2018-07-30 04:07:02 +02:00
}
private void fillInitialValues() {
if (initialValues != null) {
return;
}
initialValues = getCurrentValues();
}
private String getCurrentValues() {
StringBuilder values = new StringBuilder();
for (int a = 0; a < inputFields.length; a++) {
values.append(inputFields[a].getText()).append(",");
}
2018-08-27 10:33:11 +02:00
if (inputExtraFields != null) {
for (int a = 0; a < inputExtraFields.length; a++) {
values.append(inputExtraFields[a].getText()).append(",");
}
}
2018-07-30 04:07:02 +02:00
for (int a = 0, count = documents.size(); a < count; a++) {
values.append(documents.get(a).secureFile.id);
}
2018-08-27 10:33:11 +02:00
if (frontDocument != null) {
values.append(frontDocument.secureFile.id);
}
if (reverseDocument != null) {
values.append(reverseDocument.secureFile.id);
}
2018-07-30 04:07:02 +02:00
if (selfieDocument != null) {
values.append(selfieDocument.secureFile.id);
}
2018-08-27 10:33:11 +02:00
for (int a = 0, count = translationDocuments.size(); a < count; a++) {
values.append(translationDocuments.get(a).secureFile.id);
}
2018-07-30 04:07:02 +02:00
return values.toString();
}
private boolean isHasNotAnyChanges() {
return initialValues == null || initialValues.equals(getCurrentValues());
}
private boolean checkDiscard() {
if (isHasNotAnyChanges()) {
return false;
}
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
2018-08-27 10:33:11 +02:00
builder.setPositiveButton(LocaleController.getString("PassportDiscard", R.string.PassportDiscard), (dialog, which) -> finishFragment());
2018-07-30 04:07:02 +02:00
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.setTitle(LocaleController.getString("DiscardChanges", R.string.DiscardChanges));
builder.setMessage(LocaleController.getString("PassportDiscardChanges", R.string.PassportDiscardChanges));
showDialog(builder.create());
return true;
}
private void processSelectedFiles(final ArrayList<SendMessagesHelper.SendingMediaInfo> photos) {
if (photos.isEmpty()) {
return;
}
final boolean needRecoginze;
2018-08-27 10:33:11 +02:00
if (uploadingFileType == UPLOADING_TYPE_SELFIE || uploadingFileType == UPLOADING_TYPE_TRANSLATION) {
2018-07-30 04:07:02 +02:00
needRecoginze = false;
2018-08-27 10:33:11 +02:00
} else if (currentType.type instanceof TLRPC.TL_secureValueTypePersonalDetails) {
2018-07-30 04:07:02 +02:00
boolean allFieldsAreEmpty = true;
for (int a = 0; a < inputFields.length; a++) {
if (a == FIELD_CITIZENSHIP || a == FIELD_EXPIRE || a == FIELD_GENDER || a == FIELD_RESIDENCE) {
continue;
}
if (inputFields[a].length() > 0) {
allFieldsAreEmpty = false;
break;
}
}
needRecoginze = allFieldsAreEmpty;
} else {
needRecoginze = false;
}
final int type = uploadingFileType;
2018-08-27 10:33:11 +02:00
Utilities.globalQueue.postRunnable(() -> {
boolean didRecognizeSuccessfully = false;
for (int a = 0, count = Math.min(uploadingFileType == UPLOADING_TYPE_DOCUMENTS || uploadingFileType == UPLOADING_TYPE_TRANSLATION ? 20 : 1, photos.size()); a < count; a++) {
SendMessagesHelper.SendingMediaInfo info = photos.get(a);
Bitmap bitmap = ImageLoader.loadBitmap(info.path, info.uri, 2048, 2048, false);
if (bitmap == null) {
continue;
}
TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, 2048, 2048, 89, false, 320, 320);
if (size == null) {
continue;
}
TLRPC.TL_secureFile secureFile = new TLRPC.TL_secureFile();
secureFile.dc_id = (int) size.location.volume_id;
secureFile.id = size.location.local_id;
secureFile.date = (int) (System.currentTimeMillis() / 1000);
final SecureDocument document = delegate.saveFile(secureFile);
document.type = type;
AndroidUtilities.runOnUIThread(() -> {
if (uploadingFileType == UPLOADING_TYPE_SELFIE) {
if (selfieDocument != null) {
SecureDocumentCell cell = documentsCells.remove(selfieDocument);
if (cell != null) {
selfieLayout.removeView(cell);
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
selfieDocument = null;
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
} else if (uploadingFileType == UPLOADING_TYPE_TRANSLATION) {
if (translationDocuments.size() >= 20) {
return;
}
} else if (uploadingFileType == UPLOADING_TYPE_FRONT) {
if (frontDocument != null) {
SecureDocumentCell cell = documentsCells.remove(frontDocument);
if (cell != null) {
frontLayout.removeView(cell);
}
frontDocument = null;
}
} else if (uploadingFileType == UPLOADING_TYPE_REVERSE) {
if (reverseDocument != null) {
SecureDocumentCell cell = documentsCells.remove(reverseDocument);
if (cell != null) {
reverseLayout.removeView(cell);
}
reverseDocument = null;
}
} else if (uploadingFileType == UPLOADING_TYPE_DOCUMENTS) {
if (documents.size() >= 20) {
return;
}
}
uploadingDocuments.put(document.path, document);
doneItem.setEnabled(false);
doneItem.setAlpha(0.5f);
FileLoader.getInstance(currentAccount).uploadFile(document.path, false, true, ConnectionsManager.FileTypePhoto);
addDocumentView(document, type);
updateUploadText(type);
});
2018-07-30 04:07:02 +02:00
2018-08-27 10:33:11 +02:00
if (needRecoginze && !didRecognizeSuccessfully) {
try {
final MrzRecognizer.Result result = MrzRecognizer.recognize(bitmap, currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeDriverLicense);
if (result != null) {
didRecognizeSuccessfully = true;
AndroidUtilities.runOnUIThread(() -> {
if (result.type == MrzRecognizer.Result.TYPE_ID) {
if (!(currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeIdentityCard)) {
for (int a1 = 0, count1 = availableDocumentTypes.size(); a1 < count1; a1++) {
TLRPC.TL_secureRequiredType requiredType = availableDocumentTypes.get(a1);
if (requiredType.type instanceof TLRPC.TL_secureValueTypeIdentityCard) {
currentDocumentsType = requiredType;
updateInterfaceStringsForDocumentType();
break;
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
}
} else if (result.type == MrzRecognizer.Result.TYPE_PASSPORT) {
if (!(currentDocumentsType.type instanceof TLRPC.TL_secureValueTypePassport)) {
for (int a1 = 0, count1 = availableDocumentTypes.size(); a1 < count1; a1++) {
TLRPC.TL_secureRequiredType requiredType = availableDocumentTypes.get(a1);
if (requiredType.type instanceof TLRPC.TL_secureValueTypePassport) {
currentDocumentsType = requiredType;
updateInterfaceStringsForDocumentType();
break;
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
}
} else if (result.type == MrzRecognizer.Result.TYPE_INTERNAL_PASSPORT) {
if (!(currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeInternalPassport)) {
for (int a1 = 0, count1 = availableDocumentTypes.size(); a1 < count1; a1++) {
TLRPC.TL_secureRequiredType requiredType = availableDocumentTypes.get(a1);
if (requiredType.type instanceof TLRPC.TL_secureValueTypeInternalPassport) {
currentDocumentsType = requiredType;
updateInterfaceStringsForDocumentType();
break;
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
}
} else if (result.type == MrzRecognizer.Result.TYPE_DRIVER_LICENSE) {
if (!(currentDocumentsType.type instanceof TLRPC.TL_secureValueTypeDriverLicense)) {
for (int a1 = 0, count1 = availableDocumentTypes.size(); a1 < count1; a1++) {
TLRPC.TL_secureRequiredType requiredType = availableDocumentTypes.get(a1);
if (requiredType.type instanceof TLRPC.TL_secureValueTypeDriverLicense) {
currentDocumentsType = requiredType;
updateInterfaceStringsForDocumentType();
break;
2018-07-30 04:07:02 +02:00
}
}
}
2018-08-27 10:33:11 +02:00
}
if (!TextUtils.isEmpty(result.firstName)) {
inputFields[FIELD_NAME].setText(result.firstName);
}
if (!TextUtils.isEmpty(result.middleName)) {
inputFields[FIELD_MIDNAME].setText(result.middleName);
}
if (!TextUtils.isEmpty(result.lastName)) {
inputFields[FIELD_SURNAME].setText(result.lastName);
}
if (!TextUtils.isEmpty(result.number)) {
inputFields[FIELD_CARDNUMBER].setText(result.number);
}
if (result.gender != MrzRecognizer.Result.GENDER_UNKNOWN) {
switch (result.gender) {
case MrzRecognizer.Result.GENDER_MALE:
currentGender = "male";
inputFields[FIELD_GENDER].setText(LocaleController.getString("PassportMale", R.string.PassportMale));
break;
case MrzRecognizer.Result.GENDER_FEMALE:
currentGender = "female";
inputFields[FIELD_GENDER].setText(LocaleController.getString("PassportFemale", R.string.PassportFemale));
break;
}
}
if (!TextUtils.isEmpty(result.nationality)) {
currentCitizeship = result.nationality;
String country = languageMap.get(currentCitizeship);
if (country != null) {
inputFields[FIELD_CITIZENSHIP].setText(country);
}
}
if (!TextUtils.isEmpty(result.issuingCountry)) {
currentResidence = result.issuingCountry;
String country = languageMap.get(currentResidence);
if (country != null) {
inputFields[FIELD_RESIDENCE].setText(country);
}
}
if (result.birthDay > 0 && result.birthMonth > 0 && result.birthYear > 0) {
inputFields[FIELD_BIRTHDAY].setText(String.format(Locale.US, "%02d.%02d.%d", result.birthDay, result.birthMonth, result.birthYear));
}
if (result.expiryDay > 0 && result.expiryMonth > 0 && result.expiryYear > 0) {
currentExpireDate[0] = result.expiryYear;
currentExpireDate[1] = result.expiryMonth;
currentExpireDate[2] = result.expiryDay;
inputFields[FIELD_EXPIRE].setText(String.format(Locale.US, "%02d.%02d.%d", result.expiryDay, result.expiryMonth, result.expiryYear));
} else {
currentExpireDate[0] = currentExpireDate[1] = currentExpireDate[2] = 0;
inputFields[FIELD_EXPIRE].setText(LocaleController.getString("PassportNoExpireDate", R.string.PassportNoExpireDate));
}
});
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
} catch (Throwable e) {
FileLog.e(e);
2018-07-30 04:07:02 +02:00
}
}
2018-08-27 10:33:11 +02:00
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
SharedConfig.saveConfig();
2018-07-30 04:07:02 +02:00
});
}
public void setNeedActivityResult(boolean needActivityResult) {
this.needActivityResult = needActivityResult;
}
2020-04-24 11:21:58 +02:00
private static class ProgressView extends View {
2019-01-23 18:03:33 +01:00
private Paint paint = new Paint();
private Paint paint2 = new Paint();
private float progress;
public ProgressView(Context context) {
super(context);
paint.setColor(Theme.getColor(Theme.key_login_progressInner));
paint2.setColor(Theme.getColor(Theme.key_login_progressOuter));
}
public void setProgress(float value) {
progress = value;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
int start = (int) (getMeasuredWidth() * progress);
canvas.drawRect(0, 0, start, getMeasuredHeight(), paint2);
canvas.drawRect(start, 0, getMeasuredWidth(), getMeasuredHeight(), paint);
}
}
2018-07-30 04:07:02 +02:00
public class PhoneConfirmationView extends SlideView implements NotificationCenter.NotificationCenterDelegate {
private String phone;
private String phoneHash;
2019-01-23 18:03:33 +01:00
private LinearLayout codeFieldContainer;
private EditTextBoldCursor[] codeField;
2018-07-30 04:07:02 +02:00
private TextView confirmTextView;
2019-01-23 18:03:33 +01:00
private TextView titleTextView;
private ImageView blackImageView;
private ImageView blueImageView;
2018-07-30 04:07:02 +02:00
private TextView timeText;
private TextView problemText;
private Bundle currentParams;
private ProgressView progressView;
private Timer timeTimer;
private Timer codeTimer;
private final Object timerSync = new Object();
private int time = 60000;
private int codeTime = 15000;
private double lastCurrentTime;
private double lastCodeTime;
private boolean ignoreOnTextChange;
private boolean waitingForEvent;
private boolean nextPressed;
private String lastError = "";
private int verificationType;
private int nextType;
private String pattern = "*";
private int length;
private int timeout;
public PhoneConfirmationView(Context context, final int type) {
super(context);
verificationType = type;
setOrientation(VERTICAL);
confirmTextView = new TextView(context);
confirmTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText6));
confirmTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
2019-01-23 18:03:33 +01:00
confirmTextView.setLineSpacing(AndroidUtilities.dp(2), 1.0f);
titleTextView = new TextView(context);
titleTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
titleTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
titleTextView.setLineSpacing(AndroidUtilities.dp(2), 1.0f);
titleTextView.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
2018-07-30 04:07:02 +02:00
if (verificationType == 3) {
2019-01-23 18:03:33 +01:00
confirmTextView.setGravity(Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT));
2018-07-30 04:07:02 +02:00
FrameLayout frameLayout = new FrameLayout(context);
2019-01-23 18:03:33 +01:00
addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT));
2018-07-30 04:07:02 +02:00
ImageView imageView = new ImageView(context);
imageView.setImageResource(R.drawable.phone_activate);
if (LocaleController.isRTL) {
frameLayout.addView(imageView, LayoutHelper.createFrame(64, 76, Gravity.LEFT | Gravity.CENTER_VERTICAL, 2, 2, 0, 0));
frameLayout.addView(confirmTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 64 + 18, 0, 0, 0));
} else {
frameLayout.addView(confirmTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 0, 0, 64 + 18, 0));
frameLayout.addView(imageView, LayoutHelper.createFrame(64, 76, Gravity.RIGHT | Gravity.CENTER_VERTICAL, 0, 2, 0, 2));
}
} else {
2019-01-23 18:03:33 +01:00
confirmTextView.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
2018-07-30 04:07:02 +02:00
2019-01-23 18:03:33 +01:00
FrameLayout frameLayout = new FrameLayout(context);
addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL));
2018-07-30 04:07:02 +02:00
2019-01-23 18:03:33 +01:00
if (verificationType == 1) {
blackImageView = new ImageView(context);
blackImageView.setImageResource(R.drawable.sms_devices);
2020-06-25 17:12:58 +02:00
blackImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText), PorterDuff.Mode.SRC_IN));
2019-01-23 18:03:33 +01:00
frameLayout.addView(blackImageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 0));
2018-07-30 04:07:02 +02:00
2019-01-23 18:03:33 +01:00
blueImageView = new ImageView(context);
blueImageView.setImageResource(R.drawable.sms_bubble);
2020-06-25 17:12:58 +02:00
blueImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionBackground), PorterDuff.Mode.SRC_IN));
2019-01-23 18:03:33 +01:00
frameLayout.addView(blueImageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 0));
2018-07-30 04:07:02 +02:00
2019-01-23 18:03:33 +01:00
titleTextView.setText(LocaleController.getString("SentAppCodeTitle", R.string.SentAppCodeTitle));
} else {
blueImageView = new ImageView(context);
blueImageView.setImageResource(R.drawable.sms_code);
2020-06-25 17:12:58 +02:00
blueImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionBackground), PorterDuff.Mode.SRC_IN));
2019-01-23 18:03:33 +01:00
frameLayout.addView(blueImageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 0));
titleTextView.setText(LocaleController.getString("SentSmsCodeTitle", R.string.SentSmsCodeTitle));
2018-07-30 04:07:02 +02:00
}
2019-01-23 18:03:33 +01:00
addView(titleTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 0, 18, 0, 0));
addView(confirmTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 0, 17, 0, 0));
}
codeFieldContainer = new LinearLayout(context);
codeFieldContainer.setOrientation(HORIZONTAL);
addView(codeFieldContainer, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, 36, Gravity.CENTER_HORIZONTAL));
2018-07-30 04:07:02 +02:00
if (verificationType == 3) {
2019-01-23 18:03:33 +01:00
codeFieldContainer.setVisibility(GONE);
2018-07-30 04:07:02 +02:00
}
2019-01-23 18:03:33 +01:00
timeText = new TextView(context) {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(100), MeasureSpec.AT_MOST));
}
};
2018-07-30 04:07:02 +02:00
timeText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText6));
timeText.setLineSpacing(AndroidUtilities.dp(2), 1.0f);
if (verificationType == 3) {
2019-01-23 18:03:33 +01:00
timeText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
addView(timeText, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT));
2018-07-30 04:07:02 +02:00
progressView = new ProgressView(context);
2019-01-23 18:03:33 +01:00
timeText.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
2018-07-30 04:07:02 +02:00
addView(progressView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 3, 0, 12, 0, 0));
2019-01-23 18:03:33 +01:00
} else {
timeText.setPadding(0, AndroidUtilities.dp(2), 0, AndroidUtilities.dp(10));
timeText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
timeText.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
addView(timeText, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL));
2018-07-30 04:07:02 +02:00
}
2019-01-23 18:03:33 +01:00
problemText = new TextView(context) {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(100), MeasureSpec.AT_MOST));
}
};
2018-07-30 04:07:02 +02:00
problemText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4));
problemText.setLineSpacing(AndroidUtilities.dp(2), 1.0f);
2019-01-23 18:03:33 +01:00
problemText.setPadding(0, AndroidUtilities.dp(2), 0, AndroidUtilities.dp(10));
problemText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
problemText.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP);
if (verificationType == 1) {
problemText.setText(LocaleController.getString("DidNotGetTheCodeSms", R.string.DidNotGetTheCodeSms));
} else {
problemText.setText(LocaleController.getString("DidNotGetTheCode", R.string.DidNotGetTheCode));
}
addView(problemText, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP));
2018-08-27 10:33:11 +02:00
problemText.setOnClickListener(v -> {
if (nextPressed) {
return;
}
2019-01-23 18:03:33 +01:00
boolean email = nextType == 4 && verificationType == 2 || nextType == 0;
if (!email) {
2018-08-27 10:33:11 +02:00
resendCode();
} else {
try {
PackageInfo pInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0);
String version = String.format(Locale.US, "%s (%d)", pInfo.versionName, pInfo.versionCode);
2021-04-14 03:44:46 +02:00
Intent mailer = new Intent(Intent.ACTION_SENDTO);
mailer.setData(Uri.parse("mailto:"));
2021-12-07 14:02:02 +01:00
mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"sms@telegram.org"});
2018-08-27 10:33:11 +02:00
mailer.putExtra(Intent.EXTRA_SUBJECT, "Android registration/login issue " + version + " " + phone);
mailer.putExtra(Intent.EXTRA_TEXT, "Phone: " + phone + "\nApp version: " + version + "\nOS version: SDK " + Build.VERSION.SDK_INT + "\nDevice Name: " + Build.MANUFACTURER + Build.MODEL + "\nLocale: " + Locale.getDefault() + "\nError: " + lastError);
getContext().startActivity(Intent.createChooser(mailer, "Send email..."));
} catch (Exception e) {
AlertsCreator.showSimpleAlert(PassportActivity.this, LocaleController.getString("NoMailInstalled", R.string.NoMailInstalled));
2018-07-30 04:07:02 +02:00
}
}
});
}
2019-01-23 18:03:33 +01:00
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (verificationType != 3 && blueImageView != null) {
int innerHeight = blueImageView.getMeasuredHeight() + titleTextView.getMeasuredHeight() + confirmTextView.getMeasuredHeight() + AndroidUtilities.dp(18 + 17);
int requiredHeight = AndroidUtilities.dp(80);
int maxHeight = AndroidUtilities.dp(291);
if (scrollHeight - innerHeight < requiredHeight) {
setMeasuredDimension(getMeasuredWidth(), innerHeight + requiredHeight);
} else {
2020-04-24 11:21:58 +02:00
setMeasuredDimension(getMeasuredWidth(), Math.min(scrollHeight, maxHeight));
2019-01-23 18:03:33 +01:00
}
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (verificationType != 3 && blueImageView != null) {
int bottom = confirmTextView.getBottom();
int height = getMeasuredHeight() - bottom;
int h;
if (problemText.getVisibility() == VISIBLE) {
h = problemText.getMeasuredHeight();
t = bottom + height - h;
problemText.layout(problemText.getLeft(), t, problemText.getRight(), t + h);
} else if (timeText.getVisibility() == VISIBLE) {
h = timeText.getMeasuredHeight();
t = bottom + height - h;
timeText.layout(timeText.getLeft(), t, timeText.getRight(), t + h);
} else {
t = bottom + height;
}
height = t - bottom;
h = codeFieldContainer.getMeasuredHeight();
t = (height - h) / 2 + bottom;
codeFieldContainer.layout(codeFieldContainer.getLeft(), t, codeFieldContainer.getRight(), t + h);
}
}
2018-07-30 04:07:02 +02:00
private void resendCode() {
final Bundle params = new Bundle();
params.putString("phone", phone);
nextPressed = true;
needShowProgress();
final TLRPC.TL_auth_resendCode req = new TLRPC.TL_auth_resendCode();
req.phone_number = phone;
req.phone_code_hash = phoneHash;
2018-08-27 10:33:11 +02:00
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
nextPressed = false;
if (error == null) {
fillNextCodeParams(params, (TLRPC.TL_auth_sentCode) response, true);
} else {
AlertDialog dialog = (AlertDialog) AlertsCreator.processError(currentAccount, error, PassportActivity.this, req);
if (dialog != null && error.text.contains("PHONE_CODE_EXPIRED")) {
dialog.setPositiveButtonListener((dialog1, which) -> {
2019-01-23 18:03:33 +01:00
onBackPressed(true);
2018-08-27 10:33:11 +02:00
finishFragment();
});
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
needHideProgress();
}), ConnectionsManager.RequestFlagFailOnServerErrors);
2018-07-30 04:07:02 +02:00
}
2019-01-23 18:03:33 +01:00
@Override
public boolean needBackButton() {
return true;
}
2018-07-30 04:07:02 +02:00
@Override
public void onCancelPressed() {
nextPressed = false;
}
@Override
public void setParams(Bundle params, boolean restore) {
if (params == null) {
return;
}
waitingForEvent = true;
if (verificationType == 2) {
AndroidUtilities.setWaitingForSms(true);
NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.didReceiveSmsCode);
} else if (verificationType == 3) {
AndroidUtilities.setWaitingForCall(true);
NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.didReceiveCall);
}
currentParams = params;
phone = params.getString("phone");
phoneHash = params.getString("phoneHash");
timeout = time = params.getInt("timeout");
nextType = params.getInt("nextType");
pattern = params.getString("pattern");
length = params.getInt("length");
2019-01-23 18:03:33 +01:00
if (length == 0) {
length = 5;
}
if (codeField == null || codeField.length != length) {
codeField = new EditTextBoldCursor[length];
for (int a = 0; a < length; a++) {
final int num = a;
codeField[a] = new EditTextBoldCursor(getContext());
codeField[a].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
codeField[a].setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
codeField[a].setCursorSize(AndroidUtilities.dp(20));
codeField[a].setCursorWidth(1.5f);
Drawable pressedDrawable = getResources().getDrawable(R.drawable.search_dark_activated).mutate();
2020-06-25 17:12:58 +02:00
pressedDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated), PorterDuff.Mode.SRC_IN));
2019-01-23 18:03:33 +01:00
codeField[a].setBackgroundDrawable(pressedDrawable);
codeField[a].setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
codeField[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20);
codeField[a].setMaxLines(1);
codeField[a].setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
codeField[a].setPadding(0, 0, 0, 0);
codeField[a].setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP);
if (verificationType == 3) {
codeField[a].setEnabled(false);
codeField[a].setInputType(InputType.TYPE_NULL);
codeField[a].setVisibility(GONE);
} else {
codeField[a].setInputType(InputType.TYPE_CLASS_PHONE);
}
codeFieldContainer.addView(codeField[a], LayoutHelper.createLinear(34, 36, Gravity.CENTER_HORIZONTAL, 0, 0, a != length - 1 ? 7 : 0, 0));
codeField[a].addTextChangedListener(new TextWatcher() {
2018-07-30 04:07:02 +02:00
2019-01-23 18:03:33 +01:00
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (ignoreOnTextChange) {
return;
}
int len = s.length();
if (len >= 1) {
if (len > 1) {
String text = s.toString();
ignoreOnTextChange = true;
for (int a = 0; a < Math.min(length - num, len); a++) {
if (a == 0) {
s.replace(0, len, text.substring(a, a + 1));
} else {
codeField[num + a].setText(text.substring(a, a + 1));
}
}
ignoreOnTextChange = false;
}
if (num != length - 1) {
codeField[num + 1].setSelection(codeField[num + 1].length());
codeField[num + 1].requestFocus();
}
if ((num == length - 1 || num == length - 2 && len >= 2) && getCode().length() == length) {
2021-12-07 14:02:02 +01:00
onNextPressed(null);
2019-01-23 18:03:33 +01:00
}
}
}
});
codeField[a].setOnKeyListener((v, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_DEL && codeField[num].length() == 0 && num > 0) {
codeField[num - 1].setSelection(codeField[num - 1].length());
codeField[num - 1].requestFocus();
codeField[num - 1].dispatchKeyEvent(event);
return true;
}
return false;
});
codeField[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_NEXT) {
2021-12-07 14:02:02 +01:00
onNextPressed(null);
2019-01-23 18:03:33 +01:00
return true;
}
return false;
});
}
2018-07-30 04:07:02 +02:00
} else {
2019-01-23 18:03:33 +01:00
for (int a = 0; a < codeField.length; a++) {
codeField[a].setText("");
}
2018-07-30 04:07:02 +02:00
}
2019-01-23 18:03:33 +01:00
2018-07-30 04:07:02 +02:00
if (progressView != null) {
progressView.setVisibility(nextType != 0 ? VISIBLE : GONE);
}
if (phone == null) {
return;
}
String number = PhoneFormat.getInstance().format("+" + phone);
CharSequence str = "";
if (verificationType == 2) {
str = AndroidUtilities.replaceTags(LocaleController.formatString("SentSmsCode", R.string.SentSmsCode, LocaleController.addNbsp(number)));
} else if (verificationType == 3) {
str = AndroidUtilities.replaceTags(LocaleController.formatString("SentCallCode", R.string.SentCallCode, LocaleController.addNbsp(number)));
} else if (verificationType == 4) {
str = AndroidUtilities.replaceTags(LocaleController.formatString("SentCallOnly", R.string.SentCallOnly, LocaleController.addNbsp(number)));
}
confirmTextView.setText(str);
if (verificationType != 3) {
2019-01-23 18:03:33 +01:00
AndroidUtilities.showKeyboard(codeField[0]);
codeField[0].requestFocus();
2018-07-30 04:07:02 +02:00
} else {
2019-01-23 18:03:33 +01:00
AndroidUtilities.hideKeyboard(codeField[0]);
2018-07-30 04:07:02 +02:00
}
destroyTimer();
destroyCodeTimer();
lastCurrentTime = System.currentTimeMillis();
if (verificationType == 3 && (nextType == 4 || nextType == 2)) {
problemText.setVisibility(GONE);
timeText.setVisibility(VISIBLE);
if (nextType == 4) {
timeText.setText(LocaleController.formatString("CallText", R.string.CallText, 1, 0));
} else if (nextType == 2) {
timeText.setText(LocaleController.formatString("SmsText", R.string.SmsText, 1, 0));
}
createTimer();
} else if (verificationType == 2 && (nextType == 4 || nextType == 3)) {
timeText.setText(LocaleController.formatString("CallText", R.string.CallText, 2, 0));
problemText.setVisibility(time < 1000 ? VISIBLE : GONE);
2019-01-23 18:03:33 +01:00
timeText.setVisibility(time < 1000 ? GONE : VISIBLE);
createTimer();
} else if (verificationType == 4 && nextType == 2) {
timeText.setText(LocaleController.formatString("SmsText", R.string.SmsText, 2, 0));
problemText.setVisibility(time < 1000 ? VISIBLE : GONE);
timeText.setVisibility(time < 1000 ? GONE : VISIBLE);
2018-07-30 04:07:02 +02:00
createTimer();
} else {
timeText.setVisibility(GONE);
problemText.setVisibility(GONE);
createCodeTimer();
}
}
private void createCodeTimer() {
if (codeTimer != null) {
return;
}
codeTime = 15000;
codeTimer = new Timer();
lastCodeTime = System.currentTimeMillis();
codeTimer.schedule(new TimerTask() {
@Override
public void run() {
2018-08-27 10:33:11 +02:00
AndroidUtilities.runOnUIThread(() -> {
2019-01-23 18:03:33 +01:00
double currentTime = System.currentTimeMillis();
double diff = currentTime - lastCodeTime;
lastCodeTime = currentTime;
codeTime -= diff;
2018-08-27 10:33:11 +02:00
if (codeTime <= 1000) {
problemText.setVisibility(VISIBLE);
2019-01-23 18:03:33 +01:00
timeText.setVisibility(GONE);
2018-08-27 10:33:11 +02:00
destroyCodeTimer();
2018-07-30 04:07:02 +02:00
}
});
}
}, 0, 1000);
}
private void destroyCodeTimer() {
try {
synchronized (timerSync) {
if (codeTimer != null) {
codeTimer.cancel();
codeTimer = null;
}
}
} catch (Exception e) {
FileLog.e(e);
}
}
private void createTimer() {
if (timeTimer != null) {
return;
}
timeTimer = new Timer();
timeTimer.schedule(new TimerTask() {
@Override
public void run() {
if (timeTimer == null) {
return;
}
final double currentTime = System.currentTimeMillis();
double diff = currentTime - lastCurrentTime;
time -= diff;
lastCurrentTime = currentTime;
2019-12-31 14:08:08 +01:00
AndroidUtilities.runOnUIThread(() -> {
if (time >= 1000) {
int minutes = time / 1000 / 60;
int seconds = time / 1000 - minutes * 60;
if (nextType == 4 || nextType == 3) {
timeText.setText(LocaleController.formatString("CallText", R.string.CallText, minutes, seconds));
} else if (nextType == 2) {
timeText.setText(LocaleController.formatString("SmsText", R.string.SmsText, minutes, seconds));
}
if (progressView != null) {
progressView.setProgress(1.0f - (float) time / (float) timeout);
}
} else {
if (progressView != null) {
progressView.setProgress(1.0f);
}
destroyTimer();
if (verificationType == 3) {
AndroidUtilities.setWaitingForCall(false);
NotificationCenter.getGlobalInstance().removeObserver(PhoneConfirmationView.this, NotificationCenter.didReceiveCall);
waitingForEvent = false;
destroyCodeTimer();
resendCode();
} else if (verificationType == 2 || verificationType == 4) {
if (nextType == 4 || nextType == 2) {
if (nextType == 4) {
timeText.setText(LocaleController.getString("Calling", R.string.Calling));
} else {
timeText.setText(LocaleController.getString("SendingSms", R.string.SendingSms));
}
createCodeTimer();
TLRPC.TL_auth_resendCode req = new TLRPC.TL_auth_resendCode();
req.phone_number = phone;
req.phone_code_hash = phoneHash;
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> {
if (error != null && error.text != null) {
AndroidUtilities.runOnUIThread(() -> lastError = error.text);
}
}, ConnectionsManager.RequestFlagFailOnServerErrors);
} else if (nextType == 3) {
AndroidUtilities.setWaitingForSms(false);
NotificationCenter.getGlobalInstance().removeObserver(PhoneConfirmationView.this, NotificationCenter.didReceiveSmsCode);
2018-07-30 04:07:02 +02:00
waitingForEvent = false;
destroyCodeTimer();
resendCode();
}
}
}
});
}
}, 0, 1000);
}
private void destroyTimer() {
try {
synchronized (timerSync) {
if (timeTimer != null) {
timeTimer.cancel();
timeTimer = null;
}
}
} catch (Exception e) {
FileLog.e(e);
}
}
2019-01-23 18:03:33 +01:00
private String getCode() {
if (codeField == null) {
return "";
}
StringBuilder codeBuilder = new StringBuilder();
for (int a = 0; a < codeField.length; a++) {
codeBuilder.append(PhoneFormat.stripExceptNumbers(codeField[a].getText().toString()));
}
return codeBuilder.toString();
}
2018-07-30 04:07:02 +02:00
@Override
2021-12-07 14:02:02 +01:00
public void onNextPressed(String code) {
2018-07-30 04:07:02 +02:00
if (nextPressed) {
return;
}
2021-12-07 14:02:02 +01:00
if (code == null) {
code = getCode();
}
2019-01-23 18:03:33 +01:00
if (TextUtils.isEmpty(code)) {
AndroidUtilities.shakeView(codeFieldContainer, 2, 0);
return;
}
2018-07-30 04:07:02 +02:00
nextPressed = true;
if (verificationType == 2) {
AndroidUtilities.setWaitingForSms(false);
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didReceiveSmsCode);
} else if (verificationType == 3) {
AndroidUtilities.setWaitingForCall(false);
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didReceiveCall);
}
waitingForEvent = false;
2019-01-23 18:03:33 +01:00
showEditDoneProgress(true, true);
2018-07-30 04:07:02 +02:00
final TLRPC.TL_account_verifyPhone req = new TLRPC.TL_account_verifyPhone();
req.phone_number = phone;
2019-01-23 18:03:33 +01:00
req.phone_code = code;
2018-07-30 04:07:02 +02:00
req.phone_code_hash = phoneHash;
destroyTimer();
needShowProgress();
2018-08-27 10:33:11 +02:00
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
needHideProgress();
nextPressed = false;
if (error == null) {
destroyTimer();
destroyCodeTimer();
delegate.saveValue(currentType, currentValues.get("phone"), null, null, null, null, null, null, null, null, PassportActivity.this::finishFragment, null);
} else {
lastError = error.text;
2019-01-23 18:03:33 +01:00
if (verificationType == 3 && (nextType == 4 || nextType == 2) || verificationType == 2 && (nextType == 4 || nextType == 3) || verificationType == 4 && nextType == 2) {
2018-08-27 10:33:11 +02:00
createTimer();
}
if (verificationType == 2) {
AndroidUtilities.setWaitingForSms(true);
NotificationCenter.getGlobalInstance().addObserver(PhoneConfirmationView.this, NotificationCenter.didReceiveSmsCode);
} else if (verificationType == 3) {
AndroidUtilities.setWaitingForCall(true);
NotificationCenter.getGlobalInstance().addObserver(PhoneConfirmationView.this, NotificationCenter.didReceiveCall);
}
waitingForEvent = true;
if (verificationType != 3) {
AlertsCreator.processError(currentAccount, error, PassportActivity.this, req);
}
2019-01-23 18:03:33 +01:00
showEditDoneProgress(true, false);
if (error.text.contains("PHONE_CODE_EMPTY") || error.text.contains("PHONE_CODE_INVALID")) {
for (int a = 0; a < codeField.length; a++) {
codeField[a].setText("");
}
codeField[0].requestFocus();
} else if (error.text.contains("PHONE_CODE_EXPIRED")) {
onBackPressed(true);
setPage(0, true, null);
}
2018-07-30 04:07:02 +02:00
}
2018-08-27 10:33:11 +02:00
}), ConnectionsManager.RequestFlagFailOnServerErrors);
2018-07-30 04:07:02 +02:00
}
@Override
2019-01-23 18:03:33 +01:00
public boolean onBackPressed(boolean force) {
if (!force) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setMessage(LocaleController.getString("StopVerification", R.string.StopVerification));
builder.setPositiveButton(LocaleController.getString("Continue", R.string.Continue), null);
builder.setNegativeButton(LocaleController.getString("Stop", R.string.Stop), (dialogInterface, i) -> {
onBackPressed(true);
setPage(0, true, null);
});
showDialog(builder.create());
return false;
}
2018-07-30 04:07:02 +02:00
TLRPC.TL_auth_cancelCode req = new TLRPC.TL_auth_cancelCode();
req.phone_number = phone;
req.phone_code_hash = phoneHash;
2018-08-27 10:33:11 +02:00
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> {
2018-07-30 04:07:02 +02:00
}, ConnectionsManager.RequestFlagFailOnServerErrors);
destroyTimer();
destroyCodeTimer();
currentParams = null;
if (verificationType == 2) {
AndroidUtilities.setWaitingForSms(false);
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didReceiveSmsCode);
} else if (verificationType == 3) {
AndroidUtilities.setWaitingForCall(false);
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didReceiveCall);
}
waitingForEvent = false;
2019-01-23 18:03:33 +01:00
return true;
2018-07-30 04:07:02 +02:00
}
@Override
public void onDestroyActivity() {
super.onDestroyActivity();
if (verificationType == 2) {
AndroidUtilities.setWaitingForSms(false);
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didReceiveSmsCode);
} else if (verificationType == 3) {
AndroidUtilities.setWaitingForCall(false);
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didReceiveCall);
}
waitingForEvent = false;
destroyTimer();
destroyCodeTimer();
}
@Override
public void onShow() {
super.onShow();
2019-01-23 18:03:33 +01:00
if (codeFieldContainer != null && codeFieldContainer.getVisibility() == VISIBLE) {
for (int a = codeField.length - 1; a >= 0; a--) {
if (a == 0 || codeField[a].length() != 0) {
codeField[a].requestFocus();
codeField[a].setSelection(codeField[a].length());
AndroidUtilities.showKeyboard(codeField[a]);
break;
}
}
2018-07-30 04:07:02 +02:00
}
}
@Override
public void didReceivedNotification(int id, int account, Object... args) {
if (!waitingForEvent || codeField == null) {
return;
}
if (id == NotificationCenter.didReceiveSmsCode) {
2019-01-23 18:03:33 +01:00
codeField[0].setText("" + args[0]);
2021-12-07 14:02:02 +01:00
onNextPressed(null);
2018-07-30 04:07:02 +02:00
} else if (id == NotificationCenter.didReceiveCall) {
String num = "" + args[0];
if (!AndroidUtilities.checkPhonePattern(pattern, num)) {
return;
}
ignoreOnTextChange = true;
2019-01-23 18:03:33 +01:00
codeField[0].setText(num);
2018-07-30 04:07:02 +02:00
ignoreOnTextChange = false;
2021-12-07 14:02:02 +01:00
onNextPressed(null);
2018-07-30 04:07:02 +02:00
}
}
}
@Override
2020-04-24 11:21:58 +02:00
public ArrayList<ThemeDescription> getThemeDescriptions() {
2018-07-30 04:07:02 +02:00
ArrayList<ThemeDescription> arrayList = new ArrayList<>();
2020-04-24 11:21:58 +02:00
2018-07-30 04:07:02 +02:00
arrayList.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundGray));
arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault));
arrayList.add(new ThemeDescription(scrollView, ThemeDescription.FLAG_LISTGLOWCOLOR, null, null, null, null, Theme.key_actionBarDefault));
arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_ITEMSCOLOR, null, null, null, null, Theme.key_actionBarDefaultIcon));
arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_TITLECOLOR, null, null, null, null, Theme.key_actionBarDefaultTitle));
arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_actionBarDefaultSelector));
arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SEARCH, null, null, null, null, Theme.key_actionBarDefaultSearch));
arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SEARCHPLACEHOLDER, null, null, null, null, Theme.key_actionBarDefaultSearchPlaceholder));
arrayList.add(new ThemeDescription(linearLayout2, 0, new Class[]{View.class}, Theme.dividerPaint, null, null, Theme.key_divider));
arrayList.add(new ThemeDescription(extraBackgroundView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite));
2018-08-27 10:33:11 +02:00
if (extraBackgroundView2 != null) {
arrayList.add(new ThemeDescription(extraBackgroundView2, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite));
}
2018-07-30 04:07:02 +02:00
for (int a = 0; a < dividers.size(); a++) {
arrayList.add(new ThemeDescription(dividers.get(a), ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_divider));
}
for (HashMap.Entry<SecureDocument, SecureDocumentCell> entry : documentsCells.entrySet()) {
SecureDocumentCell cell = entry.getValue();
arrayList.add(new ThemeDescription(cell, ThemeDescription.FLAG_SELECTORWHITE, new Class[]{SecureDocumentCell.class}, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(cell, 0, new Class[]{SecureDocumentCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(cell, 0, new Class[]{SecureDocumentCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
}
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_SELECTORWHITE, new Class[]{TextDetailSettingsCell.class}, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(linearLayout2, 0, new Class[]{TextDetailSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(linearLayout2, 0, new Class[]{TextDetailSettingsCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_SELECTORWHITE, new Class[]{TextSettingsCell.class}, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(linearLayout2, 0, new Class[]{TextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(linearLayout2, 0, new Class[]{TextSettingsCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteValueText));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_SELECTORWHITE, new Class[]{TextDetailSecureCell.class}, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{TextDetailSecureCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{TextDetailSecureCell.class}, null, null, null, Theme.key_divider));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{TextDetailSecureCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{TextDetailSecureCell.class}, new String[]{"checkImageView"}, null, null, null, Theme.key_featuredStickers_addedIcon));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{HeaderCell.class}, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(linearLayout2, 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow));
arrayList.add(new ThemeDescription(linearLayout2, 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4));
if (inputFields != null) {
for (int a = 0; a < inputFields.length; a++) {
arrayList.add(new ThemeDescription((View) inputFields[a].getParent(), ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(inputFields[a], ThemeDescription.FLAG_TEXTCOLOR | ThemeDescription.FLAG_CURSORCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(inputFields[a], ThemeDescription.FLAG_HINTTEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteHintText));
arrayList.add(new ThemeDescription(inputFields[a], ThemeDescription.FLAG_HINTTEXTCOLOR | ThemeDescription.FLAG_PROGRESSBAR, null, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader));
arrayList.add(new ThemeDescription(inputFields[a], ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_windowBackgroundWhiteInputField));
arrayList.add(new ThemeDescription(inputFields[a], ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, null, null, null, null, Theme.key_windowBackgroundWhiteInputFieldActivated));
arrayList.add(new ThemeDescription(inputFields[a], ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_PROGRESSBAR, null, null, null, null, Theme.key_windowBackgroundWhiteRedText3));
}
} else {
arrayList.add(new ThemeDescription(null, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(null, ThemeDescription.FLAG_HINTTEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteHintText));
arrayList.add(new ThemeDescription(null, ThemeDescription.FLAG_HINTTEXTCOLOR | ThemeDescription.FLAG_PROGRESSBAR, null, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader));
arrayList.add(new ThemeDescription(null, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_windowBackgroundWhiteInputField));
arrayList.add(new ThemeDescription(null, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, null, null, null, null, Theme.key_windowBackgroundWhiteInputFieldActivated));
arrayList.add(new ThemeDescription(null, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_PROGRESSBAR, null, null, null, null, Theme.key_windowBackgroundWhiteRedText3));
}
2018-08-27 10:33:11 +02:00
if (inputExtraFields != null) {
for (int a = 0; a < inputExtraFields.length; a++) {
arrayList.add(new ThemeDescription((View) inputExtraFields[a].getParent(), ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(inputExtraFields[a], ThemeDescription.FLAG_TEXTCOLOR | ThemeDescription.FLAG_CURSORCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(inputExtraFields[a], ThemeDescription.FLAG_HINTTEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteHintText));
arrayList.add(new ThemeDescription(inputExtraFields[a], ThemeDescription.FLAG_HINTTEXTCOLOR | ThemeDescription.FLAG_PROGRESSBAR, null, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader));
arrayList.add(new ThemeDescription(inputExtraFields[a], ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_windowBackgroundWhiteInputField));
arrayList.add(new ThemeDescription(inputExtraFields[a], ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, null, null, null, null, Theme.key_windowBackgroundWhiteInputFieldActivated));
arrayList.add(new ThemeDescription(inputExtraFields[a], ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_PROGRESSBAR, null, null, null, null, Theme.key_windowBackgroundWhiteRedText3));
}
}
2018-07-30 04:07:02 +02:00
arrayList.add(new ThemeDescription(emptyView, ThemeDescription.FLAG_PROGRESSBAR, null, null, null, null, Theme.key_progressCircle));
arrayList.add(new ThemeDescription(noPasswordImageView, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_messagePanelIcons));
arrayList.add(new ThemeDescription(noPasswordTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteGrayText4));
arrayList.add(new ThemeDescription(noPasswordSetTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlueText5));
arrayList.add(new ThemeDescription(passwordForgotButton, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlueText4));
arrayList.add(new ThemeDescription(plusTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(acceptTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_passport_authorizeText));
arrayList.add(new ThemeDescription(bottomLayout, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_passport_authorizeBackground));
arrayList.add(new ThemeDescription(bottomLayout, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, null, null, null, null, Theme.key_passport_authorizeBackgroundSelected));
arrayList.add(new ThemeDescription(progressView, 0, null, null, null, null, Theme.key_contextProgressInner2));
arrayList.add(new ThemeDescription(progressView, 0, null, null, null, null, Theme.key_contextProgressOuter2));
arrayList.add(new ThemeDescription(progressViewButton, 0, null, null, null, null, Theme.key_contextProgressInner2));
arrayList.add(new ThemeDescription(progressViewButton, 0, null, null, null, null, Theme.key_contextProgressOuter2));
arrayList.add(new ThemeDescription(emptyImageView, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_sessions_devicesImage));
arrayList.add(new ThemeDescription(emptyTextView1, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
arrayList.add(new ThemeDescription(emptyTextView2, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
arrayList.add(new ThemeDescription(emptyTextView3, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlueText4));
2020-04-24 11:21:58 +02:00
return arrayList;
2018-07-30 04:07:02 +02:00
}
}