Daily commit
@ -162,7 +162,7 @@ QString AdbUtils::getScreenDumpAsXml(const QString &deviceId, int idx, bool scre
|
|||||||
QString("%1 -s %2 pull /sdcard/screen.png screen_step_%3.png").arg(adb, deviceId).arg(idx),
|
QString("%1 -s %2 pull /sdcard/screen.png screen_step_%3.png").arg(adb, deviceId).arg(idx),
|
||||||
QString("%1 -s %2 shell rm /sdcard/screen.png").arg(adb, deviceId)
|
QString("%1 -s %2 shell rm /sdcard/screen.png").arg(adb, deviceId)
|
||||||
};
|
};
|
||||||
for (const QString &cmd : shotCmds) {
|
for (const QString &cmd: shotCmds) {
|
||||||
startProcess(cmd); // ошибки игнорируем для скриншота
|
startProcess(cmd); // ошибки игнорируем для скриншота
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -288,6 +288,17 @@ bool AdbUtils::inputText(const QString &deviceId, const QString &text) {
|
|||||||
return process.exitStatus() == QProcess::NormalExit && process.exitCode() == 0;
|
return process.exitStatus() == QProcess::NormalExit && process.exitCode() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AdbUtils::hideKeyboard(const QString &deviceId) {
|
||||||
|
QProcess process;
|
||||||
|
process.start(adbPath(), {
|
||||||
|
"-s", deviceId,
|
||||||
|
"shell", "input",
|
||||||
|
"keyevent", "111"
|
||||||
|
});
|
||||||
|
process.waitForFinished();
|
||||||
|
return process.exitStatus() == QProcess::NormalExit && process.exitCode() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool AdbUtils::goBack(const QString &deviceId) {
|
bool AdbUtils::goBack(const QString &deviceId) {
|
||||||
QProcess process;
|
QProcess process;
|
||||||
process.start(adbPath(), {
|
process.start(adbPath(), {
|
||||||
|
|||||||
@ -37,6 +37,8 @@ public:
|
|||||||
|
|
||||||
static bool inputText(const QString &deviceId, const QString &text);
|
static bool inputText(const QString &deviceId, const QString &text);
|
||||||
|
|
||||||
|
static bool hideKeyboard(const QString &deviceId);
|
||||||
|
|
||||||
static bool goBack(const QString &deviceId);
|
static bool goBack(const QString &deviceId);
|
||||||
|
|
||||||
static QSet<QString> getListApps(const QString &deviceId);
|
static QSet<QString> getListApps(const QString &deviceId);
|
||||||
|
|||||||
@ -25,68 +25,79 @@ void LoginAndCheckAccountsBirbankScript::doStart() {
|
|||||||
const ApplicationInfo app = ApplicationDAO::getApplication(m_deviceId, m_appCode);
|
const ApplicationInfo app = ApplicationDAO::getApplication(m_deviceId, m_appCode);
|
||||||
|
|
||||||
|
|
||||||
if (false) {
|
if (true) {
|
||||||
|
// xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
// if (!xmlScreenParser.isHomeScreen()) {
|
||||||
|
// if (!runAppAndGoToHomeScreen(device.id, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
||||||
|
// m_error = "Не смогли дойти до домашней страницы";
|
||||||
|
// qCritical() << m_error;
|
||||||
|
// emit finishedWithResult(m_error);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
Node cardText = xmlScreenParser.findTextNode("2480");
|
|
||||||
if (!cardText.isEmpty()) {
|
|
||||||
AdbUtils::makeTap(device.id, cardText.x(), cardText.y());
|
|
||||||
QThread::msleep(2000);
|
|
||||||
|
|
||||||
|
Node closeBannerNode = xmlScreenParser.findButtonNode("Maraqlı deyil", false);
|
||||||
|
if (!closeBannerNode.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, closeBannerNode.x(), closeBannerNode.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
Node cardTitleText = xmlScreenParser.findTextNode("2480");
|
}
|
||||||
Node cardHistory = xmlScreenParser.findTextNode("История платежей");
|
|
||||||
if (!cardTitleText.isEmpty() && !cardHistory.isEmpty()) {
|
|
||||||
QList<TransactionInfo> transactions = xmlScreenParser.parsePositiveTransactions();
|
|
||||||
|
|
||||||
QList<TransactionInfo> savedTransactions = TransactionDAO::getTransactions(89);
|
if (xmlScreenParser.isHomeScreen()) {
|
||||||
for (TransactionInfo &transaction: transactions) {
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
bool isSaved = false;
|
Node cardText = xmlScreenParser.findTextNode("2480");
|
||||||
for (TransactionInfo &savedTransaction: savedTransactions) {
|
if (!cardText.isEmpty()) {
|
||||||
if (savedTransaction.amount == transaction.amount
|
AdbUtils::makeTap(m_deviceId, cardText.x(), cardText.y());
|
||||||
&& savedTransaction.bankTime == transaction.bankTime) {
|
QThread::msleep(2000);
|
||||||
isSaved = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!isSaved) {
|
|
||||||
TransactionInfo tr;
|
|
||||||
tr.accountId = 89;
|
|
||||||
tr.description = transaction.description;
|
|
||||||
tr.bankTime = transaction.bankTime;
|
|
||||||
tr.bankName = transaction.bankName;
|
|
||||||
tr.amount = transaction.amount;
|
|
||||||
tr.phone = transaction.phone;
|
|
||||||
tr.updateTime = DateUtils::getUtcNow();
|
|
||||||
tr.fee = transaction.fee;
|
|
||||||
tr.name = transaction.name;
|
|
||||||
tr.bankTrExternalId = transaction.bankTrExternalId;
|
|
||||||
tr.status = TransactionStatus::Complete;
|
|
||||||
tr.type = TransactionType::Card;
|
|
||||||
tr.completeTime = transaction.completeTime;
|
|
||||||
tr.id = TransactionDAO::insertTransaction(tr);
|
|
||||||
|
|
||||||
if (tr.id == -1) {
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
qDebug() << "--- saveAndPostNewTransactionData failed";
|
Node payBtn = xmlScreenParser.findTextNode("Перевести");
|
||||||
|
if (!payBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, payBtn.x(), payBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
Node payByCardBtn = xmlScreenParser.findTextNode("На карту любого банка");
|
||||||
|
if (!payByCardBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, payByCardBtn.x(), payByCardBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
Node cardEditText = xmlScreenParser.findEditText("Номер карты");
|
||||||
|
Node amountEditText = xmlScreenParser.findEditText("Сумма");
|
||||||
|
if (!cardEditText.isEmpty() && !amountEditText.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, cardEditText.x(), cardEditText.y());
|
||||||
|
QThread::msleep(200);
|
||||||
|
AdbUtils::inputText(m_deviceId, "1111222233334444");
|
||||||
|
|
||||||
|
AdbUtils::hideKeyboard(m_deviceId);
|
||||||
|
|
||||||
|
AdbUtils::makeTap(m_deviceId, amountEditText.x(), amountEditText.y());
|
||||||
|
QThread::msleep(200);
|
||||||
|
AdbUtils::inputText(m_deviceId, "10");
|
||||||
|
|
||||||
|
AdbUtils::hideKeyboard(m_deviceId);
|
||||||
|
|
||||||
|
|
||||||
|
// дальше оплата, но хз как
|
||||||
}
|
}
|
||||||
AccountInfo account = AccountDAO::getAccountById(89);
|
|
||||||
postNewTransactionData(account, tr);
|
|
||||||
|
|
||||||
// if (!saveAndPostNewTransactionData(m_account, transaction, TransactionStatus::Complete)) {
|
} else {
|
||||||
// qDebug() << "--- saveAndPostNewTransactionData failed";
|
m_error = "Pay by card button not found: " + m_deviceId + " " + m_appCode;
|
||||||
// }
|
qWarning() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Pay button not found: " + m_deviceId + " " + m_appCode;
|
||||||
|
qWarning() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
m_error = "Card page not found: " + m_deviceId + " " + m_appCode;
|
|
||||||
qWarning() << m_error;
|
|
||||||
emit finishedWithResult(m_error);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
m_error = "Card not found: " + m_deviceId + " " + m_appCode;
|
|
||||||
qWarning() << m_error;
|
|
||||||
emit finishedWithResult(m_error);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
128
android/birbank/PayByCardBirbankScript.cpp
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
#include "PayByCardBirbankScript.h"
|
||||||
|
|
||||||
|
#include <QRandomGenerator>
|
||||||
|
#include <QThread>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include "DatabaseManager.h"
|
||||||
|
#include "adb/AdbUtils.h"
|
||||||
|
#include "dao/AccountDAO.h"
|
||||||
|
#include "dao/ApplicationDAO.h"
|
||||||
|
#include "dao/DeviceDAO.h"
|
||||||
|
#include "dao/TransactionDAO.h"
|
||||||
|
#include "db/ApplicationInfo.h"
|
||||||
|
#include "db/DeviceInfo.h"
|
||||||
|
#include "time/DateUtils.h"
|
||||||
|
|
||||||
|
PayByCardBirbankScript::PayByCardBirbankScript(
|
||||||
|
AccountInfo account,
|
||||||
|
QString card,
|
||||||
|
QString fullName,
|
||||||
|
const double amount,
|
||||||
|
QObject *parent
|
||||||
|
) : CommonBirbankScript(parent),
|
||||||
|
m_account(std::move(account)), m_card(std::move(card)),
|
||||||
|
m_fullName(std::move(fullName)), m_amount(amount) {
|
||||||
|
}
|
||||||
|
|
||||||
|
PayByCardBirbankScript::~PayByCardBirbankScript() = default;
|
||||||
|
|
||||||
|
|
||||||
|
void PayByCardBirbankScript::makePayment(const DeviceInfo &device) {
|
||||||
|
// Оплата со страницы карты
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
|
||||||
|
Node cardEditText = xmlScreenParser.findEditText("Номер карты");
|
||||||
|
Node amountEditText = xmlScreenParser.findEditText("Сумма");
|
||||||
|
if (!cardEditText.isEmpty() && !amountEditText.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, cardEditText.x(), cardEditText.y());
|
||||||
|
QThread::msleep(200);
|
||||||
|
AdbUtils::inputText(device.id, m_card);
|
||||||
|
|
||||||
|
AdbUtils::hideKeyboard(device.id);
|
||||||
|
|
||||||
|
AdbUtils::makeTap(device.id, amountEditText.x(), amountEditText.y());
|
||||||
|
QThread::msleep(200);
|
||||||
|
AdbUtils::inputText(device.id, QString::number(m_amount));
|
||||||
|
|
||||||
|
AdbUtils::hideKeyboard(device.id);
|
||||||
|
|
||||||
|
// дальше оплата, но хз как
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
m_error = "Не нашли поля ввода 'Номер карты' или 'Сумма'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PayByCardBirbankScript::doStart() {
|
||||||
|
const DeviceInfo device = DeviceDAO::getDeviceById(m_account.deviceId);
|
||||||
|
const ApplicationInfo app = ApplicationDAO::getApplication(m_account.deviceId, m_account.appCode);
|
||||||
|
|
||||||
|
if (device.id.isEmpty() || app.id == -1) {
|
||||||
|
m_error = "Device or app not found.";
|
||||||
|
qDebug() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
if (!xmlScreenParser.isHomeScreen()) {
|
||||||
|
if (!runAppAndGoToHomeScreen(device.id, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
||||||
|
m_error = "Не смогли дойти до домашней страницы";
|
||||||
|
qDebug() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
Node closeBannerNode = xmlScreenParser.findButtonNode("Maraqlı deyil", false);
|
||||||
|
if (!closeBannerNode.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_account.deviceId, closeBannerNode.x(), closeBannerNode.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xmlScreenParser.isHomeScreen()) {
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
Node cardText = xmlScreenParser.findTextNode("2480");
|
||||||
|
if (!cardText.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_account.deviceId, cardText.x(), cardText.y());
|
||||||
|
QThread::msleep(2000);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
Node payBtn = xmlScreenParser.findTextNode("Перевести");
|
||||||
|
if (!payBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_account.deviceId, payBtn.x(), payBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
Node payByCardBtn = xmlScreenParser.findTextNode("На карту любого банка");
|
||||||
|
if (!payByCardBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_account.deviceId, payByCardBtn.x(), payByCardBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
|
||||||
|
makePayment(device);
|
||||||
|
} else {
|
||||||
|
m_error = "Pay by card button not found: " + m_account.deviceId + " " + m_account.appCode;
|
||||||
|
qWarning() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Pay button not found: " + m_account.deviceId + " " + m_account.appCode;
|
||||||
|
qWarning() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_error.isEmpty()) {
|
||||||
|
AdbUtils::takeXmlDump(device.id, "pay_by_Card_Birbank_fail_transactions_" + QString::number(m_account.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
}
|
||||||
30
android/birbank/PayByCardBirbankScript.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "CommonBirbankScript.h"
|
||||||
|
#include "db/DeviceInfo.h"
|
||||||
|
|
||||||
|
class PayByCardBirbankScript final : public CommonBirbankScript {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
~PayByCardBirbankScript() override;
|
||||||
|
|
||||||
|
PayByCardBirbankScript(
|
||||||
|
AccountInfo account,
|
||||||
|
QString card,
|
||||||
|
QString fullName,
|
||||||
|
double amount,
|
||||||
|
QObject *parent = nullptr
|
||||||
|
);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void doStart() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const AccountInfo m_account;
|
||||||
|
const QString m_card;
|
||||||
|
const QString m_fullName;
|
||||||
|
const double m_amount;
|
||||||
|
QString m_error;
|
||||||
|
|
||||||
|
void makePayment(const DeviceInfo &device);
|
||||||
|
};
|
||||||
281
android/ozon/CommonScript.cpp
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
#include "CommonScript.h"
|
||||||
|
|
||||||
|
#include <QJsonArray>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QRandomGenerator>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
|
#include "adb/AdbUtils.h"
|
||||||
|
#include "net/NetworkService.h"
|
||||||
|
|
||||||
|
namespace Ozon {
|
||||||
|
|
||||||
|
CommonScript::CommonScript(QObject *parent)
|
||||||
|
: QObject(parent) {
|
||||||
|
}
|
||||||
|
|
||||||
|
CommonScript::~CommonScript() = default;
|
||||||
|
|
||||||
|
void CommonScript::start() {
|
||||||
|
doStart();
|
||||||
|
emit finished();
|
||||||
|
}
|
||||||
|
|
||||||
|
Node CommonScript::swipeToButton(
|
||||||
|
const QString &deviceId,
|
||||||
|
const QString &text, int &counter, const int width, const int height
|
||||||
|
) {
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
if (Node button = xmlScreenParser.findButtonNode(text, true); button.x() > 0 && button.y() > 0) {
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
const int x = width / 2;
|
||||||
|
const int offset = height / 4;
|
||||||
|
AdbUtils::makeSwipe(deviceId, x, height - offset, x, offset);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++counter));
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommonScript::inputPinCode(const QString &deviceId, const QList<Node> &pincode) {
|
||||||
|
for (const Node &node: pincode) {
|
||||||
|
const bool completePincode = AdbUtils::makeTap(deviceId, node.x(), node.y());
|
||||||
|
if (!completePincode) {
|
||||||
|
AdbUtils::makeTap(deviceId, node.x(), node.y());
|
||||||
|
}
|
||||||
|
QThread::msleep(QRandomGenerator::global()->bounded(100, 901));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommonScript::runAppAndGoToHomeScreen(
|
||||||
|
const QString &deviceId,
|
||||||
|
const QString &packageName,
|
||||||
|
const QString &pinCode,
|
||||||
|
const int width,
|
||||||
|
const int height
|
||||||
|
) {
|
||||||
|
// Запустить устройство
|
||||||
|
if (const QString pid = AdbUtils::tryToGetRunningAppPid(deviceId, packageName); !pid.isEmpty()) {
|
||||||
|
qDebug() << "Process already running, pid: " << pid;
|
||||||
|
AdbUtils::getScreenDumpAsXml(deviceId, 1000);
|
||||||
|
AdbUtils::tryToKillApplication(deviceId, packageName);
|
||||||
|
}
|
||||||
|
if (!AdbUtils::tryToStartApplication(deviceId, packageName)) {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "run_app_error");
|
||||||
|
qWarning() << "Process has not started";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Даем минимальное время на запуск
|
||||||
|
QThread::msleep(4500);
|
||||||
|
int counter = 0;
|
||||||
|
bool findAndInputPincode = false;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
counter++;
|
||||||
|
|
||||||
|
// Если более 10 раз мы пытаемся перейти на домашнюю
|
||||||
|
if (counter > 10) {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "too_many_attempts");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
|
||||||
|
if (xmlScreenParser.isHomeScreen()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверяем на банеры после пин-кодом
|
||||||
|
Node closeBannerOrDialogNode = xmlScreenParser.tryToFindBannerOrDialog(width, height);
|
||||||
|
if (closeBannerOrDialogNode.x() != -1 && closeBannerOrDialogNode.y() != -1) {
|
||||||
|
AdbUtils::makeTap(deviceId, closeBannerOrDialogNode.x(), closeBannerOrDialogNode.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверяем на банеры перед пин-кодом
|
||||||
|
Node closeBannerNode = xmlScreenParser.tryToFindSecurityBanner();
|
||||||
|
if (!closeBannerNode.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(deviceId, closeBannerNode.x(), closeBannerNode.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Проверяем, что это экран ввода пин-кода
|
||||||
|
if (!findAndInputPincode) {
|
||||||
|
if (const QList<Node> pincode = xmlScreenParser.tryToFindPinCode(pinCode, "Введите ПИН");
|
||||||
|
pincode.size() == 4) {
|
||||||
|
// чтобы пробудить экран
|
||||||
|
if (Node textPinCodeNode = xmlScreenParser.findTextNode("Введите ПИН"); !textPinCodeNode.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(deviceId, textPinCodeNode.x(), textPinCodeNode.y());
|
||||||
|
}
|
||||||
|
inputPinCode(deviceId, pincode);
|
||||||
|
// После ввода пин-код нужно сделать задержку, пока подгрузка идет, чтобы снова не спарсить
|
||||||
|
findAndInputPincode = true;
|
||||||
|
QThread::msleep(3000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QThread::msleep(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommonScript::tryToCloseAllBannersOnHomePage(const QString &deviceId, const int width, const int height) {
|
||||||
|
Node closeBannerOrDialogNode = xmlScreenParser.tryToFindBannerOrDialog(width, height);
|
||||||
|
if (closeBannerOrDialogNode.x() != -1 && closeBannerOrDialogNode.y() != -1) {
|
||||||
|
AdbUtils::makeTap(deviceId, closeBannerOrDialogNode.x(), closeBannerOrDialogNode.y());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO тут все другие банеры попробовать закрыть
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommonScript::goToAllProducts(
|
||||||
|
const QString &deviceId,
|
||||||
|
const int width,
|
||||||
|
const int height
|
||||||
|
) {
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, m_counter));
|
||||||
|
if (tryToCloseAllBannersOnHomePage(deviceId, width, height)) {
|
||||||
|
QThread::msleep(500);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ozon: домашний экран и есть "Финансы" — счета уже доступны
|
||||||
|
if (xmlScreenParser.isHomeScreen()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если по какой-то причине не на домашнем — пробуем тапнуть по вкладке "Финансы"
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
if (Node financeTab = xmlScreenParser.findNodeByContentDesc("Финансы"); !financeTab.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(deviceId, financeTab.x(), financeTab.y());
|
||||||
|
QThread::msleep(1500);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
if (xmlScreenParser.isHomeScreen()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug() << "goToAllProducts: not home screen";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommonScript::findAndTapOnAccount(const QString &deviceId, const QString &accountNumbers) {
|
||||||
|
QList<QPair<AccountInfo, Node> > accounts = xmlScreenParser.parseAccountsInfo();
|
||||||
|
for (auto &[account, node]: accounts) {
|
||||||
|
// FIXME будем считать что числа последние везде уникальные
|
||||||
|
if (accountNumbers == account.lastNumbers) {
|
||||||
|
qDebug() << "findAndTapOnAccount: " << accountNumbers;
|
||||||
|
AdbUtils::makeTap(deviceId, node.x(), node.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CommonScript::postAccountsData(const QList<QPair<AccountInfo, Node> > &accounts) {
|
||||||
|
if (accounts.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto *thread = new QThread;
|
||||||
|
auto *worker = new NetworkService;
|
||||||
|
|
||||||
|
QJsonArray list;
|
||||||
|
for (const QPair<AccountInfo, Node> &pair: accounts) {
|
||||||
|
QJsonObject obj;
|
||||||
|
AccountInfo account = pair.first;
|
||||||
|
obj["appName"] = account.appCode;
|
||||||
|
obj["lastNumbers"] = account.lastNumbers;
|
||||||
|
obj["amount"] = account.amount;
|
||||||
|
obj["description"] = account.description;
|
||||||
|
obj["currency"] = account.currency;
|
||||||
|
obj["status"] = accountStatusToString(account.status);
|
||||||
|
|
||||||
|
list.append(obj);
|
||||||
|
}
|
||||||
|
// FIXME доставить десктоп ид из настроеек
|
||||||
|
worker->setDeviceId(accounts.first().first.deviceId);
|
||||||
|
worker->setPayload(QJsonDocument(list).toJson());
|
||||||
|
worker->moveToThread(thread);
|
||||||
|
connect(thread, &QThread::started, worker, &NetworkService::postAccountsData);
|
||||||
|
connect(worker, &NetworkService::finished, thread, &QThread::quit);
|
||||||
|
connect(worker, &NetworkService::finished, worker, &QObject::deleteLater);
|
||||||
|
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
|
||||||
|
thread->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonScript::postNewTransactionData(const AccountInfo &account, const TransactionInfo &transaction) {
|
||||||
|
auto *thread = new QThread;
|
||||||
|
auto *worker = new NetworkService;
|
||||||
|
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["id"] = transaction.id;
|
||||||
|
obj["amount"] = transaction.amount;
|
||||||
|
obj["name"] = transaction.name;
|
||||||
|
obj["fee"] = transaction.fee;
|
||||||
|
obj["status"] = transactionStatusToString(transaction.status);
|
||||||
|
obj["type"] = transactionTypeToString(transaction.type);
|
||||||
|
obj["phone"] = transaction.phone;
|
||||||
|
obj["description"] = transaction.description;
|
||||||
|
obj["updatedDescription"] = transaction.updatedDescription;
|
||||||
|
obj["bankName"] = transaction.bankName;
|
||||||
|
obj["bankTime"] = transaction.bankTime;
|
||||||
|
obj["bankTransactionId"] = transaction.bankTrExternalId;
|
||||||
|
|
||||||
|
// FIXME доставить десктоп ид из настроеек
|
||||||
|
worker->setDeviceId(account.deviceId);
|
||||||
|
worker->addExtra("lastNumbers", account.lastNumbers);
|
||||||
|
worker->addExtra("transactionId", transaction.id);
|
||||||
|
worker->setPayload(QJsonDocument(obj).toJson());
|
||||||
|
worker->moveToThread(thread);
|
||||||
|
connect(thread, &QThread::started, worker, &NetworkService::insertTransactionData);
|
||||||
|
connect(worker, &NetworkService::finished, thread, &QThread::quit);
|
||||||
|
connect(worker, &NetworkService::finished, worker, &QObject::deleteLater);
|
||||||
|
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
|
||||||
|
thread->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonScript::updateTransactionData(
|
||||||
|
const AccountInfo &account,
|
||||||
|
const int transactionId,
|
||||||
|
const TransactionStatus status,
|
||||||
|
const QString &oldDesc,
|
||||||
|
const QString &newDesc
|
||||||
|
) {
|
||||||
|
auto *thread = new QThread;
|
||||||
|
auto *worker = new NetworkService;
|
||||||
|
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["id"] = transactionId;
|
||||||
|
obj["status"] = transactionStatusToString(status);
|
||||||
|
obj["description"] = newDesc;
|
||||||
|
obj["updatedDescription"] = oldDesc;
|
||||||
|
|
||||||
|
// FIXME доставить десктоп ид из настроеек
|
||||||
|
worker->setDeviceId(account.deviceId);
|
||||||
|
worker->addExtra("lastNumbers", account.lastNumbers);
|
||||||
|
worker->setPayload(QJsonDocument(obj).toJson());
|
||||||
|
worker->moveToThread(thread);
|
||||||
|
connect(thread, &QThread::started, worker, &NetworkService::updateTransactionData);
|
||||||
|
connect(worker, &NetworkService::finished, thread, &QThread::quit);
|
||||||
|
connect(worker, &NetworkService::finished, worker, &QObject::deleteLater);
|
||||||
|
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
|
||||||
|
thread->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonScript::stop() {
|
||||||
|
m_running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Ozon
|
||||||
78
android/ozon/CommonScript.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include "ScreenXmlParser.h"
|
||||||
|
|
||||||
|
namespace Ozon {
|
||||||
|
|
||||||
|
class CommonScript : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit CommonScript(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
~CommonScript() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void doStart() = 0;
|
||||||
|
|
||||||
|
// static method
|
||||||
|
static bool inputPinCode(const QString &deviceId, const QList<Node> &pincode);
|
||||||
|
|
||||||
|
bool goToAllProducts(
|
||||||
|
const QString &deviceId,
|
||||||
|
int width,
|
||||||
|
int height
|
||||||
|
);
|
||||||
|
|
||||||
|
bool findAndTapOnAccount(const QString &deviceId, const QString &accountNumbers);
|
||||||
|
|
||||||
|
void postAccountsData(const QList<QPair<AccountInfo, Node> > &accounts);
|
||||||
|
|
||||||
|
void postNewTransactionData(const AccountInfo &account, const TransactionInfo &transaction);
|
||||||
|
|
||||||
|
void updateTransactionData(
|
||||||
|
const AccountInfo &account,
|
||||||
|
int transactionId,
|
||||||
|
TransactionStatus status,
|
||||||
|
const QString &oldDesc,
|
||||||
|
const QString &newDesc
|
||||||
|
);
|
||||||
|
|
||||||
|
Node swipeToButton(
|
||||||
|
const QString &deviceId,
|
||||||
|
const QString &text,
|
||||||
|
int &counter, int width, int height
|
||||||
|
);
|
||||||
|
|
||||||
|
bool runAppAndGoToHomeScreen(
|
||||||
|
const QString &deviceId,
|
||||||
|
const QString &packageName,
|
||||||
|
const QString &pinCode,
|
||||||
|
int width,
|
||||||
|
int height
|
||||||
|
);
|
||||||
|
|
||||||
|
bool tryToCloseAllBannersOnHomePage(
|
||||||
|
const QString &deviceId, int width, int height
|
||||||
|
);
|
||||||
|
|
||||||
|
bool m_running = true;
|
||||||
|
ScreenXmlParser xmlScreenParser;
|
||||||
|
int m_counter = 0;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void finished();
|
||||||
|
|
||||||
|
void finishedWithResult(const QString &result);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
virtual void start() final;
|
||||||
|
|
||||||
|
virtual void stop() final;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Q_DISABLE_COPY(CommonScript);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Ozon
|
||||||
69
android/ozon/LoginAndCheckAccountsScript.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#include "LoginAndCheckAccountsScript.h"
|
||||||
|
|
||||||
|
#include "adb/AdbUtils.h"
|
||||||
|
#include "dao/AccountDAO.h"
|
||||||
|
#include "dao/ApplicationDAO.h"
|
||||||
|
#include "dao/DeviceDAO.h"
|
||||||
|
|
||||||
|
namespace Ozon {
|
||||||
|
|
||||||
|
LoginAndCheckAccountsScript::LoginAndCheckAccountsScript(
|
||||||
|
QString deviceId,
|
||||||
|
QString appCode,
|
||||||
|
QObject *parent
|
||||||
|
) : CommonScript(parent),
|
||||||
|
m_deviceId(std::move(deviceId)), m_appCode(std::move(appCode)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
LoginAndCheckAccountsScript::~LoginAndCheckAccountsScript() = default;
|
||||||
|
|
||||||
|
|
||||||
|
void LoginAndCheckAccountsScript::doStart() {
|
||||||
|
const DeviceInfo device = DeviceDAO::getDeviceById(m_deviceId);
|
||||||
|
const ApplicationInfo app = ApplicationDAO::getApplication(m_deviceId, m_appCode);
|
||||||
|
|
||||||
|
if (device.id.isEmpty() || app.id == -1) {
|
||||||
|
m_error = "Device or app not found: " + m_deviceId + " " + m_appCode;
|
||||||
|
qCritical() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
|
||||||
|
if (!runAppAndGoToHomeScreen(device.id, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
||||||
|
m_error = "Cant open the home screen: " + m_deviceId + " " + m_appCode;
|
||||||
|
qWarning() << m_error;
|
||||||
|
if (!ApplicationDAO::updatePinCodeStatus(app.id, "no", "Не прошла проверка [дата]")) {
|
||||||
|
qWarning() << "Cant update the pincode: " << m_deviceId << " " << m_appCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (!ApplicationDAO::updatePinCodeStatus(app.id, "yes", "")) {
|
||||||
|
qWarning() << "Cant update the pincode: " << m_deviceId << " " << m_appCode;
|
||||||
|
}
|
||||||
|
if (goToAllProducts(device.id, device.screenWidth, device.screenHeight)) {
|
||||||
|
QList<QPair<AccountInfo, Node> > accounts = xmlScreenParser.parseAccountsInfo();
|
||||||
|
for (auto &[account, node]: accounts) {
|
||||||
|
account.deviceId = m_deviceId;
|
||||||
|
account.appCode = m_appCode;
|
||||||
|
if (!AccountDAO::upsertAccount(account)) {
|
||||||
|
m_error = "Not updated: " + account.lastNumbers;
|
||||||
|
qCritical() << m_error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
postAccountsData(accounts);
|
||||||
|
} else {
|
||||||
|
qWarning() << "Cant go to all products: " << m_deviceId << " " << m_appCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Ozon
|
||||||
27
android/ozon/LoginAndCheckAccountsScript.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "CommonScript.h"
|
||||||
|
|
||||||
|
namespace Ozon {
|
||||||
|
|
||||||
|
class LoginAndCheckAccountsScript final : public CommonScript {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
~LoginAndCheckAccountsScript() override;
|
||||||
|
|
||||||
|
explicit LoginAndCheckAccountsScript(
|
||||||
|
QString deviceId,
|
||||||
|
QString appCode,
|
||||||
|
QObject *parent = nullptr
|
||||||
|
);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void doStart() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const QString m_deviceId;
|
||||||
|
const QString m_appCode;
|
||||||
|
QString m_error;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Ozon
|
||||||
340
android/ozon/PayByPhoneScript.cpp
Normal file
@ -0,0 +1,340 @@
|
|||||||
|
#include "PayByPhoneScript.h"
|
||||||
|
|
||||||
|
#include <QRandomGenerator>
|
||||||
|
#include <QThread>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include "DatabaseManager.h"
|
||||||
|
#include "adb/AdbUtils.h"
|
||||||
|
#include "dao/AccountDAO.h"
|
||||||
|
#include "dao/ApplicationDAO.h"
|
||||||
|
#include "dao/DeviceDAO.h"
|
||||||
|
#include "dao/TransactionDAO.h"
|
||||||
|
#include "db/ApplicationInfo.h"
|
||||||
|
#include "db/DeviceInfo.h"
|
||||||
|
|
||||||
|
namespace Ozon {
|
||||||
|
|
||||||
|
PayByPhoneScript::PayByPhoneScript(
|
||||||
|
AccountInfo account,
|
||||||
|
QString phone,
|
||||||
|
QString bankName,
|
||||||
|
const double amount,
|
||||||
|
QObject *parent
|
||||||
|
) : CommonScript(parent),
|
||||||
|
m_account(std::move(account)), m_phone(std::move(phone)),
|
||||||
|
m_bankName(std::move(bankName)), m_amount(amount) {
|
||||||
|
}
|
||||||
|
|
||||||
|
PayByPhoneScript::~PayByPhoneScript() = default;
|
||||||
|
|
||||||
|
|
||||||
|
void PayByPhoneScript::makePayment(
|
||||||
|
const QString &deviceId,
|
||||||
|
const QString &pinCode,
|
||||||
|
int width,
|
||||||
|
int height
|
||||||
|
) {
|
||||||
|
// Оплата со страницы карты
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
Node payBtn = xmlScreenParser.findButtonNode("Оплатить", false);
|
||||||
|
if (!payBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(deviceId, payBtn.x(), payBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
} else {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "pay_by_phone_pay_btn_not_found");
|
||||||
|
m_error = "Кнопка 'Оплатить' не нашлась";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
// TODO - По номеру карты В РСХБ и другие банки
|
||||||
|
Node payTitle = xmlScreenParser.findTextNode("Платежи и переводы");
|
||||||
|
if (!payTitle.isEmpty() && payTitle.y() < 300) {
|
||||||
|
Node payByPhoneBtn = xmlScreenParser.findButtonNode("По номеру телефона В РСХБ и через", false);
|
||||||
|
if (!payByPhoneBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(deviceId, payByPhoneBtn.x(), payByPhoneBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
} else {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "pay_by_phone_not_found_pay_by_phone");
|
||||||
|
m_error = "Не смогли найти пункт 'По номеру телефона В РСХБ и через'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "pay_by_phone_cant_go_to_payments");
|
||||||
|
m_error = "Не смогли перейти на экран 'Платежи и переводы'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
Node payByPhoneTitle = xmlScreenParser.findTextNode("Перевод по телефону");
|
||||||
|
Node continueBtn = xmlScreenParser.findButtonNode("Продолжить", false);
|
||||||
|
if (!payByPhoneTitle.isEmpty() && payByPhoneTitle.y() < 300 && continueBtn.isEmpty()) {
|
||||||
|
Node inputPhone = xmlScreenParser.findFirstEditText();
|
||||||
|
AdbUtils::makeTap(deviceId, inputPhone.x(), inputPhone.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
AdbUtils::inputText(deviceId, m_phone);
|
||||||
|
QThread::msleep(1000);
|
||||||
|
} else {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "pay_by_phone_cant_find_pay_by_phone");
|
||||||
|
m_error = "Не смогли найти пункт 'Перевод по телефону'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
QString payBankName = m_bankName == QStringLiteral("Россельхозбанк") ? "Россельхозбанк" : "Другой банк через СБП";
|
||||||
|
Node payOtherBankBtn = xmlScreenParser.findButtonNode(payBankName, false);
|
||||||
|
if (!payOtherBankBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(deviceId, payOtherBankBtn.x(), payOtherBankBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
} else {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "pay_by_phone_cant_tap_on_bank");
|
||||||
|
m_error = "Не смогли нажать на первичный выбор банка";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_bankName != QStringLiteral("Россельхозбанк")) {
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
Node allBanksTitle = xmlScreenParser.findTextNode("Банки участники");
|
||||||
|
if (!allBanksTitle.isEmpty() && allBanksTitle.y() < 300) {
|
||||||
|
Node inputBankName = xmlScreenParser.findFirstEditText();
|
||||||
|
AdbUtils::makeTap(deviceId, inputBankName.x(), inputBankName.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
AdbUtils::enableAdbIMEKeyboard(deviceId);
|
||||||
|
AdbUtils::inputAdbIMEText(deviceId, m_bankName);
|
||||||
|
AdbUtils::disableAdbIMEKeyboard(deviceId);
|
||||||
|
QThread::msleep(1000);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
qDebug() << "--- allBanksTitle not found, i: " << i;
|
||||||
|
}
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
Node bankNameListItem = xmlScreenParser.findTextNode(m_bankName);
|
||||||
|
if (!bankNameListItem.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(deviceId, bankNameListItem.x(), bankNameListItem.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
qDebug() << "--- bankNameListItem not found, i: " << i;
|
||||||
|
}
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
|
||||||
|
const bool isRshbBank = m_bankName == QStringLiteral("Россельхозбанк");
|
||||||
|
QString payByPhoneScreenTitleText = isRshbBank ? "Перевод клиенту РСХБ" : "Перевод по телефону";
|
||||||
|
Node payByPhoneScreenTitle = xmlScreenParser.findTextNode(payByPhoneScreenTitleText);
|
||||||
|
Node continuePayBtn = xmlScreenParser.findButtonNode("Продолжить", false);
|
||||||
|
|
||||||
|
if (isRshbBank ||
|
||||||
|
!payByPhoneScreenTitle.isEmpty() && payByPhoneScreenTitle.y() < 300 && !continuePayBtn.isEmpty()) {
|
||||||
|
Node sumBtn = xmlScreenParser.findButtonNode("0", false);
|
||||||
|
if (isRshbBank || !sumBtn.isEmpty()) {
|
||||||
|
if (!isRshbBank) {
|
||||||
|
AdbUtils::makeTap(deviceId, sumBtn.x(), sumBtn.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
}
|
||||||
|
AdbUtils::inputText(deviceId, QString::number(m_amount));
|
||||||
|
QThread::msleep(500);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
Node readyBtn = xmlScreenParser.findTextNode("Готово");
|
||||||
|
if (!readyBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(deviceId, readyBtn.x(), readyBtn.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
if (isRshbBank) {
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
continuePayBtn = xmlScreenParser.findButtonNode("Продолжить", false);
|
||||||
|
}
|
||||||
|
AdbUtils::makeTap(deviceId, continuePayBtn.x(), continuePayBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
} else {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "pay_by_phone_cant_tap_on_ready");
|
||||||
|
m_error = "Не смогли нажать 'Готово'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "pay_by_phone_cant_tap_on_continue");
|
||||||
|
m_error = "Не смогли нажать 'Продолжить'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "pay_by_phone_cant_find_bank_title");
|
||||||
|
m_error = "Не смогли найти заголовок: " + payByPhoneScreenTitleText;
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
bool inputedPinCode = false;
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
// TODO кнопка содержит "Перевести 10 ₽" если будет от 1000 то скорее всвего будет "Перевести 1 000 ₽",
|
||||||
|
// TODO не ясно как форматирование будет, поэтому пока на начало зашьем
|
||||||
|
Node makePayBtn = xmlScreenParser.findButtonNode("Перевести ", true);
|
||||||
|
if (!makePayBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(deviceId, makePayBtn.x(), makePayBtn.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
if (const QList<Node> pincode = xmlScreenParser.tryToFindPinCode(pinCode, "Введите код доступа");
|
||||||
|
pincode.size() == 4) {
|
||||||
|
inputPinCode(deviceId, pincode);
|
||||||
|
inputedPinCode = true;
|
||||||
|
// После ввода пин-кода, ждем 3с
|
||||||
|
QThread::msleep(3000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
qWarning() << "--- makePayBtn not found, i: " << i;
|
||||||
|
}
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isRshbBank && !inputedPinCode) {
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "pay_by_phone_cant_input_pin_code");
|
||||||
|
m_error = "Не смогли ввести пин-код!'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
Node moreDetailBtn = xmlScreenParser.findButtonNode("Детали операции", false);
|
||||||
|
if (!moreDetailBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(deviceId, moreDetailBtn.x(), moreDetailBtn.y());
|
||||||
|
QThread::msleep(200);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
|
||||||
|
// TODO считываем все данные по переводу
|
||||||
|
TransactionInfo transaction = xmlScreenParser.parseTransactionInfo(width, height);
|
||||||
|
if (isRshbBank) {
|
||||||
|
transaction.bankName = m_bankName;
|
||||||
|
}
|
||||||
|
transaction.accountId = m_account.id;
|
||||||
|
transaction.amount = -m_amount;
|
||||||
|
transaction.type = TransactionType::Phone;
|
||||||
|
transaction.id = TransactionDAO::insertTransaction(transaction);
|
||||||
|
if (transaction.id == -1) {
|
||||||
|
// FIXME alert!!
|
||||||
|
qDebug() << "Transaction has not inserted...";
|
||||||
|
}
|
||||||
|
|
||||||
|
// ждем 10 секунд смену статуса
|
||||||
|
for (int k = 0; k < 10; ++k) {
|
||||||
|
Node paymentCompleted = xmlScreenParser.findTextNode("Исполнен", 0, 0, width, height / 2);
|
||||||
|
if (!paymentCompleted.isEmpty()) {
|
||||||
|
transaction.status = TransactionStatus::Complete;
|
||||||
|
if (!TransactionDAO::updateTransactionStatus(transaction.id, TransactionStatus::Complete)) {
|
||||||
|
qDebug() << "Not updated: " << transaction.id;
|
||||||
|
}
|
||||||
|
// TODO обновляем данные
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
postNewTransactionData(m_account, transaction);
|
||||||
|
|
||||||
|
AdbUtils::takeScreenshot(deviceId, "pay_by_phone_finish_transactions_" + transaction.id);
|
||||||
|
AdbUtils::takeXmlDump(deviceId, "pay_by_phone_finish_transactions_" + transaction.id);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
qWarning() << "--- moreDetailBtn not found, i: " << i;
|
||||||
|
}
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
Node homeBtn = xmlScreenParser.findButtonNode("Вернуться на главную", false);
|
||||||
|
AdbUtils::makeTap(deviceId, homeBtn.x(), homeBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PayByPhoneScript::doStart() {
|
||||||
|
const DeviceInfo device = DeviceDAO::getDeviceById(m_account.deviceId);
|
||||||
|
const ApplicationInfo app = ApplicationDAO::getApplication(m_account.deviceId, m_account.appCode);
|
||||||
|
|
||||||
|
if (device.id.isEmpty() || app.id == -1) {
|
||||||
|
m_error = "Device or app not found....";
|
||||||
|
qDebug() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
if (!xmlScreenParser.isHomeScreen()) {
|
||||||
|
if (!runAppAndGoToHomeScreen(device.id, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
||||||
|
m_error = "Не смогли дойти до домашней страницы";
|
||||||
|
qDebug() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (goToAllProducts(device.id, device.screenWidth, device.screenHeight)) {
|
||||||
|
QList<QPair<AccountInfo, Node> > accounts = xmlScreenParser.parseAccountsInfo();
|
||||||
|
for (auto &[account, node]: accounts) {
|
||||||
|
account.deviceId = m_account.deviceId;
|
||||||
|
account.appCode = m_account.appCode;
|
||||||
|
account.status = account.amount > 0 ? AccountStatus::Active : AccountStatus::Off;
|
||||||
|
if (!AccountDAO::upsertAccount(account)) {
|
||||||
|
qDebug() << "Not updated: " << account.lastNumbers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
postAccountsData(accounts);
|
||||||
|
|
||||||
|
for (auto &[account, node]: accounts) {
|
||||||
|
// FIXME будем считать что числа последние везде уникальные
|
||||||
|
if (m_account.lastNumbers == account.lastNumbers) {
|
||||||
|
if (account.amount >= m_amount) {
|
||||||
|
AdbUtils::makeTap(device.id, node.x(), node.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
} else {
|
||||||
|
AdbUtils::takeScreenshot(device.id, "pay_by_phone_not_enough_money_" + QString::number(m_account.id));
|
||||||
|
m_error = "Not enough money, id: " + QString::number(m_account.id)
|
||||||
|
+ ", amount: " + QString::number(account.amount)
|
||||||
|
+ ", trx amount: " + QString::number(m_amount);
|
||||||
|
qCritical() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
makePayment(device.id, app.pinCode, device.screenWidth, device.screenHeight);
|
||||||
|
// AdbUtils::tryToKillApplication(device.id, app.package); TODO - надо ли это???
|
||||||
|
} else {
|
||||||
|
AdbUtils::takeScreenshot(device.id, "pay_by_phone_cant_open_all_products_" + QString::number(m_account.id));
|
||||||
|
AdbUtils::tryToKillApplication(device.id, app.package);
|
||||||
|
m_error = "Не смогли открыть 'Все продукты'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Ozon
|
||||||
38
android/ozon/PayByPhoneScript.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "CommonScript.h"
|
||||||
|
|
||||||
|
namespace Ozon {
|
||||||
|
|
||||||
|
class PayByPhoneScript final : public CommonScript {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
~PayByPhoneScript() override;
|
||||||
|
|
||||||
|
PayByPhoneScript(
|
||||||
|
AccountInfo account,
|
||||||
|
QString phone,
|
||||||
|
QString bankName,
|
||||||
|
double amount,
|
||||||
|
QObject *parent = nullptr
|
||||||
|
);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void doStart() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const AccountInfo m_account;
|
||||||
|
const QString m_phone;
|
||||||
|
const QString m_bankName;
|
||||||
|
const double m_amount;
|
||||||
|
QString m_error;
|
||||||
|
|
||||||
|
void makePayment(
|
||||||
|
const QString &deviceId,
|
||||||
|
const QString &pinCode,
|
||||||
|
int width,
|
||||||
|
int height
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Ozon
|
||||||
1067
android/ozon/ScreenXmlParser.cpp
Normal file
63
android/ozon/ScreenXmlParser.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QDomElement>
|
||||||
|
#include "android/xml/Node.h"
|
||||||
|
#include "db/AccountInfo.h"
|
||||||
|
#include "db/TransactionInfo.h"
|
||||||
|
|
||||||
|
namespace Ozon {
|
||||||
|
|
||||||
|
class ScreenXmlParser final : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ScreenXmlParser(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
~ScreenXmlParser() override;
|
||||||
|
|
||||||
|
Node tryToFindBannerOrDialog(int width, int height);
|
||||||
|
|
||||||
|
Node tryToFindSecurityBanner();
|
||||||
|
|
||||||
|
Node tryToFindSelectBottomSheet();
|
||||||
|
|
||||||
|
Node findTextNode(const QString &text);
|
||||||
|
|
||||||
|
Node findTextNode(const QString &text, int x1, int y1, int x2, int y2);
|
||||||
|
|
||||||
|
Node findFirstEditText();
|
||||||
|
|
||||||
|
Node findButtonNode(const QString &text, bool contains);
|
||||||
|
|
||||||
|
Node findNodeByContentDesc(const QString &contentDesc);
|
||||||
|
|
||||||
|
bool isHomeScreen();
|
||||||
|
|
||||||
|
|
||||||
|
QList<Node> tryToFindPinCode(const QString &pinCode, const QString &title);
|
||||||
|
|
||||||
|
QList<Node> getLast2DaysTransactions();
|
||||||
|
|
||||||
|
void parseAndSaveXml(const QString &xml);
|
||||||
|
|
||||||
|
TransactionInfo parseTransactionInfoHistory(int screenWidth, int screenHeight);
|
||||||
|
TransactionInfo parseTransactionInfo(int screenWidth, int screenHeight);
|
||||||
|
|
||||||
|
QList<TransactionInfo> parseTodayAndYesterdayReportHistory();
|
||||||
|
|
||||||
|
QList<TransactionInfo> parseTodayAndYesterdayHistory();
|
||||||
|
|
||||||
|
|
||||||
|
QList<QPair<AccountInfo, Node> > parseAccountsInfo();
|
||||||
|
|
||||||
|
void test();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList<Node> m_nodes;
|
||||||
|
QDomElement m_xml;
|
||||||
|
|
||||||
|
QList<Node> findPinCodeNodes(const QString &pinCode);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Ozon
|
||||||
@ -8,6 +8,8 @@
|
|||||||
#include "adb/AdbUtils.h"
|
#include "adb/AdbUtils.h"
|
||||||
#include "net/NetworkService.h"
|
#include "net/NetworkService.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
CommonScript::CommonScript(QObject *parent)
|
CommonScript::CommonScript(QObject *parent)
|
||||||
: QObject(parent) {
|
: QObject(parent) {
|
||||||
}
|
}
|
||||||
@ -291,3 +293,5 @@ void CommonScript::updateTransactionData(
|
|||||||
void CommonScript::stop() {
|
void CommonScript::stop() {
|
||||||
m_running = false;
|
m_running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -3,6 +3,8 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include "ScreenXmlParser.h"
|
#include "ScreenXmlParser.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
class CommonScript : public QObject {
|
class CommonScript : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -72,3 +74,5 @@ public slots:
|
|||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(CommonScript);
|
Q_DISABLE_COPY(CommonScript);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -15,6 +15,8 @@
|
|||||||
#include "net/NetworkService.h"
|
#include "net/NetworkService.h"
|
||||||
#include "time/DateUtils.h"
|
#include "time/DateUtils.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
GetLastDaysHistoryScript::GetLastDaysHistoryScript(
|
GetLastDaysHistoryScript::GetLastDaysHistoryScript(
|
||||||
AccountInfo account,
|
AccountInfo account,
|
||||||
QObject *parent
|
QObject *parent
|
||||||
@ -393,3 +395,5 @@ void GetLastDaysHistoryScript::doStart() {
|
|||||||
AdbUtils::goBack(m_account.deviceId);
|
AdbUtils::goBack(m_account.deviceId);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -1,6 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "CommonScript.h"
|
#include "CommonScript.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
class GetLastDaysHistoryScript final : public CommonScript {
|
class GetLastDaysHistoryScript final : public CommonScript {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -33,3 +35,5 @@ private:
|
|||||||
const QString &newDesc
|
const QString &newDesc
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -8,6 +8,8 @@
|
|||||||
#include "ScreenXmlParser.h"
|
#include "ScreenXmlParser.h"
|
||||||
#include "adb/AdbUtils.h"
|
#include "adb/AdbUtils.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
|
|
||||||
HomeScreenScript::HomeScreenScript(QObject *parent)
|
HomeScreenScript::HomeScreenScript(QObject *parent)
|
||||||
: QObject(parent) {
|
: QObject(parent) {
|
||||||
@ -507,3 +509,5 @@ void HomeScreenScript::start() {
|
|||||||
void HomeScreenScript::stop() {
|
void HomeScreenScript::stop() {
|
||||||
m_running = false;
|
m_running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
#include "ScreenXmlParser.h"
|
#include "ScreenXmlParser.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
class HomeScreenScript final : public QObject {
|
class HomeScreenScript final : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -33,3 +35,5 @@ private:
|
|||||||
int height
|
int height
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -5,6 +5,8 @@
|
|||||||
#include "dao/ApplicationDAO.h"
|
#include "dao/ApplicationDAO.h"
|
||||||
#include "dao/DeviceDAO.h"
|
#include "dao/DeviceDAO.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
LoginAndCheckAccountsScript::LoginAndCheckAccountsScript(
|
LoginAndCheckAccountsScript::LoginAndCheckAccountsScript(
|
||||||
QString deviceId,
|
QString deviceId,
|
||||||
QString appCode,
|
QString appCode,
|
||||||
@ -63,3 +65,5 @@ void LoginAndCheckAccountsScript::doStart() {
|
|||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -1,6 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "CommonScript.h"
|
#include "CommonScript.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
class LoginAndCheckAccountsScript final : public CommonScript {
|
class LoginAndCheckAccountsScript final : public CommonScript {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -20,4 +22,6 @@ private:
|
|||||||
const QString m_deviceId;
|
const QString m_deviceId;
|
||||||
const QString m_appCode;
|
const QString m_appCode;
|
||||||
QString m_error;
|
QString m_error;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -13,6 +13,8 @@
|
|||||||
#include "db/ApplicationInfo.h"
|
#include "db/ApplicationInfo.h"
|
||||||
#include "db/DeviceInfo.h"
|
#include "db/DeviceInfo.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
PayByPhoneScript::PayByPhoneScript(
|
PayByPhoneScript::PayByPhoneScript(
|
||||||
AccountInfo account,
|
AccountInfo account,
|
||||||
QString phone,
|
QString phone,
|
||||||
@ -334,3 +336,5 @@ void PayByPhoneScript::doStart() {
|
|||||||
|
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -1,6 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "CommonScript.h"
|
#include "CommonScript.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
class PayByPhoneScript final : public CommonScript {
|
class PayByPhoneScript final : public CommonScript {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -32,3 +34,5 @@ private:
|
|||||||
int height
|
int height
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -15,6 +15,8 @@
|
|||||||
#include "db/TransactionInfo.h"
|
#include "db/TransactionInfo.h"
|
||||||
#include "time/DateUtils.h"
|
#include "time/DateUtils.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
ScreenXmlParser::ScreenXmlParser(QObject *parent) : QObject(parent) {
|
ScreenXmlParser::ScreenXmlParser(QObject *parent) : QObject(parent) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -974,3 +976,5 @@ void ScreenXmlParser::test() {
|
|||||||
// qDebug().noquote().nospace() << convertTransactionToString(info);
|
// qDebug().noquote().nospace() << convertTransactionToString(info);
|
||||||
// ЕСПП
|
// ЕСПП
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -6,6 +6,8 @@
|
|||||||
#include "db/AccountInfo.h"
|
#include "db/AccountInfo.h"
|
||||||
#include "db/TransactionInfo.h"
|
#include "db/TransactionInfo.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
class ScreenXmlParser final : public QObject {
|
class ScreenXmlParser final : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -55,3 +57,5 @@ private:
|
|||||||
|
|
||||||
QList<Node> findPinCodeNodes(const QString &pinCode);
|
QList<Node> findPinCodeNodes(const QString &pinCode);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -1,5 +1,7 @@
|
|||||||
#include "SyncAccountDataScript.h"
|
#include "SyncAccountDataScript.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
SyncAccountDataScript::SyncAccountDataScript(
|
SyncAccountDataScript::SyncAccountDataScript(
|
||||||
QString deviceId,
|
QString deviceId,
|
||||||
QObject *parent
|
QObject *parent
|
||||||
@ -12,4 +14,6 @@ SyncAccountDataScript::~SyncAccountDataScript() = default;
|
|||||||
void SyncAccountDataScript::doStart() {
|
void SyncAccountDataScript::doStart() {
|
||||||
|
|
||||||
// 1.
|
// 1.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -1,6 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "CommonScript.h"
|
#include "CommonScript.h"
|
||||||
|
|
||||||
|
namespace Rshb {
|
||||||
|
|
||||||
class SyncAccountDataScript final : public CommonScript {
|
class SyncAccountDataScript final : public CommonScript {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -19,3 +21,4 @@ private:
|
|||||||
const QString m_deviceId;
|
const QString m_deviceId;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Rshb
|
||||||
@ -113,7 +113,7 @@ void GetLastDaysHistoryTossScript::doStart() {
|
|||||||
|
|
||||||
|
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
Node transferText = xmlScreenParser.findTextContainsNode("토스뱅크 통장");
|
Node transferText = xmlScreenParser.findFirstAccountLine();
|
||||||
if (!transferText.isEmpty()) {
|
if (!transferText.isEmpty()) {
|
||||||
AdbUtils::makeTap(device.id, transferText.x(), transferText.y());
|
AdbUtils::makeTap(device.id, transferText.x(), transferText.y());
|
||||||
QThread::msleep(3000);
|
QThread::msleep(3000);
|
||||||
@ -142,11 +142,7 @@ void GetLastDaysHistoryTossScript::doStart() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
break;
|
||||||
m_error = "Card page not found: " + m_account.deviceId + " " + m_account.lastNumbers;
|
|
||||||
qWarning() << m_error;
|
|
||||||
emit finishedWithResult(m_error);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
#include "LoginAndCheckAccountsTossScript.h"
|
#include "LoginAndCheckAccountsTossScript.h"
|
||||||
|
|
||||||
|
#include <QRandomGenerator>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
|
||||||
#include "adb/AdbUtils.h"
|
#include "adb/AdbUtils.h"
|
||||||
@ -63,50 +64,220 @@ void LoginAndCheckAccountsTossScript::doStart() {
|
|||||||
|
|
||||||
|
|
||||||
if (true) {
|
if (true) {
|
||||||
|
|
||||||
|
if (true) {
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
auto accounts = xmlScreenParser.parseAccountsInfo();
|
||||||
|
if (!accounts.empty()) {
|
||||||
|
qDebug() << "--- Finish, amount: " << QString::number(accounts[0].amount);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
// находим первую кнопку Transfer
|
||||||
// искать Transfer кнопку
|
Node transferText = xmlScreenParser.findButtonNode("Transfer", false);
|
||||||
|
|
||||||
// Node transferText = xmlScreenParser.findTextContainsNode("토스뱅크 통장");
|
|
||||||
// if (transferText.isEmpty()) {
|
|
||||||
// }
|
|
||||||
|
|
||||||
Node transferText = xmlScreenParser.findFirstAccountLine();
|
|
||||||
if (!transferText.isEmpty()) {
|
if (!transferText.isEmpty()) {
|
||||||
AdbUtils::makeTap(device.id, transferText.x(), transferText.y());
|
AdbUtils::makeTap(m_deviceId, transferText.x(), transferText.y());
|
||||||
QThread::msleep(3000);
|
QThread::msleep(1000);
|
||||||
|
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
Node enterAmount = xmlScreenParser.findEditText("Enter account number");
|
||||||
|
if (!enterAmount.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, enterAmount.x(), enterAmount.y());
|
||||||
|
QThread::msleep(200);
|
||||||
|
|
||||||
bool historyFound = false;
|
AdbUtils::inputText(m_deviceId, "51291082442507");
|
||||||
for (int i = 0; i < 5; ++i) {
|
QThread::msleep(200);
|
||||||
Node topUpBtn = xmlScreenParser.findButtonNode("Top up", false);
|
|
||||||
Node sendBtn = xmlScreenParser.findButtonNode("Send", false);
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
Node inputBank = xmlScreenParser.findNodeByClassName("android.widget.Spinner");
|
||||||
|
if (!inputBank.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, inputBank.x(), inputBank.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
|
||||||
if (!topUpBtn.isEmpty() && !sendBtn.isEmpty()) {
|
|
||||||
// подгрузка истории идет
|
|
||||||
QThread::msleep(2000);
|
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
|
||||||
QList<TransactionInfo> transactions = xmlScreenParser.parsePositiveTransactions();
|
bool foundBank = false;
|
||||||
for (auto &transaction: transactions) {
|
for (int i = 0; i < 5; ++i) {
|
||||||
qDebug().noquote().nospace() << convertTransactionToString(transaction);
|
Node bank = xmlScreenParser.findTextNode("Hana");
|
||||||
|
if (!bank.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, bank.x(), bank.y());
|
||||||
|
QThread::msleep(200);
|
||||||
|
foundBank = true;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
AdbUtils::makeSwipe(
|
||||||
|
m_deviceId,
|
||||||
|
device.screenWidth / 2, device.screenHeight / 4 * 3,
|
||||||
|
device.screenWidth / 2, device.screenHeight / 2
|
||||||
|
);
|
||||||
|
QThread::msleep(500);
|
||||||
|
}
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
}
|
}
|
||||||
historyFound = true;
|
|
||||||
break;
|
if (!foundBank) {
|
||||||
|
m_error = "Bank not found: " + m_deviceId + " " + m_appCode;
|
||||||
|
qCritical() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
Node confirmTransfer = xmlScreenParser.findButtonNode("Confirm", false);
|
||||||
|
if (!confirmTransfer.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, confirmTransfer.x(), confirmTransfer.y());
|
||||||
|
QThread::msleep(3000);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
|
||||||
|
bool enterAmountFound = false;
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
Node enterAmountText = xmlScreenParser.findTextNode("Enter amount");
|
||||||
|
if (!enterAmountText.isEmpty()) {
|
||||||
|
// AdbUtils::makeTap(m_deviceId, enterAmountText.x(), enterAmountText.y());
|
||||||
|
// QThread::msleep(500);
|
||||||
|
enterAmountFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enterAmountFound) {
|
||||||
|
m_error = "Enter amount not found: " + m_deviceId + " " + m_appCode;
|
||||||
|
qCritical() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
Node closeBtn = xmlScreenParser.findButtonNode("확인", false);
|
||||||
|
if (!closeBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, closeBtn.x(), closeBtn.y());
|
||||||
|
QThread::msleep(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
for (Node &number: xmlScreenParser.getNodeNumbers(4)) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, number.x(), number.y());
|
||||||
|
QThread::msleep(QRandomGenerator::global()->bounded(200, 901));
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdbUtils::inputText(m_deviceId, "2");
|
||||||
|
QThread::msleep(1000);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
Node nextBtn = xmlScreenParser.findButtonNode("Next", false);
|
||||||
|
if (!nextBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, nextBtn.x(), nextBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
Node sendBtn = xmlScreenParser.findButtonNode("Send", false);
|
||||||
|
if (!sendBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, sendBtn.x(), sendBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(
|
||||||
|
AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
Node sendAgainBtn = xmlScreenParser.findButtonNode("Send", false);
|
||||||
|
if (!sendAgainBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, sendAgainBtn.x(), sendAgainBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool findAndInputPincode = false;
|
||||||
|
xmlScreenParser.parseAndSaveXml(
|
||||||
|
AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
if (const QList<Node> pincode = xmlScreenParser.findPinCodeNodes(app.pinCode);
|
||||||
|
pincode.size() == 6) {
|
||||||
|
for (const Node &node: pincode) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, node.x(), node.y());
|
||||||
|
QThread::msleep(QRandomGenerator::global()->bounded(200, 901));
|
||||||
|
}
|
||||||
|
findAndInputPincode = true;
|
||||||
|
QThread::msleep(2000);
|
||||||
|
}
|
||||||
|
if (!findAndInputPincode) {
|
||||||
|
m_error = "Pincode not found: " + m_deviceId + " " + m_appCode;
|
||||||
|
qCritical() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(
|
||||||
|
AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
bool foundConfirmBtn = false;
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
Node confirmBtn = xmlScreenParser.findButtonNode("Confirm", false);
|
||||||
|
if (!confirmBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, confirmBtn.x(), confirmBtn.y());
|
||||||
|
foundConfirmBtn = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundConfirmBtn) {
|
||||||
|
m_error = "Last Confirm button not found: " + m_deviceId + " " + m_appCode;
|
||||||
|
qCritical() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
Node lastBtn = xmlScreenParser.findTextNode("닫기");
|
||||||
|
Node lastBtn2 = xmlScreenParser.findTextNode("Close");
|
||||||
|
if (!lastBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, lastBtn.x(), lastBtn.y());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!lastBtn2.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(m_deviceId, lastBtn2.x(), lastBtn2.y());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
qDebug() << "--- Finish: " << xmlScreenParser.parseAccountAmount();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Next button not found: " + m_deviceId + " " + m_appCode;
|
||||||
|
qCritical() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Confirm transfer button not found: " + m_deviceId + " " + m_appCode;
|
||||||
|
qCritical() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Input bank not found: " + m_deviceId + " " + m_appCode;
|
||||||
|
qCritical() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
QThread::msleep(1000);
|
} else {
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
m_error = "Enter account number not found: " + m_deviceId + " " + m_appCode;
|
||||||
}
|
qCritical() << m_error;
|
||||||
if (!historyFound) {
|
|
||||||
m_error = "Top up or send button not found: " + m_deviceId + " " + m_appCode;
|
|
||||||
qWarning() << m_error;
|
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m_error = "Card not found: " + m_deviceId + " " + m_appCode;
|
m_error = "Transfer button not found: " + m_deviceId + " " + m_appCode;
|
||||||
qWarning() << m_error;
|
qCritical() << m_error;
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
350
android/toss/PayByCardTossScript.cpp
Normal file
@ -0,0 +1,350 @@
|
|||||||
|
#include "PayByCardTossScript.h"
|
||||||
|
|
||||||
|
#include <QRandomGenerator>
|
||||||
|
#include <QThread>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include "DatabaseManager.h"
|
||||||
|
#include "adb/AdbUtils.h"
|
||||||
|
#include "dao/AccountDAO.h"
|
||||||
|
#include "dao/ApplicationDAO.h"
|
||||||
|
#include "dao/DeviceDAO.h"
|
||||||
|
#include "dao/TransactionDAO.h"
|
||||||
|
#include "db/ApplicationInfo.h"
|
||||||
|
#include "db/DeviceInfo.h"
|
||||||
|
#include "time/DateUtils.h"
|
||||||
|
|
||||||
|
PayByCardTossScript::PayByCardTossScript(
|
||||||
|
AccountInfo account,
|
||||||
|
QString iban,
|
||||||
|
QString fullName,
|
||||||
|
const double amount,
|
||||||
|
QObject *parent
|
||||||
|
) : CommonTossScript(parent),
|
||||||
|
m_account(std::move(account)),
|
||||||
|
m_fullName(std::move(fullName)), m_amount(amount) {
|
||||||
|
}
|
||||||
|
|
||||||
|
PayByCardTossScript::~PayByCardTossScript() = default;
|
||||||
|
|
||||||
|
|
||||||
|
void PayByCardTossScript::makePayment(const DeviceInfo &device) {
|
||||||
|
// Оплата со страницы карты
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
Node editIbanEditText = xmlScreenParser.findEditTextByResourceId("com.Toss.Tossmobil:id/edit_iban");
|
||||||
|
Node fullNameEditText = xmlScreenParser.findEditTextByResourceId("com.Toss.Tossmobil:id/edit_full_name");
|
||||||
|
if (!editIbanEditText.isEmpty() && !fullNameEditText.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, editIbanEditText.x(), editIbanEditText.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
// AdbUtils::inputText(device.id, m_iban);
|
||||||
|
|
||||||
|
AdbUtils::makeTap(device.id, editIbanEditText.x(), editIbanEditText.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
AdbUtils::inputText(device.id, m_fullName);
|
||||||
|
|
||||||
|
Node nextBtn = xmlScreenParser.findButtonNode("NEXT", false);
|
||||||
|
AdbUtils::makeTap(device.id, nextBtn.x(), nextBtn.y());
|
||||||
|
|
||||||
|
bool findSenderAccount = false;
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
|
||||||
|
Node senderAccount = xmlScreenParser.findTextNode("Sender Account");
|
||||||
|
if (!senderAccount.isEmpty()) {
|
||||||
|
// Node inputBankName = xmlScreenParser.findAccountButton(m_account.lastNumbers);
|
||||||
|
// if (!inputBankName.isEmpty()) {
|
||||||
|
// AdbUtils::makeTap(device.id, inputBankName.x(), inputBankName.y());
|
||||||
|
// QThread::msleep(500);
|
||||||
|
|
||||||
|
|
||||||
|
// // FXIME скорее всего придется нажать кнопку NEXT
|
||||||
|
// findSenderAccount = true;
|
||||||
|
// }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!findSenderAccount) {
|
||||||
|
m_error = "Не нашли Sender Account";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool findAmountDetermination = false;
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
|
||||||
|
Node amountDetermination = xmlScreenParser.findTextNode("Amount Determination");
|
||||||
|
if (!amountDetermination.isEmpty()) {
|
||||||
|
Node integerEditText = xmlScreenParser.findEditTextByResourceId(
|
||||||
|
"com.Toss.Tossmobil:id/edit_text_integer");
|
||||||
|
Node decimalEditText = xmlScreenParser.findEditTextByResourceId(
|
||||||
|
"com.Toss.Tossmobil:id/edit_text_decimal");
|
||||||
|
if (!integerEditText.isEmpty() && !decimalEditText.isEmpty()) {
|
||||||
|
int integerPart = static_cast<int>(m_amount);
|
||||||
|
AdbUtils::makeTap(device.id, integerEditText.x(), integerEditText.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
AdbUtils::inputText(device.id, QString::number(integerPart));
|
||||||
|
|
||||||
|
int decimalPart = static_cast<int>((m_amount - integerPart) * 100);
|
||||||
|
AdbUtils::makeTap(device.id, decimalEditText.x(), decimalEditText.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
AdbUtils::inputText(device.id, QString::number(decimalPart));
|
||||||
|
|
||||||
|
findAmountDetermination = true;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
m_error = "Не нашли поля ввода для ввода суммы перевода";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!findAmountDetermination) {
|
||||||
|
m_error = "Не нашли Amount Determination";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool findDetailDefinition = false;
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
Node fastTransferBtn = xmlScreenParser.findButtonNode("FAST TRANSFER", false);
|
||||||
|
if (!fastTransferBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, fastTransferBtn.x(), fastTransferBtn.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Node detailDefinitionTitle = xmlScreenParser.findTextNode("Detail Definition");
|
||||||
|
Node pleaseChooseBtn = xmlScreenParser.findButtonNode("Please choose", false);
|
||||||
|
if (!detailDefinitionTitle.isEmpty() && !pleaseChooseBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, pleaseChooseBtn.x(), pleaseChooseBtn.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
|
||||||
|
Node searchEditText = xmlScreenParser.
|
||||||
|
findEditTextByResourceId("com.Toss.Tossmobil:id/input_search");
|
||||||
|
if (!searchEditText.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, searchEditText.x(), searchEditText.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
// FIXME "Individual Payment" или "Other Payments" если нет одного, то надо другой
|
||||||
|
AdbUtils::inputText(device.id, "Other Payments");
|
||||||
|
QThread::msleep(1000);
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
|
||||||
|
Node otherPaymentsText = xmlScreenParser.findTextNode("Other Payments");
|
||||||
|
if (!otherPaymentsText.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, otherPaymentsText.x(), otherPaymentsText.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
findDetailDefinition = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
Node otherPaymentsText = xmlScreenParser.findTextNode("Other Payments");
|
||||||
|
if (otherPaymentsText.isEmpty()) {
|
||||||
|
AdbUtils::makeSwipe(
|
||||||
|
m_account.deviceId,
|
||||||
|
device.screenWidth / 2, device.screenHeight / 4 * 3,
|
||||||
|
device.screenWidth / 2, device.screenHeight / 4
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
AdbUtils::makeTap(device.id, otherPaymentsText.x(), otherPaymentsText.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
findDetailDefinition = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
QThread::msleep(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!findDetailDefinition) {
|
||||||
|
m_error = "Не нашли Detail Definition";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
Node nextBtn4 = xmlScreenParser.findButtonNode("NEXT", false);
|
||||||
|
AdbUtils::makeTap(device.id, nextBtn4.x(), nextBtn4.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
|
||||||
|
Node checkInfo = xmlScreenParser.findTextNode(
|
||||||
|
"Check the details of the transaction you shall realize and approve your transaction.");
|
||||||
|
if (!checkInfo.isEmpty()) {
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
Node confirmBtn = xmlScreenParser.findButtonNode("CONFIRM", false);
|
||||||
|
if (confirmBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeSwipe(
|
||||||
|
m_account.deviceId,
|
||||||
|
device.screenWidth / 2, device.screenHeight / 4 * 3,
|
||||||
|
device.screenWidth / 2, device.screenHeight / 4
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
AdbUtils::makeTap(device.id, confirmBtn.x(), confirmBtn.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
QThread::msleep(500);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
Node successText = xmlScreenParser.findTextNode("Your transaction is successfully realized.");
|
||||||
|
if (!successText.isEmpty()) {
|
||||||
|
Node receiptBtn = xmlScreenParser.findButtonNode("RECEIPT", false);
|
||||||
|
if (!receiptBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, receiptBtn.x(), receiptBtn.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
||||||
|
|
||||||
|
Node sendBtn = xmlScreenParser.findButtonNode("SEND E-MAIL", false);
|
||||||
|
if (!sendBtn.isEmpty()) {
|
||||||
|
AdbUtils::takeXmlDump(
|
||||||
|
device.id, "pay_by_iban_finish_transactions_" + QString::number(m_account.id)
|
||||||
|
);
|
||||||
|
// Успешная транзакция
|
||||||
|
// TODO считываем все данные по переводу
|
||||||
|
TransactionInfo transaction;
|
||||||
|
transaction.name = m_fullName;
|
||||||
|
transaction.accountId = m_account.id;
|
||||||
|
transaction.amount = -m_amount;
|
||||||
|
transaction.fee = 0;
|
||||||
|
transaction.status = TransactionStatus::Complete;
|
||||||
|
transaction.type = TransactionType::Iban;
|
||||||
|
transaction.updateTime = DateUtils::getUtcNow();
|
||||||
|
transaction.completeTime = DateUtils::getUtcNow();
|
||||||
|
transaction.timestamp = DateUtils::getUtcNow();
|
||||||
|
transaction.id = TransactionDAO::insertTransaction(transaction);
|
||||||
|
if (transaction.id == -1) {
|
||||||
|
// FIXME alert!!
|
||||||
|
qDebug() << "Transaction has not inserted...";
|
||||||
|
}
|
||||||
|
|
||||||
|
postNewTransactionData(m_account, transaction);
|
||||||
|
|
||||||
|
Node backBtn = xmlScreenParser.findButtonNode("BACK", false);
|
||||||
|
if (!backBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, backBtn.x(), backBtn.y());
|
||||||
|
QThread::msleep(500);
|
||||||
|
|
||||||
|
Node returnBtn = xmlScreenParser.findButtonNode("RETURN TO HOME PAGE", false);
|
||||||
|
if (!returnBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, returnBtn.x(), returnBtn.y());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//FIXME не успешная транзакция
|
||||||
|
AdbUtils::takeXmlDump(
|
||||||
|
device.id, "pay_by_iban_fail_transactions_receipt_" + QString::number(m_account.id)
|
||||||
|
);
|
||||||
|
m_error = "Транзакция не успешна";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Транзакция не успешна";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Не нашли Check the details title info";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Не нашли поля ввода для IBAN";
|
||||||
|
qDebug() << m_error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PayByCardTossScript::doStart() {
|
||||||
|
const DeviceInfo device = DeviceDAO::getDeviceById(m_account.deviceId);
|
||||||
|
const ApplicationInfo app = ApplicationDAO::getApplication(m_account.deviceId, m_account.appCode);
|
||||||
|
|
||||||
|
if (device.id.isEmpty() || app.id == -1) {
|
||||||
|
m_error = "Device or app not found.";
|
||||||
|
qDebug() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
if (!xmlScreenParser.isHomeScreen()) {
|
||||||
|
if (!runAppAndGoToHomeScreen(device.id, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
||||||
|
m_error = "Не смогли дойти до домашней страницы";
|
||||||
|
qDebug() << m_error;
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
Node allTransactionsNav = xmlScreenParser.findTextNode("Transactions");
|
||||||
|
if (!allTransactionsNav.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, allTransactionsNav.x(), allTransactionsNav.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
|
||||||
|
// перешли на страницу транзакций
|
||||||
|
Node allTransactionsTitle = xmlScreenParser.findTextNode(
|
||||||
|
"Transactions", 0, 0, device.screenWidth, device.screenHeight / 2
|
||||||
|
);
|
||||||
|
Node moneyTransfersBtn = xmlScreenParser.findTextNode("Money Transfers");
|
||||||
|
if (!allTransactionsTitle.isEmpty() && !moneyTransfersBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, moneyTransfersBtn.x(), moneyTransfersBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
|
||||||
|
// перешли на страницу переводов
|
||||||
|
Node moneyTransfersTitle = xmlScreenParser.findTextNode(
|
||||||
|
"Money Transfers", 0, 0, device.screenWidth, device.screenHeight / 2
|
||||||
|
);
|
||||||
|
Node transferToOtherAccountBtn = xmlScreenParser.findTextNode("Transfer to Other Account");
|
||||||
|
if (!moneyTransfersTitle.isEmpty() && !transferToOtherAccountBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, transferToOtherAccountBtn.x(), transferToOtherAccountBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||||||
|
|
||||||
|
Node transferToOtherAccountTitle = xmlScreenParser.findTextNode(
|
||||||
|
"Transfer to Other Account", 0, 0, device.screenWidth, device.screenHeight / 2
|
||||||
|
);
|
||||||
|
Node aNewRecipientBtn = xmlScreenParser.findTextNode("A New Recipient");
|
||||||
|
if (!transferToOtherAccountTitle.isEmpty() && !aNewRecipientBtn.isEmpty()) {
|
||||||
|
AdbUtils::makeTap(device.id, aNewRecipientBtn.x(), aNewRecipientBtn.y());
|
||||||
|
QThread::msleep(1000);
|
||||||
|
|
||||||
|
makePayment(device);
|
||||||
|
} else {
|
||||||
|
m_error = "Не нашли кнопку 'A New Recipient'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Не нашли кнопку 'Transfer to Other Account'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Не нашли кнопку 'Money Transfers'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_error = "Не нашли пункт меню 'Transactions'";
|
||||||
|
qDebug() << m_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_error.isEmpty()) {
|
||||||
|
AdbUtils::takeXmlDump(device.id, "pay_by_iban_fail_transactions_" + QString::number(m_account.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
emit finishedWithResult(m_error);
|
||||||
|
}
|
||||||
30
android/toss/PayByCardTossScript.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "CommonTossScript.h"
|
||||||
|
#include "db/DeviceInfo.h"
|
||||||
|
|
||||||
|
class PayByCardTossScript final : public CommonTossScript {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
~PayByCardTossScript() override;
|
||||||
|
|
||||||
|
PayByCardTossScript(
|
||||||
|
AccountInfo account,
|
||||||
|
QString CardToss,
|
||||||
|
QString fullName,
|
||||||
|
double amount,
|
||||||
|
QObject *parent = nullptr
|
||||||
|
);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void doStart() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const AccountInfo m_account;
|
||||||
|
const QString m_CardToss;
|
||||||
|
const QString m_fullName;
|
||||||
|
const double m_amount;
|
||||||
|
QString m_error;
|
||||||
|
|
||||||
|
void makePayment(const DeviceInfo &device);
|
||||||
|
};
|
||||||
@ -68,6 +68,33 @@ Node ScreenXmlTossParser::findEditTextByResourceId(const QString &resourceId) {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QList<Node> ScreenXmlTossParser::getNodeNumbers(double value) {
|
||||||
|
// Формат 'f' с precision = 0 — дробная часть отбрасывается
|
||||||
|
QString str = QString::number(value, 'f', 0);
|
||||||
|
// Разбиваем на отдельные символы
|
||||||
|
QList<Node> nodes;
|
||||||
|
for (QChar ch: str) {
|
||||||
|
QString num = QString(ch);
|
||||||
|
for (const Node &node: m_nodes) {
|
||||||
|
if (node.contentDesc == num && node.className == "android.widget.Button") {
|
||||||
|
nodes.append(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
Node ScreenXmlTossParser::findNodeByClassName(const QString &className) {
|
||||||
|
for (const Node &node: m_nodes) {
|
||||||
|
if (node.className == className) {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
Node ScreenXmlTossParser::findButtonNode(const QString &text, const bool contains) {
|
Node ScreenXmlTossParser::findButtonNode(const QString &text, const bool contains) {
|
||||||
for (const Node &node: m_nodes) {
|
for (const Node &node: m_nodes) {
|
||||||
if (contains) {
|
if (contains) {
|
||||||
@ -137,7 +164,7 @@ Node convertTossDomElementToNode(const QDomElement &element) {
|
|||||||
node.clickable = element.attribute("clickable") == "true";
|
node.clickable = element.attribute("clickable") == "true";
|
||||||
}
|
}
|
||||||
if (element.hasAttribute("focusable")) {
|
if (element.hasAttribute("focusable")) {
|
||||||
node.focusable =element.attribute("focusable") == "true";
|
node.focusable = element.attribute("focusable") == "true";
|
||||||
}
|
}
|
||||||
if (element.hasAttribute("resource-id")) {
|
if (element.hasAttribute("resource-id")) {
|
||||||
node.resourceId = element.attribute("resource-id");
|
node.resourceId = element.attribute("resource-id");
|
||||||
@ -383,6 +410,70 @@ float extractKoreanWonFromText(const QString &input) {
|
|||||||
return numberStr.toFloat();
|
return numberStr.toFloat();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double parseKoreanNumber(const QString &input) {
|
||||||
|
// Карта корейских единиц в числовые множители
|
||||||
|
static const QMap<QString, double> unitMap = {
|
||||||
|
{QStringLiteral("조"), 1e12},
|
||||||
|
{QStringLiteral("억"), 1e8},
|
||||||
|
{QStringLiteral("만"), 1e4}
|
||||||
|
};
|
||||||
|
// Статические регулярки (Clazy: don't create temporaries)
|
||||||
|
static const QRegularExpression cleanRe(QStringLiteral("[^0-9.,만억조]"));
|
||||||
|
static const QRegularExpression segmentRe(QStringLiteral(R"(([\d,]+(?:\.\d+)?)(조|억|만))"));
|
||||||
|
|
||||||
|
QString s = input;
|
||||||
|
s.remove(cleanRe);
|
||||||
|
|
||||||
|
double total = 0.0;
|
||||||
|
auto it = segmentRe.globalMatch(s);
|
||||||
|
qsizetype pos = 0;
|
||||||
|
|
||||||
|
while (it.hasNext()) {
|
||||||
|
auto match = it.next();
|
||||||
|
QString numStr = match.captured(1);
|
||||||
|
QString unitStr = match.captured(2);
|
||||||
|
|
||||||
|
numStr.remove(',');
|
||||||
|
bool ok = false;
|
||||||
|
const double num = numStr.toDouble(&ok);
|
||||||
|
if (ok)
|
||||||
|
total += num * unitMap.value(unitStr);
|
||||||
|
|
||||||
|
pos = match.capturedEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обработка остатка (обычное число, возможно с дробной частью)
|
||||||
|
QString rem = s.mid(static_cast<int>(pos));
|
||||||
|
rem.remove(',');
|
||||||
|
if (!rem.isEmpty()) {
|
||||||
|
bool ok = false;
|
||||||
|
const double num = rem.toDouble(&ok);
|
||||||
|
if (ok) total += num;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
double ScreenXmlTossParser::parseAccountAmount() {
|
||||||
|
const QDomNodeList nodes = m_xml.elementsByTagName("node");
|
||||||
|
|
||||||
|
for (int i = 0; i < nodes.count(); ++i) {
|
||||||
|
const QDomElement el = nodes.at(i).toElement();
|
||||||
|
|
||||||
|
// Аккаунтов может быть несколько, вот берем первый по списку
|
||||||
|
if (el.attribute("text") == "Top up" && el.attribute("class") == "android.widget.Button") {
|
||||||
|
for (QDomNode node: el.parentNode().childNodes()) {
|
||||||
|
const QDomElement child = node.toElement();
|
||||||
|
if (child.attribute("text").contains("만") || child.attribute("text").contains("원")) {
|
||||||
|
return parseKoreanNumber(child.attribute("text"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
QList<AccountInfo> ScreenXmlTossParser::parseAccountsInfo() {
|
QList<AccountInfo> ScreenXmlTossParser::parseAccountsInfo() {
|
||||||
const QDomNodeList nodes = m_xml.elementsByTagName("node");
|
const QDomNodeList nodes = m_xml.elementsByTagName("node");
|
||||||
QList<AccountInfo> accounts;
|
QList<AccountInfo> accounts;
|
||||||
@ -390,34 +481,28 @@ QList<AccountInfo> ScreenXmlTossParser::parseAccountsInfo() {
|
|||||||
for (int i = 0; i < nodes.count(); ++i) {
|
for (int i = 0; i < nodes.count(); ++i) {
|
||||||
const QDomElement el = nodes.at(i).toElement();
|
const QDomElement el = nodes.at(i).toElement();
|
||||||
|
|
||||||
// 토스뱅크 통장
|
|
||||||
if (el.attribute("content-desc").contains("토스뱅크 통장") && el.attribute("content-desc").contains("₩")) {
|
// Аккаунтов может быть несколько, вот берем первый по списку
|
||||||
AccountInfo info;
|
if (el.attribute("text") == "Transfer") {
|
||||||
info.amount = extractKoreanWonFromText(el.attribute("content-desc"));
|
for (QDomNode node: el.parentNode().parentNode().parentNode().childNodes()) {
|
||||||
info.updateTime = DateUtils::getUtcNow();
|
const QDomElement child = node.toElement();
|
||||||
accounts.append(info);
|
if (child.attribute("content-desc").contains("₩")) {
|
||||||
break;
|
AccountInfo info;
|
||||||
// auto amount = el.attribute("text").replace("₼", "").trimmed();
|
info.amount = extractKoreanWonFromText(child.attribute("content-desc"));
|
||||||
// const QDomElement parent = el.parentNode().parentNode().toElement();
|
info.updateTime = DateUtils::getUtcNow();
|
||||||
// // Перебираем потомков
|
accounts.append(info);
|
||||||
// QDomNode n = parent.firstChild().firstChild().firstChild().firstChild();
|
return accounts;
|
||||||
// while (!n.isNull()) {
|
}
|
||||||
// const QDomElement e = n.toElement();
|
}
|
||||||
// if (e.attribute("resource-id") == "az.kapitalbank.mbanking:id/tvNumber") {
|
|
||||||
// const QString account = e.attribute("text");
|
|
||||||
//
|
|
||||||
// AccountInfo info;
|
|
||||||
// info.lastNumbers = account;
|
|
||||||
// info.amount = amount.toFloat();
|
|
||||||
// info.description = account;
|
|
||||||
// info.updateTime = DateUtils::getUtcNow();
|
|
||||||
//
|
|
||||||
// accounts.append(info);
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// n = n.nextSibling();
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if (el.attribute("content-desc").contains("토스뱅크 통장") && el.attribute("content-desc").contains("₩")) {
|
||||||
|
// AccountInfo info;
|
||||||
|
// info.amount = extractKoreanWonFromText(el.attribute("content-desc"));
|
||||||
|
// info.updateTime = DateUtils::getUtcNow();
|
||||||
|
// accounts.append(info);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
return accounts;
|
return accounts;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,6 +26,8 @@ public:
|
|||||||
|
|
||||||
Node findEditTextByResourceId(const QString &resourceId);
|
Node findEditTextByResourceId(const QString &resourceId);
|
||||||
|
|
||||||
|
Node findNodeByClassName(const QString &className);
|
||||||
|
|
||||||
Node findButtonNode(const QString &text, bool contains);
|
Node findButtonNode(const QString &text, bool contains);
|
||||||
|
|
||||||
bool isHomeScreen();
|
bool isHomeScreen();
|
||||||
@ -36,8 +38,12 @@ public:
|
|||||||
|
|
||||||
QList<AccountInfo> parseAccountsInfo();
|
QList<AccountInfo> parseAccountsInfo();
|
||||||
|
|
||||||
|
double parseAccountAmount();
|
||||||
|
|
||||||
QList<Node> findPinCodeNodes(const QString &pinCode);
|
QList<Node> findPinCodeNodes(const QString &pinCode);
|
||||||
|
|
||||||
|
QList<Node> getNodeNumbers(double value);
|
||||||
|
|
||||||
void test();
|
void test();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
BIN
assets/ozon/ask_biometry.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
450
assets/ozon/ask_biometry.xml
Normal file
@ -0,0 +1,450 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="ru.ozon.fintech.finance:id/action_bar_root"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,0][1080,2400]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="ru.ozon.fintech.finance:id/container"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="ru.ozon.fintech.finance:id/coordinator"
|
||||||
|
class="android.view.ViewGroup" package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node NAF="true" index="0" text=""
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/touch_outside" class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="1" hint=""/>
|
||||||
|
<node index="1" text="" resource-id="ru.ozon.fintech.finance:id/design_bottom_sheet"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,1040][1080,2400]" drawing-order="2"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/base_bottom_sheet_top"
|
||||||
|
class="android.widget.LinearLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,1176][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/base_bottom_sheet_dragger"
|
||||||
|
class="android.view.View" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,1176][1080,1234]" drawing-order="1" hint=""/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/base_bottom_sheet_main_container"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,1234][1080,2337]" drawing-order="3" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/cbottom_recycler"
|
||||||
|
class="androidx.recyclerview.widget.RecyclerView"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,1234][1080,2337]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,1234][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,1234][1080,2337]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.LinearLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,1276][1038,2295]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[361,1276][718,1633]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[361,1276][718,1633]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[455,1370][624,1539]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,1633][1038,1654]" drawing-order="2"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,1633][1038,1654]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,1633][1038,1654]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,1654][1038,1788]" drawing-order="3"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,1654][1038,1788]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="Быстрый вход"
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/text_atom"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,1675][1017,1767]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,1788][1038,1938]" drawing-order="4"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,1788][1038,1938]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0"
|
||||||
|
text="Подключите, чтобы не вводить пароль каждый раз"
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/text_atom"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,1809][1017,1917]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,1938][1038,1959]" drawing-order="5"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,1938][1038,1959]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,1938][1038,1959]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="5" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,1959][1038,2106]" drawing-order="6"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,1959][1038,2106]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,1959][1038,2106]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[412,2006][667,2059]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="Подключить"
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/mainViewId"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[412,2006][667,2059]"
|
||||||
|
drawing-order="2" hint=""/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[412,2006][667,2059]"
|
||||||
|
drawing-order="4" hint=""/>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[412,2056][667,2059]"
|
||||||
|
drawing-order="3" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="6" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,2106][1038,2148]" drawing-order="7"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,2106][1038,2148]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,2106][1038,2148]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="7" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,2148][1038,2295]" drawing-order="8"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,2148][1038,2295]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,2148][1038,2295]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[435,2195][644,2248]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="Не сейчас"
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/mainViewId"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[435,2195][644,2248]"
|
||||||
|
drawing-order="2" hint=""/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[435,2195][644,2248]"
|
||||||
|
drawing-order="4" hint=""/>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[435,2245][644,2248]"
|
||||||
|
drawing-order="3" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/ozon/home_ad_1.png
Normal file
|
After Width: | Height: | Size: 710 KiB |
1
assets/ozon/home_ad_1.xml
Normal file
BIN
assets/ozon/home_page.png
Normal file
|
After Width: | Height: | Size: 641 KiB |
1507
assets/ozon/home_page.xml
Normal file
BIN
assets/ozon/pay/pay_buy_phone.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
1
assets/ozon/pay/pay_buy_phone.xml
Normal file
BIN
assets/ozon/pay/pay_buy_phone_check_data.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
1
assets/ozon/pay/pay_buy_phone_check_data.xml
Normal file
BIN
assets/ozon/pay/pay_buy_phone_default_bank.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
1
assets/ozon/pay/pay_buy_phone_default_bank.xml
Normal file
BIN
assets/ozon/pay/pay_buy_phone_enter_sum.png
Normal file
|
After Width: | Height: | Size: 101 KiB |
1
assets/ozon/pay/pay_buy_phone_enter_sum.xml
Normal file
BIN
assets/ozon/pay/pay_buy_phone_select_bank.png
Normal file
|
After Width: | Height: | Size: 218 KiB |
1290
assets/ozon/pay/pay_buy_phone_select_bank.xml
Normal file
BIN
assets/ozon/pay/pay_buy_phone_select_bank_1.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
458
assets/ozon/pay/pay_buy_phone_select_bank_1.xml
Normal file
@ -0,0 +1,458 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="ru.ozon.fintech.finance:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,0][1080,2400]"
|
||||||
|
drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="ru.ozon.fintech.finance:id/main_activity_top"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node index="1" text="" resource-id="ru.ozon.fintech.finance:id/over_host_fragment"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,2400]" drawing-order="4" hint="">
|
||||||
|
<node index="0" text="" resource-id="ru.ozon.fintech.finance:id/over_fragment_top"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][1080,2400]" drawing-order="1"
|
||||||
|
hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="3" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,0][1080,2400]"
|
||||||
|
drawing-order="3" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/main_activity_host_fragment"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][1080,2400]" drawing-order="2"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/main_activity_host_fragment"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="ru.ozon.fintech.finance:id/web_view_top"
|
||||||
|
class="android.view.ViewGroup" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/web_view_holder"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,1447]" drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,1447]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.webkit.WebView"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]" drawing-order="0"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="⠀" resource-id=""
|
||||||
|
class="android.webkit.WebView"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,1447]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id="svelte"
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id="MFC2C@sbp"
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,252]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="base-go-back-button"
|
||||||
|
checkable="false"
|
||||||
|
checked="false"
|
||||||
|
clickable="true"
|
||||||
|
enabled="true"
|
||||||
|
focusable="true"
|
||||||
|
focused="false"
|
||||||
|
scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[44,149][133,236]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
<node index="1"
|
||||||
|
text="Кому перевести"
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc=""
|
||||||
|
checkable="false"
|
||||||
|
checked="false"
|
||||||
|
clickable="false"
|
||||||
|
enabled="true"
|
||||||
|
focusable="false"
|
||||||
|
focused="false"
|
||||||
|
scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[372,165][708,223]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="native-toolbar-close-button"
|
||||||
|
checkable="false"
|
||||||
|
checked="false"
|
||||||
|
clickable="true"
|
||||||
|
enabled="true"
|
||||||
|
focusable="true"
|
||||||
|
focused="false"
|
||||||
|
scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[1021,191][1080,252]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,249][1080,1447]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc=""
|
||||||
|
checkable="false"
|
||||||
|
checked="false"
|
||||||
|
clickable="false"
|
||||||
|
enabled="true"
|
||||||
|
focusable="false"
|
||||||
|
focused="false"
|
||||||
|
scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[42,280][1039,430]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0"
|
||||||
|
text="Альфа-банк"
|
||||||
|
resource-id="select-bank-input"
|
||||||
|
class="android.widget.EditText"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc=""
|
||||||
|
checkable="false"
|
||||||
|
checked="false"
|
||||||
|
clickable="true"
|
||||||
|
enabled="true"
|
||||||
|
focusable="true"
|
||||||
|
focused="true"
|
||||||
|
scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[84,349][924,404]"
|
||||||
|
drawing-order="0"
|
||||||
|
hint="Название банка"/>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc=""
|
||||||
|
checkable="false"
|
||||||
|
checked="false"
|
||||||
|
clickable="false"
|
||||||
|
enabled="true"
|
||||||
|
focusable="false"
|
||||||
|
focused="false"
|
||||||
|
scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[42,280][1039,430]"
|
||||||
|
drawing-order="0"
|
||||||
|
hint=""/>
|
||||||
|
<node index="2"
|
||||||
|
text="Название банка"
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc=""
|
||||||
|
checkable="false"
|
||||||
|
checked="false"
|
||||||
|
clickable="false"
|
||||||
|
enabled="true"
|
||||||
|
focusable="false"
|
||||||
|
focused="false"
|
||||||
|
scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[84,307][333,351]"
|
||||||
|
drawing-order="0"
|
||||||
|
hint=""/>
|
||||||
|
<node NAF="true" index="3"
|
||||||
|
text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc=""
|
||||||
|
checkable="false"
|
||||||
|
checked="false"
|
||||||
|
clickable="true"
|
||||||
|
enabled="true"
|
||||||
|
focusable="true"
|
||||||
|
focused="false"
|
||||||
|
scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[931,322][997,388]"
|
||||||
|
drawing-order="0"
|
||||||
|
hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="100000000008"
|
||||||
|
checkable="false"
|
||||||
|
checked="false"
|
||||||
|
clickable="true"
|
||||||
|
enabled="true"
|
||||||
|
focusable="true"
|
||||||
|
focused="false"
|
||||||
|
scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[42,448][1039,609]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="modal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,1446][1080,1446]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
<node index="2" text="⠀"
|
||||||
|
resource-id="svelte-announcer"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][5,5]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,133][1080,1447]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="ru.ozon.fintech.finance" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,1447]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/web_view_toolbar"
|
||||||
|
class="android.view.ViewGroup" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,147]" drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="ru.ozon.fintech.finance:id/main_activity_bottom_navigation_holder"
|
||||||
|
class="android.widget.FrameLayout" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,1311][1080,2400]" drawing-order="3"
|
||||||
|
hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.View" package="ru.ozon.fintech.finance"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[818,0][1080,262]" drawing-order="2" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/ozon/pay/pay_buy_phone_sent_success.png
Normal file
|
After Width: | Height: | Size: 700 KiB |
1
assets/ozon/pay/pay_buy_phone_sent_success.xml
Normal file
BIN
assets/ozon/payments_page.png
Normal file
|
After Width: | Height: | Size: 175 KiB |
1
assets/ozon/payments_page.xml
Normal file
BIN
assets/ozon/pin_code.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
1456
assets/ozon/pin_code.xml
Normal file
BIN
assets/toss/confirmation_oper.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
716
assets/toss/confirmation_oper.xml
Normal file
@ -0,0 +1,716 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/root_view"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_web_view_container"
|
||||||
|
class="android.widget.ViewAnimator" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/lab_swipe_refresh_layout"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="false" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.webkit.WebView"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.webkit.WebView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="true" focused="true"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="__next"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2127]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2127]">
|
||||||
|
<node index="0" text="My 토스뱅크 통장" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[210,282][658,366]"/>
|
||||||
|
<node index="1" text="from" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,282][199,366]"/>
|
||||||
|
<node index="2" text=" " resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[196,282][212,366]"/>
|
||||||
|
<node index="3" text="Balance" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,392][223,450]"/>
|
||||||
|
<node index="4" text=" " resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[217,392][231,450]"/>
|
||||||
|
<node index="5" text="₩" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[228,392][270,450]"/>
|
||||||
|
<node index="6" text="441,747" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[265,392][420,450]"/>
|
||||||
|
<node index="7" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,536][1018,715]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[42,515][1039,736]"/>
|
||||||
|
<node index="1" text="LI MAKSIM VALENTINOVICH"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[133,542][947,626]"/>
|
||||||
|
<node index="2" text="to" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,542][123,626]"/>
|
||||||
|
<node index="3" text=" " resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[120,542][136,626]"/>
|
||||||
|
<node index="4" text="토스뱅크 1002-0458-7450"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[112,652][616,710]"/>
|
||||||
|
</node>
|
||||||
|
<node index="8" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,796][1080,1017]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,796][1080,912]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,796][1080,912]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.EditText"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="false" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[63,796][1080,912]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,796][73,912]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="Enter ・ Balance: ₩441,747"
|
||||||
|
resource-id="" class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,928][640,1017]"/>
|
||||||
|
</node>
|
||||||
|
<node index="9" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1537][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[23,1579][1055,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,1579][1055,1757]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="1" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[23,1579][370,1757]"/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="2" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[367,1579][714,1757]"/>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="3" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[708,1579][1055,1757]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,1752][1055,1928]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="4" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[23,1752][370,1928]"/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="5" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[367,1752][714,1928]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[367,1752][714,1928]"/>
|
||||||
|
<node index="1" text="5" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[514,1789][564,1891]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="6" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[708,1752][1055,1928]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,1925][1055,2101]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="7" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[23,1925][370,2101]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,1925][370,2101]"/>
|
||||||
|
<node index="1" text="7" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[173,1962][223,2064]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="8" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[367,1925][714,2101]"/>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="9" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[708,1925][1055,2101]"/>
|
||||||
|
</node>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,2098][1055,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="00" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[23,2098][370,2186]"/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="0" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[367,2098][714,2186]"/>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="지우기" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[708,2098][1055,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[708,2098][1055,2186]"/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Image"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[855,2167][910,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,88]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,88]"/>
|
||||||
|
<node index="3" text="" resource-id="portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,88]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]">
|
||||||
|
<node index="0" text="" resource-id="__next-route-announcer__"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/app_bar_layout"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,230]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/toolbar"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,230]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Navigate up" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][147,230]"/>
|
||||||
|
<node index="1" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[189,123][607,194]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node NAF="true" index="2" text="" resource-id="viva.republica.toss:id/init_touch_blocker"
|
||||||
|
class="android.view.View" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,230][1080,2186]"/>
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/send_input_container"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,230][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_scroll_view"
|
||||||
|
class="android.widget.ScrollView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,230][1080,1974]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_wrapper"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,884]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/withdraw_account_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,452]">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,262]"/>
|
||||||
|
<node index="4" text="From "
|
||||||
|
resource-id="viva.republica.toss:id/text1_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,262][218,337]"/>
|
||||||
|
<node index="5" text="My 토스뱅크 통장" resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[218,262][639,337]"/>
|
||||||
|
<node index="6" text=""
|
||||||
|
resource-id="viva.republica.toss:id/layout_updated_balance"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,348][1017,420]">
|
||||||
|
<node index="0" text="Balance"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,356][219,415]"/>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[219,356][430,415]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/rolling_number_balance"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc=" 441,747 " checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[235,359][390,413]"/>
|
||||||
|
<node index="1" text="₩"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_suffix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[393,356][430,415]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="7" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,420][1080,452]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/deposit_info_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,452][1080,660]">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,452][1080,484]"/>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/view_text1"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,484][624,559]">
|
||||||
|
<node index="0" text="To Toss Bank acco..."
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,484][624,559]"/>
|
||||||
|
</node>
|
||||||
|
<node index="5" text="Toss Bank 1002-0458-7450"
|
||||||
|
resource-id="viva.republica.toss:id/text2"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="Toss Bank 일공공이-공사오팔-칠사오공" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[63,570][606,628]"/>
|
||||||
|
<node index="6" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,628][1080,660]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/amount_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,671][1080,821]">
|
||||||
|
<node index="0" text="Enter amount"
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,703][1017,778]"/>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/cursor"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[59,703][67,778]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/send_cta_wrapper"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,1974][1080,2186]"/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/progress_bar"
|
||||||
|
class="android.widget.ProgressBar" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[477,1118][603,1244]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/enter_amount.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
265
assets/toss/enter_amount.xml
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,136][1080,2337]"
|
||||||
|
drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/root_view"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,2337]" drawing-order="7" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,136][1080,2337]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_web_view_container"
|
||||||
|
class="android.widget.ViewAnimator" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/lab_swipe_refresh_layout"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="false" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node NAF="true" index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/lab_web_view"
|
||||||
|
class="android.webkit.WebView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="true" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/app_bar_layout"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,278]" drawing-order="8" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/toolbar"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,136][1080,278]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Navigate up" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][147,278]" drawing-order="1" hint=""/>
|
||||||
|
<node index="1" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[189,174][577,240]"
|
||||||
|
drawing-order="3" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node NAF="true" index="2" text="" resource-id="viva.republica.toss:id/init_touch_blocker"
|
||||||
|
class="android.view.View" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,278][1080,2337]" drawing-order="3" hint=""/>
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/send_input_container"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,278][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_scroll_view"
|
||||||
|
class="android.widget.ScrollView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,278][1080,2042]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_wrapper"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,278][1080,916]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/withdraw_account_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,278][1080,493]" drawing-order="1" hint="">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,278][1080,310]" drawing-order="4" hint=""/>
|
||||||
|
<node index="4" text="From "
|
||||||
|
resource-id="viva.republica.toss:id/text1_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,310][210,383]" drawing-order="6" hint=""/>
|
||||||
|
<node index="5" text="My 토스뱅크 통장" resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[210,310][609,383]" drawing-order="7" hint=""/>
|
||||||
|
<node index="6" text=""
|
||||||
|
resource-id="viva.republica.toss:id/layout_updated_balance"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,394][1017,461]" drawing-order="13" hint="">
|
||||||
|
<node index="0" text="Balance"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,402][204,456]" drawing-order="1"
|
||||||
|
hint=""/>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[204,402][380,456]"
|
||||||
|
drawing-order="2" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/rolling_number_balance"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc=" 10,003 " checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[220,405][343,454]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
<node index="1" text="₩"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_suffix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[346,402][380,456]"
|
||||||
|
drawing-order="2" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="7" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,461][1080,493]" drawing-order="5" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/deposit_info_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,493][1080,694]" drawing-order="2" hint="">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,493][1080,525]" drawing-order="4" hint=""/>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/view_text1"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,525][616,598]" drawing-order="6" hint="">
|
||||||
|
<node index="0" text="To Hana Bank acco..."
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,525][616,598]" drawing-order="2"
|
||||||
|
hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="5" text="Hana 512-910824-42507"
|
||||||
|
resource-id="viva.republica.toss:id/text2"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="Hana 오일이-구일공팔이사-사이오공칠" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,609][517,662]" drawing-order="9"
|
||||||
|
hint=""/>
|
||||||
|
<node index="6" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,662][1080,694]" drawing-order="5" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/amount_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,705][1080,853]" drawing-order="3" hint="">
|
||||||
|
<node index="0" text="Enter amount"
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,737][1017,810]" drawing-order="2" hint=""/>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/cursor"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[59,740][67,808]" drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/send_cta_wrapper"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,2042][1080,2337]" drawing-order="3"
|
||||||
|
hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/progress_bar"
|
||||||
|
class="android.widget.ProgressBar" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[477,1174][603,1300]" drawing-order="4" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/enter_amount_error.png
Normal file
|
After Width: | Height: | Size: 121 KiB |
442
assets/toss/enter_amount_error.xml
Normal file
@ -0,0 +1,442 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,136][1080,2337]"
|
||||||
|
drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/root_view"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,2337]" drawing-order="7" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,136][1080,2337]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_web_view_container"
|
||||||
|
class="android.widget.ViewAnimator" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/lab_swipe_refresh_layout"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="false" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.webkit.WebView"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,136][1080,2337]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.webkit.WebView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,2337]" drawing-order="0"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,136]" drawing-order="0"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id="__next"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2191]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2191]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,818][1080,1031]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="Enter ・ Balance: ₩10,003"
|
||||||
|
resource-id="" class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,944][577,1031]" drawing-order="0"
|
||||||
|
hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]" drawing-order="0"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="__next-route-announcer__"
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,2337]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="닫기"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="0"
|
||||||
|
hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="3" text="" resource-id="radix-:r6:"
|
||||||
|
class="android.app.Dialog" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1440][1080,2337]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1440][1080,2337]" drawing-order="0"
|
||||||
|
hint="">
|
||||||
|
<node index="0"
|
||||||
|
text="사기 거래 0건 참고용이며 거래의 안전을 보장하지 않아요. 확인"
|
||||||
|
resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="true"
|
||||||
|
focused="true" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[23,1414][1055,2312]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,1414][1055,1459]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
<node index="1" text="사기 거래 0건" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[367,1781][711,1863]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
<node index="2" text="참고용이며 거래의 안전을 보장하지 않아요."
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[168,1889][913,1949]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[76,2110][1002,2259]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="확인" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[76,2110][1002,2259]"
|
||||||
|
drawing-order="0" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/app_bar_layout"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,278]" drawing-order="8" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/toolbar"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,136][1080,278]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Navigate up" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][147,278]" drawing-order="1" hint=""/>
|
||||||
|
<node index="1" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[189,174][577,240]"
|
||||||
|
drawing-order="3" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node NAF="true" index="2" text="" resource-id="viva.republica.toss:id/init_touch_blocker"
|
||||||
|
class="android.view.View" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,278][1080,2337]" drawing-order="3" hint=""/>
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/send_input_container"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,278][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_scroll_view"
|
||||||
|
class="android.widget.ScrollView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,278][1080,2042]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_wrapper"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,278][1080,916]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/withdraw_account_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,278][1080,493]" drawing-order="1" hint="">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,278][1080,310]" drawing-order="4" hint=""/>
|
||||||
|
<node index="4" text="From "
|
||||||
|
resource-id="viva.republica.toss:id/text1_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,310][210,383]" drawing-order="6" hint=""/>
|
||||||
|
<node index="5" text="My 토스뱅크 통장" resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[210,310][609,383]" drawing-order="7" hint=""/>
|
||||||
|
<node index="6" text=""
|
||||||
|
resource-id="viva.republica.toss:id/layout_updated_balance"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,394][1017,461]" drawing-order="13" hint="">
|
||||||
|
<node index="0" text="Balance"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,402][204,456]" drawing-order="1"
|
||||||
|
hint=""/>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[204,402][380,456]"
|
||||||
|
drawing-order="2" hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/rolling_number_balance"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc=" 10,003 " checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[220,405][343,454]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
<node index="1" text="₩"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_suffix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[346,402][380,456]"
|
||||||
|
drawing-order="2" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="7" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,461][1080,493]" drawing-order="5" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/deposit_info_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,493][1080,694]" drawing-order="2" hint="">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,493][1080,525]" drawing-order="4" hint=""/>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/view_text1"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,525][616,598]" drawing-order="6" hint="">
|
||||||
|
<node index="0" text="To Hana Bank acco..."
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,525][616,598]" drawing-order="2"
|
||||||
|
hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="5" text="Hana 512-910824-42507"
|
||||||
|
resource-id="viva.republica.toss:id/text2"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="Hana 오일이-구일공팔이사-사이오공칠" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,609][517,662]" drawing-order="9"
|
||||||
|
hint=""/>
|
||||||
|
<node index="6" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,662][1080,694]" drawing-order="5" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/amount_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,705][1080,853]" drawing-order="3" hint="">
|
||||||
|
<node index="0" text="Enter amount"
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,737][1017,810]" drawing-order="2" hint=""/>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/cursor"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[59,740][67,808]" drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/send_cta_wrapper"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,2042][1080,2337]" drawing-order="3"
|
||||||
|
hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/progress_bar"
|
||||||
|
class="android.widget.ProgressBar" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[477,1174][603,1300]" drawing-order="4" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/entered_amount.png
Normal file
|
After Width: | Height: | Size: 109 KiB |
722
assets/toss/entered_amount.xml
Normal file
@ -0,0 +1,722 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/root_view"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_web_view_container"
|
||||||
|
class="android.widget.ViewAnimator" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/lab_swipe_refresh_layout"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="false" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.webkit.WebView"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.webkit.WebView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]">
|
||||||
|
<node index="0" text="" resource-id="__next"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2127]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2127]">
|
||||||
|
<node index="0" text="My 토스뱅크 통장" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[210,282][658,366]"/>
|
||||||
|
<node index="1" text="from" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,282][199,366]"/>
|
||||||
|
<node index="2" text=" " resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[196,282][212,366]"/>
|
||||||
|
<node index="3" text="Balance" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,392][223,450]"/>
|
||||||
|
<node index="4" text=" " resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[217,392][231,450]"/>
|
||||||
|
<node index="5" text="₩" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[228,392][270,450]"/>
|
||||||
|
<node index="6" text="441,747" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[265,392][420,450]"/>
|
||||||
|
<node index="7" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,536][1018,715]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,515][1039,736]"/>
|
||||||
|
<node index="1" text="LI MAKSIM VALENTINOVICH"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[133,542][947,626]"/>
|
||||||
|
<node index="2" text="to" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,542][123,626]"/>
|
||||||
|
<node index="3" text=" " resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[120,542][136,626]"/>
|
||||||
|
<node index="4" text="토스뱅크 1002-0458-7450"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[112,652][616,710]"/>
|
||||||
|
</node>
|
||||||
|
<node index="8" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,796][1080,917]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,796][336,917]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[63,796][273,917]">
|
||||||
|
<node index="0" text="₩" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,804][136,907]"/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[133,796][236,917]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="9" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,1390][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1432][1080,1581]">
|
||||||
|
<node index="0" text="Next" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[0,1463][1080,1613]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,1579][1055,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[23,1579][1055,1757]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="1" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,1579][370,1757]"/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="2" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[367,1579][714,1757]"/>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="3" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[708,1579][1055,1757]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[23,1752][1055,1928]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="4" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,1752][370,1928]"/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="5" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[367,1752][714,1928]"/>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="6" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[708,1752][1055,1928]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[23,1925][1055,2101]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="7" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="true" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,1925][370,2101]"/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="8" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[367,1925][714,2101]"/>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="9" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[708,1925][1055,2101]"/>
|
||||||
|
</node>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[23,2098][1055,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="00" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[23,2098][370,2186]"/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="0" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[367,2098][714,2186]"/>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="지우기" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[708,2098][1055,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[708,2098][1055,2186]"/>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Image"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[855,2167][910,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,88]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,88]"/>
|
||||||
|
<node index="3" text="" resource-id="portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,88]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="__next-route-announcer__"
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/app_bar_layout"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,230]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/toolbar"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,230]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Navigate up" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][147,230]"/>
|
||||||
|
<node index="1" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[189,123][607,194]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node NAF="true" index="2" text="" resource-id="viva.republica.toss:id/init_touch_blocker"
|
||||||
|
class="android.view.View" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,230][1080,2186]"/>
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/send_input_container"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,230][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_scroll_view"
|
||||||
|
class="android.widget.ScrollView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,230][1080,1974]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_wrapper"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,884]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/withdraw_account_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,452]">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,262]"/>
|
||||||
|
<node index="4" text="From "
|
||||||
|
resource-id="viva.republica.toss:id/text1_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,262][218,337]"/>
|
||||||
|
<node index="5" text="My 토스뱅크 통장" resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[218,262][639,337]"/>
|
||||||
|
<node index="6" text=""
|
||||||
|
resource-id="viva.republica.toss:id/layout_updated_balance"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,348][1017,420]">
|
||||||
|
<node index="0" text="Balance"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,356][219,415]"/>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[219,356][430,415]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/rolling_number_balance"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc=" 441,747 " checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[235,359][390,413]"/>
|
||||||
|
<node index="1" text="₩"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_suffix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[393,356][430,415]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="7" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,420][1080,452]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/deposit_info_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,452][1080,660]">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,452][1080,484]"/>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/view_text1"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,484][624,559]">
|
||||||
|
<node index="0" text="To Toss Bank acco..."
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,484][624,559]"/>
|
||||||
|
</node>
|
||||||
|
<node index="5" text="Toss Bank 1002-0458-7450"
|
||||||
|
resource-id="viva.republica.toss:id/text2"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="Toss Bank 일공공이-공사오팔-칠사오공" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[63,570][606,628]"/>
|
||||||
|
<node index="6" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,628][1080,660]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/amount_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,671][1080,821]">
|
||||||
|
<node index="0" text="Enter amount"
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,703][1017,778]"/>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/cursor"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[59,703][67,778]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/send_cta_wrapper"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,1974][1080,2186]"/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/progress_bar"
|
||||||
|
class="android.widget.ProgressBar" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[477,1118][603,1244]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/inputed_account_Number.png
Normal file
|
After Width: | Height: | Size: 134 KiB |
209
assets/toss/inputed_account_Number.xml
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,1563]" drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,1563]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,136][1080,1563]"
|
||||||
|
drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,136][1080,1563]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/app_bar_layout"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,283]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/toolbar"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,136][1080,283]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Navigate up" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][147,281]" drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/scroll_view"
|
||||||
|
class="android.widget.ScrollView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,283][1080,1563]" drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/input_container"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,283][1080,1500]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/header"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,283][1080,522]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="Which account do you want to transfer money to?"
|
||||||
|
resource-id="viva.republica.toss:id/top_upper_text"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,346][1017,522]" drawing-order="4" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/input_account_number"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,564][1017,723]" drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,597][1017,723]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="51291082442507"
|
||||||
|
resource-id="viva.republica.toss:id/editText"
|
||||||
|
class="android.widget.EditText" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="true" scrollable="false"
|
||||||
|
long-clickable="true" password="false" selected="false"
|
||||||
|
bounds="[63,597][1017,723]" drawing-order="1"
|
||||||
|
hint="Enter account number"/>
|
||||||
|
<node index="2" text="" resource-id="" class="android.widget.LinearLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[880,597][1017,723]"
|
||||||
|
drawing-order="3" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[880,597][1017,723]" drawing-order="2"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/text_input_end_icon"
|
||||||
|
class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Clear text"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[891,597][1017,723]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node NAF="true" index="2" text="" resource-id="viva.republica.toss:id/input_bank"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,786][1017,933]" drawing-order="3" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,819][1017,933]" drawing-order="1" hint="">
|
||||||
|
<node NAF="true" index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/editText"
|
||||||
|
class="android.widget.Spinner" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,819][1017,933]" drawing-order="2" hint="Select a bank"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="3" text=""
|
||||||
|
resource-id="viva.republica.toss:id/bank_predict_recycler_view"
|
||||||
|
class="androidx.recyclerview.widget.RecyclerView"
|
||||||
|
package="viva.republica.toss" content-desc="Recommended banks"
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[63,954][1017,1070]"
|
||||||
|
drawing-order="8" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,954][248,1049]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[95,981][137,1023]" drawing-order="1" hint=""/>
|
||||||
|
<node index="1" text="하나" resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[148,975][216,1028]" drawing-order="2" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[269,954][454,1049]" drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[301,981][343,1023]" drawing-order="1" hint=""/>
|
||||||
|
<node index="1" text="우리" resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[354,975][422,1028]" drawing-order="2" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[475,954][740,1049]" drawing-order="3" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[507,981][549,1023]" drawing-order="1" hint=""/>
|
||||||
|
<node index="1" text="KDB산업" resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[560,975][708,1028]" drawing-order="2" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/last_step.png
Normal file
|
After Width: | Height: | Size: 241 KiB |
353
assets/toss/last_step.xml
Normal file
@ -0,0 +1,353 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2400]" drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,136][1080,2337]"
|
||||||
|
drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/root_view_holder"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,136][1080,2337]"
|
||||||
|
drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,2337]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,136][1080,2337]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,136][1080,2337]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.LinearLayout"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,283]" drawing-order="2"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,136][1080,283]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,178][105,241]" drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="뒤로가기"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,178][105,241]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="com.horcrux.svg.SvgView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[42,178][95,241]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="com.horcrux.svg.GroupView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[38,185][90,232]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="com.horcrux.svg.PathView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[38,185][90,232]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,283][1080,2337]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,283][1080,2337]"
|
||||||
|
drawing-order="2" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,556][1080,1223]" drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,556][875,1223]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[205,556][875,1223]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[205,556][875,1223]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,1288][1017,1445]" drawing-order="2"
|
||||||
|
hint="">
|
||||||
|
<node index="0"
|
||||||
|
text="Try the free delivery service and get 3 meal coupons"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[162,1288][919,1445]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[348,1445][732,1658]" drawing-order="3"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="Get now" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[348,1511][732,1658]" drawing-order="1"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[348,1511][732,1658]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[454,1551][625,1618]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="Get now"
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[454,1551][625,1618]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="Close"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[446,1724][634,1791]" drawing-order="4"
|
||||||
|
hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[446,1731][498,1784]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[446,1731][498,1784]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="com.horcrux.svg.SvgView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[446,1731][498,1784]"
|
||||||
|
drawing-order="1" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="com.horcrux.svg.GroupView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[454,1739][490,1775]"
|
||||||
|
drawing-order="0" hint="">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="com.horcrux.svg.PathView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[454,1739][490,1775]"
|
||||||
|
drawing-order="1" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="Close" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[514,1724][634,1791]"
|
||||||
|
drawing-order="2" hint=""/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/pop_up_win.png
Normal file
|
After Width: | Height: | Size: 441 KiB |
219
assets/toss/pop_up_win.xml
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/root" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_container"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_web_view_container"
|
||||||
|
class="android.widget.ViewAnimator" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/lab_swipe_refresh_layout"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="false" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.webkit.WebView"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.webkit.WebView"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="true"
|
||||||
|
focused="true" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="__next"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,88]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[126,326][955,1156]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[126,326][955,1156]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[126,326][955,1156]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="케이뱅크가 청년을 위해 인당 현금 100만원 지원"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[215,1216][866,1426]"/>
|
||||||
|
<node index="2" text="당첨 기회 놓치지 마세요" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[309,1455][769,1531]"/>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[301,1670][779,1820]">
|
||||||
|
<node index="0" text="지원 대상 확인하기" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[301,1670][779,1820]"/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[462,1959][619,2035]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[462,1959][538,2035]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[462,1959][538,2035]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="닫기" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[538,1964][619,2025]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,88]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,88]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]">
|
||||||
|
<node index="0" text="" resource-id="__next-route-announcer__"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/appBarLayoutContainer"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,230]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/select_bank.png
Normal file
|
After Width: | Height: | Size: 182 KiB |
814
assets/toss/select_bank.xml
Normal file
@ -0,0 +1,814 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/container"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/coordinator"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/touch_outside"
|
||||||
|
class="android.view.View" package="viva.republica.toss" content-desc="Close"
|
||||||
|
checkable="false" checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="true" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][1080,2186]"/>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/design_bottom_sheet"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,52][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,52][1080,2186]">
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/sheet"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[26,489][1054,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/handle"
|
||||||
|
class="android.widget.ImageView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[477,489][603,531]"/>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/content"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[26,531][1054,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[26,531][1054,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/header"
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[26,531][1054,718]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[26,531][1054,718]">
|
||||||
|
<node index="0" text="Please select the bank"
|
||||||
|
resource-id="viva.republica.toss:id/title"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[89,594][991,665]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/bankListViewContainer"
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[79,718][1001,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.GridView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="true" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[79,718][1001,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="NongHyup"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[90,729][375,953]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[90,729][375,953]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[196,766][270,840]"/>
|
||||||
|
<node index="1" text="NongHyup"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[135,861][331,916]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="KakaoBank"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[397,729][682,953]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[397,729][682,953]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[503,766][577,840]"/>
|
||||||
|
<node index="1" text="KakaoBank"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[436,861][643,916]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="Kookmin"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[704,729][990,953]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[704,729][990,953]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[810,766][884,840]"/>
|
||||||
|
<node index="1" text="Kookmin"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[767,861][928,916]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="Toss Bank"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[90,975][375,1199]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[90,975][375,1199]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[196,1012][270,1086]"/>
|
||||||
|
<node index="1" text="Toss Bank"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[141,1107][325,1162]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="Shinhan"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[397,975][682,1199]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[397,975][682,1199]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[503,1012][577,1086]"/>
|
||||||
|
<node index="1" text="Shinhan"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[465,1107][614,1162]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="5" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="Woori"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[704,975][990,1199]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[704,975][990,1199]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[810,1012][884,1086]"/>
|
||||||
|
<node index="1" text="Woori"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[793,1107][902,1162]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="6" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="IBK"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[90,1221][375,1445]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[90,1221][375,1445]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[196,1258][270,1332]"/>
|
||||||
|
<node index="1" text="IBK"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[202,1353][263,1408]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="7" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="Hana"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[397,1221][682,1445]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[397,1221][682,1445]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[503,1258][577,1332]"/>
|
||||||
|
<node index="1" text="Hana"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[492,1353][588,1408]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="8" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="MG"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[704,1221][990,1445]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[704,1221][990,1445]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[810,1258][884,1332]"/>
|
||||||
|
<node index="1" text="MG"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[815,1353][880,1408]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="9" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="Busan Bank" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[90,1467][375,1753]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[90,1467][375,1691]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[196,1504][270,1578]"/>
|
||||||
|
<node index="1" text="Busan Bank"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[125,1599][341,1654]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="10" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="iM Bank(Daegu)" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[397,1467][682,1753]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[397,1467][682,1753]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[503,1504][577,1578]"/>
|
||||||
|
<node index="1" text="iM Bank(Daegu)"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[418,1599][661,1716]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="11" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="Kbank"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[704,1467][990,1753]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[704,1467][990,1691]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[810,1504][884,1578]"/>
|
||||||
|
<node index="1" text="Kbank"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[789,1599][906,1654]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="12" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="Credit Union" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[90,1775][375,1999]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[90,1775][375,1999]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[196,1812][270,1886]"/>
|
||||||
|
<node index="1" text="Credit Union"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[118,1907][347,1962]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="13" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="Postal Sav." checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[397,1775][682,1999]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[397,1775][682,1999]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[503,1812][577,1886]"/>
|
||||||
|
<node index="1" text="Postal Sav."
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[442,1907][638,1962]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="14" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="SC"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[704,1775][990,1999]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[704,1775][990,1999]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[810,1812][884,1886]"/>
|
||||||
|
<node index="1" text="SC"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[820,1907][874,1962]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="15" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="Kyongnam"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[90,2021][375,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[90,2021][375,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[196,2058][270,2132]"/>
|
||||||
|
<node index="1" text="Kyongnam"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[135,2153][330,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="16" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="Kwangju"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[397,2021][682,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[397,2021][682,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[503,2058][577,2132]"/>
|
||||||
|
<node index="1" text="Kwangju"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[462,2153][618,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="17" text="" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc="Suhyup"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[704,2021][990,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[704,2021][990,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/icon"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[810,2058][884,2132]"/>
|
||||||
|
<node index="1" text="Suhyup"
|
||||||
|
resource-id="viva.republica.toss:id/name"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[778,2153][916,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/select_recipient.png
Normal file
|
After Width: | Height: | Size: 205 KiB |
689
assets/toss/select_recipient.xml
Normal file
@ -0,0 +1,689 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/fragment_container"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/app_bar_layout"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,557]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/toolbar"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,235]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Navigate up" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][147,233]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/header"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,235][1080,379]">
|
||||||
|
<node index="0" text="Select the recipient"
|
||||||
|
resource-id="viva.republica.toss:id/top_upper_text"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,298][1017,379]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/radio_tab"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[63,442][1017,557]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tabContainerBackgroundCardView"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,442][1017,557]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tabContainerBackground"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,442][1017,557]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/container"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,442][1017,557]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/segmentedControlContainer"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[63,442][1017,557]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tabContainer"
|
||||||
|
class="androidx.appcompat.widget.LinearLayoutCompat"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,442][1017,557]">
|
||||||
|
<node index="0" text="Domestic" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="true"
|
||||||
|
bounds="[74,453][384,546]"/>
|
||||||
|
<node index="1" text="Overseas, 새로운 업데이트" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[384,453][695,546]"/>
|
||||||
|
<node index="2" text="Contacts" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[695,453][1006,546]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tabCursor"
|
||||||
|
class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[74,453][384,546]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/contact_tab_tooltip_container"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][180,280]"/>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/receiver_tab_pager"
|
||||||
|
class="androidx.viewpager.widget.ViewPager" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,578][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="androidx.recyclerview.widget.RecyclerView"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="true"
|
||||||
|
focused="true" scrollable="true" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,578][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,578][1080,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/swipe_refresh_layout"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,578][1080,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/recycler_view"
|
||||||
|
class="androidx.recyclerview.widget.RecyclerView"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="true" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,578][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,599][1080,759]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/input"
|
||||||
|
class="android.widget.LinearLayout"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,599][1017,759]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,636][1017,759]">
|
||||||
|
<node index="0" text="Enter account number"
|
||||||
|
resource-id="viva.republica.toss:id/editText"
|
||||||
|
class="android.widget.EditText"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,636][1017,759]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/camera_button"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="Photo Remittance" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[912,636][1017,759]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_header_v2"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="My accounts" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,801][1080,948]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/clickView"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,801][1080,948]"/>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/overlay"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,801][1080,948]"/>
|
||||||
|
<node index="2" text="My accounts"
|
||||||
|
resource-id="viva.republica.toss:id/title"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,864][355,927]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,948][1080,1126]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/overlay"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,948][1080,1126]"/>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/clickView"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[16,948][1064,1126]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_left_animate_logo"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[63,985][168,1090]"/>
|
||||||
|
<node index="3" text="Link your accounts"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text1"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[200,980][570,1033]"/>
|
||||||
|
<node index="4" text="Free transfer fees for life"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text2"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[200,1033][750,1094]"/>
|
||||||
|
<node index="5" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_right_arrow"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[975,1006][1038,1069]"/>
|
||||||
|
</node>
|
||||||
|
<node index="3" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_header_v2"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="Recent accounts" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,1126][1080,1273]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/clickView"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1126][1080,1273]"/>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/overlay"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1126][1080,1273]"/>
|
||||||
|
<node index="2" text="Recent accounts"
|
||||||
|
resource-id="viva.republica.toss:id/title"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,1189][448,1252]"/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="문성준, 카카오뱅크 3333-15-8718926" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="true" password="false" selected="false"
|
||||||
|
bounds="[0,1273][1080,1459]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/overlay"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1273][1080,1459]"/>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/clickView"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[16,1273][1064,1459]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_left_image"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,1311][173,1421]"/>
|
||||||
|
<node index="3" text="문성준"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text1"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,1305][331,1368]"/>
|
||||||
|
<node index="4" text="카카오뱅크 3333-15-8718926"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text2"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,1368][754,1427]"/>
|
||||||
|
<node index="5" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_right_icon"
|
||||||
|
class="android.widget.CheckBox"
|
||||||
|
package="viva.republica.toss" content-desc="Favorites"
|
||||||
|
checkable="true" checked="true" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[943,1324][1027,1408]"/>
|
||||||
|
</node>
|
||||||
|
<node index="5" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="KAN IGOR, 전북 9100057686412" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="true" password="false" selected="false"
|
||||||
|
bounds="[0,1459][1080,1645]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/overlay"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1459][1080,1645]"/>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/clickView"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[16,1459][1064,1645]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_left_image"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,1497][173,1607]"/>
|
||||||
|
<node index="3" text="KAN IGOR"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text1"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,1491][438,1554]"/>
|
||||||
|
<node index="4" text="전북 9100057686412"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text2"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,1554][612,1613]"/>
|
||||||
|
<node index="5" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_right_icon"
|
||||||
|
class="android.widget.CheckBox"
|
||||||
|
package="viva.republica.toss" content-desc="Favorites"
|
||||||
|
checkable="true" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[943,1510][1027,1594]"/>
|
||||||
|
</node>
|
||||||
|
<node index="6" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="유명현, 토스뱅크 1001-5070-8326" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="true" password="false" selected="false"
|
||||||
|
bounds="[0,1645][1080,1831]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/overlay"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1645][1080,1831]"/>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/clickView"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[16,1645][1064,1831]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_left_image"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,1683][173,1793]"/>
|
||||||
|
<node index="3" text="유명현"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text1"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,1677][331,1740]"/>
|
||||||
|
<node index="4" text="토스뱅크 1001-5070-8326"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text2"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,1740][695,1799]"/>
|
||||||
|
<node index="5" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_right_icon"
|
||||||
|
class="android.widget.CheckBox"
|
||||||
|
package="viva.republica.toss" content-desc="Favorites"
|
||||||
|
checkable="true" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[943,1696][1027,1780]"/>
|
||||||
|
</node>
|
||||||
|
<node index="7" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="김범철, 카카오뱅크 3333-25-8642122" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="true" password="false" selected="false"
|
||||||
|
bounds="[0,1831][1080,2017]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/overlay"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1831][1080,2017]"/>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/clickView"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[16,1831][1064,2017]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_left_image"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,1869][173,1979]"/>
|
||||||
|
<node index="3" text="김범철"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text1"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,1863][331,1926]"/>
|
||||||
|
<node index="4" text="카카오뱅크 3333-25-8642122"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text2"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,1926][762,1985]"/>
|
||||||
|
<node index="5" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_right_icon"
|
||||||
|
class="android.widget.CheckBox"
|
||||||
|
package="viva.republica.toss" content-desc="Favorites"
|
||||||
|
checkable="true" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[943,1882][1027,1966]"/>
|
||||||
|
</node>
|
||||||
|
<node index="8" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="DYU ALEVTI, 하나 327-910469-87907"
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="true" password="false"
|
||||||
|
selected="false" bounds="[0,2017][1080,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/overlay"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,2017][1080,2186]"/>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/clickView"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[16,2017][1064,2186]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_left_image"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,2055][173,2165]"/>
|
||||||
|
<node index="3" text="DYU ALEVTI"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text1"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,2049][484,2112]"/>
|
||||||
|
<node index="4" text="하나 327-910469-87907"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text2"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[205,2112][674,2171]"/>
|
||||||
|
<node index="5" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_right_icon"
|
||||||
|
class="android.widget.CheckBox"
|
||||||
|
package="viva.republica.toss" content-desc="Favorites"
|
||||||
|
checkable="true" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[943,2068][1027,2152]"/>
|
||||||
|
</node>
|
||||||
|
<node index="9" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="이재한, NH농협 302-1567-2625-01" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="true" password="false" selected="false"
|
||||||
|
bounds="[0,0][0,0]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/overlay"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="viva.republica.toss:id/clickView"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_left_image"
|
||||||
|
class="android.widget.ImageView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
<node index="3" text="이재한"
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_center_text1"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
<node index="5" text=""
|
||||||
|
resource-id="viva.republica.toss:id/tds_list_row_v1_right_icon"
|
||||||
|
class="android.widget.CheckBox"
|
||||||
|
package="viva.republica.toss" content-desc="Favorites"
|
||||||
|
checkable="true" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/selected_acc_bank.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
147
assets/toss/selected_acc_bank.xml
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/app_bar_layout"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,235]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/toolbar"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,235]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Navigate up" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][147,233]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/scroll_view"
|
||||||
|
class="android.widget.ScrollView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,235][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/input_container"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,235][1080,1980]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/header"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,235][1080,474]">
|
||||||
|
<node index="0" text="Which account do you want to transfer money to?"
|
||||||
|
resource-id="viva.republica.toss:id/top_upper_text"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,298][1017,474]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/input_account_number"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="true" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,516][1017,679]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,553][1017,679]">
|
||||||
|
<node index="0" text="100204587450"
|
||||||
|
resource-id="viva.republica.toss:id/editText"
|
||||||
|
class="android.widget.EditText" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="true" password="false" selected="false"
|
||||||
|
bounds="[63,553][1017,679]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/input_bank"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,742][1017,902]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,779][1017,902]">
|
||||||
|
<node index="0" text="Toss Bank"
|
||||||
|
resource-id="viva.republica.toss:id/editText"
|
||||||
|
class="android.widget.Spinner" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,779][1017,902]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/bottom_cta"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,1985][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,1985][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/gradient"
|
||||||
|
class="android.view.View" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,1985][1080,2074]"/>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/keyboardBottomCtaBody"
|
||||||
|
class="android.view.View" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,2074][1080,2186]"/>
|
||||||
|
<node index="2" text="Confirm" resource-id="viva.republica.toss:id/cta"
|
||||||
|
class="android.widget.Button" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[53,2074][1027,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/send_operation.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
594
assets/toss/send_operation.xml
Normal file
@ -0,0 +1,594 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/root_view"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_web_view_container"
|
||||||
|
class="android.widget.ViewAnimator" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/lab_swipe_refresh_layout"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="false" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.webkit.WebView"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.webkit.WebView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="true" focused="true"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,235]">
|
||||||
|
<node index="0" text="" resource-id="__next"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,235]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,235][1080,925]">
|
||||||
|
<node index="0" text="LI MAKSIM VALENTINOVICH"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[126,817][1029,917]"/>
|
||||||
|
<node index="1" text="to" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[34,817][112,917]"/>
|
||||||
|
<node index="2" text=" " resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[107,817][128,917]"/>
|
||||||
|
<node index="3" text="₩747" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[438,702][643,802]"/>
|
||||||
|
<node index="4" text="Send" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[446,589][635,689]"/>
|
||||||
|
<node index="5" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,1579][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[49,1579][1039,1647]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[28,1558][1060,1668]"/>
|
||||||
|
<node index="1" text="Display sender as"
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[49,1584][404,1642]"/>
|
||||||
|
<node index="2" text="KAN IGOR" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[766,1584][976,1642]"/>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[973,1581][1039,1647]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[973,1581][1039,1647]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[49,1681][1039,1749]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[28,1660][1060,1770]"/>
|
||||||
|
<node index="1" text="Send from" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[49,1686][262,1744]"/>
|
||||||
|
<node index="2" text="My 토스뱅크 통장" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[672,1686][976,1744]"/>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[973,1684][1039,1749]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[973,1684][1039,1749]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[49,1783][1039,1852]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[28,1762][1060,1873]"/>
|
||||||
|
<node index="1" text="Send to" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[49,1789][207,1846]"/>
|
||||||
|
<node index="2" text="토스뱅크 1002-0458-7450"
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[472,1789][976,1846]"/>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[973,1783][1039,1852]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[973,1783][1039,1852]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[49,1943][1029,2093]">
|
||||||
|
<node index="0" text="Send" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[49,1943][1029,2093]"/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="Free transfer fees for life"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[296,2156][784,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,235][1080,235]"/>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,235][1080,235]"/>
|
||||||
|
<node index="3" text="" resource-id="portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,235][1080,235]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="__next-route-announcer__"
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/app_bar_layout"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,230]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/toolbar"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,230]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Navigate up" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][147,230]"/>
|
||||||
|
<node index="1" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[189,123][607,194]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node NAF="true" index="2" text="" resource-id="viva.republica.toss:id/init_touch_blocker"
|
||||||
|
class="android.view.View" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,230][1080,2186]"/>
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/send_input_container"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,230][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_scroll_view"
|
||||||
|
class="android.widget.ScrollView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,230][1080,1974]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_wrapper"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,884]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/withdraw_account_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,452]">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,262]"/>
|
||||||
|
<node index="4" text="From "
|
||||||
|
resource-id="viva.republica.toss:id/text1_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,262][218,337]"/>
|
||||||
|
<node index="5" text="My 토스뱅크 통장" resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[218,262][639,337]"/>
|
||||||
|
<node index="6" text=""
|
||||||
|
resource-id="viva.republica.toss:id/layout_updated_balance"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,348][1017,420]">
|
||||||
|
<node index="0" text="Balance"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,356][219,415]"/>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[219,356][430,415]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/rolling_number_balance"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc=" 441,747 " checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[235,359][390,413]"/>
|
||||||
|
<node index="1" text="₩"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_suffix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[393,356][430,415]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="7" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,420][1080,452]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/deposit_info_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,452][1080,660]">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,452][1080,484]"/>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/view_text1"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,484][624,559]">
|
||||||
|
<node index="0" text="To Toss Bank acco..."
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,484][624,559]"/>
|
||||||
|
</node>
|
||||||
|
<node index="5" text="Toss Bank 1002-0458-7450"
|
||||||
|
resource-id="viva.republica.toss:id/text2"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="Toss Bank 일공공이-공사오팔-칠사오공" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[63,570][606,628]"/>
|
||||||
|
<node index="6" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,628][1080,660]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/amount_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,671][1080,821]">
|
||||||
|
<node index="0" text="Enter amount"
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,703][1017,778]"/>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/cursor"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[59,703][67,778]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/send_cta_wrapper"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,1974][1080,2186]"/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/progress_bar"
|
||||||
|
class="android.widget.ProgressBar" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[477,1118][603,1244]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/send_operation_1.png
Normal file
|
After Width: | Height: | Size: 175 KiB |
685
assets/toss/send_operation_1.xml
Normal file
@ -0,0 +1,685 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/root_view"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_web_view_container"
|
||||||
|
class="android.widget.ViewAnimator" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/lab_swipe_refresh_layout"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="false" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.webkit.WebView"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.webkit.WebView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="true" focused="true"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,235]">
|
||||||
|
<node index="0" text="" resource-id="__next"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,235]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,235][1080,925]">
|
||||||
|
<node index="0" text="LI MAKSIM VALENTINOVICH"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[126,817][1029,917]"/>
|
||||||
|
<node index="1" text="to" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[34,817][112,917]"/>
|
||||||
|
<node index="2" text=" " resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[107,817][128,917]"/>
|
||||||
|
<node index="3" text="₩747" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[438,702][643,802]"/>
|
||||||
|
<node index="4" text="Send" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[446,589][635,689]"/>
|
||||||
|
<node index="5" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,1579][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[49,1579][1039,1647]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[28,1558][1060,1668]"/>
|
||||||
|
<node index="1" text="Display sender as"
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[49,1584][404,1642]"/>
|
||||||
|
<node index="2" text="KAN IGOR" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[766,1584][976,1642]"/>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[973,1581][1039,1647]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[973,1581][1039,1647]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[49,1681][1039,1749]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[28,1660][1060,1770]"/>
|
||||||
|
<node index="1" text="Send from" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[49,1686][262,1744]"/>
|
||||||
|
<node index="2" text="My 토스뱅크 통장" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[672,1686][976,1744]"/>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[973,1684][1039,1749]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[973,1684][1039,1749]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[49,1783][1039,1852]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[28,1762][1060,1873]"/>
|
||||||
|
<node index="1" text="Send to" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[49,1789][207,1846]"/>
|
||||||
|
<node index="2" text="토스뱅크 1002-0458-7450"
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[472,1789][976,1846]"/>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[973,1783][1039,1852]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[973,1783][1039,1852]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="3" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[49,1943][1029,2093]">
|
||||||
|
<node index="0" text="Send loading"
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="false" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[49,1943][1029,2093]"/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="Free transfer fees for life"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[296,2156][784,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,235][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,235][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,235][1080,2186]">
|
||||||
|
<node index="0"
|
||||||
|
text="This is your first time sending money to LI MAKSIM VALENTINOVICH!To keep your transfer safe, make sure you're sending it to LI MAKSIM VALENTINOVICH."
|
||||||
|
resource-id=""
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[0,1345][1080,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="2" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1978][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,1978][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[49,2072][540,2186]">
|
||||||
|
<node index="0" text="Cancel" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[49,2072][540,2186]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[559,2072][1029,2186]">
|
||||||
|
<node index="0" text="Send" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[559,2072][1029,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="3" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,235][1080,235]"/>
|
||||||
|
<node index="4" text="" resource-id="portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,235][1080,235]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="__next-route-announcer__"
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/app_bar_layout"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,230]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/toolbar"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,230]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Navigate up" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][147,230]"/>
|
||||||
|
<node index="1" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[189,123][607,194]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node NAF="true" index="2" text="" resource-id="viva.republica.toss:id/init_touch_blocker"
|
||||||
|
class="android.view.View" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,230][1080,2186]"/>
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/send_input_container"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,230][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_scroll_view"
|
||||||
|
class="android.widget.ScrollView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,230][1080,1974]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_wrapper"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,884]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/withdraw_account_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,452]">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,262]"/>
|
||||||
|
<node index="4" text="From "
|
||||||
|
resource-id="viva.republica.toss:id/text1_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,262][218,337]"/>
|
||||||
|
<node index="5" text="My 토스뱅크 통장" resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[218,262][639,337]"/>
|
||||||
|
<node index="6" text=""
|
||||||
|
resource-id="viva.republica.toss:id/layout_updated_balance"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,348][1017,420]">
|
||||||
|
<node index="0" text="Balance"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,356][219,415]"/>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[219,356][430,415]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/rolling_number_balance"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc=" 441,747 " checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[235,359][390,413]"/>
|
||||||
|
<node index="1" text="₩"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_suffix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[393,356][430,415]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="7" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,420][1080,452]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/deposit_info_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,452][1080,660]">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,452][1080,484]"/>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/view_text1"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,484][624,559]">
|
||||||
|
<node index="0" text="To Toss Bank acco..."
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,484][624,559]"/>
|
||||||
|
</node>
|
||||||
|
<node index="5" text="Toss Bank 1002-0458-7450"
|
||||||
|
resource-id="viva.republica.toss:id/text2"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="Toss Bank 일공공이-공사오팔-칠사오공" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[63,570][606,628]"/>
|
||||||
|
<node index="6" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,628][1080,660]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/amount_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,671][1080,821]">
|
||||||
|
<node index="0" text="Enter amount"
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,703][1017,778]"/>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/cursor"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[59,703][67,778]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/send_cta_wrapper"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,1974][1080,2186]"/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/progress_bar"
|
||||||
|
class="android.widget.ProgressBar" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[477,1118][603,1244]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
BIN
assets/toss/win_after_pass.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
427
assets/toss/win_after_pass.xml
Normal file
@ -0,0 +1,427 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||||
|
<hierarchy rotation="0">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,0][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/action_bar_root"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/root_view"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_frame_layout"
|
||||||
|
class="android.widget.FrameLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/lab_web_view_container"
|
||||||
|
class="android.widget.ViewAnimator" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/lab_swipe_refresh_layout"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="false" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.webkit.WebView"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.webkit.WebView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="true" focused="true"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,1484]">
|
||||||
|
<node index="0" text="" resource-id="__next"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,88][1080,1484]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[341,347][737,746]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[341,347][737,746]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[341,347][737,746]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.widget.Image"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[341,347][737,746]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1"
|
||||||
|
text="Sent ₩747 to LI MAKSIM VALENTINOVICH"
|
||||||
|
resource-id="" class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[70,749][1008,1022]"/>
|
||||||
|
<node index="2" text="Leave a memo" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[338,1080][742,1190]"/>
|
||||||
|
<node index="3" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1978][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,1978][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[49,2072][519,2186]">
|
||||||
|
<node index="0" text="Share" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[49,2072][519,2186]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id=""
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[538,2072][1029,2186]">
|
||||||
|
<node index="0" text="Confirm" resource-id=""
|
||||||
|
class="android.widget.Button"
|
||||||
|
package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false"
|
||||||
|
selected="false"
|
||||||
|
bounds="[538,2072][1029,2186]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="4" text=""
|
||||||
|
resource-id="tds-mobile-portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1479][1080,1479]"/>
|
||||||
|
<node index="5" text="" resource-id="portal-container"
|
||||||
|
class="android.widget.TextView"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,1479][1080,1479]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,0][0,0]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="__next-route-announcer__"
|
||||||
|
class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/app_bar_layout"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][1080,230]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/toolbar"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,88][1080,230]">
|
||||||
|
<node index="0" text="" resource-id="" class="android.widget.ImageButton"
|
||||||
|
package="viva.republica.toss" content-desc="Navigate up" checkable="false"
|
||||||
|
checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,88][147,230]"/>
|
||||||
|
<node index="1" text="Toss Bank Transfer" resource-id=""
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[189,123][607,194]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node NAF="true" index="2" text="" resource-id="viva.republica.toss:id/init_touch_blocker"
|
||||||
|
class="android.view.View" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="true" enabled="true" focusable="true"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,230][1080,2186]"/>
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/send_input_container"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[0,230][1080,2186]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_scroll_view"
|
||||||
|
class="android.widget.ScrollView" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="true" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,230][1080,1974]">
|
||||||
|
<node index="0" text="" resource-id="viva.republica.toss:id/deposit_info_wrapper"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,884]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/withdraw_account_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,452]">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,230][1080,262]"/>
|
||||||
|
<node index="4" text="From "
|
||||||
|
resource-id="viva.republica.toss:id/text1_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,262][218,337]"/>
|
||||||
|
<node index="5" text="My 토스뱅크 통장" resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[218,262][639,337]"/>
|
||||||
|
<node index="6" text=""
|
||||||
|
resource-id="viva.republica.toss:id/layout_updated_balance"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,348][1017,420]">
|
||||||
|
<node index="0" text="Balance"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_prefix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,356][219,415]"/>
|
||||||
|
<node index="1" text="" resource-id="" class="android.view.ViewGroup"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[219,356][430,415]">
|
||||||
|
<node index="0" text=""
|
||||||
|
resource-id="viva.republica.toss:id/rolling_number_balance"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc=" 441,747 " checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[235,359][390,413]"/>
|
||||||
|
<node index="1" text="₩"
|
||||||
|
resource-id="viva.republica.toss:id/tv_balance_suffix"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false"
|
||||||
|
bounds="[393,356][430,415]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="7" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,420][1080,452]"/>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/deposit_info_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,452][1080,660]">
|
||||||
|
<node index="3" text="" resource-id="viva.republica.toss:id/padding_top"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,452][1080,484]"/>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/view_text1"
|
||||||
|
class="android.widget.LinearLayout" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,484][624,559]">
|
||||||
|
<node index="0" text="To Toss Bank acco..."
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false"
|
||||||
|
clickable="false" enabled="true" focusable="false" focused="false"
|
||||||
|
scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[63,484][624,559]"/>
|
||||||
|
</node>
|
||||||
|
<node index="5" text="Toss Bank 1002-0458-7450"
|
||||||
|
resource-id="viva.republica.toss:id/text2"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="Toss Bank 일공공이-공사오팔-칠사오공" checkable="false"
|
||||||
|
checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[63,570][606,628]"/>
|
||||||
|
<node index="6" text="" resource-id="viva.republica.toss:id/padding_bottom"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,628][1080,660]"/>
|
||||||
|
</node>
|
||||||
|
<node index="2" text="" resource-id="viva.republica.toss:id/amount_row"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="true"
|
||||||
|
enabled="true" focusable="true" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[0,671][1080,821]">
|
||||||
|
<node index="0" text="Enter amount"
|
||||||
|
resource-id="viva.republica.toss:id/text1"
|
||||||
|
class="android.widget.TextView" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[63,703][1017,778]"/>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/cursor"
|
||||||
|
class="android.view.View" package="viva.republica.toss"
|
||||||
|
content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false"
|
||||||
|
long-clickable="false" password="false" selected="false"
|
||||||
|
bounds="[59,703][67,778]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="viva.republica.toss:id/send_cta_wrapper"
|
||||||
|
class="android.view.ViewGroup" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true"
|
||||||
|
focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,1974][1080,2186]"/>
|
||||||
|
</node>
|
||||||
|
<node index="4" text="" resource-id="viva.republica.toss:id/progress_bar"
|
||||||
|
class="android.widget.ProgressBar" package="viva.republica.toss" content-desc=""
|
||||||
|
checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
|
||||||
|
focused="false" scrollable="false" long-clickable="false" password="false"
|
||||||
|
selected="false" bounds="[477,1118][603,1244]"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View"
|
||||||
|
package="viva.republica.toss" content-desc="" checkable="false" checked="false" clickable="false"
|
||||||
|
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
|
||||||
|
password="false" selected="false" bounds="[0,0][0,0]"/>
|
||||||
|
</node>
|
||||||
|
</hierarchy>
|
||||||
18
config.ini
@ -1,29 +1,37 @@
|
|||||||
[apps]
|
[apps]
|
||||||
list=birbank, toss
|
list=ozon
|
||||||
|
|
||||||
[birbank]
|
[birbank]
|
||||||
android_package_name=az.kapitalbank.mbanking
|
android_package_name=az.kapitalbank.mbanking
|
||||||
name=Birbank
|
name=Birbank
|
||||||
|
|
||||||
[common]
|
[common]
|
||||||
|
access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjNDU1MjE1Ni1kMTc5LTRhNzktOWU5MS01ODcwMzhjOTVjZjAiLCJ0eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcxODU0MzI0fQ.xLalNxKuPK1QV3D94Je1OJITBV-VfIQJG6iSwPa_mMg
|
||||||
|
api_key=0eee77b62013253e02e1a69bc6a505bb37757fb7
|
||||||
currencies=USD, KRW, AZN, RUB
|
currencies=USD, KRW, AZN, RUB
|
||||||
token=token1753605586797
|
desktop_id=6554b2a2-2885-430e-aae2-0045f82f068e
|
||||||
|
profile_id=c4552156-d179-4a79-9e91-587038c95cf0
|
||||||
|
refresh_token=d22175aa-96ec-405d-8c9f-f6cfce1a0913
|
||||||
|
token_expires_at=1771854324
|
||||||
version=0.0.1
|
version=0.0.1
|
||||||
|
|
||||||
[db]
|
[db]
|
||||||
dbPath=/Users/trnsmkot/CLionProjects/ARCDeskProject/ARCDeskProject/database/app_data.db
|
dbPath=~/CLionProjects/ARCDeskProject/ARCDeskProject/database/app_data.db
|
||||||
|
|
||||||
[net]
|
[net]
|
||||||
accountUpdate=http://localhost:9999/api/v1/account/update
|
accountUpdate=http://localhost:9999/api/v1/account/update
|
||||||
|
apiBase=http://93.183.75.134:8005
|
||||||
appInfoUpdate=http://localhost:9999/api/v1/device/update
|
appInfoUpdate=http://localhost:9999/api/v1/device/update
|
||||||
appStatusUpdate=http://localhost:9999/api/v1/application/update
|
appStatusUpdate=http://localhost:9999/api/v1/application/update
|
||||||
checkAppStatus=http://localhost:9999/api/v1/application/status
|
|
||||||
eventStatusUpdate=http://localhost:9999/api/v1/event/update
|
eventStatusUpdate=http://localhost:9999/api/v1/event/update
|
||||||
paymentsGet=http://localhost:9999/api/v1/payments
|
paymentsGet=http://localhost:9999/api/v1/payments
|
||||||
registerNewUser=http://localhost:9999/api/v1/application/register
|
|
||||||
transactionInsert=http://localhost:9999/api/v1/transaction/insert
|
transactionInsert=http://localhost:9999/api/v1/transaction/insert
|
||||||
transactionUpdate=http://localhost:9999/api/v1/transaction/update
|
transactionUpdate=http://localhost:9999/api/v1/transaction/update
|
||||||
|
|
||||||
|
[ozon]
|
||||||
|
android_package_name=ru.ozon.fintech.finance
|
||||||
|
name=Ozon
|
||||||
|
|
||||||
[rshb]
|
[rshb]
|
||||||
android_package_name=ru.rshb.dbo
|
android_package_name=ru.rshb.dbo
|
||||||
name=Росcельхозбанк
|
name=Росcельхозбанк
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QSqlError>
|
#include <QSqlError>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QDir>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
|
||||||
@ -29,9 +30,15 @@ QSqlDatabase DatabaseManager::database() {
|
|||||||
if (!connectionPool.contains(name)) {
|
if (!connectionPool.contains(name)) {
|
||||||
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", name);
|
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", name);
|
||||||
const QSettings settings("config.ini", QSettings::IniFormat);
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
|
|
||||||
|
QString dbPath = settings.value("db/dbPath").toString();
|
||||||
|
if (dbPath.startsWith("~")) {
|
||||||
|
dbPath.replace(0, 1, QDir::homePath());
|
||||||
|
}
|
||||||
|
|
||||||
// qDebug() << settings.value("db/dbPath").toString();
|
// qDebug() << settings.value("db/dbPath").toString();
|
||||||
// db.setDatabaseName(QCoreApplication::applicationDirPath() + "/database/app_data.db");
|
// db.setDatabaseName(QCoreApplication::applicationDirPath() + "/database/app_data.db");
|
||||||
db.setDatabaseName(settings.value("db/dbPath").toString());
|
db.setDatabaseName(dbPath);
|
||||||
|
|
||||||
if (!db.open()) {
|
if (!db.open()) {
|
||||||
qWarning() << "Ошибка открытия базы данных:" << db.lastError().text();
|
qWarning() << "Ошибка открытия базы данных:" << db.lastError().text();
|
||||||
|
|||||||
@ -157,12 +157,12 @@ ApplicationInfo ApplicationDAO::getApplication(const QString &deviceId, const QS
|
|||||||
QList<ApplicationInfo> ApplicationDAO::getApplicationsByDeviceId(const QString &deviceId) {
|
QList<ApplicationInfo> ApplicationDAO::getApplicationsByDeviceId(const QString &deviceId) {
|
||||||
QSqlQuery query(DatabaseManager::instance().database());
|
QSqlQuery query(DatabaseManager::instance().database());
|
||||||
QList<ApplicationInfo> list;
|
QList<ApplicationInfo> list;
|
||||||
|
|
||||||
query.prepare(R"(
|
query.prepare(R"(
|
||||||
SELECT id, device_id, pin_code, code, name, package, status, comment, install, pin_code_checked
|
SELECT id, device_id, pin_code, code, name, package, status, comment, install, pin_code_checked
|
||||||
FROM applications
|
FROM applications
|
||||||
WHERE device_id = :device_id
|
WHERE device_id = :device_id AND install = 'yes'
|
||||||
)");
|
)");
|
||||||
|
|
||||||
query.bindValue(":device_id", deviceId);
|
query.bindValue(":device_id", deviceId);
|
||||||
|
|
||||||
if (!query.exec()) {
|
if (!query.exec()) {
|
||||||
@ -182,6 +182,21 @@ bool ApplicationDAO::checkInstalledApps(const QString &deviceId, const QSet<QStr
|
|||||||
const QSettings settings("config.ini", QSettings::IniFormat);
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
QStringList banks = settings.value("apps/list", QStringList()).toStringList();
|
QStringList banks = settings.value("apps/list", QStringList()).toStringList();
|
||||||
|
|
||||||
|
// Сбросить install = 'no' для банков которых нет в текущем apps/list
|
||||||
|
if (!banks.isEmpty()) {
|
||||||
|
QStringList placeholders;
|
||||||
|
for (int i = 0; i < banks.size(); ++i) placeholders << "?";
|
||||||
|
query.prepare(QString(R"(
|
||||||
|
UPDATE applications SET install = 'no'
|
||||||
|
WHERE device_id = ? AND code NOT IN (%1)
|
||||||
|
)").arg(placeholders.join(",")));
|
||||||
|
query.addBindValue(deviceId);
|
||||||
|
for (const QString &bank : banks) query.addBindValue(bank);
|
||||||
|
if (!query.exec()) {
|
||||||
|
qWarning() << "Ошибка при сбросе install:" << query.lastError().text();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (const QString &bank: banks) {
|
for (const QString &bank: banks) {
|
||||||
QString package = settings.value(bank + "/android_package_name").toString();
|
QString package = settings.value(bank + "/android_package_name").toString();
|
||||||
QString name = settings.value(bank + "/name").toString();
|
QString name = settings.value(bank + "/name").toString();
|
||||||
|
|||||||
@ -8,6 +8,7 @@
|
|||||||
DeviceInfo parseDevice(const QSqlQuery &query) {
|
DeviceInfo parseDevice(const QSqlQuery &query) {
|
||||||
DeviceInfo device;
|
DeviceInfo device;
|
||||||
device.id = query.value("id").toString();
|
device.id = query.value("id").toString();
|
||||||
|
device.apiId = query.value("api_id").toString();
|
||||||
device.status = query.value("status").toString();
|
device.status = query.value("status").toString();
|
||||||
device.name = query.value("name").toString();
|
device.name = query.value("name").toString();
|
||||||
device.android = query.value("android").toString();
|
device.android = query.value("android").toString();
|
||||||
@ -19,12 +20,18 @@ DeviceInfo parseDevice(const QSqlQuery &query) {
|
|||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeviceDAO::migrate() {
|
||||||
|
QSqlQuery query(DatabaseManager::instance().database());
|
||||||
|
// Добавляем колонку если её ещё нет (SQLite вернёт ошибку — игнорируем)
|
||||||
|
query.exec("ALTER TABLE devices ADD COLUMN api_id TEXT");
|
||||||
|
}
|
||||||
|
|
||||||
QList<DeviceInfo> DeviceDAO::getAllDevices(const bool online) {
|
QList<DeviceInfo> DeviceDAO::getAllDevices(const bool online) {
|
||||||
QList<DeviceInfo> devices;
|
QList<DeviceInfo> devices;
|
||||||
|
|
||||||
QSqlQuery query(DatabaseManager::instance().database());
|
QSqlQuery query(DatabaseManager::instance().database());
|
||||||
QString sql = R"(
|
QString sql = R"(
|
||||||
SELECT id, status, name, android, screen_width, screen_height, battery, update_time, image
|
SELECT id, api_id, status, name, android, screen_width, screen_height, battery, update_time, image
|
||||||
FROM devices
|
FROM devices
|
||||||
WHERE image IS NOT NULL
|
WHERE image IS NOT NULL
|
||||||
)";
|
)";
|
||||||
@ -71,7 +78,7 @@ DeviceInfo DeviceDAO::getDeviceById(const QString &deviceId) {
|
|||||||
QSqlQuery query(DatabaseManager::instance().database());
|
QSqlQuery query(DatabaseManager::instance().database());
|
||||||
|
|
||||||
query.prepare(R"(
|
query.prepare(R"(
|
||||||
SELECT id, status, name, android, screen_width, screen_height, battery, update_time, image
|
SELECT id, api_id, status, name, android, screen_width, screen_height, battery, update_time, image
|
||||||
FROM devices
|
FROM devices
|
||||||
WHERE id = :deviceId
|
WHERE id = :deviceId
|
||||||
)");
|
)");
|
||||||
@ -179,6 +186,19 @@ bool DeviceDAO::markDevicesOfflineExcept(const QStringList &onlineDeviceIds) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DeviceDAO::updateApiId(const QString &deviceId, const QString &apiId) {
|
||||||
|
QSqlQuery query(DatabaseManager::instance().database());
|
||||||
|
query.prepare("UPDATE devices SET api_id = :api_id WHERE id = :id");
|
||||||
|
query.bindValue(":api_id", apiId);
|
||||||
|
query.bindValue(":id", deviceId);
|
||||||
|
|
||||||
|
if (!query.exec()) {
|
||||||
|
qWarning() << "Ошибка при обновлении api_id устройства:" << query.lastError().text();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool DeviceDAO::updateImage(const QString &deviceId, const QByteArray &imageData) {
|
bool DeviceDAO::updateImage(const QString &deviceId, const QByteArray &imageData) {
|
||||||
QSqlQuery query(DatabaseManager::instance().database());
|
QSqlQuery query(DatabaseManager::instance().database());
|
||||||
query.prepare("UPDATE devices SET image = :image WHERE id = :id");
|
query.prepare("UPDATE devices SET image = :image WHERE id = :id");
|
||||||
|
|||||||
@ -4,10 +4,14 @@
|
|||||||
|
|
||||||
class DeviceDAO {
|
class DeviceDAO {
|
||||||
public:
|
public:
|
||||||
|
static void migrate();
|
||||||
|
|
||||||
[[nodiscard]] static DeviceInfo getDeviceById(const QString &deviceId);
|
[[nodiscard]] static DeviceInfo getDeviceById(const QString &deviceId);
|
||||||
|
|
||||||
[[nodiscard]] static bool upsertDevice(const DeviceInfo &device);
|
[[nodiscard]] static bool upsertDevice(const DeviceInfo &device);
|
||||||
|
|
||||||
|
[[nodiscard]] static bool updateApiId(const QString &deviceId, const QString &apiId);
|
||||||
|
|
||||||
[[nodiscard]] static bool markDevicesOfflineExcept(const QStringList &onlineDeviceIds);
|
[[nodiscard]] static bool markDevicesOfflineExcept(const QStringList &onlineDeviceIds);
|
||||||
|
|
||||||
[[nodiscard]] static bool updateImage(const QString &deviceId, const QByteArray &imageData);
|
[[nodiscard]] static bool updateImage(const QString &deviceId, const QByteArray &imageData);
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "db/TransactionInfo.h"
|
#include "db/TransactionInfo.h"
|
||||||
#include "rshb/GetLastDaysHistoryScript.h"
|
|
||||||
|
|
||||||
class TransactionDAO {
|
class TransactionDAO {
|
||||||
public:
|
public:
|
||||||
|
|||||||
BIN
images/ozon_icon.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
127
main.cpp
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "database/DatabaseManager.h"
|
#include "database/DatabaseManager.h"
|
||||||
#include "database/dao/CommonDataDAO.h"
|
#include "database/dao/CommonDataDAO.h"
|
||||||
|
#include "database/dao/DeviceDAO.h"
|
||||||
#include "services/DeviceScreener.h"
|
#include "services/DeviceScreener.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -16,14 +17,11 @@
|
|||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
|
|
||||||
#include "EventHandler.h"
|
#include "EventHandler.h"
|
||||||
#include "adb/AdbUtils.h"
|
|
||||||
#include "net/NetworkService.h"
|
#include "net/NetworkService.h"
|
||||||
#include "rshb/GetLastDaysHistoryScript.h"
|
|
||||||
#include "rshb/HomeScreenScript.h"
|
|
||||||
#include "rshb/PayByPhoneScript.h"
|
|
||||||
#include "widget/loader/ErrorWindow.h"
|
#include "widget/loader/ErrorWindow.h"
|
||||||
#include "widget/loader/LoaderWindow.h"
|
#include "widget/loader/LoaderWindow.h"
|
||||||
#include "widget/loader/RegistrationWindow.h"
|
#include "widget/loader/RegistrationWindow.h"
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
void startDeviceScreener(const QCoreApplication &app) {
|
void startDeviceScreener(const QCoreApplication &app) {
|
||||||
auto *thread = new QThread();
|
auto *thread = new QThread();
|
||||||
@ -80,6 +78,21 @@ void startNetworkService(const QCoreApplication &app) {
|
|||||||
QObject::connect(&app, &QCoreApplication::aboutToQuit, [=]() {
|
QObject::connect(&app, &QCoreApplication::aboutToQuit, [=]() {
|
||||||
networkService->stop();
|
networkService->stop();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Сигнал эмитируется из фонового потока → Qt::QueuedConnection доставит его в главный поток
|
||||||
|
QObject::connect(networkService, &NetworkService::tokenRefreshFailed, qApp, []() {
|
||||||
|
QMessageBox *box = new QMessageBox(
|
||||||
|
QMessageBox::Critical,
|
||||||
|
"Ошибка авторизации",
|
||||||
|
"Не удалось обновить токен авторизации.\n\n"
|
||||||
|
"Проверьте подключение к интернету.\n"
|
||||||
|
"Приложение продолжит попытки автоматически.",
|
||||||
|
QMessageBox::Ok
|
||||||
|
);
|
||||||
|
box->setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
box->show();
|
||||||
|
}, Qt::QueuedConnection);
|
||||||
|
|
||||||
paymentThread->start();
|
paymentThread->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,67 +156,57 @@ int main(int argc, char *argv[]) {
|
|||||||
qInstallMessageHandler(messageHandler);
|
qInstallMessageHandler(messageHandler);
|
||||||
|
|
||||||
|
|
||||||
// 1. Если есть токен, проверяем его
|
// Миграции БД (добавляем новые колонки если их ещё нет)
|
||||||
// - ошибка сети или сайта [code -1]
|
DeviceDAO::migrate();
|
||||||
// - протух токен, надо заново [code 0]
|
|
||||||
// - все ок, запуск программы [code 1]
|
// 1. Если есть api_key — логинимся и проверяем/создаём desktop
|
||||||
// 2. Если нет токена, выводим, что нет и надо зарегаться [code 0]
|
// - ошибка сети или сервера [code -1]
|
||||||
|
// - неверный api_key [code 0] — показываем окно ввода
|
||||||
|
// - всё ок [code 1] — запускаем приложение
|
||||||
|
// 2. Если нет api_key — показываем окно для ввода
|
||||||
const QSettings settings("config.ini", QSettings::IniFormat);
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
const QString token = settings.value("common/token").toString();
|
const QString apiKey = settings.value("common/api_key").toString();
|
||||||
|
|
||||||
if (false) {
|
auto showRegistration = [&app]() {
|
||||||
auto *mainWindow = new MainWindow();
|
auto *registrationWindow = new RegistrationWindow();
|
||||||
mainWindow->show();
|
registrationWindow->show();
|
||||||
} else {
|
QObject::connect(
|
||||||
if (token.isEmpty()) {
|
registrationWindow, &RegistrationWindow::onRegisteredSuccess, registrationWindow,
|
||||||
auto *registrationWindow = new RegistrationWindow();
|
[registrationWindow, &app]() {
|
||||||
registrationWindow->show();
|
auto *mainWindow = new MainWindow();
|
||||||
|
mainWindow->show();
|
||||||
QObject::connect(
|
registrationWindow->close();
|
||||||
registrationWindow, &RegistrationWindow::onRegisteredSuccess, registrationWindow,
|
startNetworkService(app);
|
||||||
[registrationWindow, &app]() {
|
startDeviceScreener(app);
|
||||||
auto *mainWindow = new MainWindow();
|
startEventHandler(app);
|
||||||
mainWindow->show();
|
|
||||||
registrationWindow->close();
|
|
||||||
startNetworkService(app);
|
|
||||||
startDeviceScreener(app);
|
|
||||||
startEventHandler(app);
|
|
||||||
}, Qt::QueuedConnection);
|
|
||||||
} else {
|
|
||||||
auto *loader = new LoaderWindow(token);
|
|
||||||
loader->show();
|
|
||||||
|
|
||||||
QObject::connect(loader, &LoaderWindow::loadingFinished, loader, [loader, &app](const int result) {
|
|
||||||
if (result == -1) {
|
|
||||||
auto *errorWindow = new ErrorWindow(
|
|
||||||
"Нет подключения к интернету или сервер не отвечает.\n\nПожалуйста, попробуйте позже."
|
|
||||||
);
|
|
||||||
errorWindow->show();
|
|
||||||
} else if (result == 1) {
|
|
||||||
auto *mainWindow = new MainWindow();
|
|
||||||
mainWindow->show();
|
|
||||||
startNetworkService(app);
|
|
||||||
startDeviceScreener(app);
|
|
||||||
startEventHandler(app);
|
|
||||||
} else if (result == 0) {
|
|
||||||
auto *registrationWindow = new RegistrationWindow();
|
|
||||||
registrationWindow->show();
|
|
||||||
|
|
||||||
QObject::connect(
|
|
||||||
registrationWindow, &RegistrationWindow::onRegisteredSuccess, registrationWindow,
|
|
||||||
[registrationWindow, &app]() {
|
|
||||||
auto *mainWindow = new MainWindow();
|
|
||||||
mainWindow->show();
|
|
||||||
registrationWindow->close();
|
|
||||||
startNetworkService(app);
|
|
||||||
startDeviceScreener(app);
|
|
||||||
startEventHandler(app);
|
|
||||||
}, Qt::QueuedConnection);
|
|
||||||
}
|
|
||||||
loader->close();
|
|
||||||
}, Qt::QueuedConnection);
|
}, Qt::QueuedConnection);
|
||||||
// loader.show();
|
};
|
||||||
}
|
|
||||||
|
if (apiKey.isEmpty()) {
|
||||||
|
showRegistration();
|
||||||
|
} else {
|
||||||
|
auto *loader = new LoaderWindow();
|
||||||
|
loader->show();
|
||||||
|
|
||||||
|
QObject::connect(loader, &LoaderWindow::loadingFinished, loader, [loader, &app, showRegistration](const int result) {
|
||||||
|
if (result == -1) {
|
||||||
|
auto *errorWindow = new ErrorWindow(
|
||||||
|
"Нет подключения к интернету или сервер не отвечает.\n\nПожалуйста, попробуйте позже."
|
||||||
|
);
|
||||||
|
errorWindow->show();
|
||||||
|
} else if (result == 1) {
|
||||||
|
auto *mainWindow = new MainWindow();
|
||||||
|
mainWindow->show();
|
||||||
|
startNetworkService(app);
|
||||||
|
startDeviceScreener(app);
|
||||||
|
startEventHandler(app);
|
||||||
|
} else if (result == 0) {
|
||||||
|
QSettings s("config.ini", QSettings::IniFormat);
|
||||||
|
s.remove("common/api_key");
|
||||||
|
showRegistration();
|
||||||
|
}
|
||||||
|
loader->close();
|
||||||
|
}, Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
return QApplication::exec();
|
return QApplication::exec();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
CREATE TABLE IF NOT EXISTS devices
|
CREATE TABLE IF NOT EXISTS devices
|
||||||
(
|
(
|
||||||
id TEXT PRIMARY KEY,
|
id TEXT PRIMARY KEY,
|
||||||
|
api_id TEXT,
|
||||||
status TEXT,
|
status TEXT,
|
||||||
name TEXT,
|
name TEXT,
|
||||||
android TEXT,
|
android TEXT,
|
||||||
|
|||||||
@ -21,6 +21,9 @@ public:
|
|||||||
* const int x = (x1() + x2()) / 2;
|
* const int x = (x1() + x2()) / 2;
|
||||||
* const int y = (y1() + y2()) / 2;
|
* const int y = (y1() + y2()) / 2;
|
||||||
*/
|
*/
|
||||||
|
[[nodiscard]] int width() const { return m_x2 - m_x1; }
|
||||||
|
[[nodiscard]] int height() const { return m_y2 - m_y1; }
|
||||||
|
|
||||||
[[nodiscard]] int x() const {
|
[[nodiscard]] int x() const {
|
||||||
if (m_x1 < 0) {
|
if (m_x1 < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@ -3,7 +3,8 @@
|
|||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
|
||||||
struct DeviceInfo {
|
struct DeviceInfo {
|
||||||
QString id;
|
QString id; // ADB device id (e.g. "emulator-5554")
|
||||||
|
QString apiId; // UUID from backend API (DeviceResponseModel.id)
|
||||||
QString status;
|
QString status;
|
||||||
QString name;
|
QString name;
|
||||||
QString android;
|
QString android;
|
||||||
|
|||||||
@ -16,6 +16,7 @@ enum class EventType {
|
|||||||
Card,
|
Card,
|
||||||
Balance,
|
Balance,
|
||||||
History,
|
History,
|
||||||
|
FetchProfile,
|
||||||
Unknown
|
Unknown
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -44,6 +45,7 @@ inline QString eventTypeToString(const EventType type) {
|
|||||||
case EventType::Card: return "card";
|
case EventType::Card: return "card";
|
||||||
case EventType::Balance: return "balance";
|
case EventType::Balance: return "balance";
|
||||||
case EventType::History: return "history";
|
case EventType::History: return "history";
|
||||||
|
case EventType::FetchProfile: return "fetch_profile";
|
||||||
default: return "unknown";
|
default: return "unknown";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -53,6 +55,7 @@ inline EventType eventTypeFromString(const QString &str) {
|
|||||||
if (str == "card") return EventType::Card;
|
if (str == "card") return EventType::Card;
|
||||||
if (str == "balance") return EventType::Balance;
|
if (str == "balance") return EventType::Balance;
|
||||||
if (str == "history") return EventType::History;
|
if (str == "history") return EventType::History;
|
||||||
|
if (str == "fetch_profile") return EventType::FetchProfile;
|
||||||
return EventType::Unknown;
|
return EventType::Unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
#include <QHttpMultiPart>
|
#include <QHttpMultiPart>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
|
#include <QJsonDocument>
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
#include <dao/DeviceDAO.h>
|
#include <dao/DeviceDAO.h>
|
||||||
@ -22,6 +23,7 @@ DeviceScreener::DeviceScreener(QObject *parent) : QObject(parent) {
|
|||||||
const QSettings settings("config.ini", QSettings::IniFormat);
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
m_urlAppUpdate = settings.value("net/appInfoUpdate").toString();
|
m_urlAppUpdate = settings.value("net/appInfoUpdate").toString();
|
||||||
m_token = settings.value("common/token").toString();
|
m_token = settings.value("common/token").toString();
|
||||||
|
m_apiBase = settings.value("net/apiBase").toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceScreener::~DeviceScreener() = default;
|
DeviceScreener::~DeviceScreener() = default;
|
||||||
@ -98,6 +100,88 @@ void DeviceScreener::postDevicesData(const QList<DeviceInfo> &devices) {
|
|||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QJsonValue DeviceScreener::apiPost(const QString &path, const QJsonObject &body) {
|
||||||
|
if (!m_manager) m_manager = new QNetworkAccessManager(this);
|
||||||
|
|
||||||
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
|
QNetworkRequest request(QUrl(m_apiBase + path));
|
||||||
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||||
|
request.setRawHeader("Authorization",
|
||||||
|
("Bearer " + settings.value("common/access_token").toString()).toUtf8());
|
||||||
|
|
||||||
|
QNetworkReply *reply = m_manager->post(request, QJsonDocument(body).toJson());
|
||||||
|
QEventLoop loop;
|
||||||
|
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
|
||||||
|
connect(reply, &QNetworkReply::errorOccurred, [&loop](QNetworkReply::NetworkError) { loop.quit(); });
|
||||||
|
loop.exec();
|
||||||
|
|
||||||
|
QJsonValue result;
|
||||||
|
if (reply->error() == QNetworkReply::NoError) {
|
||||||
|
const QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());
|
||||||
|
if (doc.isObject()) {
|
||||||
|
const QJsonObject root = doc.object();
|
||||||
|
if (root["success"].toBool()) result = root["data"];
|
||||||
|
else qCritical() << "DeviceScreener apiPost error:" << root;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
qCritical() << "DeviceScreener apiPost network error:" << reply->errorString();
|
||||||
|
}
|
||||||
|
reply->deleteLater();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceScreener::apiPatch(const QString &path, const QJsonObject &body) {
|
||||||
|
if (!m_manager) m_manager = new QNetworkAccessManager(this);
|
||||||
|
|
||||||
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
|
QNetworkRequest request(QUrl(m_apiBase + path));
|
||||||
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||||
|
request.setRawHeader("Authorization",
|
||||||
|
("Bearer " + settings.value("common/access_token").toString()).toUtf8());
|
||||||
|
|
||||||
|
QNetworkReply *reply = m_manager->sendCustomRequest(request, "PATCH", QJsonDocument(body).toJson());
|
||||||
|
QEventLoop loop;
|
||||||
|
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
|
||||||
|
connect(reply, &QNetworkReply::errorOccurred, [&loop](QNetworkReply::NetworkError) { loop.quit(); });
|
||||||
|
loop.exec();
|
||||||
|
|
||||||
|
if (reply->error() != QNetworkReply::NoError) {
|
||||||
|
qCritical() << "DeviceScreener apiPatch network error:" << reply->errorString();
|
||||||
|
}
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString DeviceScreener::createDeviceOnApi(const DeviceInfo &device) {
|
||||||
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
|
const QString desktopId = settings.value("common/desktop_id").toString();
|
||||||
|
if (desktopId.isEmpty()) {
|
||||||
|
qWarning() << "createDeviceOnApi: desktop_id не задан";
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
QJsonObject body;
|
||||||
|
body["desktop_id"] = desktopId;
|
||||||
|
body["status"] = "ONLINE";
|
||||||
|
body["name"] = device.name;
|
||||||
|
body["screen_width"] = device.screenWidth;
|
||||||
|
body["screen_height"] = device.screenHeight;
|
||||||
|
body["battery"] = device.battery;
|
||||||
|
|
||||||
|
const QJsonValue result = apiPost("/api/v1/device/", body);
|
||||||
|
if (!result.isNull() && !result.isUndefined()) {
|
||||||
|
return result.toObject()["id"].toString();
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceScreener::updateDeviceOnApi(const DeviceInfo &device) {
|
||||||
|
QJsonObject body;
|
||||||
|
body["status"] = (device.status == "device") ? "ONLINE" : "OFFLINE";
|
||||||
|
body["battery"] = device.battery;
|
||||||
|
body["update_time"] = QDateTime::currentSecsSinceEpoch();
|
||||||
|
apiPatch("/api/v1/device/" + device.apiId, body);
|
||||||
|
}
|
||||||
|
|
||||||
void DeviceScreener::start() {
|
void DeviceScreener::start() {
|
||||||
QMap<QString, bool> bankChecked;
|
QMap<QString, bool> bankChecked;
|
||||||
while (m_running) {
|
while (m_running) {
|
||||||
@ -124,10 +208,29 @@ void DeviceScreener::start() {
|
|||||||
if (!DeviceDAO::upsertDevice(device)) {
|
if (!DeviceDAO::upsertDevice(device)) {
|
||||||
qDebug() << "Cant update devive";
|
qDebug() << "Cant update devive";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Синхронизация с API
|
||||||
|
DeviceInfo saved = DeviceDAO::getDeviceById(device.id);
|
||||||
|
if (saved.apiId.isEmpty()) {
|
||||||
|
// Устройство ещё не зарегистрировано — создаём
|
||||||
|
const QString apiId = createDeviceOnApi(device);
|
||||||
|
if (!apiId.isEmpty()) {
|
||||||
|
DeviceDAO::updateApiId(device.id, apiId);
|
||||||
|
qDebug() << "Device registered on API:" << device.id << "->" << apiId;
|
||||||
|
}
|
||||||
|
} else if (status == "device") {
|
||||||
|
// Обновляем не чаще раза в 60 секунд
|
||||||
|
const qint64 now = QDateTime::currentSecsSinceEpoch();
|
||||||
|
if (now - m_lastApiUpdate.value(device.id, 0) >= 60) {
|
||||||
|
device.apiId = saved.apiId;
|
||||||
|
updateDeviceOnApi(device);
|
||||||
|
m_lastApiUpdate[device.id] = now;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (!deviceInfos.empty()) {
|
// if (!deviceInfos.empty()) {
|
||||||
postDevicesData(deviceInfos);
|
// postDevicesData(deviceInfos);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (!DeviceDAO::markDevicesOfflineExcept(onlineIds)) {
|
if (!DeviceDAO::markDevicesOfflineExcept(onlineIds)) {
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
#include <dao/DeviceDAO.h>
|
#include <dao/DeviceDAO.h>
|
||||||
#include <db/DeviceInfo.h>
|
#include <db/DeviceInfo.h>
|
||||||
|
|
||||||
@ -23,12 +24,21 @@ private:
|
|||||||
bool m_running = true;
|
bool m_running = true;
|
||||||
QString m_urlAppUpdate;
|
QString m_urlAppUpdate;
|
||||||
QString m_token;
|
QString m_token;
|
||||||
|
QString m_apiBase;
|
||||||
|
QNetworkAccessManager *m_manager = nullptr;
|
||||||
|
QMap<QString, qint64> m_lastApiUpdate; // deviceId → unix timestamp последнего PATCH
|
||||||
|
|
||||||
static QList<QPair<QString, QString> > readAdbDevices();
|
static QList<QPair<QString, QString> > readAdbDevices();
|
||||||
|
|
||||||
static QByteArray takeScreenshot(const QString &deviceId);
|
static QByteArray takeScreenshot(const QString &deviceId);
|
||||||
|
|
||||||
static DeviceInfo readDeviceInfo(const QString &deviceId, bool isChecked);
|
static DeviceInfo readDeviceInfo(const QString &deviceId, bool isChecked);
|
||||||
|
|
||||||
void postDevicesData(const QList<DeviceInfo> &devices);
|
void postDevicesData(const QList<DeviceInfo> &devices);
|
||||||
|
|
||||||
|
QJsonValue apiPost(const QString &path, const QJsonObject &body);
|
||||||
|
void apiPatch(const QString &path, const QJsonObject &body);
|
||||||
|
|
||||||
|
QString createDeviceOnApi(const DeviceInfo &device);
|
||||||
|
void updateDeviceOnApi(const DeviceInfo &device);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -12,6 +12,7 @@
|
|||||||
#include "db/ApplicationInfo.h"
|
#include "db/ApplicationInfo.h"
|
||||||
#include "net/NetworkService.h"
|
#include "net/NetworkService.h"
|
||||||
#include "birbank/GetLastDaysHistoryBirbankScript.h"
|
#include "birbank/GetLastDaysHistoryBirbankScript.h"
|
||||||
|
#include "ozon/LoginAndCheckAccountsScript.h"
|
||||||
#include "rshb/CommonScript.h"
|
#include "rshb/CommonScript.h"
|
||||||
#include "rshb/GetLastDaysHistoryScript.h"
|
#include "rshb/GetLastDaysHistoryScript.h"
|
||||||
#include "rshb/LoginAndCheckAccountsScript.h"
|
#include "rshb/LoginAndCheckAccountsScript.h"
|
||||||
@ -140,31 +141,49 @@ void EventHandler::startThreadForKey(const QString &key) {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// auto *worker = new GetLastDaysHistoryScript(account);
|
// auto *worker = new Rshb::GetLastDaysHistoryScript(account);
|
||||||
// worker->moveToThread(thr);
|
// worker->moveToThread(thr);
|
||||||
//
|
//
|
||||||
// connect(thr, &QThread::started, worker, &GetLastDaysHistoryScript::start);
|
// connect(thr, &QThread::started, worker, &Rshb::GetLastDaysHistoryScript::start);
|
||||||
// connect(worker, &GetLastDaysHistoryScript::finished, thr, &QThread::quit);
|
// connect(worker, &Rshb::GetLastDaysHistoryScript::finished, thr, &QThread::quit);
|
||||||
// connect(worker, &GetLastDaysHistoryScript::finished, worker, &QObject::deleteLater);
|
// connect(worker, &Rshb::GetLastDaysHistoryScript::finished, worker, &QObject::deleteLater);
|
||||||
// connect(thr, &QThread::finished, thr, &QObject::deleteLater);
|
// connect(thr, &QThread::finished, thr, &QObject::deleteLater);
|
||||||
//
|
//
|
||||||
// connect(worker, &GetLastDaysHistoryScript::finishedWithResult, this,
|
// connect(worker, &Rshb::GetLastDaysHistoryScript::finishedWithResult, this,
|
||||||
// [this, key, event](const QString &result) {
|
// [this, key, event](const QString &result) {
|
||||||
// updateEventThread(key, event, result);
|
// updateEventThread(key, event, result);
|
||||||
// }
|
// }
|
||||||
// );
|
// );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (event.type == EventType::FetchProfile) {
|
||||||
|
if ("ozon" == account.appCode) {
|
||||||
|
auto *worker = new Ozon::LoginAndCheckAccountsScript(event.deviceId, account.appCode);
|
||||||
|
worker->moveToThread(thr);
|
||||||
|
|
||||||
|
connect(thr, &QThread::started, worker, &Ozon::LoginAndCheckAccountsScript::start);
|
||||||
|
connect(worker, &Ozon::LoginAndCheckAccountsScript::finished, thr, &QThread::quit);
|
||||||
|
connect(worker, &Ozon::LoginAndCheckAccountsScript::finished, worker, &QObject::deleteLater);
|
||||||
|
connect(thr, &QThread::finished, thr, &QObject::deleteLater);
|
||||||
|
|
||||||
|
connect(worker, &Ozon::LoginAndCheckAccountsScript::finishedWithResult, this,
|
||||||
|
[this, key, event](const QString &result) {
|
||||||
|
updateEventThread(key, event, result);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (event.type == EventType::Phone) {
|
if (event.type == EventType::Phone) {
|
||||||
// auto *worker = new PayByPhoneScript(account, event.phone, event.bankName, event.amount);
|
// auto *worker = new Rshb::PayByPhoneScript(account, event.phone, event.bankName, event.amount);
|
||||||
// worker->moveToThread(thr);
|
// worker->moveToThread(thr);
|
||||||
//
|
//
|
||||||
// connect(thr, &QThread::started, worker, &PayByPhoneScript::start);
|
// connect(thr, &QThread::started, worker, &Rshb::PayByPhoneScript::start);
|
||||||
// connect(worker, &PayByPhoneScript::finished, thr, &QThread::quit);
|
// connect(worker, &Rshb::PayByPhoneScript::finished, thr, &QThread::quit);
|
||||||
// connect(worker, &PayByPhoneScript::finished, worker, &QObject::deleteLater);
|
// connect(worker, &Rshb::PayByPhoneScript::finished, worker, &QObject::deleteLater);
|
||||||
// connect(thr, &QThread::finished, thr, &QObject::deleteLater);
|
// connect(thr, &QThread::finished, thr, &QObject::deleteLater);
|
||||||
//
|
//
|
||||||
// connect(worker, &PayByPhoneScript::finishedWithResult, this,
|
// connect(worker, &Rshb::PayByPhoneScript::finishedWithResult, this,
|
||||||
// [this, key, event](const QString &result) {
|
// [this, key, event](const QString &result) {
|
||||||
// updateEventThread(key, event, result);
|
// updateEventThread(key, event, result);
|
||||||
// }
|
// }
|
||||||
|
|||||||
@ -11,7 +11,6 @@
|
|||||||
#include <QTimeZone>
|
#include <QTimeZone>
|
||||||
|
|
||||||
#include "dao/AccountDAO.h"
|
#include "dao/AccountDAO.h"
|
||||||
#include "dao/ApplicationDAO.h"
|
|
||||||
#include "dao/DeviceDAO.h"
|
#include "dao/DeviceDAO.h"
|
||||||
#include "dao/EventDAO.h"
|
#include "dao/EventDAO.h"
|
||||||
#include "dao/TransactionDAO.h"
|
#include "dao/TransactionDAO.h"
|
||||||
@ -25,10 +24,10 @@ NetworkService::NetworkService(QObject *parent) : QObject(parent) {
|
|||||||
m_urlAppStatusUpdate = settings.value("net/appStatusUpdate").toString();
|
m_urlAppStatusUpdate = settings.value("net/appStatusUpdate").toString();
|
||||||
m_urlTransactionInsert = settings.value("net/transactionInsert").toString();
|
m_urlTransactionInsert = settings.value("net/transactionInsert").toString();
|
||||||
m_urlEventStatusUpdate = settings.value("net/eventStatusUpdate").toString();
|
m_urlEventStatusUpdate = settings.value("net/eventStatusUpdate").toString();
|
||||||
m_urlCheckAppStatus = settings.value("net/checkAppStatus").toString();
|
m_apiBase = settings.value("net/apiBase").toString();
|
||||||
m_urlRegisterNewUser = settings.value("net/registerNewUser").toString();
|
|
||||||
m_manager = new QNetworkAccessManager(this);
|
m_manager = new QNetworkAccessManager(this);
|
||||||
m_token = settings.value("common/token").toString();
|
m_token = settings.value("common/token").toString();
|
||||||
|
m_accessToken = settings.value("common/access_token").toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkService::~NetworkService() = default;
|
NetworkService::~NetworkService() = default;
|
||||||
@ -129,16 +128,7 @@ QJsonArray NetworkService::get(const QString &path, const QMap<QString, QString>
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NetworkService::postAccountsData() {
|
void NetworkService::postAccountsData() {
|
||||||
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
|
// TODO: заменить на новый API
|
||||||
|
|
||||||
addFormMetadata(multiPart, m_json);
|
|
||||||
addFormField(multiPart, "token", m_token);
|
|
||||||
addFormField(multiPart, "androidUniqueName", m_deviceId);
|
|
||||||
const bool isSuccess = post(multiPart, m_urlAccountUpdate).toBool();
|
|
||||||
if (!isSuccess) {
|
|
||||||
qCritical() << "Cant post accounts data";
|
|
||||||
}
|
|
||||||
|
|
||||||
emit finished();
|
emit finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,34 +181,98 @@ void NetworkService::postAppStatus() {
|
|||||||
emit finished();
|
emit finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkService::checkAppStatus() {
|
QJsonValue NetworkService::postJson(const QString &path, const QJsonObject &body, bool withAuth) {
|
||||||
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
|
const QUrl url(path);
|
||||||
|
QNetworkRequest request(url);
|
||||||
addFormField(multiPart, "token", m_extraData["token"].toString());
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||||
|
if (withAuth && !m_accessToken.isEmpty()) {
|
||||||
const QJsonValue result = post(multiPart, m_urlCheckAppStatus);
|
request.setRawHeader("Authorization", ("Bearer " + m_accessToken).toUtf8());
|
||||||
if (result.isNull()) {
|
|
||||||
emit finishedWithResult(-1);
|
|
||||||
} else {
|
|
||||||
emit finishedWithResult(result.toInt());
|
|
||||||
}
|
}
|
||||||
emit finished();
|
|
||||||
|
QNetworkReply *reply = m_manager->post(request, QJsonDocument(body).toJson());
|
||||||
|
QEventLoop loop;
|
||||||
|
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
|
||||||
|
connect(reply, &QNetworkReply::errorOccurred, [&loop](QNetworkReply::NetworkError) {
|
||||||
|
loop.quit();
|
||||||
|
});
|
||||||
|
loop.exec();
|
||||||
|
|
||||||
|
QJsonValue result;
|
||||||
|
if (reply->error() != QNetworkReply::NoError) {
|
||||||
|
qCritical() << "Network error:" << reply->errorString() << path;
|
||||||
|
result = QJsonValue::Undefined;
|
||||||
|
} else {
|
||||||
|
const QByteArray raw = reply->readAll();
|
||||||
|
QJsonParseError err;
|
||||||
|
const QJsonDocument doc = QJsonDocument::fromJson(raw, &err);
|
||||||
|
if (err.error == QJsonParseError::NoError && doc.isObject()) {
|
||||||
|
const QJsonObject root = doc.object();
|
||||||
|
if (root["success"].toBool()) {
|
||||||
|
result = root["data"];
|
||||||
|
} else {
|
||||||
|
qCritical() << "API error:" << root;
|
||||||
|
result = QJsonValue::Null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reply->deleteLater();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkService::registerNewUser() {
|
void NetworkService::loginAndSetup() {
|
||||||
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
|
|
||||||
QSettings settings("config.ini", QSettings::IniFormat);
|
QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
addFormField(multiPart, "version", settings.value("common/version").toString());
|
const QString apiKey = settings.value("common/api_key").toString();
|
||||||
addFormField(multiPart, "name", m_extraData["name"].toString());
|
|
||||||
addFormField(multiPart, "email", m_extraData["email"].toString());
|
|
||||||
|
|
||||||
const QJsonValue result = post(multiPart, m_urlRegisterNewUser);
|
// Шаг 1: логин
|
||||||
if (result.isNull()) {
|
QJsonObject loginBody;
|
||||||
emit finishedWithResult(-1);
|
loginBody["api_key"] = apiKey;
|
||||||
} else {
|
const QJsonValue loginResult = postJson(m_apiBase + "/api/v1/auth/login", loginBody);
|
||||||
settings.setValue("common/token", result.toString());
|
|
||||||
emit finishedWithResult(1);
|
if (loginResult.isUndefined()) {
|
||||||
|
emit finishedWithResult(-1); // ошибка сети
|
||||||
|
emit finished();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
if (loginResult.isNull()) {
|
||||||
|
emit finishedWithResult(0); // неверный api_key
|
||||||
|
emit finished();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QJsonObject loginData = loginResult.toObject();
|
||||||
|
m_accessToken = loginData["access_token"].toString();
|
||||||
|
settings.setValue("common/access_token", m_accessToken);
|
||||||
|
settings.setValue("common/refresh_token", loginData["refresh_token"].toString());
|
||||||
|
const qint64 expiresIn = static_cast<qint64>(loginData["expires_in"].toDouble());
|
||||||
|
settings.setValue("common/token_expires_at", QDateTime::currentSecsSinceEpoch() + expiresIn);
|
||||||
|
|
||||||
|
// Шаг 2: проверяем есть ли desktop_id
|
||||||
|
const QString desktopId = settings.value("common/desktop_id").toString();
|
||||||
|
if (!desktopId.isEmpty()) {
|
||||||
|
emit finishedWithResult(1);
|
||||||
|
emit finished();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Шаг 3: создаём desktop
|
||||||
|
QJsonObject desktopBody;
|
||||||
|
desktopBody["blue_token"] = QJsonValue::Null;
|
||||||
|
desktopBody["name"] = QJsonValue::Null;
|
||||||
|
desktopBody["contact"] = QJsonValue::Null;
|
||||||
|
desktopBody["app_version"] = settings.value("common/version").toString();
|
||||||
|
const QJsonValue desktopResult = postJson(m_apiBase + "/api/v1/desktop/", desktopBody, true);
|
||||||
|
|
||||||
|
if (desktopResult.isUndefined() || desktopResult.isNull()) {
|
||||||
|
emit finishedWithResult(-1);
|
||||||
|
emit finished();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QJsonObject desktopData = desktopResult.toObject();
|
||||||
|
settings.setValue("common/desktop_id", desktopData["id"].toString());
|
||||||
|
settings.setValue("common/profile_id", desktopData["profile_id"].toString());
|
||||||
|
|
||||||
|
emit finishedWithResult(1);
|
||||||
emit finished();
|
emit finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,46 +324,162 @@ void NetworkService::insertTransactionData() {
|
|||||||
emit finished();
|
emit finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkService::start() {
|
QJsonValue NetworkService::patchJson(const QString &path, const QJsonObject &body, bool withAuth) {
|
||||||
QList<DeviceInfo> devices = DeviceDAO::getAllDevices(true);
|
const QUrl url(path);
|
||||||
for (DeviceInfo &device: devices) {
|
QNetworkRequest request(url);
|
||||||
QList<ApplicationInfo> applications = ApplicationDAO::getApplicationsByDeviceId(device.id);
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||||
for (ApplicationInfo &app: applications) {
|
if (withAuth && !m_accessToken.isEmpty()) {
|
||||||
if (app.pinCodeChecked) {
|
request.setRawHeader("Authorization", ("Bearer " + m_accessToken).toUtf8());
|
||||||
QList<AccountInfo> accounts = AccountDAO::getAccounts(device.id, app.code);
|
}
|
||||||
QJsonArray list;
|
|
||||||
|
|
||||||
for (const AccountInfo &account: accounts) {
|
QNetworkReply *reply = m_manager->sendCustomRequest(request, "PATCH", QJsonDocument(body).toJson());
|
||||||
QJsonObject obj;
|
QEventLoop loop;
|
||||||
obj["appName"] = account.appCode;
|
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
|
||||||
obj["lastNumbers"] = account.lastNumbers;
|
connect(reply, &QNetworkReply::errorOccurred, [&loop](QNetworkReply::NetworkError) { loop.quit(); });
|
||||||
obj["amount"] = account.amount;
|
loop.exec();
|
||||||
obj["description"] = account.description;
|
|
||||||
obj["currency"] = account.currency;
|
|
||||||
obj["status"] = accountStatusToString(account.status);
|
|
||||||
list.append(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto *paymentThread = new QThread;
|
QJsonValue result;
|
||||||
auto *networkService = new NetworkService;
|
if (reply->error() != QNetworkReply::NoError) {
|
||||||
networkService->setDeviceId(device.id);
|
qCritical() << "Network error (PATCH):" << reply->errorString() << path;
|
||||||
networkService->setPayload(QJsonDocument(list).toJson());
|
} else {
|
||||||
networkService->moveToThread(paymentThread);
|
const QByteArray raw = reply->readAll();
|
||||||
QObject::connect(paymentThread, &QThread::started, networkService, &NetworkService::postAccountsData);
|
QJsonParseError err;
|
||||||
QObject::connect(networkService, &NetworkService::finished, paymentThread, &QThread::quit);
|
const QJsonDocument doc = QJsonDocument::fromJson(raw, &err);
|
||||||
QObject::connect(networkService, &NetworkService::finished, networkService, &QObject::deleteLater);
|
if (err.error == QJsonParseError::NoError && doc.isObject()) {
|
||||||
QObject::connect(paymentThread, &QThread::finished, paymentThread, &QThread::deleteLater);
|
const QJsonObject root = doc.object();
|
||||||
paymentThread->start();
|
if (root["success"].toBool()) {
|
||||||
|
result = root["data"];
|
||||||
|
} else {
|
||||||
|
qCritical() << "API error (PATCH):" << root;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
reply->deleteLater();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
QTimer *poller = new QTimer(this);
|
void NetworkService::createDevice() {
|
||||||
poller->setInterval(1000);
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
connect(poller, &QTimer::timeout, this, &NetworkService::getPayments);
|
const QString desktopId = settings.value("common/desktop_id").toString();
|
||||||
poller->start();
|
if (desktopId.isEmpty()) {
|
||||||
|
qWarning() << "createDevice: desktop_id not set";
|
||||||
|
emit finished();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QJsonObject body = QJsonDocument::fromJson(m_json).object();
|
||||||
|
const QJsonValue result = postJson(m_apiBase + "/api/v1/device/", body, true);
|
||||||
|
|
||||||
|
if (!result.isNull() && !result.isUndefined()) {
|
||||||
|
const QString apiId = result.toObject()["id"].toString();
|
||||||
|
if (!apiId.isEmpty() && !m_deviceId.isEmpty()) {
|
||||||
|
DeviceDAO::updateApiId(m_deviceId, apiId);
|
||||||
|
qDebug() << "createDevice: saved api_id" << apiId << "for" << m_deviceId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
emit finished();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetworkService::updateDevice() {
|
||||||
|
const DeviceInfo device = DeviceDAO::getDeviceById(m_deviceId);
|
||||||
|
if (device.apiId.isEmpty()) {
|
||||||
|
qWarning() << "updateDevice: api_id not set for" << m_deviceId;
|
||||||
|
emit finished();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QJsonObject body = QJsonDocument::fromJson(m_json).object();
|
||||||
|
patchJson(m_apiBase + "/api/v1/device/" + device.apiId, body, true);
|
||||||
|
|
||||||
|
emit finished();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NetworkService::refreshToken() {
|
||||||
|
QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
|
const QString storedRefreshToken = settings.value("common/refresh_token").toString();
|
||||||
|
if (storedRefreshToken.isEmpty()) {
|
||||||
|
qWarning() << "refreshToken: refresh_token отсутствует";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QJsonObject body;
|
||||||
|
body["refresh_token"] = storedRefreshToken;
|
||||||
|
const QJsonValue result = postJson(m_apiBase + "/api/v1/auth/refresh_token", body);
|
||||||
|
|
||||||
|
if (result.isNull() || result.isUndefined()) {
|
||||||
|
qCritical() << "refreshToken: не удалось обновить токен";
|
||||||
|
if (!m_tokenErrorShown) {
|
||||||
|
m_tokenErrorShown = true;
|
||||||
|
emit tokenRefreshFailed();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QJsonObject data = result.toObject();
|
||||||
|
m_accessToken = data["access_token"].toString();
|
||||||
|
settings.setValue("common/access_token", m_accessToken);
|
||||||
|
settings.setValue("common/refresh_token", data["refresh_token"].toString());
|
||||||
|
const qint64 expiresIn = static_cast<qint64>(data["expires_in"].toDouble());
|
||||||
|
settings.setValue("common/token_expires_at", QDateTime::currentSecsSinceEpoch() + expiresIn);
|
||||||
|
|
||||||
|
m_tokenErrorShown = false; // сбрасываем если снова заработало
|
||||||
|
qDebug() << "refreshToken: токен обновлён, истекает через" << expiresIn << "сек";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NetworkService::ensureValidToken() {
|
||||||
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
|
const qint64 expiresAt = settings.value("common/token_expires_at", 0).toLongLong();
|
||||||
|
const qint64 now = QDateTime::currentSecsSinceEpoch();
|
||||||
|
|
||||||
|
// Обновляем заранее — за 30 минут до истечения
|
||||||
|
if (expiresAt - now < 30 * 60) {
|
||||||
|
qDebug() << "ensureValidToken: токен истекает через" << (expiresAt - now) << "сек, обновляем";
|
||||||
|
return refreshToken();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetworkService::scheduleNextRefresh() {
|
||||||
|
if (!m_running) return;
|
||||||
|
|
||||||
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
||||||
|
const qint64 expiresAt = settings.value("common/token_expires_at", 0).toLongLong();
|
||||||
|
const qint64 now = QDateTime::currentSecsSinceEpoch();
|
||||||
|
|
||||||
|
// Обновляем за 30 минут до истечения; если уже пора — сразу
|
||||||
|
const qint64 secsUntilRefresh = qMax<qint64>(0, expiresAt - now - 30 * 60);
|
||||||
|
qDebug() << "scheduleNextRefresh: следующий рефреш через" << secsUntilRefresh << "сек"
|
||||||
|
<< "(" << secsUntilRefresh / 3600 << "ч" << (secsUntilRefresh % 3600) / 60 << "мин)";
|
||||||
|
|
||||||
|
QTimer::singleShot(secsUntilRefresh * 1000, this, [this]() {
|
||||||
|
if (!m_running) return;
|
||||||
|
|
||||||
|
if (refreshToken()) {
|
||||||
|
scheduleNextRefresh(); // успех — планируем следующий
|
||||||
|
} else {
|
||||||
|
// Ошибка — повторяем через 60 секунд
|
||||||
|
qWarning() << "scheduleNextRefresh: повтор через 60 сек";
|
||||||
|
QTimer::singleShot(60 * 1000, this, [this]() {
|
||||||
|
scheduleNextRefresh();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetworkService::start() {
|
||||||
|
m_running = true;
|
||||||
|
|
||||||
|
// Проверяем токен при старте и планируем рефреш по времени жизни
|
||||||
|
ensureValidToken();
|
||||||
|
scheduleNextRefresh();
|
||||||
|
|
||||||
|
// TODO: GET /api/v1/task/get_tasks (polling)
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkService::stop() {
|
void NetworkService::stop() {
|
||||||
m_running = false;
|
m_running = false;
|
||||||
|
// Эмитируем finished() в потоке NetworkService, чтобы корректно завершить QThread
|
||||||
|
QMetaObject::invokeMethod(this, [this]() { emit finished(); }, Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
|
|||||||