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

3384 lines
187 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* This is the source code of Telegram for Android v. 5.x.x.
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013-2018.
*/
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.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Build;
import android.os.Vibrator;
import android.telephony.TelephonyManager;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.method.PasswordTransformationMethod;
import android.text.style.ClickableSpan;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.webkit.CookieManager;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import com.stripe.android.Stripe;
import com.stripe.android.TokenCallback;
import com.stripe.android.exception.APIConnectionException;
import com.stripe.android.exception.APIException;
import com.stripe.android.model.Card;
import com.stripe.android.model.Token;
import org.json.JSONObject;
import org.telegram.PhoneFormat.PhoneFormat;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.ContactsController;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.SRPHelper;
import org.telegram.messenger.SharedConfig;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.Utilities;
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.EditTextSettingsCell;
import org.telegram.ui.Cells.HeaderCell;
import org.telegram.ui.Cells.PaymentInfoCell;
import org.telegram.ui.Cells.RadioCell;
import org.telegram.ui.Cells.ShadowSectionCell;
import org.telegram.ui.Cells.TextCheckCell;
import org.telegram.ui.Cells.TextDetailSettingsCell;
import org.telegram.ui.Cells.TextInfoPrivacyCell;
import org.telegram.ui.Cells.TextPriceCell;
import org.telegram.ui.Cells.TextSettingsCell;
import org.telegram.ui.Components.AlertsCreator;
import org.telegram.ui.Components.ContextProgressView;
import org.telegram.ui.Components.EditTextBoldCursor;
import org.telegram.ui.Components.HintEditText;
import org.telegram.ui.Components.LayoutHelper;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import tw.nekomimi.nekogram.JalaliCalendar;
public class PaymentFormActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
private final static int FIELD_CARD = 0;
private final static int FIELD_EXPIRE_DATE = 1;
private final static int FIELD_CARDNAME = 2;
private final static int FIELD_CVV = 3;
private final static int FIELD_CARD_COUNTRY = 4;
private final static int FIELD_CARD_POSTCODE = 5;
private final static int FIELDS_COUNT_CARD = 6;
private final static int FIELD_STREET1 = 0;
private final static int FIELD_STREET2 = 1;
private final static int FIELD_CITY = 2;
private final static int FIELD_STATE = 3;
private final static int FIELD_COUNTRY = 4;
private final static int FIELD_POSTCODE = 5;
private final static int FIELD_NAME = 6;
private final static int FIELD_EMAIL = 7;
private final static int FIELD_PHONECODE = 8;
private final static int FIELD_PHONE = 9;
private final static int FIELDS_COUNT_ADDRESS = 10;
private final static int FIELD_SAVEDCARD = 0;
private final static int FIELD_SAVEDPASSWORD = 1;
private final static int FIELDS_COUNT_SAVEDCARD = 2;
private final static int FIELD_ENTERPASSWORD = 0;
private final static int FIELD_REENTERPASSWORD = 1;
private final static int FIELD_ENTERPASSWORDEMAIL = 2;
private final static int FIELDS_COUNT_PASSWORD = 3;
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 EditTextBoldCursor[] inputFields;
private RadioCell[] radioCells;
private ActionBarMenuItem doneItem;
private ContextProgressView progressView;
private ContextProgressView progressViewButton;
private AnimatorSet doneItemAnimation;
private WebView webView;
private String webViewUrl;
private boolean shouldNavigateBack;
private ScrollView scrollView;
private boolean swipeBackEnabled = true;
private TextView textView;
private HeaderCell[] headerCell = new HeaderCell[3];
private ArrayList<View> dividers = new ArrayList<>();
private ShadowSectionCell[] sectionCell = new ShadowSectionCell[3];
private TextCheckCell checkCell1;
private TextInfoPrivacyCell[] bottomCell = new TextInfoPrivacyCell[3];
private TextSettingsCell[] settingsCell = new TextSettingsCell[2];
private FrameLayout androidPayContainer;
private LinearLayout linearLayout2;
private EditTextSettingsCell codeFieldCell;
private PaymentFormActivityDelegate delegate;
private TextView payTextView;
private FrameLayout bottomLayout;
private PaymentInfoCell paymentInfoCell;
private TextDetailSettingsCell[] detailSettingsCell = new TextDetailSettingsCell[7];
private TLRPC.TL_account_password currentPassword;
private boolean waitingForEmail;
private int emailCodeLength = 6;
private Runnable shortPollRunnable;
private boolean loadingPasswordInfo;
private PaymentFormActivity passwordFragment;
private boolean need_card_country;
private boolean need_card_postcode;
private boolean need_card_name;
private String stripeApiKey;
private TLRPC.User botUser;
private boolean ignoreOnTextChange;
private boolean ignoreOnPhoneChange;
private boolean ignoreOnCardChange;
private String currentBotName;
private String currentItemName;
private int currentStep;
private boolean passwordOk;
private String paymentJson;
private String cardName;
private boolean webviewLoading;
private String countryName;
private String totalPriceDecimal;
private TLRPC.TL_payments_paymentForm paymentForm;
private TLRPC.TL_payments_validatedRequestedInfo requestedInfo;
private TLRPC.TL_shippingOption shippingOption;
private TLRPC.TL_payments_validateRequestedInfo validateRequest;
private TLRPC.TL_inputPaymentCredentialsAndroidPay androidPayCredentials;
private String androidPayPublicKey;
private int androidPayBackgroundColor;
private boolean androidPayBlackTheme;
private MessageObject messageObject;
private boolean donePressed;
private boolean canceled;
private boolean isWebView;
private boolean saveShippingInfo;
private boolean saveCardInfo;
private final static int done_button = 1;
private static final int LOAD_MASKED_WALLET_REQUEST_CODE = 1000;
private static final int LOAD_FULL_WALLET_REQUEST_CODE = 1001;
private final static int fragment_container_id = 4000;
private interface PaymentFormActivityDelegate {
boolean didSelectNewCard(String tokenJson, String card, boolean saveCard, TLRPC.TL_inputPaymentCredentialsAndroidPay androidPay);
void onFragmentDestroyed();
void currentPasswordUpdated(TLRPC.TL_account_password password);
}
private class TelegramWebviewProxy {
@JavascriptInterface
public void postEvent(final String eventName, final String eventData) {
AndroidUtilities.runOnUIThread(() -> {
if (getParentActivity() == null) {
return;
}
if (eventName.equals("payment_form_submit")) {
try {
JSONObject jsonObject = new JSONObject(eventData);
JSONObject response = jsonObject.getJSONObject("credentials");
paymentJson = response.toString();
cardName = jsonObject.getString("title");
} catch (Throwable e) {
paymentJson = eventData;
FileLog.e(e);
}
goToNextStep();
}
});
}
}
public class LinkSpan extends ClickableSpan {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
@Override
public void onClick(View widget) {
presentFragment(new TwoStepVerificationSetupActivity(TwoStepVerificationSetupActivity.TYPE_INTRO, currentPassword));
}
}
public PaymentFormActivity(MessageObject message, TLRPC.TL_payments_paymentReceipt receipt) {
currentStep = 5;
paymentForm = new TLRPC.TL_payments_paymentForm();
paymentForm.bot_id = receipt.bot_id;
paymentForm.invoice = receipt.invoice;
paymentForm.provider_id = receipt.provider_id;
paymentForm.users = receipt.users;
shippingOption = receipt.shipping;
messageObject = message;
botUser = MessagesController.getInstance(currentAccount).getUser(receipt.bot_id);
if (botUser != null) {
currentBotName = botUser.first_name;
} else {
currentBotName = "";
}
currentItemName = message.messageOwner.media.title;
if (receipt.info != null) {
validateRequest = new TLRPC.TL_payments_validateRequestedInfo();
validateRequest.info = receipt.info;
}
cardName = receipt.credentials_title;
}
public PaymentFormActivity(TLRPC.TL_payments_paymentForm form, MessageObject message) {
int step;
if (form.invoice.shipping_address_requested || form.invoice.email_requested || form.invoice.name_requested || form.invoice.phone_requested) {
step = 0;
} else if (form.saved_credentials != null) {
if (UserConfig.getInstance(currentAccount).tmpPassword != null) {
if (UserConfig.getInstance(currentAccount).tmpPassword.valid_until < ConnectionsManager.getInstance(currentAccount).getCurrentTime() + 60) {
UserConfig.getInstance(currentAccount).tmpPassword = null;
UserConfig.getInstance(currentAccount).saveConfig(false);
}
}
if (UserConfig.getInstance(currentAccount).tmpPassword != null) {
step = 4;
} else {
step = 3;
}
} else {
step = 2;
}
init(form, message, step, null, null, null, null, null, false, null);
}
private PaymentFormActivity(TLRPC.TL_payments_paymentForm form, MessageObject message, int step, TLRPC.TL_payments_validatedRequestedInfo validatedRequestedInfo, TLRPC.TL_shippingOption shipping, String tokenJson, String card, TLRPC.TL_payments_validateRequestedInfo request, boolean saveCard, TLRPC.TL_inputPaymentCredentialsAndroidPay androidPay) {
init(form, message, step, validatedRequestedInfo, shipping, tokenJson, card, request, saveCard, androidPay);
}
private void setCurrentPassword(TLRPC.TL_account_password password) {
if (password.has_password) {
if (getParentActivity() == null) {
return;
}
goToNextStep();
} else {
currentPassword = password;
if (currentPassword != null) {
waitingForEmail = !TextUtils.isEmpty(currentPassword.email_unconfirmed_pattern);
}
updatePasswordFields();
}
}
private void setDelegate(PaymentFormActivityDelegate paymentFormActivityDelegate) {
delegate = paymentFormActivityDelegate;
}
private void init(TLRPC.TL_payments_paymentForm form, MessageObject message, int step, TLRPC.TL_payments_validatedRequestedInfo validatedRequestedInfo, TLRPC.TL_shippingOption shipping, String tokenJson, String card, TLRPC.TL_payments_validateRequestedInfo request, boolean saveCard, TLRPC.TL_inputPaymentCredentialsAndroidPay androidPay) {
currentStep = step;
paymentJson = tokenJson;
androidPayCredentials = androidPay;
requestedInfo = validatedRequestedInfo;
paymentForm = form;
shippingOption = shipping;
messageObject = message;
saveCardInfo = saveCard;
isWebView = !"stripe".equals(paymentForm.native_provider);
botUser = MessagesController.getInstance(currentAccount).getUser(form.bot_id);
if (botUser != null) {
currentBotName = botUser.first_name;
} else {
currentBotName = "";
}
currentItemName = message.messageOwner.media.title;
validateRequest = request;
saveShippingInfo = true;
if (saveCard) {
saveCardInfo = saveCard;
} else {
saveCardInfo = paymentForm.saved_credentials != null;
}
if (card == null) {
if (form.saved_credentials != null) {
cardName = form.saved_credentials.title;
}
} else {
cardName = card;
}
}
@Override
public void onResume() {
super.onResume();
AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid);
if (Build.VERSION.SDK_INT >= 23) {
try {
if ((currentStep == 2 || currentStep == 6) && !paymentForm.invoice.test) {
getParentActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
} else if (SharedConfig.passcodeHash.length() == 0 || SharedConfig.allowScreenCapture) {
getParentActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
} catch (Throwable e) {
FileLog.e(e);
}
}
}
@Override
public void onPause() {
}
@SuppressLint({"SetJavaScriptEnabled", "AddJavascriptInterface"})
@Override
public View createView(Context context) {
if (currentStep == 0) {
actionBar.setTitle(LocaleController.getString("PaymentShippingInfo", R.string.PaymentShippingInfo));
} else if (currentStep == 1) {
actionBar.setTitle(LocaleController.getString("PaymentShippingMethod", R.string.PaymentShippingMethod));
} else if (currentStep == 2) {
actionBar.setTitle(LocaleController.getString("PaymentCardInfo", R.string.PaymentCardInfo));
} else if (currentStep == 3) {
actionBar.setTitle(LocaleController.getString("PaymentCardInfo", R.string.PaymentCardInfo));
} else if (currentStep == 4) {
if (paymentForm.invoice.test) {
actionBar.setTitle("Test " + LocaleController.getString("PaymentCheckout", R.string.PaymentCheckout));
} else {
actionBar.setTitle(LocaleController.getString("PaymentCheckout", R.string.PaymentCheckout));
}
} else if (currentStep == 5) {
if (paymentForm.invoice.test) {
actionBar.setTitle("Test " + LocaleController.getString("PaymentReceipt", R.string.PaymentReceipt));
} else {
actionBar.setTitle(LocaleController.getString("PaymentReceipt", R.string.PaymentReceipt));
}
} else if (currentStep == 6) {
actionBar.setTitle(LocaleController.getString("PaymentPassword", R.string.PaymentPassword));
}
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
actionBar.setAllowOverlayTitle(true);
actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
@Override
public void onItemClick(int id) {
if (id == -1) {
if (donePressed) {
return;
}
finishFragment();
} else if (id == done_button) {
if (donePressed) {
return;
}
if (currentStep != 3) {
AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus());
}
if (currentStep == 0) {
setDonePressed(true);
sendForm();
} else if (currentStep == 1) {
for (int a = 0; a < radioCells.length; a++) {
if (radioCells[a].isChecked()) {
shippingOption = requestedInfo.shipping_options.get(a);
break;
}
}
goToNextStep();
} else if (currentStep == 2) {
sendCardData();
} else if (currentStep == 3) {
checkPassword();
} else if (currentStep == 6) {
sendSavePassword(false);
}
}
}
});
ActionBarMenu menu = actionBar.createMenu();
if (currentStep == 0 || currentStep == 1 || currentStep == 2 || currentStep == 3 || currentStep == 4 || currentStep == 6) {
doneItem = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56));
progressView = new ContextProgressView(context, 1);
progressView.setAlpha(0.0f);
progressView.setScaleX(0.1f);
progressView.setScaleY(0.1f);
progressView.setVisibility(View.INVISIBLE);
doneItem.addView(progressView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
}
fragmentView = new FrameLayout(context);
FrameLayout frameLayout = (FrameLayout) fragmentView;
fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray));
scrollView = new ScrollView(context);
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, currentStep == 4 ? 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 (currentStep == 0) {
HashMap<String, String> languageMap = new HashMap<>();
HashMap<String, String> countryMap = 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]);
countryMap.put(args[1], 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);
}
Collections.sort(countriesArray, String::compareTo);
inputFields = new EditTextBoldCursor[FIELDS_COUNT_ADDRESS];
for (int a = 0; a < FIELDS_COUNT_ADDRESS; a++) {
if (a == FIELD_STREET1) {
headerCell[0] = new HeaderCell(context);
headerCell[0].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
headerCell[0].setText(LocaleController.getString("PaymentShippingAddress", R.string.PaymentShippingAddress));
linearLayout2.addView(headerCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else if (a == FIELD_NAME) {
sectionCell[0] = new ShadowSectionCell(context);
linearLayout2.addView(sectionCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
headerCell[1] = new HeaderCell(context);
headerCell[1].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
headerCell[1].setText(LocaleController.getString("PaymentShippingReceiver", R.string.PaymentShippingReceiver));
linearLayout2.addView(headerCell[1], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
ViewGroup container;
if (a == FIELD_PHONECODE) {
container = new LinearLayout(context);
((LinearLayout) container).setOrientation(LinearLayout.HORIZONTAL);
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
} else if (a == FIELD_PHONE) {
container = (ViewGroup) inputFields[FIELD_PHONECODE].getParent();
} else {
container = new FrameLayout(context);
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
boolean allowDivider = a != FIELD_POSTCODE && a != FIELD_PHONE;
if (allowDivider) {
if (a == FIELD_EMAIL && !paymentForm.invoice.phone_requested) {
allowDivider = false;
} else if (a == FIELD_NAME && !paymentForm.invoice.phone_requested && !paymentForm.invoice.email_requested) {
allowDivider = false;
}
}
if (allowDivider) {
View divider = new View(context) {
@Override
protected void onDraw(Canvas canvas) {
canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint);
}
};
divider.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
dividers.add(divider);
container.addView(divider, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1, Gravity.LEFT | Gravity.BOTTOM));
}
}
if (a == FIELD_PHONE) {
inputFields[a] = new HintEditText(context);
} else {
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);
if (a == FIELD_COUNTRY) {
inputFields[a].setOnTouchListener((v, event) -> {
if (getParentActivity() == null) {
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
CountrySelectActivity fragment = new CountrySelectActivity(false);
fragment.setCountrySelectActivityDelegate((name, shortName) -> {
inputFields[FIELD_COUNTRY].setText(name);
countryName = shortName;
});
presentFragment(fragment);
}
return true;
});
inputFields[a].setInputType(0);
}
if (a == FIELD_PHONE || a == FIELD_PHONECODE) {
inputFields[a].setInputType(InputType.TYPE_CLASS_PHONE);
} else if (a == FIELD_EMAIL) {
inputFields[a].setInputType(InputType.TYPE_CLASS_TEXT);
} 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);
switch (a) {
case FIELD_NAME:
inputFields[a].setHint(LocaleController.getString("PaymentShippingName", R.string.PaymentShippingName));
if (paymentForm.saved_info != null && paymentForm.saved_info.name != null) {
inputFields[a].setText(paymentForm.saved_info.name);
}
break;
case FIELD_EMAIL:
inputFields[a].setHint(LocaleController.getString("PaymentShippingEmailPlaceholder", R.string.PaymentShippingEmailPlaceholder));
if (paymentForm.saved_info != null && paymentForm.saved_info.email != null) {
inputFields[a].setText(paymentForm.saved_info.email);
}
break;
case FIELD_STREET1:
inputFields[a].setHint(LocaleController.getString("PaymentShippingAddress1Placeholder", R.string.PaymentShippingAddress1Placeholder));
if (paymentForm.saved_info != null && paymentForm.saved_info.shipping_address != null) {
inputFields[a].setText(paymentForm.saved_info.shipping_address.street_line1);
}
break;
case FIELD_STREET2:
inputFields[a].setHint(LocaleController.getString("PaymentShippingAddress2Placeholder", R.string.PaymentShippingAddress2Placeholder));
if (paymentForm.saved_info != null && paymentForm.saved_info.shipping_address != null) {
inputFields[a].setText(paymentForm.saved_info.shipping_address.street_line2);
}
break;
case FIELD_CITY:
inputFields[a].setHint(LocaleController.getString("PaymentShippingCityPlaceholder", R.string.PaymentShippingCityPlaceholder));
if (paymentForm.saved_info != null && paymentForm.saved_info.shipping_address != null) {
inputFields[a].setText(paymentForm.saved_info.shipping_address.city);
}
break;
case FIELD_STATE:
inputFields[a].setHint(LocaleController.getString("PaymentShippingStatePlaceholder", R.string.PaymentShippingStatePlaceholder));
if (paymentForm.saved_info != null && paymentForm.saved_info.shipping_address != null) {
inputFields[a].setText(paymentForm.saved_info.shipping_address.state);
}
break;
case FIELD_COUNTRY:
inputFields[a].setHint(LocaleController.getString("PaymentShippingCountry", R.string.PaymentShippingCountry));
if (paymentForm.saved_info != null && paymentForm.saved_info.shipping_address != null) {
String value = countryMap.get(paymentForm.saved_info.shipping_address.country_iso2);
countryName = paymentForm.saved_info.shipping_address.country_iso2;
inputFields[a].setText(value != null ? value : countryName);
}
break;
case FIELD_POSTCODE:
inputFields[a].setHint(LocaleController.getString("PaymentShippingZipPlaceholder", R.string.PaymentShippingZipPlaceholder));
if (paymentForm.saved_info != null && paymentForm.saved_info.shipping_address != null) {
inputFields[a].setText(paymentForm.saved_info.shipping_address.post_code);
}
break;
}
inputFields[a].setSelection(inputFields[a].length());
if (a == FIELD_PHONECODE) {
textView = new TextView(context);
textView.setText("+");
textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
container.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 21, 12, 0, 6));
inputFields[a].setPadding(AndroidUtilities.dp(10), 0, 0, 0);
inputFields[a].setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
InputFilter[] inputFilters = new InputFilter[1];
inputFilters[0] = new InputFilter.LengthFilter(5);
inputFields[a].setFilters(inputFilters);
container.addView(inputFields[a], LayoutHelper.createLinear(55, LayoutHelper.WRAP_CONTENT, 0, 12, 21, 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));
} 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;
textToSet = text.substring(a) + inputFields[FIELD_PHONE].getText().toString();
inputFields[FIELD_PHONECODE].setText(text = sub);
break;
}
}
if (!ok) {
textToSet = text.substring(1) + inputFields[FIELD_PHONE].getText().toString();
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) {
String hint = phoneFormatMap.get(text);
if (hint != null) {
set = true;
phoneField.setHintText(hint.replace('X', ''));
phoneField.setHint(null);
}
}
}
if (!set) {
phoneField.setHintText(null);
phoneField.setHint(LocaleController.getString("PaymentShippingPhoneNumber", R.string.PaymentShippingPhoneNumber));
}
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);
container.addView(inputFields[a], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 12, 21, 6));
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) {
str = str.substring(0, actionPosition) + str.substring(actionPosition + 1);
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) {
phoneField.setSelection(Math.min(start, phoneField.length()));
}
phoneField.onTextChange();
ignoreOnPhoneChange = false;
}
});
} else {
inputFields[a].setPadding(0, 0, 0, AndroidUtilities.dp(6));
inputFields[a].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
container.addView(inputFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 21, 12, 21, 6));
}
inputFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_NEXT) {
int num = (Integer) textView.getTag();
while (num + 1 < inputFields.length) {
num++;
if (num != FIELD_COUNTRY && ((View) inputFields[num].getParent()).getVisibility() == View.VISIBLE) {
inputFields[num].requestFocus();
break;
}
}
return true;
} else if (i == EditorInfo.IME_ACTION_DONE) {
doneItem.performClick();
return true;
}
return false;
});
if (a == FIELD_PHONE) {
if (paymentForm.invoice.email_to_provider || paymentForm.invoice.phone_to_provider) {
TLRPC.User providerUser = null;
for (int b = 0; b < paymentForm.users.size(); b++) {
TLRPC.User user = paymentForm.users.get(b);
if (user.id == paymentForm.provider_id) {
providerUser = user;
}
}
final String providerName;
if (providerUser != null) {
providerName = ContactsController.formatName(providerUser.first_name, providerUser.last_name);
} else {
providerName = "";
}
bottomCell[1] = new TextInfoPrivacyCell(context);
bottomCell[1].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(bottomCell[1], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
if (paymentForm.invoice.email_to_provider && paymentForm.invoice.phone_to_provider) {
bottomCell[1].setText(LocaleController.formatString("PaymentPhoneEmailToProvider", R.string.PaymentPhoneEmailToProvider, providerName));
} else if (paymentForm.invoice.email_to_provider) {
bottomCell[1].setText(LocaleController.formatString("PaymentEmailToProvider", R.string.PaymentEmailToProvider, providerName));
} else {
bottomCell[1].setText(LocaleController.formatString("PaymentPhoneToProvider", R.string.PaymentPhoneToProvider, providerName));
}
} else {
sectionCell[1] = new ShadowSectionCell(context);
linearLayout2.addView(sectionCell[1], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
checkCell1 = new TextCheckCell(context);
checkCell1.setBackgroundDrawable(Theme.getSelectorDrawable(true));
checkCell1.setTextAndCheck(LocaleController.getString("PaymentShippingSave", R.string.PaymentShippingSave), saveShippingInfo, false);
linearLayout2.addView(checkCell1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
checkCell1.setOnClickListener(v -> {
saveShippingInfo = !saveShippingInfo;
checkCell1.setChecked(saveShippingInfo);
});
bottomCell[0] = new TextInfoPrivacyCell(context);
bottomCell[0].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
bottomCell[0].setText(LocaleController.getString("PaymentShippingSaveInfo", R.string.PaymentShippingSaveInfo));
linearLayout2.addView(bottomCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
}
if (!paymentForm.invoice.name_requested) {
((ViewGroup) inputFields[FIELD_NAME].getParent()).setVisibility(View.GONE);
}
if (!paymentForm.invoice.phone_requested) {
((ViewGroup) inputFields[FIELD_PHONECODE].getParent()).setVisibility(View.GONE);
}
if (!paymentForm.invoice.email_requested) {
((ViewGroup) inputFields[FIELD_EMAIL].getParent()).setVisibility(View.GONE);
}
if (paymentForm.invoice.phone_requested) {
inputFields[FIELD_PHONE].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
} else if (paymentForm.invoice.email_requested) {
inputFields[FIELD_EMAIL].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
} else if (paymentForm.invoice.name_requested) {
inputFields[FIELD_NAME].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
} else {
inputFields[FIELD_POSTCODE].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
}
if (sectionCell[1] != null) {
sectionCell[1].setVisibility(paymentForm.invoice.name_requested || paymentForm.invoice.phone_requested || paymentForm.invoice.email_requested ? View.VISIBLE : View.GONE);
} else if (bottomCell[1] != null) {
bottomCell[1].setVisibility(paymentForm.invoice.name_requested || paymentForm.invoice.phone_requested || paymentForm.invoice.email_requested ? View.VISIBLE : View.GONE);
}
headerCell[1].setVisibility(paymentForm.invoice.name_requested || paymentForm.invoice.phone_requested || paymentForm.invoice.email_requested ? View.VISIBLE : View.GONE);
if (!paymentForm.invoice.shipping_address_requested) {
headerCell[0].setVisibility(View.GONE);
sectionCell[0].setVisibility(View.GONE);
((ViewGroup) inputFields[FIELD_STREET1].getParent()).setVisibility(View.GONE);
((ViewGroup) inputFields[FIELD_STREET2].getParent()).setVisibility(View.GONE);
((ViewGroup) inputFields[FIELD_CITY].getParent()).setVisibility(View.GONE);
((ViewGroup) inputFields[FIELD_STATE].getParent()).setVisibility(View.GONE);
((ViewGroup) inputFields[FIELD_COUNTRY].getParent()).setVisibility(View.GONE);
((ViewGroup) inputFields[FIELD_POSTCODE].getParent()).setVisibility(View.GONE);
}
if (paymentForm.saved_info != null && !TextUtils.isEmpty(paymentForm.saved_info.phone)) {
fillNumber(paymentForm.saved_info.phone);
} else {
fillNumber(null);
}
if (inputFields[FIELD_PHONECODE].length() == 0 && (paymentForm.invoice.phone_requested && (paymentForm.saved_info == null || TextUtils.isEmpty(paymentForm.saved_info.phone)))) {
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));
}
}
}
}
} else if (currentStep == 2) {
if (paymentForm.native_params != null) {
try {
JSONObject jsonObject = new JSONObject(paymentForm.native_params.data);
try {
String androidPayKey = jsonObject.getString("android_pay_public_key");
if (!TextUtils.isEmpty(androidPayKey)) {
androidPayPublicKey = androidPayKey;
}
} catch (Exception e) {
androidPayPublicKey = null;
}
try {
androidPayBackgroundColor = jsonObject.getInt("android_pay_bgcolor") | 0xff000000;
} catch (Exception e) {
androidPayBackgroundColor = 0xffffffff;
}
try {
androidPayBlackTheme = jsonObject.getBoolean("android_pay_inverse");
} catch (Exception e) {
androidPayBlackTheme = false;
}
} catch (Exception e) {
FileLog.e(e);
}
}
if (isWebView) {
if (androidPayPublicKey != null) {
initAndroidPay(context);
}
androidPayContainer = new FrameLayout(context);
androidPayContainer.setId(fragment_container_id);
androidPayContainer.setBackgroundDrawable(Theme.getSelectorDrawable(true));
androidPayContainer.setVisibility(View.GONE);
linearLayout2.addView(androidPayContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
webviewLoading = true;
showEditDoneProgress(true, true);
progressView.setVisibility(View.VISIBLE);
doneItem.setEnabled(false);
doneItem.getContentView().setVisibility(View.INVISIBLE);
webView = new WebView(context) {
@Override
public boolean onTouchEvent(MotionEvent event) {
((ViewGroup) fragmentView).requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(event);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
};
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
if (Build.VERSION.SDK_INT >= 21) {
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptThirdPartyCookies(webView, true);
}
if (Build.VERSION.SDK_INT >= 17) {
webView.addJavascriptInterface(new TelegramWebviewProxy(), "TelegramWebviewProxy");
}
webView.setWebViewClient(new WebViewClient() {
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
shouldNavigateBack = !url.equals(webViewUrl);
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
webviewLoading = false;
showEditDoneProgress(true, false);
updateSavePaymentField();
}
});
linearLayout2.addView(webView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
sectionCell[2] = new ShadowSectionCell(context);
linearLayout2.addView(sectionCell[2], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
checkCell1 = new TextCheckCell(context);
checkCell1.setBackgroundDrawable(Theme.getSelectorDrawable(true));
checkCell1.setTextAndCheck(LocaleController.getString("PaymentCardSavePaymentInformation", R.string.PaymentCardSavePaymentInformation), saveCardInfo, false);
linearLayout2.addView(checkCell1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
checkCell1.setOnClickListener(v -> {
saveCardInfo = !saveCardInfo;
checkCell1.setChecked(saveCardInfo);
});
bottomCell[0] = new TextInfoPrivacyCell(context);
bottomCell[0].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
updateSavePaymentField();
linearLayout2.addView(bottomCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else {
if (paymentForm.native_params != null) {
try {
JSONObject jsonObject = new JSONObject(paymentForm.native_params.data);
try {
need_card_country = jsonObject.getBoolean("need_country");
} catch (Exception e) {
need_card_country = false;
}
try {
need_card_postcode = jsonObject.getBoolean("need_zip");
} catch (Exception e) {
need_card_postcode = false;
}
try {
need_card_name = jsonObject.getBoolean("need_cardholder_name");
} catch (Exception e) {
need_card_name = false;
}
try {
stripeApiKey = jsonObject.getString("publishable_key");
} catch (Exception e) {
stripeApiKey = "";
}
} catch (Exception e) {
FileLog.e(e);
}
}
initAndroidPay(context);
inputFields = new EditTextBoldCursor[FIELDS_COUNT_CARD];
for (int a = 0; a < FIELDS_COUNT_CARD; a++) {
if (a == FIELD_CARD) {
headerCell[0] = new HeaderCell(context);
headerCell[0].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
headerCell[0].setText(LocaleController.getString("PaymentCardTitle", R.string.PaymentCardTitle));
linearLayout2.addView(headerCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else if (a == FIELD_CARD_COUNTRY) {
headerCell[1] = new HeaderCell(context);
headerCell[1].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
headerCell[1].setText(LocaleController.getString("PaymentBillingAddress", R.string.PaymentBillingAddress));
linearLayout2.addView(headerCell[1], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
boolean allowDivider = a != FIELD_CVV && a != FIELD_CARD_POSTCODE && !(a == FIELD_CARD_COUNTRY && !need_card_postcode);
ViewGroup container = new FrameLayout(context);
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
View.OnTouchListener onTouchListener = null;
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);
if (a == FIELD_CVV) {
InputFilter[] inputFilters = new InputFilter[1];
inputFilters[0] = new InputFilter.LengthFilter(3);
inputFields[a].setFilters(inputFilters);
inputFields[a].setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_PASSWORD);
inputFields[a].setTypeface(Typeface.DEFAULT);
inputFields[a].setTransformationMethod(PasswordTransformationMethod.getInstance());
} else if (a == FIELD_CARD) {
inputFields[a].setInputType(InputType.TYPE_CLASS_PHONE);
} else if (a == FIELD_CARD_COUNTRY) {
inputFields[a].setOnTouchListener((v, event) -> {
if (getParentActivity() == null) {
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
CountrySelectActivity fragment = new CountrySelectActivity(false);
fragment.setCountrySelectActivityDelegate((name, shortName) -> inputFields[FIELD_CARD_COUNTRY].setText(name));
presentFragment(fragment);
}
return true;
});
inputFields[a].setInputType(0);
} else if (a == FIELD_EXPIRE_DATE) {
inputFields[a].setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
} else if (a == FIELD_CARDNAME) {
inputFields[a].setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
} 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);
switch (a) {
case FIELD_CARD:
inputFields[a].setHint(LocaleController.getString("PaymentCardNumber", R.string.PaymentCardNumber));
break;
case FIELD_CVV:
inputFields[a].setHint(LocaleController.getString("PaymentCardCvv", R.string.PaymentCardCvv));
break;
case FIELD_EXPIRE_DATE:
inputFields[a].setHint(LocaleController.getString("PaymentCardExpireDate", R.string.PaymentCardExpireDate));
break;
case FIELD_CARDNAME:
inputFields[a].setHint(LocaleController.getString("PaymentCardName", R.string.PaymentCardName));
break;
case FIELD_CARD_POSTCODE:
inputFields[a].setHint(LocaleController.getString("PaymentShippingZipPlaceholder", R.string.PaymentShippingZipPlaceholder));
break;
case FIELD_CARD_COUNTRY:
inputFields[a].setHint(LocaleController.getString("PaymentShippingCountry", R.string.PaymentShippingCountry));
break;
}
if (a == FIELD_CARD) {
inputFields[a].addTextChangedListener(new TextWatcher() {
public final String[] PREFIXES_15 = {"34", "37"};
public final String[] PREFIXES_14 = {"300", "301", "302", "303", "304", "305", "309", "36", "38", "39"};
public final String[] PREFIXES_16 = {
"2221", "2222", "2223", "2224", "2225", "2226", "2227", "2228", "2229",
"223", "224", "225", "226", "227", "228", "229",
"23", "24", "25", "26",
"270", "271", "2720",
"50", "51", "52", "53", "54", "55",
"4",
"60", "62", "64", "65",
"35"
};
public static final int MAX_LENGTH_STANDARD = 16;
public static final int MAX_LENGTH_AMERICAN_EXPRESS = 15;
public static final int MAX_LENGTH_DINERS_CLUB = 14;
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 editable) {
if (ignoreOnCardChange) {
return;
}
EditText phoneField = inputFields[FIELD_CARD];
int start = phoneField.getSelectionStart();
String phoneChars = "0123456789";
String str = phoneField.getText().toString();
if (characterAction == 3) {
str = str.substring(0, actionPosition) + str.substring(actionPosition + 1);
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);
}
}
ignoreOnCardChange = true;
String hint = null;
int maxLength = 100;
if (builder.length() > 0) {
String currentString = builder.toString();
for (int a = 0; a < 3; a++) {
String[] checkArr;
String resultHint;
int resultMaxLength;
switch (a) {
case 0:
checkArr = PREFIXES_16;
resultMaxLength = 16;
resultHint = "xxxx xxxx xxxx xxxx";
break;
case 1:
checkArr = PREFIXES_15;
resultMaxLength = 15;
resultHint = "xxxx xxxx xxxx xxx";
break;
case 2:
default:
checkArr = PREFIXES_14;
resultMaxLength = 14;
resultHint = "xxxx xxxx xxxx xx";
break;
}
for (int b = 0; b < checkArr.length; b++) {
String prefix = checkArr[b];
if (currentString.length() <= prefix.length()) {
if (prefix.startsWith(currentString)) {
hint = resultHint;
maxLength = resultMaxLength;
break;
}
} else {
if (currentString.startsWith(prefix)) {
hint = resultHint;
maxLength = resultMaxLength;
break;
}
}
}
if (hint != null) {
break;
}
}
if (maxLength != 0) {
if (builder.length() > maxLength) {
builder.setLength(maxLength);
}
}
}
if (hint != null) {
if (maxLength != 0) {
if (builder.length() == maxLength) {
inputFields[FIELD_EXPIRE_DATE].requestFocus();
}
}
phoneField.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
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;
}
}
} else {
phoneField.setTextColor(builder.length() > 0 ? Theme.getColor(Theme.key_windowBackgroundWhiteRedText4) : Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
}
if (!builder.toString().equals(editable.toString())) {
editable.replace(0, editable.length(), builder);
}
if (start >= 0) {
phoneField.setSelection(Math.min(start, phoneField.length()));
}
ignoreOnCardChange = false;
}
});
} else if (a == FIELD_EXPIRE_DATE) {
inputFields[a].addTextChangedListener(new TextWatcher() {
private int characterAction = -1;
private boolean isYear;
private int actionPosition;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (count == 0 && after == 1) {
isYear = TextUtils.indexOf(inputFields[FIELD_EXPIRE_DATE].getText(), '/') != -1;
characterAction = 1;
} else if (count == 1 && after == 0) {
if (s.charAt(start) == '/' && start > 0) {
isYear = false;
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 (ignoreOnCardChange) {
return;
}
EditText phoneField = inputFields[FIELD_EXPIRE_DATE];
int start = phoneField.getSelectionStart();
String phoneChars = "0123456789";
String str = phoneField.getText().toString();
if (characterAction == 3) {
str = str.substring(0, actionPosition) + str.substring(actionPosition + 1);
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);
}
}
ignoreOnCardChange = true;
inputFields[FIELD_EXPIRE_DATE].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
if (builder.length() > 4) {
builder.setLength(4);
}
if (builder.length() < 2) {
isYear = false;
}
boolean isError = false;
if (isYear) {
String[] args = new String[builder.length() > 2 ? 2 : 1];
args[0] = builder.substring(0, 2);
if (args.length == 2) {
args[1] = builder.substring(2);
}
if (builder.length() == 4 && args.length == 2) {
int month = Utilities.parseInt(args[0]);
int year = Utilities.parseInt(args[1]) + 2000;
Calendar rightNow = JalaliCalendar.mInstance();
int currentYear = rightNow.get(Calendar.YEAR);
int currentMonth = rightNow.get(Calendar.MONTH) + 1;
if (year < currentYear || year == currentYear && month < currentMonth) {
inputFields[FIELD_EXPIRE_DATE].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText4));
isError = true;
}
} else {
int value = Utilities.parseInt(args[0]);
if (value > 12 || value == 0) {
inputFields[FIELD_EXPIRE_DATE].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText4));
isError = true;
}
}
} else {
if (builder.length() == 1) {
int value = Utilities.parseInt(builder.toString());
if (value != 1 && value != 0) {
builder.insert(0, "0");
start++;
}
} else if (builder.length() == 2) {
int value = Utilities.parseInt(builder.toString());
if (value > 12 || value == 0) {
inputFields[FIELD_EXPIRE_DATE].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText4));
isError = true;
}
start++;
}
}
if (!isError && builder.length() == 4) {
inputFields[need_card_name ? FIELD_CARDNAME : FIELD_CVV].requestFocus();
}
if (builder.length() == 2) {
builder.append('/');
start++;
} else if (builder.length() > 2 && builder.charAt(2) != '/') {
builder.insert(2, '/');
start++;
}
phoneField.setText(builder);
if (start >= 0) {
phoneField.setSelection(Math.min(start, phoneField.length()));
}
ignoreOnCardChange = false;
}
});
}
inputFields[a].setPadding(0, 0, 0, AndroidUtilities.dp(6));
inputFields[a].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
container.addView(inputFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 21, 12, 21, 6));
inputFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_NEXT) {
int num = (Integer) textView.getTag();
while (num + 1 < inputFields.length) {
num++;
if (num == FIELD_CARD_COUNTRY) {
num++;
}
if (((View) inputFields[num].getParent()).getVisibility() == View.VISIBLE) {
inputFields[num].requestFocus();
break;
}
}
return true;
} else if (i == EditorInfo.IME_ACTION_DONE) {
doneItem.performClick();
return true;
}
return false;
});
if (a == FIELD_CVV) {
sectionCell[0] = new ShadowSectionCell(context);
linearLayout2.addView(sectionCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else if (a == FIELD_CARD_POSTCODE) {
sectionCell[2] = new ShadowSectionCell(context);
linearLayout2.addView(sectionCell[2], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
checkCell1 = new TextCheckCell(context);
checkCell1.setBackgroundDrawable(Theme.getSelectorDrawable(true));
checkCell1.setTextAndCheck(LocaleController.getString("PaymentCardSavePaymentInformation", R.string.PaymentCardSavePaymentInformation), saveCardInfo, false);
linearLayout2.addView(checkCell1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
checkCell1.setOnClickListener(v -> {
saveCardInfo = !saveCardInfo;
checkCell1.setChecked(saveCardInfo);
});
bottomCell[0] = new TextInfoPrivacyCell(context);
bottomCell[0].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
updateSavePaymentField();
linearLayout2.addView(bottomCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else if (a == FIELD_CARD) {
androidPayContainer = new FrameLayout(context);
androidPayContainer.setId(fragment_container_id);
androidPayContainer.setBackgroundDrawable(Theme.getSelectorDrawable(true));
androidPayContainer.setVisibility(View.GONE);
container.addView(androidPayContainer, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.RIGHT, 0, 0, 4, 0));
}
if (allowDivider) {
View divider = new View(context) {
@Override
protected void onDraw(Canvas canvas) {
canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint);
}
};
divider.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
dividers.add(divider);
container.addView(divider, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1, Gravity.LEFT | Gravity.BOTTOM));
}
if (a == FIELD_CARD_COUNTRY && !need_card_country || a == FIELD_CARD_POSTCODE && !need_card_postcode || a == FIELD_CARDNAME && !need_card_name) {
container.setVisibility(View.GONE);
}
}
if (!need_card_country && !need_card_postcode) {
headerCell[1].setVisibility(View.GONE);
sectionCell[0].setVisibility(View.GONE);
}
if (need_card_postcode) {
inputFields[FIELD_CARD_POSTCODE].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
} else {
inputFields[FIELD_CVV].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
}
}
} else if (currentStep == 1) {
int count = requestedInfo.shipping_options.size();
radioCells = new RadioCell[count];
for (int a = 0; a < count; a++) {
TLRPC.TL_shippingOption shippingOption = requestedInfo.shipping_options.get(a);
radioCells[a] = new RadioCell(context);
radioCells[a].setTag(a);
radioCells[a].setBackgroundDrawable(Theme.getSelectorDrawable(true));
radioCells[a].setText(String.format("%s - %s", getTotalPriceString(shippingOption.prices), shippingOption.title), a == 0, a != count - 1);
radioCells[a].setOnClickListener(v -> {
int num = (Integer) v.getTag();
for (int a1 = 0; a1 < radioCells.length; a1++) {
radioCells[a1].setChecked(num == a1, true);
}
});
linearLayout2.addView(radioCells[a]);
}
bottomCell[0] = new TextInfoPrivacyCell(context);
bottomCell[0].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(bottomCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else if (currentStep == 3) {
inputFields = new EditTextBoldCursor[FIELDS_COUNT_SAVEDCARD];
for (int a = 0; a < FIELDS_COUNT_SAVEDCARD; a++) {
if (a == FIELD_SAVEDCARD) {
headerCell[0] = new HeaderCell(context);
headerCell[0].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
headerCell[0].setText(LocaleController.getString("PaymentCardTitle", R.string.PaymentCardTitle));
linearLayout2.addView(headerCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
ViewGroup container = new FrameLayout(context);
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
boolean allowDivider = a != FIELD_SAVEDPASSWORD;
if (allowDivider) {
if (a == FIELD_EMAIL && !paymentForm.invoice.phone_requested) {
allowDivider = false;
} else if (a == FIELD_NAME && !paymentForm.invoice.phone_requested && !paymentForm.invoice.email_requested) {
allowDivider = false;
}
}
if (allowDivider) {
View divider = new View(context) {
@Override
protected void onDraw(Canvas canvas) {
canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint);
}
};
divider.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
dividers.add(divider);
container.addView(divider, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1, Gravity.LEFT | Gravity.BOTTOM));
}
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);
if (a == FIELD_SAVEDCARD) {
inputFields[a].setOnTouchListener((v, event) -> true);
inputFields[a].setInputType(0);
} else {
inputFields[a].setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
inputFields[a].setTypeface(Typeface.DEFAULT);
}
inputFields[a].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
switch (a) {
case FIELD_SAVEDCARD:
inputFields[a].setText(paymentForm.saved_credentials.title);
break;
case FIELD_SAVEDPASSWORD:
inputFields[a].setHint(LocaleController.getString("LoginPassword", R.string.LoginPassword));
inputFields[a].requestFocus();
break;
}
inputFields[a].setPadding(0, 0, 0, AndroidUtilities.dp(6));
inputFields[a].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
container.addView(inputFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 21, 12, 21, 6));
inputFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_DONE) {
doneItem.performClick();
return true;
}
return false;
});
if (a == FIELD_SAVEDPASSWORD) {
bottomCell[0] = new TextInfoPrivacyCell(context);
bottomCell[0].setText(LocaleController.formatString("PaymentConfirmationMessage", R.string.PaymentConfirmationMessage, paymentForm.saved_credentials.title));
bottomCell[0].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(bottomCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
settingsCell[0] = new TextSettingsCell(context);
settingsCell[0].setBackgroundDrawable(Theme.getSelectorDrawable(true));
settingsCell[0].setText(LocaleController.getString("PaymentConfirmationNewCard", R.string.PaymentConfirmationNewCard), false);
linearLayout2.addView(settingsCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
settingsCell[0].setOnClickListener(v -> {
passwordOk = false;
goToNextStep();
});
bottomCell[1] = new TextInfoPrivacyCell(context);
bottomCell[1].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(bottomCell[1], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
}
} else if (currentStep == 4 || currentStep == 5) {
paymentInfoCell = new PaymentInfoCell(context);
paymentInfoCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
paymentInfoCell.setInvoice((TLRPC.TL_messageMediaInvoice) messageObject.messageOwner.media, currentBotName);
linearLayout2.addView(paymentInfoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
sectionCell[0] = new ShadowSectionCell(context);
linearLayout2.addView(sectionCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
ArrayList<TLRPC.TL_labeledPrice> arrayList = new ArrayList<>(paymentForm.invoice.prices);
if (shippingOption != null) {
arrayList.addAll(shippingOption.prices);
}
final String totalPrice = getTotalPriceString(arrayList);
for (int a = 0; a < arrayList.size(); a++) {
TLRPC.TL_labeledPrice price = arrayList.get(a);
TextPriceCell priceCell = new TextPriceCell(context);
priceCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
priceCell.setTextAndValue(price.label, LocaleController.getInstance().formatCurrencyString(price.amount, paymentForm.invoice.currency), false);
linearLayout2.addView(priceCell);
}
TextPriceCell priceCell = new TextPriceCell(context);
priceCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
priceCell.setTextAndValue(LocaleController.getString("PaymentTransactionTotal", R.string.PaymentTransactionTotal), totalPrice, true);
linearLayout2.addView(priceCell);
View divider = new View(context) {
@Override
protected void onDraw(Canvas canvas) {
canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint);
}
};
divider.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
dividers.add(divider);
linearLayout2.addView(divider, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1, Gravity.LEFT | Gravity.BOTTOM));
detailSettingsCell[0] = new TextDetailSettingsCell(context);
detailSettingsCell[0].setBackgroundDrawable(Theme.getSelectorDrawable(true));
detailSettingsCell[0].setTextAndValue(cardName, LocaleController.getString("PaymentCheckoutMethod", R.string.PaymentCheckoutMethod), true);
linearLayout2.addView(detailSettingsCell[0]);
if (currentStep == 4) {
detailSettingsCell[0].setOnClickListener(v -> {
PaymentFormActivity activity = new PaymentFormActivity(paymentForm, messageObject, 2, requestedInfo, shippingOption, null, cardName, validateRequest, saveCardInfo, null);
activity.setDelegate(new PaymentFormActivityDelegate() {
@Override
public boolean didSelectNewCard(String tokenJson, String card, boolean saveCard, TLRPC.TL_inputPaymentCredentialsAndroidPay androidPay) {
paymentForm.saved_credentials = null;
paymentJson = tokenJson;
saveCardInfo = saveCard;
cardName = card;
androidPayCredentials = androidPay;
detailSettingsCell[0].setTextAndValue(cardName, LocaleController.getString("PaymentCheckoutMethod", R.string.PaymentCheckoutMethod), true);
return false;
}
@Override
public void onFragmentDestroyed() {
}
@Override
public void currentPasswordUpdated(TLRPC.TL_account_password password) {
}
});
presentFragment(activity);
});
}
TLRPC.User providerUser = null;
for (int a = 0; a < paymentForm.users.size(); a++) {
TLRPC.User user = paymentForm.users.get(a);
if (user.id == paymentForm.provider_id) {
providerUser = user;
}
}
final String providerName;
if (providerUser != null) {
detailSettingsCell[1] = new TextDetailSettingsCell(context);
detailSettingsCell[1].setBackgroundDrawable(Theme.getSelectorDrawable(true));
detailSettingsCell[1].setTextAndValue(providerName = ContactsController.formatName(providerUser.first_name, providerUser.last_name), LocaleController.getString("PaymentCheckoutProvider", R.string.PaymentCheckoutProvider), true);
linearLayout2.addView(detailSettingsCell[1]);
} else {
providerName = "";
}
if (validateRequest != null) {
if (validateRequest.info.shipping_address != null) {
String address = String.format("%s %s, %s, %s, %s, %s", validateRequest.info.shipping_address.street_line1, validateRequest.info.shipping_address.street_line2, validateRequest.info.shipping_address.city, validateRequest.info.shipping_address.state, validateRequest.info.shipping_address.country_iso2, validateRequest.info.shipping_address.post_code);
detailSettingsCell[2] = new TextDetailSettingsCell(context);
detailSettingsCell[2].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
detailSettingsCell[2].setTextAndValue(address, LocaleController.getString("PaymentShippingAddress", R.string.PaymentShippingAddress), true);
linearLayout2.addView(detailSettingsCell[2]);
}
if (validateRequest.info.name != null) {
detailSettingsCell[3] = new TextDetailSettingsCell(context);
detailSettingsCell[3].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
detailSettingsCell[3].setTextAndValue(validateRequest.info.name, LocaleController.getString("PaymentCheckoutName", R.string.PaymentCheckoutName), true);
linearLayout2.addView(detailSettingsCell[3]);
}
if (validateRequest.info.phone != null) {
detailSettingsCell[4] = new TextDetailSettingsCell(context);
detailSettingsCell[4].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
detailSettingsCell[4].setTextAndValue(PhoneFormat.getInstance().format(validateRequest.info.phone), LocaleController.getString("PaymentCheckoutPhoneNumber", R.string.PaymentCheckoutPhoneNumber), true);
linearLayout2.addView(detailSettingsCell[4]);
}
if (validateRequest.info.email != null) {
detailSettingsCell[5] = new TextDetailSettingsCell(context);
detailSettingsCell[5].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
detailSettingsCell[5].setTextAndValue(validateRequest.info.email, LocaleController.getString("PaymentCheckoutEmail", R.string.PaymentCheckoutEmail), true);
linearLayout2.addView(detailSettingsCell[5]);
}
if (shippingOption != null) {
detailSettingsCell[6] = new TextDetailSettingsCell(context);
detailSettingsCell[6].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
detailSettingsCell[6].setTextAndValue(shippingOption.title, LocaleController.getString("PaymentCheckoutShippingMethod", R.string.PaymentCheckoutShippingMethod), false);
linearLayout2.addView(detailSettingsCell[6]);
}
}
if (currentStep == 4) {
bottomLayout = new FrameLayout(context);
bottomLayout.setBackgroundDrawable(Theme.getSelectorDrawable(true));
frameLayout.addView(bottomLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM));
bottomLayout.setOnClickListener(v -> {
if (botUser != null && !botUser.verified) {
String botKey = "payment_warning_" + botUser.id;
SharedPreferences preferences = MessagesController.getNotificationsSettings(currentAccount);
if (!preferences.getBoolean(botKey, false)) {
preferences.edit().putBoolean(botKey, true).commit();
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("PaymentWarning", R.string.PaymentWarning));
builder.setMessage(LocaleController.formatString("PaymentWarningText", R.string.PaymentWarningText, currentBotName, providerName));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialogInterface, i) -> showPayAlert(totalPrice));
showDialog(builder.create());
} else {
showPayAlert(totalPrice);
}
} else {
showPayAlert(totalPrice);
}
});
payTextView = new TextView(context);
payTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText6));
payTextView.setText(LocaleController.formatString("PaymentCheckoutPay", R.string.PaymentCheckoutPay, totalPrice));
payTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
payTextView.setGravity(Gravity.CENTER);
payTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
bottomLayout.addView(payTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
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));
doneItem.setEnabled(false);
doneItem.getContentView().setVisibility(View.INVISIBLE);
webView = new WebView(context) {
@Override
public boolean onTouchEvent(MotionEvent event) {
getParent().requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(event);
}
};
webView.setBackgroundColor(0xffffffff);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
if (Build.VERSION.SDK_INT >= 21) {
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptThirdPartyCookies(webView, true);
}
webView.setWebViewClient(new WebViewClient() {
@Override
public void onLoadResource(WebView view, String url) {
try {
Uri uri = Uri.parse(url);
if ("t.me".equals(uri.getHost())) {
goToNextStep();
return;
}
} catch (Exception ignore) {
}
super.onLoadResource(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
webviewLoading = false;
showEditDoneProgress(true, false);
updateSavePaymentField();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
try {
Uri uri = Uri.parse(url);
if ("t.me".equals(uri.getHost())) {
goToNextStep();
return true;
}
} catch (Exception ignore) {
}
return false;
}
});
frameLayout.addView(webView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
webView.setVisibility(View.GONE);
}
sectionCell[1] = new ShadowSectionCell(context);
sectionCell[1].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(sectionCell[1], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else if (currentStep == 6) {
codeFieldCell = new EditTextSettingsCell(context);
codeFieldCell.setTextAndHint("", LocaleController.getString("PasswordCode", R.string.PasswordCode), false);
codeFieldCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
EditTextBoldCursor editText = codeFieldCell.getTextView();
editText.setInputType(InputType.TYPE_CLASS_PHONE);
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_DONE) {
sendSavePassword(false);
return true;
}
return false;
});
editText.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 (emailCodeLength != 0 && s.length() == emailCodeLength) {
sendSavePassword(false);
}
}
});
linearLayout2.addView(codeFieldCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
bottomCell[2] = new TextInfoPrivacyCell(context);
bottomCell[2].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(bottomCell[2], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
settingsCell[1] = new TextSettingsCell(context);
settingsCell[1].setBackgroundDrawable(Theme.getSelectorDrawable(true));
settingsCell[1].setTag(Theme.key_windowBackgroundWhiteBlackText);
settingsCell[1].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
settingsCell[1].setText(LocaleController.getString("ResendCode", R.string.ResendCode), true);
linearLayout2.addView(settingsCell[1], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
settingsCell[1].setOnClickListener(v -> {
TLRPC.TL_account_resendPasswordEmail req = new TLRPC.TL_account_resendPasswordEmail();
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> {
});
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setMessage(LocaleController.getString("ResendCodeInfo", R.string.ResendCodeInfo));
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
showDialog(builder.create());
});
settingsCell[0] = new TextSettingsCell(context);
settingsCell[0].setBackgroundDrawable(Theme.getSelectorDrawable(true));
settingsCell[0].setTag(Theme.key_windowBackgroundWhiteRedText3);
settingsCell[0].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText3));
settingsCell[0].setText(LocaleController.getString("AbortPassword", R.string.AbortPassword), false);
linearLayout2.addView(settingsCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
settingsCell[0].setOnClickListener(v -> {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
String text = LocaleController.getString("TurnPasswordOffQuestion", R.string.TurnPasswordOffQuestion);
if (currentPassword.has_secure_values) {
text += "\n\n" + LocaleController.getString("TurnPasswordOffPassport", R.string.TurnPasswordOffPassport);
}
builder.setMessage(text);
builder.setTitle(LocaleController.getString("TurnPasswordOffQuestionTitle", R.string.TurnPasswordOffQuestionTitle));
builder.setPositiveButton(LocaleController.getString("Disable", R.string.Disable), (dialogInterface, i) -> sendSavePassword(true));
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
AlertDialog alertDialog = builder.create();
showDialog(alertDialog);
TextView button = (TextView) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
if (button != null) {
button.setTextColor(Theme.getColor(Theme.key_dialogTextRed2));
}
});
inputFields = new EditTextBoldCursor[FIELDS_COUNT_PASSWORD];
for (int a = 0; a < FIELDS_COUNT_PASSWORD; a++) {
if (a == FIELD_ENTERPASSWORD) {
headerCell[0] = new HeaderCell(context);
headerCell[0].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
headerCell[0].setText(LocaleController.getString("PaymentPasswordTitle", R.string.PaymentPasswordTitle));
linearLayout2.addView(headerCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else if (a == FIELD_ENTERPASSWORDEMAIL) {
headerCell[1] = new HeaderCell(context);
headerCell[1].setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
headerCell[1].setText(LocaleController.getString("PaymentPasswordEmailTitle", R.string.PaymentPasswordEmailTitle));
linearLayout2.addView(headerCell[1], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
ViewGroup container = new FrameLayout(context);
linearLayout2.addView(container, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50));
container.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
if (a == FIELD_ENTERPASSWORD) {
View divider = new View(context) {
@Override
protected void onDraw(Canvas canvas) {
canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint);
}
};
divider.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
dividers.add(divider);
container.addView(divider, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1, Gravity.LEFT | Gravity.BOTTOM));
}
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);
if (a == FIELD_ENTERPASSWORD || a == FIELD_REENTERPASSWORD) {
inputFields[a].setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
inputFields[a].setTypeface(Typeface.DEFAULT);
inputFields[a].setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
} else {
inputFields[a].setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
inputFields[a].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
}
switch (a) {
case FIELD_ENTERPASSWORD:
inputFields[a].setHint(LocaleController.getString("PaymentPasswordEnter", R.string.PaymentPasswordEnter));
inputFields[a].requestFocus();
break;
case FIELD_REENTERPASSWORD:
inputFields[a].setHint(LocaleController.getString("PaymentPasswordReEnter", R.string.PaymentPasswordReEnter));
break;
case FIELD_ENTERPASSWORDEMAIL:
inputFields[a].setHint(LocaleController.getString("PaymentPasswordEmail", R.string.PaymentPasswordEmail));
break;
}
inputFields[a].setPadding(0, 0, 0, AndroidUtilities.dp(6));
inputFields[a].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
container.addView(inputFields[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 21, 12, 21, 6));
inputFields[a].setOnEditorActionListener((textView, i, keyEvent) -> {
if (i == EditorInfo.IME_ACTION_DONE) {
doneItem.performClick();
return true;
} else if (i == EditorInfo.IME_ACTION_NEXT) {
int num = (Integer) textView.getTag();
if (num == FIELD_ENTERPASSWORD) {
inputFields[FIELD_REENTERPASSWORD].requestFocus();
} else if (num == FIELD_REENTERPASSWORD) {
inputFields[FIELD_ENTERPASSWORDEMAIL].requestFocus();
}
}
return false;
});
if (a == FIELD_REENTERPASSWORD) {
bottomCell[0] = new TextInfoPrivacyCell(context);
bottomCell[0].setText(LocaleController.getString("PaymentPasswordInfo", R.string.PaymentPasswordInfo));
bottomCell[0].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(bottomCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
} else if (a == FIELD_ENTERPASSWORDEMAIL) {
bottomCell[1] = new TextInfoPrivacyCell(context);
bottomCell[1].setText(LocaleController.getString("PaymentPasswordEmailInfo", R.string.PaymentPasswordEmailInfo));
bottomCell[1].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
linearLayout2.addView(bottomCell[1], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
}
updatePasswordFields();
}
return fragmentView;
}
private void updatePasswordFields() {
if (currentStep != 6 || bottomCell[2] == null) {
return;
}
doneItem.setVisibility(View.VISIBLE);
if (currentPassword == null) {
showEditDoneProgress(true, true);
bottomCell[2].setVisibility(View.GONE);
settingsCell[0].setVisibility(View.GONE);
settingsCell[1].setVisibility(View.GONE);
codeFieldCell.setVisibility(View.GONE);
headerCell[0].setVisibility(View.GONE);
headerCell[1].setVisibility(View.GONE);
bottomCell[0].setVisibility(View.GONE);
for (int a = 0; a < FIELDS_COUNT_PASSWORD; a++) {
((View) inputFields[a].getParent()).setVisibility(View.GONE);
}
for (int a = 0; a < dividers.size(); a++) {
dividers.get(a).setVisibility(View.GONE);
}
} else {
showEditDoneProgress(true, false);
if (waitingForEmail) {
bottomCell[2].setText(LocaleController.formatString("EmailPasswordConfirmText2", R.string.EmailPasswordConfirmText2, currentPassword.email_unconfirmed_pattern != null ? currentPassword.email_unconfirmed_pattern : ""));
bottomCell[2].setVisibility(View.VISIBLE);
settingsCell[0].setVisibility(View.VISIBLE);
settingsCell[1].setVisibility(View.VISIBLE);
codeFieldCell.setVisibility(View.VISIBLE);
bottomCell[1].setText("");
headerCell[0].setVisibility(View.GONE);
headerCell[1].setVisibility(View.GONE);
bottomCell[0].setVisibility(View.GONE);
for (int a = 0; a < FIELDS_COUNT_PASSWORD; a++) {
((View) inputFields[a].getParent()).setVisibility(View.GONE);
}
for (int a = 0; a < dividers.size(); a++) {
dividers.get(a).setVisibility(View.GONE);
}
} else {
bottomCell[2].setVisibility(View.GONE);
settingsCell[0].setVisibility(View.GONE);
settingsCell[1].setVisibility(View.GONE);
bottomCell[1].setText(LocaleController.getString("PaymentPasswordEmailInfo", R.string.PaymentPasswordEmailInfo));
codeFieldCell.setVisibility(View.GONE);
headerCell[0].setVisibility(View.VISIBLE);
headerCell[1].setVisibility(View.VISIBLE);
bottomCell[0].setVisibility(View.VISIBLE);
for (int a = 0; a < FIELDS_COUNT_PASSWORD; a++) {
((View) inputFields[a].getParent()).setVisibility(View.VISIBLE);
}
for (int a = 0; a < dividers.size(); a++) {
dividers.get(a).setVisibility(View.VISIBLE);
}
}
}
}
private void loadPasswordInfo() {
if (loadingPasswordInfo) {
return;
}
loadingPasswordInfo = true;
TLRPC.TL_account_getPassword req = new TLRPC.TL_account_getPassword();
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
loadingPasswordInfo = false;
if (error == null) {
currentPassword = (TLRPC.TL_account_password) response;
if (!TwoStepVerificationActivity.canHandleCurrentPassword(currentPassword, false)) {
AlertsCreator.showUpdateAppAlert(getParentActivity(), LocaleController.getString("UpdateAppAlert", R.string.UpdateAppAlert), true);
return;
}
if (paymentForm != null && currentPassword.has_password) {
paymentForm.password_missing = false;
paymentForm.can_save_credentials = true;
updateSavePaymentField();
}
TwoStepVerificationActivity.initPasswordNewAlgo(currentPassword);
if (passwordFragment != null) {
passwordFragment.setCurrentPassword(currentPassword);
}
if (!currentPassword.has_password && shortPollRunnable == null) {
shortPollRunnable = () -> {
if (shortPollRunnable == null) {
return;
}
loadPasswordInfo();
shortPollRunnable = null;
};
AndroidUtilities.runOnUIThread(shortPollRunnable, 5000);
}
}
}), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin);
}
private void showAlertWithText(String title, String text) {
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 showPayAlert(final String totalPrice) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("PaymentTransactionReview", R.string.PaymentTransactionReview));
builder.setMessage(LocaleController.formatString("PaymentTransactionMessage", R.string.PaymentTransactionMessage, totalPrice, currentBotName, currentItemName));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialogInterface, i) -> {
setDonePressed(true);
sendData();
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
showDialog(builder.create());
}
private void initAndroidPay(Context context) {
/*if (Build.VERSION.SDK_INT < 19) {
return;
}
googleApiClient = new GoogleApiClient.Builder(context)
.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
})
.addOnConnectionFailedListener(connectionResult -> {
})
.addApi(Wallet.API, new Wallet.WalletOptions.Builder()
.setEnvironment(paymentForm.invoice.test ? WalletConstants.ENVIRONMENT_TEST : WalletConstants.ENVIRONMENT_PRODUCTION)
.setTheme(WalletConstants.THEME_LIGHT)
.build())
.build();
Wallet.Payments.isReadyToPay(googleApiClient).setResultCallback(
booleanResult -> {
if (booleanResult.getStatus().isSuccess()) {
if (booleanResult.getValue()) {
showAndroidPay();
}
} else {
}
}
);
googleApiClient.connect();*/
}
private String getTotalPriceString(ArrayList<TLRPC.TL_labeledPrice> prices) {
long amount = 0;
for (int a = 0; a < prices.size(); a++) {
amount += prices.get(a).amount;
}
return LocaleController.getInstance().formatCurrencyString(amount, paymentForm.invoice.currency);
}
private String getTotalPriceDecimalString(ArrayList<TLRPC.TL_labeledPrice> prices) {
long amount = 0;
for (int a = 0; a < prices.size(); a++) {
amount += prices.get(a).amount;
}
return LocaleController.getInstance().formatCurrencyDecimalString(amount, paymentForm.invoice.currency, false);
}
@Override
public boolean onFragmentCreate() {
NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.twoStepPasswordChanged);
NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.didRemoveTwoStepPassword);
if (currentStep != 4) {
NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.paymentFinished);
}
return super.onFragmentCreate();
}
@Override
public void onFragmentDestroy() {
if (delegate != null) {
delegate.onFragmentDestroyed();
}
NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.twoStepPasswordChanged);
NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.didRemoveTwoStepPassword);
if (currentStep != 4) {
NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.paymentFinished);
}
if (webView != null) {
try {
ViewParent parent = webView.getParent();
if (parent != null) {
((ViewGroup) parent).removeView(webView);
}
webView.stopLoading();
webView.loadUrl("about:blank");
webViewUrl = null;
webView.destroy();
webView = null;
} catch (Exception e) {
FileLog.e(e);
}
}
try {
if ((currentStep == 2 || currentStep == 6) && Build.VERSION.SDK_INT >= 23 && (SharedConfig.passcodeHash.length() == 0 || SharedConfig.allowScreenCapture)) {
getParentActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
} catch (Throwable e) {
FileLog.e(e);
}
super.onFragmentDestroy();
canceled = true;
}
@Override
protected void onTransitionAnimationEnd(boolean isOpen, boolean backward) {
if (isOpen && !backward) {
if (webView != null) {
if (currentStep != 4) {
webView.loadUrl(webViewUrl = paymentForm.url);
}
} else if (currentStep == 2) {
inputFields[FIELD_CARD].requestFocus();
AndroidUtilities.showKeyboard(inputFields[FIELD_CARD]);
} else if (currentStep == 3) {
inputFields[FIELD_SAVEDPASSWORD].requestFocus();
AndroidUtilities.showKeyboard(inputFields[FIELD_SAVEDPASSWORD]);
} else if (currentStep == 6) {
if (!waitingForEmail) {
inputFields[FIELD_ENTERPASSWORD].requestFocus();
AndroidUtilities.showKeyboard(inputFields[FIELD_ENTERPASSWORD]);
}
}
}
}
@Override
public void didReceivedNotification(int id, int account, Object... args) {
if (id == NotificationCenter.twoStepPasswordChanged) {
paymentForm.password_missing = false;
paymentForm.can_save_credentials = true;
updateSavePaymentField();
} else if (id == NotificationCenter.didRemoveTwoStepPassword) {
paymentForm.password_missing = true;
paymentForm.can_save_credentials = false;
updateSavePaymentField();
} else if (id == NotificationCenter.paymentFinished) {
removeSelfFromStack();
}
}
private void showAndroidPay() {
/*if (getParentActivity() == null || androidPayContainer == null) {
return;
}
WalletFragmentOptions.Builder optionsBuilder = WalletFragmentOptions.newBuilder();
optionsBuilder.setEnvironment(paymentForm.invoice.test ? WalletConstants.ENVIRONMENT_TEST : WalletConstants.ENVIRONMENT_PRODUCTION);
optionsBuilder.setMode(WalletFragmentMode.BUY_BUTTON);
WalletFragmentStyle walletFragmentStyle;
if (androidPayPublicKey != null) {
androidPayContainer.setBackgroundColor(androidPayBackgroundColor);
walletFragmentStyle = new WalletFragmentStyle()
.setBuyButtonText(WalletFragmentStyle.BuyButtonText.BUY_WITH)
.setBuyButtonAppearance(androidPayBlackTheme ? WalletFragmentStyle.BuyButtonAppearance.ANDROID_PAY_LIGHT_WITH_BORDER : WalletFragmentStyle.BuyButtonAppearance.ANDROID_PAY_DARK)
.setBuyButtonWidth(WalletFragmentStyle.Dimension.MATCH_PARENT);
} else {
walletFragmentStyle = new WalletFragmentStyle()
.setBuyButtonText(WalletFragmentStyle.BuyButtonText.LOGO_ONLY)
.setBuyButtonAppearance(WalletFragmentStyle.BuyButtonAppearance.ANDROID_PAY_LIGHT_WITH_BORDER)
.setBuyButtonWidth(WalletFragmentStyle.Dimension.WRAP_CONTENT);
}
optionsBuilder.setFragmentStyle(walletFragmentStyle);
WalletFragment walletFragment = WalletFragment.newInstance(optionsBuilder.build());
FragmentManager fragmentManager = getParentActivity().getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(fragment_container_id, walletFragment);
fragmentTransaction.commit();
ArrayList<TLRPC.TL_labeledPrice> arrayList = new ArrayList<>(paymentForm.invoice.prices);
if (shippingOption != null) {
arrayList.addAll(shippingOption.prices);
}
totalPriceDecimal = getTotalPriceDecimalString(arrayList);
PaymentMethodTokenizationParameters parameters;
if (androidPayPublicKey != null) {
parameters = PaymentMethodTokenizationParameters.newBuilder()
.setPaymentMethodTokenizationType(PaymentMethodTokenizationType.NETWORK_TOKEN)
.addParameter("publicKey", androidPayPublicKey)
.build();
} else {
parameters = PaymentMethodTokenizationParameters.newBuilder()
.setPaymentMethodTokenizationType(PaymentMethodTokenizationType.PAYMENT_GATEWAY)
.addParameter("gateway", "stripe")
.addParameter("stripe:publishableKey", stripeApiKey)
.addParameter("stripe:version", StripeApiHandler.VERSION)
.build();
}
MaskedWalletRequest maskedWalletRequest = MaskedWalletRequest.newBuilder()
.setPaymentMethodTokenizationParameters(parameters)
.setEstimatedTotalPrice(totalPriceDecimal)
.setCurrencyCode(paymentForm.invoice.currency)
.build();
WalletFragmentInitParams initParams = WalletFragmentInitParams.newBuilder()
.setMaskedWalletRequest(maskedWalletRequest)
.setMaskedWalletRequestCode(LOAD_MASKED_WALLET_REQUEST_CODE)
.build();
walletFragment.initialize(initParams);
androidPayContainer.setVisibility(View.VISIBLE);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(ObjectAnimator.ofFloat(androidPayContainer, "alpha", 0.0f, 1.0f));
animatorSet.setInterpolator(new DecelerateInterpolator());
animatorSet.setDuration(180);
animatorSet.start();*/
}
@Override
public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
/*if (requestCode == LOAD_MASKED_WALLET_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
showEditDoneProgress(true, true);
setDonePressed(true);
MaskedWallet maskedWallet = data.getParcelableExtra(WalletConstants.EXTRA_MASKED_WALLET);
Cart.Builder cardBuilder = Cart.newBuilder()
.setCurrencyCode(paymentForm.invoice.currency)
.setTotalPrice(totalPriceDecimal);
ArrayList<TLRPC.TL_labeledPrice> arrayList = new ArrayList<>(paymentForm.invoice.prices);
if (shippingOption != null) {
arrayList.addAll(shippingOption.prices);
}
for (int a = 0; a < arrayList.size(); a++) {
TLRPC.TL_labeledPrice price = arrayList.get(a);
String amount = LocaleController.getInstance().formatCurrencyDecimalString(price.amount, paymentForm.invoice.currency, false);
cardBuilder.addLineItem(LineItem.newBuilder()
.setCurrencyCode(paymentForm.invoice.currency)
.setQuantity("1")
.setDescription(price.label)
.setTotalPrice(amount)
.setUnitPrice(amount).build());
}
FullWalletRequest fullWalletRequest = FullWalletRequest.newBuilder()
.setCart(cardBuilder.build())
.setGoogleTransactionId(maskedWallet.getGoogleTransactionId())
.build();
Wallet.Payments.loadFullWallet(googleApiClient, fullWalletRequest, LOAD_FULL_WALLET_REQUEST_CODE);
} else {
showEditDoneProgress(true, false);
setDonePressed(false);
}
} else if (requestCode == LOAD_FULL_WALLET_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
FullWallet fullWallet = data.getParcelableExtra(WalletConstants.EXTRA_FULL_WALLET);
String tokenJSON = fullWallet.getPaymentMethodToken().getToken();
try {
if (androidPayPublicKey != null) {
androidPayCredentials = new TLRPC.TL_inputPaymentCredentialsAndroidPay();
androidPayCredentials.payment_token = new TLRPC.TL_dataJSON();
androidPayCredentials.payment_token.data = tokenJSON;
androidPayCredentials.google_transaction_id = fullWallet.getGoogleTransactionId();
String[] descriptions = fullWallet.getPaymentDescriptions();
if (descriptions.length > 0) {
cardName = descriptions[0];
} else {
cardName = "Android Pay";
}
} else {
Token token = TokenParser.parseToken(tokenJSON);
paymentJson = String.format(Locale.US, "{\"type\":\"%1$s\", \"id\":\"%2$s\"}", token.getType(), token.getId());
Card card = token.getCard();
cardName = card.getType() + " *" + card.getLast4();
}
goToNextStep();
showEditDoneProgress(true, false);
setDonePressed(false);
} catch (JSONException ignore) {
showEditDoneProgress(true, false);
setDonePressed(false);
}
} else {
showEditDoneProgress(true, false);
setDonePressed(false);
}
}*/
}
private void goToNextStep() {
if (currentStep == 0) {
int nextStep;
if (paymentForm.invoice.flexible) {
nextStep = 1;
} else if (paymentForm.saved_credentials != null) {
if (UserConfig.getInstance(currentAccount).tmpPassword != null) {
if (UserConfig.getInstance(currentAccount).tmpPassword.valid_until < ConnectionsManager.getInstance(currentAccount).getCurrentTime() + 60) {
UserConfig.getInstance(currentAccount).tmpPassword = null;
UserConfig.getInstance(currentAccount).saveConfig(false);
}
}
if (UserConfig.getInstance(currentAccount).tmpPassword != null) {
nextStep = 4;
} else {
nextStep = 3;
}
} else {
nextStep = 2;
}
presentFragment(new PaymentFormActivity(paymentForm, messageObject, nextStep, requestedInfo, null, null, cardName, validateRequest, saveCardInfo, androidPayCredentials), isWebView);
} else if (currentStep == 1) {
int nextStep;
if (paymentForm.saved_credentials != null) {
if (UserConfig.getInstance(currentAccount).tmpPassword != null) {
if (UserConfig.getInstance(currentAccount).tmpPassword.valid_until < ConnectionsManager.getInstance(currentAccount).getCurrentTime() + 60) {
UserConfig.getInstance(currentAccount).tmpPassword = null;
UserConfig.getInstance(currentAccount).saveConfig(false);
}
}
if (UserConfig.getInstance(currentAccount).tmpPassword != null) {
nextStep = 4;
} else {
nextStep = 3;
}
} else {
nextStep = 2;
}
presentFragment(new PaymentFormActivity(paymentForm, messageObject, nextStep, requestedInfo, shippingOption, null, cardName, validateRequest, saveCardInfo, androidPayCredentials), isWebView);
} else if (currentStep == 2) {
if (paymentForm.password_missing && saveCardInfo) {
passwordFragment = new PaymentFormActivity(paymentForm, messageObject, 6, requestedInfo, shippingOption, paymentJson, cardName, validateRequest, saveCardInfo, androidPayCredentials);
passwordFragment.setCurrentPassword(currentPassword);
passwordFragment.setDelegate(new PaymentFormActivityDelegate() {
@Override
public boolean didSelectNewCard(String tokenJson, String card, boolean saveCard, TLRPC.TL_inputPaymentCredentialsAndroidPay androidPay) {
if (delegate != null) {
delegate.didSelectNewCard(tokenJson, card, saveCard, androidPay);
}
if (isWebView) {
removeSelfFromStack();
}
return delegate != null;
}
@Override
public void onFragmentDestroyed() {
passwordFragment = null;
}
@Override
public void currentPasswordUpdated(TLRPC.TL_account_password password) {
currentPassword = password;
}
});
presentFragment(passwordFragment, isWebView);
} else {
if (delegate != null) {
delegate.didSelectNewCard(paymentJson, cardName, saveCardInfo, androidPayCredentials);
finishFragment();
} else {
presentFragment(new PaymentFormActivity(paymentForm, messageObject, 4, requestedInfo, shippingOption, paymentJson, cardName, validateRequest, saveCardInfo, androidPayCredentials), isWebView);
}
}
} else if (currentStep == 3) {
int nextStep;
if (passwordOk) {
nextStep = 4;
} else {
nextStep = 2;
}
presentFragment(new PaymentFormActivity(paymentForm, messageObject, nextStep, requestedInfo, shippingOption, paymentJson, cardName, validateRequest, saveCardInfo, androidPayCredentials), !passwordOk);
} else if (currentStep == 4) {
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.paymentFinished);
finishFragment();
} else if (currentStep == 6) {
if (!delegate.didSelectNewCard(paymentJson, cardName, saveCardInfo, androidPayCredentials)) {
presentFragment(new PaymentFormActivity(paymentForm, messageObject, 4, requestedInfo, shippingOption, paymentJson, cardName, validateRequest, saveCardInfo, androidPayCredentials), true);
} else {
finishFragment();
}
}
}
private void updateSavePaymentField() {
if (bottomCell[0] == null || sectionCell[2] == null) {
return;
}
if ((paymentForm.password_missing || paymentForm.can_save_credentials) && (webView == null || webView != null && !webviewLoading)) {
SpannableStringBuilder text = new SpannableStringBuilder(LocaleController.getString("PaymentCardSavePaymentInformationInfoLine1", R.string.PaymentCardSavePaymentInformationInfoLine1));
if (paymentForm.password_missing) {
loadPasswordInfo();
text.append("\n");
int len = text.length();
String str2 = LocaleController.getString("PaymentCardSavePaymentInformationInfoLine2", R.string.PaymentCardSavePaymentInformationInfoLine2);
int index1 = str2.indexOf('*');
int index2 = str2.lastIndexOf('*');
text.append(str2);
if (index1 != -1 && index2 != -1) {
index1 += len;
index2 += len;
bottomCell[0].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);
}
}
checkCell1.setEnabled(true);
bottomCell[0].setText(text);
checkCell1.setVisibility(View.VISIBLE);
bottomCell[0].setVisibility(View.VISIBLE);
sectionCell[2].setBackgroundDrawable(Theme.getThemedDrawable(sectionCell[2].getContext(), R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
} else {
checkCell1.setVisibility(View.GONE);
bottomCell[0].setVisibility(View.GONE);
sectionCell[2].setBackgroundDrawable(Theme.getThemedDrawable(sectionCell[2].getContext(), R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
}
}
@SuppressLint("HardwareIds")
public void fillNumber(String number) {
try {
TelephonyManager tm = (TelephonyManager) ApplicationLoader.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
boolean allowCall = true;
boolean allowSms = true;
if (number != null || tm.getSimState() != TelephonyManager.SIM_STATE_ABSENT && tm.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE) {
if (Build.VERSION.SDK_INT >= 23) {
allowCall = getParentActivity().checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED;
}
if (number != null || allowCall) {
if (number == null) {
number = PhoneFormat.stripExceptNumbers(tm.getLine1Number());
}
String textToSet = null;
boolean ok = false;
if (!TextUtils.isEmpty(number)) {
if (number.length() > 4) {
for (int a = 4; a >= 1; a--) {
String sub = number.substring(0, a);
String country = codesMap.get(sub);
if (country != null) {
ok = true;
textToSet = number.substring(a);
inputFields[FIELD_PHONECODE].setText(sub);
break;
}
}
if (!ok) {
textToSet = number.substring(1);
inputFields[FIELD_PHONECODE].setText(number.substring(0, 1));
}
}
if (textToSet != null) {
inputFields[FIELD_PHONE].setText(textToSet);
inputFields[FIELD_PHONE].setSelection(inputFields[FIELD_PHONE].length());
}
}
}
}
} catch (Exception e) {
FileLog.e(e);
}
}
private void sendSavePassword(final boolean clear) {
if (!clear && codeFieldCell.getVisibility() == View.VISIBLE) {
String code = codeFieldCell.getText();
if (code.length() == 0) {
shakeView(codeFieldCell);
return;
}
showEditDoneProgress(true, true);
TLRPC.TL_account_confirmPasswordEmail req = new TLRPC.TL_account_confirmPasswordEmail();
req.code = code;
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
showEditDoneProgress(true, false);
if (error == null) {
if (getParentActivity() == null) {
return;
}
if (shortPollRunnable != null) {
AndroidUtilities.cancelRunOnUIThread(shortPollRunnable);
shortPollRunnable = null;
}
goToNextStep();
} else {
if (error.text.startsWith("CODE_INVALID")) {
shakeView(codeFieldCell);
codeFieldCell.setText("", false);
} 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);
}
}
}), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin);
} else {
final TLRPC.TL_account_updatePasswordSettings req = new TLRPC.TL_account_updatePasswordSettings();
final String email;
final String firstPassword;
if (clear) {
doneItem.setVisibility(View.VISIBLE);
email = null;
firstPassword = null;
req.new_settings = new TLRPC.TL_account_passwordInputSettings();
req.new_settings.flags = 2;
req.new_settings.email = "";
req.password = new TLRPC.TL_inputCheckPasswordEmpty();
} else {
firstPassword = inputFields[FIELD_ENTERPASSWORD].getText().toString();
if (TextUtils.isEmpty(firstPassword)) {
shakeField(FIELD_ENTERPASSWORD);
return;
}
String secondPassword = inputFields[FIELD_REENTERPASSWORD].getText().toString();
if (!firstPassword.equals(secondPassword)) {
try {
Toast.makeText(getParentActivity(), LocaleController.getString("PasswordDoNotMatch", R.string.PasswordDoNotMatch), Toast.LENGTH_SHORT).show();
} catch (Exception e) {
FileLog.e(e);
}
shakeField(FIELD_REENTERPASSWORD);
return;
}
email = inputFields[FIELD_ENTERPASSWORDEMAIL].getText().toString();
if (email.length() < 3) {
shakeField(FIELD_ENTERPASSWORDEMAIL);
return;
}
int dot = email.lastIndexOf('.');
int dog = email.lastIndexOf('@');
if (dog < 0 || dot < dog) {
shakeField(FIELD_ENTERPASSWORDEMAIL);
return;
}
req.password = new TLRPC.TL_inputCheckPasswordEmpty();
req.new_settings = new TLRPC.TL_account_passwordInputSettings();
req.new_settings.flags |= 1;
req.new_settings.hint = "";
req.new_settings.new_algo = currentPassword.new_algo;
if (email.length() > 0) {
req.new_settings.flags |= 2;
req.new_settings.email = email.trim();
}
}
showEditDoneProgress(true, true);
Utilities.globalQueue.postRunnable(() -> {
RequestDelegate requestDelegate = (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);
sendSavePassword(clear);
}
}), ConnectionsManager.RequestFlagWithoutLogin);
return;
}
showEditDoneProgress(true, false);
if (clear) {
currentPassword.has_password = false;
currentPassword.current_algo = null;
delegate.currentPasswordUpdated(currentPassword);
finishFragment();
} else {
if (error == null && response instanceof TLRPC.TL_boolTrue) {
if (getParentActivity() == null) {
return;
}
goToNextStep();
} else if (error != null) {
if (error.text.equals("EMAIL_UNCONFIRMED") || error.text.startsWith("EMAIL_UNCONFIRMED_")) {
emailCodeLength = Utilities.parseInt(error.text);
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialogInterface, i) -> {
waitingForEmail = true;
currentPassword.email_unconfirmed_pattern = email;
updatePasswordFields();
});
builder.setMessage(LocaleController.getString("YourEmailAlmostThereText", R.string.YourEmailAlmostThereText));
builder.setTitle(LocaleController.getString("YourEmailAlmostThere", R.string.YourEmailAlmostThere));
Dialog dialog = showDialog(builder.create());
if (dialog != null) {
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
}
} else {
if (error.text.equals("EMAIL_INVALID")) {
showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("PasswordEmailInvalid", R.string.PasswordEmailInvalid));
} 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);
}
}
}
}
});
if (!clear) {
byte[] newPasswordBytes = AndroidUtilities.getStringBytes(firstPassword);
if (currentPassword.new_algo instanceof TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) {
TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow algo = (TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) currentPassword.new_algo;
req.new_settings.new_password_hash = SRPHelper.getVBytes(newPasswordBytes, algo);
if (req.new_settings.new_password_hash == null) {
TLRPC.TL_error error = new TLRPC.TL_error();
error.text = "ALGO_INVALID";
requestDelegate.run(null, error);
}
ConnectionsManager.getInstance(currentAccount).sendRequest(req, requestDelegate, ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin);
} else {
TLRPC.TL_error error = new TLRPC.TL_error();
error.text = "PASSWORD_HASH_INVALID";
requestDelegate.run(null, error);
}
} else {
ConnectionsManager.getInstance(currentAccount).sendRequest(req, requestDelegate, ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin);
}
});
}
}
private boolean sendCardData() {
Integer month;
Integer year;
String date = inputFields[FIELD_EXPIRE_DATE].getText().toString();
String[] args = date.split("/");
if (args.length == 2) {
month = Utilities.parseInt(args[0]);
year = Utilities.parseInt(args[1]);
} else {
month = null;
year = null;
}
Card card = new Card(
inputFields[FIELD_CARD].getText().toString(),
month,
year,
inputFields[FIELD_CVV].getText().toString(),
inputFields[FIELD_CARDNAME].getText().toString(),
null, null, null, null,
inputFields[FIELD_CARD_POSTCODE].getText().toString(),
inputFields[FIELD_CARD_COUNTRY].getText().toString(),
null);
cardName = card.getType() + " *" + card.getLast4();
if (!card.validateNumber()) {
shakeField(FIELD_CARD);
return false;
} else if (!card.validateExpMonth() || !card.validateExpYear() || !card.validateExpiryDate()) {
shakeField(FIELD_EXPIRE_DATE);
return false;
} else if (need_card_name && inputFields[FIELD_CARDNAME].length() == 0) {
shakeField(FIELD_CARDNAME);
return false;
} else if (!card.validateCVC()) {
shakeField(FIELD_CVV);
return false;
} else if (need_card_country && inputFields[FIELD_CARD_COUNTRY].length() == 0) {
shakeField(FIELD_CARD_COUNTRY);
return false;
} else if (need_card_postcode && inputFields[FIELD_CARD_POSTCODE].length() == 0) {
shakeField(FIELD_CARD_POSTCODE);
return false;
}
showEditDoneProgress(true, true);
try {
Stripe stripe = new Stripe(stripeApiKey);
stripe.createToken(card, new TokenCallback() {
public void onSuccess(Token token) {
if (canceled) {
return;
}
paymentJson = String.format(Locale.US, "{\"type\":\"%1$s\", \"id\":\"%2$s\"}", token.getType(), token.getId());
AndroidUtilities.runOnUIThread(() -> {
goToNextStep();
showEditDoneProgress(true, false);
setDonePressed(false);
});
}
public void onError(Exception error) {
if (canceled) {
return;
}
showEditDoneProgress(true, false);
setDonePressed(false);
if (error instanceof APIConnectionException || error instanceof APIException) {
AlertsCreator.showSimpleToast(PaymentFormActivity.this, LocaleController.getString("PaymentConnectionFailed", R.string.PaymentConnectionFailed));
} else {
AlertsCreator.showSimpleToast(PaymentFormActivity.this, error.getMessage());
}
}
}
);
} catch (Exception e) {
FileLog.e(e);
}
return true;
}
private void sendForm() {
if (canceled) {
return;
}
showEditDoneProgress(true, true);
validateRequest = new TLRPC.TL_payments_validateRequestedInfo();
validateRequest.save = saveShippingInfo;
validateRequest.msg_id = messageObject.getId();
validateRequest.info = new TLRPC.TL_paymentRequestedInfo();
if (paymentForm.invoice.name_requested) {
validateRequest.info.name = inputFields[FIELD_NAME].getText().toString();
validateRequest.info.flags |= 1;
}
if (paymentForm.invoice.phone_requested) {
validateRequest.info.phone = "+" + inputFields[FIELD_PHONECODE].getText().toString() + inputFields[FIELD_PHONE].getText().toString();
validateRequest.info.flags |= 2;
}
if (paymentForm.invoice.email_requested) {
validateRequest.info.email = inputFields[FIELD_EMAIL].getText().toString().trim();
validateRequest.info.flags |= 4;
}
if (paymentForm.invoice.shipping_address_requested) {
validateRequest.info.shipping_address = new TLRPC.TL_postAddress();
validateRequest.info.shipping_address.street_line1 = inputFields[FIELD_STREET1].getText().toString();
validateRequest.info.shipping_address.street_line2 = inputFields[FIELD_STREET2].getText().toString();
validateRequest.info.shipping_address.city = inputFields[FIELD_CITY].getText().toString();
validateRequest.info.shipping_address.state = inputFields[FIELD_STATE].getText().toString();
validateRequest.info.shipping_address.country_iso2 = countryName != null ? countryName : "";
validateRequest.info.shipping_address.post_code = inputFields[FIELD_POSTCODE].getText().toString();
validateRequest.info.flags |= 8;
}
final TLObject req = validateRequest;
ConnectionsManager.getInstance(currentAccount).sendRequest(validateRequest, (response, error) -> {
if (response instanceof TLRPC.TL_payments_validatedRequestedInfo) {
AndroidUtilities.runOnUIThread(() -> {
requestedInfo = (TLRPC.TL_payments_validatedRequestedInfo) response;
if (paymentForm.saved_info != null && !saveShippingInfo) {
TLRPC.TL_payments_clearSavedInfo req1 = new TLRPC.TL_payments_clearSavedInfo();
req1.info = true;
ConnectionsManager.getInstance(currentAccount).sendRequest(req1, (response1, error1) -> {
});
}
goToNextStep();
setDonePressed(false);
showEditDoneProgress(true, false);
});
} else {
AndroidUtilities.runOnUIThread(() -> {
setDonePressed(false);
showEditDoneProgress(true, false);
if (error != null) {
switch (error.text) {
case "REQ_INFO_NAME_INVALID":
shakeField(FIELD_NAME);
break;
case "REQ_INFO_PHONE_INVALID":
shakeField(FIELD_PHONE);
break;
case "REQ_INFO_EMAIL_INVALID":
shakeField(FIELD_EMAIL);
break;
case "ADDRESS_COUNTRY_INVALID":
shakeField(FIELD_COUNTRY);
break;
case "ADDRESS_CITY_INVALID":
shakeField(FIELD_CITY);
break;
case "ADDRESS_POSTCODE_INVALID":
shakeField(FIELD_POSTCODE);
break;
case "ADDRESS_STATE_INVALID":
shakeField(FIELD_STATE);
break;
case "ADDRESS_STREET_LINE1_INVALID":
shakeField(FIELD_STREET1);
break;
case "ADDRESS_STREET_LINE2_INVALID":
shakeField(FIELD_STREET2);
break;
default:
AlertsCreator.processError(currentAccount, error, PaymentFormActivity.this, req);
break;
}
}
});
}
}, ConnectionsManager.RequestFlagFailOnServerErrors);
}
private TLRPC.TL_paymentRequestedInfo getRequestInfo() {
TLRPC.TL_paymentRequestedInfo info = new TLRPC.TL_paymentRequestedInfo();
if (paymentForm.invoice.name_requested) {
info.name = inputFields[FIELD_NAME].getText().toString();
info.flags |= 1;
}
if (paymentForm.invoice.phone_requested) {
info.phone = "+" + inputFields[FIELD_PHONECODE].getText().toString() + inputFields[FIELD_PHONE].getText().toString();
info.flags |= 2;
}
if (paymentForm.invoice.email_requested) {
info.email = inputFields[FIELD_EMAIL].getText().toString().trim();
info.flags |= 4;
}
if (paymentForm.invoice.shipping_address_requested) {
info.shipping_address = new TLRPC.TL_postAddress();
info.shipping_address.street_line1 = inputFields[FIELD_STREET1].getText().toString();
info.shipping_address.street_line2 = inputFields[FIELD_STREET2].getText().toString();
info.shipping_address.city = inputFields[FIELD_CITY].getText().toString();
info.shipping_address.state = inputFields[FIELD_STATE].getText().toString();
info.shipping_address.country_iso2 = countryName != null ? countryName : "";
info.shipping_address.post_code = inputFields[FIELD_POSTCODE].getText().toString();
info.flags |= 8;
}
return info;
}
private void sendData() {
if (canceled) {
return;
}
showEditDoneProgress(false, true);
final TLRPC.TL_payments_sendPaymentForm req = new TLRPC.TL_payments_sendPaymentForm();
req.msg_id = messageObject.getId();
if (UserConfig.getInstance(currentAccount).tmpPassword != null && paymentForm.saved_credentials != null) {
req.credentials = new TLRPC.TL_inputPaymentCredentialsSaved();
req.credentials.id = paymentForm.saved_credentials.id;
req.credentials.tmp_password = UserConfig.getInstance(currentAccount).tmpPassword.tmp_password;
} else if (androidPayCredentials != null) {
req.credentials = androidPayCredentials;
} else {
req.credentials = new TLRPC.TL_inputPaymentCredentials();
req.credentials.save = saveCardInfo;
req.credentials.data = new TLRPC.TL_dataJSON();
req.credentials.data.data = paymentJson;
}
if (requestedInfo != null && requestedInfo.id != null) {
req.requested_info_id = requestedInfo.id;
req.flags |= 1;
}
if (shippingOption != null) {
req.shipping_option_id = shippingOption.id;
req.flags |= 2;
}
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> {
if (response != null) {
if (response instanceof TLRPC.TL_payments_paymentResult) {
MessagesController.getInstance(currentAccount).processUpdates(((TLRPC.TL_payments_paymentResult) response).updates, false);
AndroidUtilities.runOnUIThread(this::goToNextStep);
} else if (response instanceof TLRPC.TL_payments_paymentVerificationNeeded) {
AndroidUtilities.runOnUIThread(() -> {
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.paymentFinished);
setDonePressed(false);
webviewLoading = true;
showEditDoneProgress(true, true);
if (progressView != null) {
progressView.setVisibility(View.VISIBLE);
}
if (doneItem != null) {
doneItem.setEnabled(false);
doneItem.getContentView().setVisibility(View.INVISIBLE);
}
if (webView != null) {
webView.setVisibility(View.VISIBLE);
webView.loadUrl(webViewUrl = ((TLRPC.TL_payments_paymentVerificationNeeded) response).url);
}
});
}
} else {
AndroidUtilities.runOnUIThread(() -> {
AlertsCreator.processError(currentAccount, error, PaymentFormActivity.this, req);
setDonePressed(false);
showEditDoneProgress(false, false);
});
}
}, ConnectionsManager.RequestFlagFailOnServerErrors);
}
private void shakeField(int field) {
shakeView(inputFields[field]);
}
private void shakeView(View view) {
Vibrator v = (Vibrator) getParentActivity().getSystemService(Context.VIBRATOR_SERVICE);
if (v != null) {
v.vibrate(200);
}
AndroidUtilities.shakeView(view, 2, 0);
}
private void setDonePressed(boolean value) {
donePressed = value;
swipeBackEnabled = !value;
if (actionBar != null) {
actionBar.getBackButton().setEnabled(!donePressed);
}
if (detailSettingsCell[0] != null) {
detailSettingsCell[0].setEnabled(!donePressed);
}
}
@Override
public boolean isSwipeBackEnabled(MotionEvent event) {
return swipeBackEnabled;
}
private void checkPassword() {
if (UserConfig.getInstance(currentAccount).tmpPassword != null) {
if (UserConfig.getInstance(currentAccount).tmpPassword.valid_until < ConnectionsManager.getInstance(currentAccount).getCurrentTime() + 60) {
UserConfig.getInstance(currentAccount).tmpPassword = null;
UserConfig.getInstance(currentAccount).saveConfig(false);
}
}
if (UserConfig.getInstance(currentAccount).tmpPassword != null) {
sendData();
return;
}
if (inputFields[FIELD_SAVEDPASSWORD].length() == 0) {
Vibrator v = (Vibrator) ApplicationLoader.applicationContext.getSystemService(Context.VIBRATOR_SERVICE);
if (v != null) {
v.vibrate(200);
}
AndroidUtilities.shakeView(inputFields[FIELD_SAVEDPASSWORD], 2, 0);
return;
}
final String password = inputFields[FIELD_SAVEDPASSWORD].getText().toString();
showEditDoneProgress(true, true);
setDonePressed(true);
final TLRPC.TL_account_getPassword req = new TLRPC.TL_account_getPassword();
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (error == null) {
TLRPC.TL_account_password currentPassword = (TLRPC.TL_account_password) response;
if (!TwoStepVerificationActivity.canHandleCurrentPassword(currentPassword, false)) {
AlertsCreator.showUpdateAppAlert(getParentActivity(), LocaleController.getString("UpdateAppAlert", R.string.UpdateAppAlert), true);
return;
}
if (!currentPassword.has_password) {
passwordOk = false;
goToNextStep();
} else {
byte[] passwordBytes = AndroidUtilities.getStringBytes(password);
Utilities.globalQueue.postRunnable(() -> {
final byte[] x_bytes;
if (currentPassword.current_algo instanceof TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) {
TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow algo = (TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) currentPassword.current_algo;
x_bytes = SRPHelper.getX(passwordBytes, algo);
} else {
x_bytes = null;
}
final TLRPC.TL_account_getTmpPassword req1 = new TLRPC.TL_account_getTmpPassword();
req1.period = 60 * 30;
RequestDelegate requestDelegate = (response1, error1) -> AndroidUtilities.runOnUIThread(() -> {
showEditDoneProgress(true, false);
setDonePressed(false);
if (response1 != null) {
passwordOk = true;
UserConfig.getInstance(currentAccount).tmpPassword = (TLRPC.TL_account_tmpPassword) response1;
UserConfig.getInstance(currentAccount).saveConfig(false);
goToNextStep();
} else {
if (error1.text.equals("PASSWORD_HASH_INVALID")) {
Vibrator v = (Vibrator) ApplicationLoader.applicationContext.getSystemService(Context.VIBRATOR_SERVICE);
if (v != null) {
v.vibrate(200);
}
AndroidUtilities.shakeView(inputFields[FIELD_SAVEDPASSWORD], 2, 0);
inputFields[FIELD_SAVEDPASSWORD].setText("");
} else {
AlertsCreator.processError(currentAccount, error1, PaymentFormActivity.this, req1);
}
}
});
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);
if (req1.password == null) {
TLRPC.TL_error error2 = new TLRPC.TL_error();
error2.text = "ALGO_INVALID";
requestDelegate.run(null, error2);
return;
}
ConnectionsManager.getInstance(currentAccount).sendRequest(req1, requestDelegate, ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin);
} else {
TLRPC.TL_error error2 = new TLRPC.TL_error();
error2.text = "PASSWORD_HASH_INVALID";
requestDelegate.run(null, error2);
}
});
}
} else {
AlertsCreator.processError(currentAccount, error, PaymentFormActivity.this, req);
showEditDoneProgress(true, false);
setDonePressed(false);
}
}), ConnectionsManager.RequestFlagFailOnServerErrors);
}
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(
ObjectAnimator.ofFloat(doneItem.getContentView(), "scaleX", 0.1f),
ObjectAnimator.ofFloat(doneItem.getContentView(), "scaleY", 0.1f),
ObjectAnimator.ofFloat(doneItem.getContentView(), "alpha", 0.0f),
ObjectAnimator.ofFloat(progressView, "scaleX", 1.0f),
ObjectAnimator.ofFloat(progressView, "scaleY", 1.0f),
ObjectAnimator.ofFloat(progressView, "alpha", 1.0f));
} else {
if (webView != null) {
doneItemAnimation.playTogether(
ObjectAnimator.ofFloat(progressView, "scaleX", 0.1f),
ObjectAnimator.ofFloat(progressView, "scaleY", 0.1f),
ObjectAnimator.ofFloat(progressView, "alpha", 0.0f));
} else {
doneItem.getContentView().setVisibility(View.VISIBLE);
doneItem.setEnabled(true);
doneItemAnimation.playTogether(
ObjectAnimator.ofFloat(progressView, "scaleX", 0.1f),
ObjectAnimator.ofFloat(progressView, "scaleY", 0.1f),
ObjectAnimator.ofFloat(progressView, "alpha", 0.0f),
ObjectAnimator.ofFloat(doneItem.getContentView(), "scaleX", 1.0f),
ObjectAnimator.ofFloat(doneItem.getContentView(), "scaleY", 1.0f),
ObjectAnimator.ofFloat(doneItem.getContentView(), "alpha", 1.0f));
}
}
doneItemAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (doneItemAnimation != null && doneItemAnimation.equals(animation)) {
if (!show) {
progressView.setVisibility(View.INVISIBLE);
} else {
doneItem.getContentView().setVisibility(View.INVISIBLE);
}
}
}
@Override
public void onAnimationCancel(Animator animation) {
if (doneItemAnimation != null && doneItemAnimation.equals(animation)) {
doneItemAnimation = null;
}
}
});
doneItemAnimation.setDuration(150);
doneItemAnimation.start();
} else if (payTextView != null) {
doneItemAnimation = new AnimatorSet();
if (show) {
progressViewButton.setVisibility(View.VISIBLE);
bottomLayout.setEnabled(false);
doneItemAnimation.playTogether(
ObjectAnimator.ofFloat(payTextView, "scaleX", 0.1f),
ObjectAnimator.ofFloat(payTextView, "scaleY", 0.1f),
ObjectAnimator.ofFloat(payTextView, "alpha", 0.0f),
ObjectAnimator.ofFloat(progressViewButton, "scaleX", 1.0f),
ObjectAnimator.ofFloat(progressViewButton, "scaleY", 1.0f),
ObjectAnimator.ofFloat(progressViewButton, "alpha", 1.0f));
} else {
payTextView.setVisibility(View.VISIBLE);
bottomLayout.setEnabled(true);
doneItemAnimation.playTogether(
ObjectAnimator.ofFloat(progressViewButton, "scaleX", 0.1f),
ObjectAnimator.ofFloat(progressViewButton, "scaleY", 0.1f),
ObjectAnimator.ofFloat(progressViewButton, "alpha", 0.0f),
ObjectAnimator.ofFloat(payTextView, "scaleX", 1.0f),
ObjectAnimator.ofFloat(payTextView, "scaleY", 1.0f),
ObjectAnimator.ofFloat(payTextView, "alpha", 1.0f));
}
doneItemAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (doneItemAnimation != null && doneItemAnimation.equals(animation)) {
if (!show) {
progressViewButton.setVisibility(View.INVISIBLE);
} else {
payTextView.setVisibility(View.INVISIBLE);
}
}
}
@Override
public void onAnimationCancel(Animator animation) {
if (doneItemAnimation != null && doneItemAnimation.equals(animation)) {
doneItemAnimation = null;
}
}
});
doneItemAnimation.setDuration(150);
doneItemAnimation.start();
}
}
@Override
public boolean onBackPressed() {
if (shouldNavigateBack) {
webView.loadUrl(webViewUrl);
shouldNavigateBack = false;
return false;
}
return !donePressed;
}
@Override
public ArrayList<ThemeDescription> getThemeDescriptions() {
ArrayList<ThemeDescription> arrayList = new ArrayList<>();
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(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));
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, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(inputFields[a], ThemeDescription.FLAG_HINTTEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteHintText));
}
} 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));
}
if (radioCells != null) {
for (int a = 0; a < radioCells.length; a++) {
arrayList.add(new ThemeDescription(radioCells[a], ThemeDescription.FLAG_SELECTORWHITE, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(radioCells[a], ThemeDescription.FLAG_SELECTORWHITE, null, null, null, null, Theme.key_listSelector));
arrayList.add(new ThemeDescription(radioCells[a], 0, new Class[]{RadioCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(radioCells[a], ThemeDescription.FLAG_CHECKBOX, new Class[]{RadioCell.class}, new String[]{"radioButton"}, null, null, null, Theme.key_radioBackground));
arrayList.add(new ThemeDescription(radioCells[a], ThemeDescription.FLAG_CHECKBOXCHECK, new Class[]{RadioCell.class}, new String[]{"radioButton"}, null, null, null, Theme.key_radioBackgroundChecked));
}
} else {
arrayList.add(new ThemeDescription(null, 0, new Class[]{RadioCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(null, ThemeDescription.FLAG_CHECKBOX, new Class[]{RadioCell.class}, new String[]{"radioButton"}, null, null, null, Theme.key_radioBackground));
arrayList.add(new ThemeDescription(null, ThemeDescription.FLAG_CHECKBOXCHECK, new Class[]{RadioCell.class}, new String[]{"radioButton"}, null, null, null, Theme.key_radioBackgroundChecked));
}
for (int a = 0; a < headerCell.length; a++) {
arrayList.add(new ThemeDescription(headerCell[a], ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(headerCell[a], 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader));
}
for (int a = 0; a < sectionCell.length; a++) {
arrayList.add(new ThemeDescription(sectionCell[a], ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow));
}
for (int a = 0; a < bottomCell.length; a++) {
arrayList.add(new ThemeDescription(bottomCell[a], ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow));
arrayList.add(new ThemeDescription(bottomCell[a], 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4));
arrayList.add(new ThemeDescription(bottomCell[a], ThemeDescription.FLAG_LINKCOLOR, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteLinkText));
}
for (int a = 0; a < dividers.size(); a++) {
arrayList.add(new ThemeDescription(dividers.get(a), ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite));
}
arrayList.add(new ThemeDescription(codeFieldCell, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(codeFieldCell, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{EditTextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(codeFieldCell, ThemeDescription.FLAG_HINTTEXTCOLOR, new Class[]{EditTextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteHintText));
arrayList.add(new ThemeDescription(textView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(checkCell1, 0, new Class[]{TextCheckCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(checkCell1, 0, new Class[]{TextCheckCell.class}, new String[]{"checkBox"}, null, null, null, Theme.key_switchTrack));
arrayList.add(new ThemeDescription(checkCell1, 0, new Class[]{TextCheckCell.class}, new String[]{"checkBox"}, null, null, null, Theme.key_switchTrackChecked));
arrayList.add(new ThemeDescription(checkCell1, ThemeDescription.FLAG_SELECTORWHITE, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(checkCell1, ThemeDescription.FLAG_SELECTORWHITE, null, null, null, null, Theme.key_listSelector));
for (int a = 0; a < settingsCell.length; a++) {
arrayList.add(new ThemeDescription(settingsCell[a], ThemeDescription.FLAG_SELECTORWHITE, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(settingsCell[a], ThemeDescription.FLAG_SELECTORWHITE, null, null, null, null, Theme.key_listSelector));
arrayList.add(new ThemeDescription(settingsCell[a], 0, new Class[]{TextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
}
arrayList.add(new ThemeDescription(payTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlueText6));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{TextPriceCell.class}, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_CHECKTAG, new Class[]{TextPriceCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_CHECKTAG, new Class[]{TextPriceCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_CHECKTAG, new Class[]{TextPriceCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
arrayList.add(new ThemeDescription(linearLayout2, ThemeDescription.FLAG_CHECKTAG, new Class[]{TextPriceCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
arrayList.add(new ThemeDescription(detailSettingsCell[0], ThemeDescription.FLAG_SELECTORWHITE, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(detailSettingsCell[0], ThemeDescription.FLAG_SELECTORWHITE, null, null, null, null, Theme.key_listSelector));
for (int a = 1; a < detailSettingsCell.length; a++) {
arrayList.add(new ThemeDescription(detailSettingsCell[a], ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(detailSettingsCell[a], 0, new Class[]{TextDetailSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(detailSettingsCell[a], 0, new Class[]{TextDetailSettingsCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
}
arrayList.add(new ThemeDescription(paymentInfoCell, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(paymentInfoCell, 0, new Class[]{PaymentInfoCell.class}, new String[]{"nameTextView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(paymentInfoCell, 0, new Class[]{PaymentInfoCell.class}, new String[]{"detailTextView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
arrayList.add(new ThemeDescription(paymentInfoCell, 0, new Class[]{PaymentInfoCell.class}, new String[]{"detailExTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
arrayList.add(new ThemeDescription(bottomLayout, ThemeDescription.FLAG_SELECTORWHITE, null, null, null, null, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(bottomLayout, ThemeDescription.FLAG_SELECTORWHITE, null, null, null, null, Theme.key_listSelector));
return arrayList;
}
}