1
0
forked from BRT/arc

Daily commit

This commit is contained in:
slava 2026-02-22 20:48:16 +07:00
parent c9e266225a
commit f5810acf6c
107 changed files with 15027 additions and 363 deletions

View File

@ -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 shell rm /sdcard/screen.png").arg(adb, deviceId)
};
for (const QString &cmd : shotCmds) {
for (const QString &cmd: shotCmds) {
startProcess(cmd); // ошибки игнорируем для скриншота
}
}
@ -288,6 +288,17 @@ bool AdbUtils::inputText(const QString &deviceId, const QString &text) {
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) {
QProcess process;
process.start(adbPath(), {

View File

@ -37,6 +37,8 @@ public:
static bool inputText(const QString &deviceId, const QString &text);
static bool hideKeyboard(const QString &deviceId);
static bool goBack(const QString &deviceId);
static QSet<QString> getListApps(const QString &deviceId);

View File

@ -25,70 +25,81 @@ void LoginAndCheckAccountsBirbankScript::doStart() {
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));
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));
}
if (xmlScreenParser.isHomeScreen()) {
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
Node cardText = xmlScreenParser.findTextNode("2480");
if (!cardText.isEmpty()) {
AdbUtils::makeTap(device.id, cardText.x(), cardText.y());
AdbUtils::makeTap(m_deviceId, cardText.x(), cardText.y());
QThread::msleep(2000);
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();
Node payBtn = xmlScreenParser.findTextNode("Перевести");
if (!payBtn.isEmpty()) {
AdbUtils::makeTap(m_deviceId, payBtn.x(), payBtn.y());
QThread::msleep(1000);
QList<TransactionInfo> savedTransactions = TransactionDAO::getTransactions(89);
for (TransactionInfo &transaction: transactions) {
bool isSaved = false;
for (TransactionInfo &savedTransaction: savedTransactions) {
if (savedTransaction.amount == transaction.amount
&& savedTransaction.bankTime == transaction.bankTime) {
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);
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);
if (tr.id == -1) {
qDebug() << "--- saveAndPostNewTransactionData failed";
}
AccountInfo account = AccountDAO::getAccountById(89);
postNewTransactionData(account, tr);
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");
// if (!saveAndPostNewTransactionData(m_account, transaction, TransactionStatus::Complete)) {
// qDebug() << "--- saveAndPostNewTransactionData failed";
// }
}
AdbUtils::hideKeyboard(m_deviceId);
AdbUtils::makeTap(m_deviceId, amountEditText.x(), amountEditText.y());
QThread::msleep(200);
AdbUtils::inputText(m_deviceId, "10");
AdbUtils::hideKeyboard(m_deviceId);
// дальше оплата, но хз как
}
} else {
m_error = "Card page not found: " + m_deviceId + " " + m_appCode;
m_error = "Pay by card button not found: " + m_deviceId + " " + m_appCode;
qWarning() << m_error;
emit finishedWithResult(m_error);
return;
}
} else {
m_error = "Card not found: " + m_deviceId + " " + m_appCode;
m_error = "Pay button not found: " + m_deviceId + " " + m_appCode;
qWarning() << m_error;
emit finishedWithResult(m_error);
return;
}
}
}
} else {
// "Maraqlı deyil" - не интересно
if (device.id.isEmpty() || app.id == -1) {

View 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);
}

View 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);
};

View 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

View 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

View 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

View 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

View 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

View 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

File diff suppressed because it is too large Load Diff

View 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

View File

@ -8,6 +8,8 @@
#include "adb/AdbUtils.h"
#include "net/NetworkService.h"
namespace Rshb {
CommonScript::CommonScript(QObject *parent)
: QObject(parent) {
}
@ -291,3 +293,5 @@ void CommonScript::updateTransactionData(
void CommonScript::stop() {
m_running = false;
}
} // namespace Rshb

View File

@ -3,6 +3,8 @@
#include <QObject>
#include "ScreenXmlParser.h"
namespace Rshb {
class CommonScript : public QObject {
Q_OBJECT
@ -72,3 +74,5 @@ public slots:
private:
Q_DISABLE_COPY(CommonScript);
};
} // namespace Rshb

View File

@ -15,6 +15,8 @@
#include "net/NetworkService.h"
#include "time/DateUtils.h"
namespace Rshb {
GetLastDaysHistoryScript::GetLastDaysHistoryScript(
AccountInfo account,
QObject *parent
@ -393,3 +395,5 @@ void GetLastDaysHistoryScript::doStart() {
AdbUtils::goBack(m_account.deviceId);
emit finishedWithResult(m_error);
}
} // namespace Rshb

View File

@ -1,6 +1,8 @@
#pragma once
#include "CommonScript.h"
namespace Rshb {
class GetLastDaysHistoryScript final : public CommonScript {
Q_OBJECT
@ -33,3 +35,5 @@ private:
const QString &newDesc
);
};
} // namespace Rshb

View File

@ -8,6 +8,8 @@
#include "ScreenXmlParser.h"
#include "adb/AdbUtils.h"
namespace Rshb {
HomeScreenScript::HomeScreenScript(QObject *parent)
: QObject(parent) {
@ -507,3 +509,5 @@ void HomeScreenScript::start() {
void HomeScreenScript::stop() {
m_running = false;
}
} // namespace Rshb

View File

@ -5,6 +5,8 @@
#include "ScreenXmlParser.h"
namespace Rshb {
class HomeScreenScript final : public QObject {
Q_OBJECT
@ -33,3 +35,5 @@ private:
int height
);
};
} // namespace Rshb

View File

@ -5,6 +5,8 @@
#include "dao/ApplicationDAO.h"
#include "dao/DeviceDAO.h"
namespace Rshb {
LoginAndCheckAccountsScript::LoginAndCheckAccountsScript(
QString deviceId,
QString appCode,
@ -63,3 +65,5 @@ void LoginAndCheckAccountsScript::doStart() {
AdbUtils::tryToKillApplication(m_deviceId, app.package);
emit finishedWithResult(m_error);
}
} // namespace Rshb

View File

@ -1,6 +1,8 @@
#pragma once
#include "CommonScript.h"
namespace Rshb {
class LoginAndCheckAccountsScript final : public CommonScript {
Q_OBJECT
@ -21,3 +23,5 @@ private:
const QString m_appCode;
QString m_error;
};
} // namespace Rshb

View File

@ -13,6 +13,8 @@
#include "db/ApplicationInfo.h"
#include "db/DeviceInfo.h"
namespace Rshb {
PayByPhoneScript::PayByPhoneScript(
AccountInfo account,
QString phone,
@ -334,3 +336,5 @@ void PayByPhoneScript::doStart() {
emit finishedWithResult(m_error);
}
} // namespace Rshb

View File

@ -1,6 +1,8 @@
#pragma once
#include "CommonScript.h"
namespace Rshb {
class PayByPhoneScript final : public CommonScript {
Q_OBJECT
@ -32,3 +34,5 @@ private:
int height
);
};
} // namespace Rshb

View File

@ -15,6 +15,8 @@
#include "db/TransactionInfo.h"
#include "time/DateUtils.h"
namespace Rshb {
ScreenXmlParser::ScreenXmlParser(QObject *parent) : QObject(parent) {
}
@ -974,3 +976,5 @@ void ScreenXmlParser::test() {
// qDebug().noquote().nospace() << convertTransactionToString(info);
// ЕСПП
}
} // namespace Rshb

View File

@ -6,6 +6,8 @@
#include "db/AccountInfo.h"
#include "db/TransactionInfo.h"
namespace Rshb {
class ScreenXmlParser final : public QObject {
Q_OBJECT
@ -55,3 +57,5 @@ private:
QList<Node> findPinCodeNodes(const QString &pinCode);
};
} // namespace Rshb

View File

@ -1,5 +1,7 @@
#include "SyncAccountDataScript.h"
namespace Rshb {
SyncAccountDataScript::SyncAccountDataScript(
QString deviceId,
QObject *parent
@ -13,3 +15,5 @@ void SyncAccountDataScript::doStart() {
// 1.
}
} // namespace Rshb

View File

@ -1,6 +1,8 @@
#pragma once
#include "CommonScript.h"
namespace Rshb {
class SyncAccountDataScript final : public CommonScript {
Q_OBJECT
@ -19,3 +21,4 @@ private:
const QString m_deviceId;
};
} // namespace Rshb

View File

@ -113,7 +113,7 @@ void GetLastDaysHistoryTossScript::doStart() {
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
Node transferText = xmlScreenParser.findTextContainsNode("토스뱅크 통장");
Node transferText = xmlScreenParser.findFirstAccountLine();
if (!transferText.isEmpty()) {
AdbUtils::makeTap(device.id, transferText.x(), transferText.y());
QThread::msleep(3000);
@ -142,11 +142,7 @@ void GetLastDaysHistoryTossScript::doStart() {
}
}
}
} else {
m_error = "Card page not found: " + m_account.deviceId + " " + m_account.lastNumbers;
qWarning() << m_error;
emit finishedWithResult(m_error);
return;
break;
}
QThread::msleep(1000);

View File

@ -1,5 +1,6 @@
#include "LoginAndCheckAccountsTossScript.h"
#include <QRandomGenerator>
#include <QThread>
#include "adb/AdbUtils.h"
@ -63,50 +64,220 @@ void LoginAndCheckAccountsTossScript::doStart() {
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));
// находим первую кнопку Transfer
Node transferText = xmlScreenParser.findButtonNode("Transfer", false);
if (!transferText.isEmpty()) {
AdbUtils::makeTap(m_deviceId, transferText.x(), transferText.y());
QThread::msleep(1000);
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);
AdbUtils::inputText(m_deviceId, "51291082442507");
QThread::msleep(200);
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);
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
// искать Transfer кнопку
bool foundBank = false;
for (int i = 0; i < 5; ++i) {
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));
}
// Node transferText = xmlScreenParser.findTextContainsNode("토스뱅크 통장");
// if (transferText.isEmpty()) {
// }
if (!foundBank) {
m_error = "Bank not found: " + m_deviceId + " " + m_appCode;
qCritical() << m_error;
emit finishedWithResult(m_error);
return;
}
Node transferText = xmlScreenParser.findFirstAccountLine();
if (!transferText.isEmpty()) {
AdbUtils::makeTap(device.id, transferText.x(), transferText.y());
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 historyFound = false;
for (int i = 0; i < 5; ++i) {
Node topUpBtn = xmlScreenParser.findButtonNode("Top up", false);
Node sendBtn = xmlScreenParser.findButtonNode("Send", false);
if (!topUpBtn.isEmpty() && !sendBtn.isEmpty()) {
// подгрузка истории идет
QThread::msleep(2000);
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
QList<TransactionInfo> transactions = xmlScreenParser.parsePositiveTransactions();
for (auto &transaction: transactions) {
qDebug().noquote().nospace() << convertTransactionToString(transaction);
}
historyFound = true;
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 (!historyFound) {
m_error = "Top up or send button not found: " + m_deviceId + " " + m_appCode;
qWarning() << m_error;
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 = "Card not found: " + m_deviceId + " " + m_appCode;
qWarning() << m_error;
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;
}
} else {
m_error = "Enter account number not found: " + m_deviceId + " " + m_appCode;
qCritical() << m_error;
emit finishedWithResult(m_error);
return;
}
} else {
m_error = "Transfer button not found: " + m_deviceId + " " + m_appCode;
qCritical() << m_error;
emit finishedWithResult(m_error);
return;
}

View 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);
}

View 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);
};

View File

@ -68,6 +68,33 @@ Node ScreenXmlTossParser::findEditTextByResourceId(const QString &resourceId) {
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) {
for (const Node &node: m_nodes) {
if (contains) {
@ -137,7 +164,7 @@ Node convertTossDomElementToNode(const QDomElement &element) {
node.clickable = element.attribute("clickable") == "true";
}
if (element.hasAttribute("focusable")) {
node.focusable =element.attribute("focusable") == "true";
node.focusable = element.attribute("focusable") == "true";
}
if (element.hasAttribute("resource-id")) {
node.resourceId = element.attribute("resource-id");
@ -383,6 +410,70 @@ float extractKoreanWonFromText(const QString &input) {
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() {
const QDomNodeList nodes = m_xml.elementsByTagName("node");
QList<AccountInfo> accounts;
@ -390,34 +481,28 @@ QList<AccountInfo> ScreenXmlTossParser::parseAccountsInfo() {
for (int i = 0; i < nodes.count(); ++i) {
const QDomElement el = nodes.at(i).toElement();
// 토스뱅크 통장
if (el.attribute("content-desc").contains("토스뱅크 통장") && el.attribute("content-desc").contains("")) {
// Аккаунтов может быть несколько, вот берем первый по списку
if (el.attribute("text") == "Transfer") {
for (QDomNode node: el.parentNode().parentNode().parentNode().childNodes()) {
const QDomElement child = node.toElement();
if (child.attribute("content-desc").contains("")) {
AccountInfo info;
info.amount = extractKoreanWonFromText(el.attribute("content-desc"));
info.amount = extractKoreanWonFromText(child.attribute("content-desc"));
info.updateTime = DateUtils::getUtcNow();
accounts.append(info);
break;
// auto amount = el.attribute("text").replace("₼", "").trimmed();
// const QDomElement parent = el.parentNode().parentNode().toElement();
// // Перебираем потомков
// QDomNode n = parent.firstChild().firstChild().firstChild().firstChild();
// while (!n.isNull()) {
// const QDomElement e = n.toElement();
// if (e.attribute("resource-id") == "az.kapitalbank.mbanking:id/tvNumber") {
// const QString account = e.attribute("text");
//
return accounts;
}
}
}
// if (el.attribute("content-desc").contains("토스뱅크 통장") && el.attribute("content-desc").contains("₩")) {
// AccountInfo info;
// info.lastNumbers = account;
// info.amount = amount.toFloat();
// info.description = account;
// info.amount = extractKoreanWonFromText(el.attribute("content-desc"));
// info.updateTime = DateUtils::getUtcNow();
//
// accounts.append(info);
// break;
// }
// n = n.nextSibling();
// }
}
}
return accounts;
}

View File

@ -26,6 +26,8 @@ public:
Node findEditTextByResourceId(const QString &resourceId);
Node findNodeByClassName(const QString &className);
Node findButtonNode(const QString &text, bool contains);
bool isHomeScreen();
@ -36,8 +38,12 @@ public:
QList<AccountInfo> parseAccountsInfo();
double parseAccountAmount();
QList<Node> findPinCodeNodes(const QString &pinCode);
QList<Node> getNodeNumbers(double value);
void test();
private:

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

File diff suppressed because one or more lines are too long

BIN
assets/ozon/home_page.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 KiB

1507
assets/ozon/home_page.xml Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

File diff suppressed because one or more lines are too long

BIN
assets/ozon/pin_code.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

1456
assets/ozon/pin_code.xml Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

353
assets/toss/last_step.xml Normal file
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 KiB

219
assets/toss/pop_up_win.xml Normal file
View 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="케이뱅크가 청년을 위해&#10;인당 현금 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

814
assets/toss/select_bank.xml Normal file
View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

View 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&#10;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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View 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&#10;₩747&#10;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>

View File

@ -1,29 +1,37 @@
[apps]
list=birbank, toss
list=ozon
[birbank]
android_package_name=az.kapitalbank.mbanking
name=Birbank
[common]
access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjNDU1MjE1Ni1kMTc5LTRhNzktOWU5MS01ODcwMzhjOTVjZjAiLCJ0eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzcxODU0MzI0fQ.xLalNxKuPK1QV3D94Je1OJITBV-VfIQJG6iSwPa_mMg
api_key=0eee77b62013253e02e1a69bc6a505bb37757fb7
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
[db]
dbPath=/Users/trnsmkot/CLionProjects/ARCDeskProject/ARCDeskProject/database/app_data.db
dbPath=~/CLionProjects/ARCDeskProject/ARCDeskProject/database/app_data.db
[net]
accountUpdate=http://localhost:9999/api/v1/account/update
apiBase=http://93.183.75.134:8005
appInfoUpdate=http://localhost:9999/api/v1/device/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
paymentsGet=http://localhost:9999/api/v1/payments
registerNewUser=http://localhost:9999/api/v1/application/register
transactionInsert=http://localhost:9999/api/v1/transaction/insert
transactionUpdate=http://localhost:9999/api/v1/transaction/update
[ozon]
android_package_name=ru.ozon.fintech.finance
name=Ozon
[rshb]
android_package_name=ru.rshb.dbo
name=Росcельхозбанк

View File

@ -2,6 +2,7 @@
#include <QCoreApplication>
#include <QSqlError>
#include <QDebug>
#include <QDir>
#include <QSettings>
#include <QThread>
@ -29,9 +30,15 @@ QSqlDatabase DatabaseManager::database() {
if (!connectionPool.contains(name)) {
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", name);
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();
// db.setDatabaseName(QCoreApplication::applicationDirPath() + "/database/app_data.db");
db.setDatabaseName(settings.value("db/dbPath").toString());
db.setDatabaseName(dbPath);
if (!db.open()) {
qWarning() << "Ошибка открытия базы данных:" << db.lastError().text();

Binary file not shown.

View File

@ -157,12 +157,12 @@ ApplicationInfo ApplicationDAO::getApplication(const QString &deviceId, const QS
QList<ApplicationInfo> ApplicationDAO::getApplicationsByDeviceId(const QString &deviceId) {
QSqlQuery query(DatabaseManager::instance().database());
QList<ApplicationInfo> list;
query.prepare(R"(
SELECT id, device_id, pin_code, code, name, package, status, comment, install, pin_code_checked
FROM applications
WHERE device_id = :device_id
WHERE device_id = :device_id AND install = 'yes'
)");
query.bindValue(":device_id", deviceId);
if (!query.exec()) {
@ -182,6 +182,21 @@ bool ApplicationDAO::checkInstalledApps(const QString &deviceId, const QSet<QStr
const QSettings settings("config.ini", QSettings::IniFormat);
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) {
QString package = settings.value(bank + "/android_package_name").toString();
QString name = settings.value(bank + "/name").toString();

View File

@ -8,6 +8,7 @@
DeviceInfo parseDevice(const QSqlQuery &query) {
DeviceInfo device;
device.id = query.value("id").toString();
device.apiId = query.value("api_id").toString();
device.status = query.value("status").toString();
device.name = query.value("name").toString();
device.android = query.value("android").toString();
@ -19,12 +20,18 @@ DeviceInfo parseDevice(const QSqlQuery &query) {
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> devices;
QSqlQuery query(DatabaseManager::instance().database());
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
WHERE image IS NOT NULL
)";
@ -71,7 +78,7 @@ DeviceInfo DeviceDAO::getDeviceById(const QString &deviceId) {
QSqlQuery query(DatabaseManager::instance().database());
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
WHERE id = :deviceId
)");
@ -179,6 +186,19 @@ bool DeviceDAO::markDevicesOfflineExcept(const QStringList &onlineDeviceIds) {
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) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare("UPDATE devices SET image = :image WHERE id = :id");

View File

@ -4,10 +4,14 @@
class DeviceDAO {
public:
static void migrate();
[[nodiscard]] static DeviceInfo getDeviceById(const QString &deviceId);
[[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 updateImage(const QString &deviceId, const QByteArray &imageData);

View File

@ -1,6 +1,5 @@
#pragma once
#include "db/TransactionInfo.h"
#include "rshb/GetLastDaysHistoryScript.h"
class TransactionDAO {
public:

BIN
images/ozon_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -6,6 +6,7 @@
#include "database/DatabaseManager.h"
#include "database/dao/CommonDataDAO.h"
#include "database/dao/DeviceDAO.h"
#include "services/DeviceScreener.h"
#include <iostream>
@ -16,14 +17,11 @@
#include <QSettings>
#include "EventHandler.h"
#include "adb/AdbUtils.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/LoaderWindow.h"
#include "widget/loader/RegistrationWindow.h"
#include <QMessageBox>
void startDeviceScreener(const QCoreApplication &app) {
auto *thread = new QThread();
@ -80,6 +78,21 @@ void startNetworkService(const QCoreApplication &app) {
QObject::connect(&app, &QCoreApplication::aboutToQuit, [=]() {
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();
}
@ -143,22 +156,20 @@ int main(int argc, char *argv[]) {
qInstallMessageHandler(messageHandler);
// 1. Если есть токен, проверяем его
// - ошибка сети или сайта [code -1]
// - протух токен, надо заново [code 0]
// - все ок, запуск программы [code 1]
// 2. Если нет токена, выводим, что нет и надо зарегаться [code 0]
const QSettings settings("config.ini", QSettings::IniFormat);
const QString token = settings.value("common/token").toString();
// Миграции БД (добавляем новые колонки если их ещё нет)
DeviceDAO::migrate();
if (false) {
auto *mainWindow = new MainWindow();
mainWindow->show();
} else {
if (token.isEmpty()) {
// 1. Если есть api_key — логинимся и проверяем/создаём desktop
// - ошибка сети или сервера [code -1]
// - неверный api_key [code 0] — показываем окно ввода
// - всё ок [code 1] — запускаем приложение
// 2. Если нет api_key — показываем окно для ввода
const QSettings settings("config.ini", QSettings::IniFormat);
const QString apiKey = settings.value("common/api_key").toString();
auto showRegistration = [&app]() {
auto *registrationWindow = new RegistrationWindow();
registrationWindow->show();
QObject::connect(
registrationWindow, &RegistrationWindow::onRegisteredSuccess, registrationWindow,
[registrationWindow, &app]() {
@ -169,11 +180,15 @@ int main(int argc, char *argv[]) {
startDeviceScreener(app);
startEventHandler(app);
}, Qt::QueuedConnection);
};
if (apiKey.isEmpty()) {
showRegistration();
} else {
auto *loader = new LoaderWindow(token);
auto *loader = new LoaderWindow();
loader->show();
QObject::connect(loader, &LoaderWindow::loadingFinished, loader, [loader, &app](const int result) {
QObject::connect(loader, &LoaderWindow::loadingFinished, loader, [loader, &app, showRegistration](const int result) {
if (result == -1) {
auto *errorWindow = new ErrorWindow(
"Нет подключения к интернету или сервер не отвечает.\n\nПожалуйста, попробуйте позже."
@ -186,24 +201,12 @@ int main(int argc, char *argv[]) {
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);
QSettings s("config.ini", QSettings::IniFormat);
s.remove("common/api_key");
showRegistration();
}
loader->close();
}, Qt::QueuedConnection);
// loader.show();
}
}
return QApplication::exec();
}

View File

@ -1,6 +1,7 @@
CREATE TABLE IF NOT EXISTS devices
(
id TEXT PRIMARY KEY,
api_id TEXT,
status TEXT,
name TEXT,
android TEXT,

View File

@ -21,6 +21,9 @@ public:
* const int x = (x1() + x2()) / 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 {
if (m_x1 < 0) {
return -1;

View File

@ -3,7 +3,8 @@
#include <QDateTime>
struct DeviceInfo {
QString id;
QString id; // ADB device id (e.g. "emulator-5554")
QString apiId; // UUID from backend API (DeviceResponseModel.id)
QString status;
QString name;
QString android;

View File

@ -16,6 +16,7 @@ enum class EventType {
Card,
Balance,
History,
FetchProfile,
Unknown
};
@ -44,6 +45,7 @@ inline QString eventTypeToString(const EventType type) {
case EventType::Card: return "card";
case EventType::Balance: return "balance";
case EventType::History: return "history";
case EventType::FetchProfile: return "fetch_profile";
default: return "unknown";
}
}
@ -53,6 +55,7 @@ inline EventType eventTypeFromString(const QString &str) {
if (str == "card") return EventType::Card;
if (str == "balance") return EventType::Balance;
if (str == "history") return EventType::History;
if (str == "fetch_profile") return EventType::FetchProfile;
return EventType::Unknown;
}

View File

@ -10,6 +10,7 @@
#include <QHttpMultiPart>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <dao/DeviceDAO.h>
@ -22,6 +23,7 @@ DeviceScreener::DeviceScreener(QObject *parent) : QObject(parent) {
const QSettings settings("config.ini", QSettings::IniFormat);
m_urlAppUpdate = settings.value("net/appInfoUpdate").toString();
m_token = settings.value("common/token").toString();
m_apiBase = settings.value("net/apiBase").toString();
}
DeviceScreener::~DeviceScreener() = default;
@ -98,6 +100,88 @@ void DeviceScreener::postDevicesData(const QList<DeviceInfo> &devices) {
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() {
QMap<QString, bool> bankChecked;
while (m_running) {
@ -124,10 +208,29 @@ void DeviceScreener::start() {
if (!DeviceDAO::upsertDevice(device)) {
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()) {
postDevicesData(deviceInfos);
// postDevicesData(deviceInfos);
// }
if (!DeviceDAO::markDevicesOfflineExcept(onlineIds)) {

View File

@ -1,5 +1,6 @@
#pragma once
#include <QObject>
#include <QNetworkAccessManager>
#include <dao/DeviceDAO.h>
#include <db/DeviceInfo.h>
@ -23,6 +24,9 @@ private:
bool m_running = true;
QString m_urlAppUpdate;
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();
@ -31,4 +35,10 @@ private:
static DeviceInfo readDeviceInfo(const QString &deviceId, bool isChecked);
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);
};

View File

@ -12,6 +12,7 @@
#include "db/ApplicationInfo.h"
#include "net/NetworkService.h"
#include "birbank/GetLastDaysHistoryBirbankScript.h"
#include "ozon/LoginAndCheckAccountsScript.h"
#include "rshb/CommonScript.h"
#include "rshb/GetLastDaysHistoryScript.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);
//
// connect(thr, &QThread::started, worker, &GetLastDaysHistoryScript::start);
// connect(worker, &GetLastDaysHistoryScript::finished, thr, &QThread::quit);
// connect(worker, &GetLastDaysHistoryScript::finished, worker, &QObject::deleteLater);
// connect(thr, &QThread::started, worker, &Rshb::GetLastDaysHistoryScript::start);
// connect(worker, &Rshb::GetLastDaysHistoryScript::finished, thr, &QThread::quit);
// connect(worker, &Rshb::GetLastDaysHistoryScript::finished, worker, &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) {
// 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) {
// 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);
//
// connect(thr, &QThread::started, worker, &PayByPhoneScript::start);
// connect(worker, &PayByPhoneScript::finished, thr, &QThread::quit);
// connect(worker, &PayByPhoneScript::finished, worker, &QObject::deleteLater);
// connect(thr, &QThread::started, worker, &Rshb::PayByPhoneScript::start);
// connect(worker, &Rshb::PayByPhoneScript::finished, thr, &QThread::quit);
// connect(worker, &Rshb::PayByPhoneScript::finished, worker, &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) {
// updateEventThread(key, event, result);
// }

View File

@ -11,7 +11,6 @@
#include <QTimeZone>
#include "dao/AccountDAO.h"
#include "dao/ApplicationDAO.h"
#include "dao/DeviceDAO.h"
#include "dao/EventDAO.h"
#include "dao/TransactionDAO.h"
@ -25,10 +24,10 @@ NetworkService::NetworkService(QObject *parent) : QObject(parent) {
m_urlAppStatusUpdate = settings.value("net/appStatusUpdate").toString();
m_urlTransactionInsert = settings.value("net/transactionInsert").toString();
m_urlEventStatusUpdate = settings.value("net/eventStatusUpdate").toString();
m_urlCheckAppStatus = settings.value("net/checkAppStatus").toString();
m_urlRegisterNewUser = settings.value("net/registerNewUser").toString();
m_apiBase = settings.value("net/apiBase").toString();
m_manager = new QNetworkAccessManager(this);
m_token = settings.value("common/token").toString();
m_accessToken = settings.value("common/access_token").toString();
}
NetworkService::~NetworkService() = default;
@ -129,16 +128,7 @@ QJsonArray NetworkService::get(const QString &path, const QMap<QString, QString>
}
void NetworkService::postAccountsData() {
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
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";
}
// TODO: заменить на новый API
emit finished();
}
@ -191,34 +181,98 @@ void NetworkService::postAppStatus() {
emit finished();
}
void NetworkService::checkAppStatus() {
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
addFormField(multiPart, "token", m_extraData["token"].toString());
const QJsonValue result = post(multiPart, m_urlCheckAppStatus);
if (result.isNull()) {
emit finishedWithResult(-1);
} else {
emit finishedWithResult(result.toInt());
QJsonValue NetworkService::postJson(const QString &path, const QJsonObject &body, bool withAuth) {
const QUrl url(path);
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
if (withAuth && !m_accessToken.isEmpty()) {
request.setRawHeader("Authorization", ("Bearer " + m_accessToken).toUtf8());
}
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() {
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
void NetworkService::loginAndSetup() {
QSettings settings("config.ini", QSettings::IniFormat);
addFormField(multiPart, "version", settings.value("common/version").toString());
addFormField(multiPart, "name", m_extraData["name"].toString());
addFormField(multiPart, "email", m_extraData["email"].toString());
const QString apiKey = settings.value("common/api_key").toString();
const QJsonValue result = post(multiPart, m_urlRegisterNewUser);
if (result.isNull()) {
emit finishedWithResult(-1);
} else {
settings.setValue("common/token", result.toString());
emit finishedWithResult(1);
// Шаг 1: логин
QJsonObject loginBody;
loginBody["api_key"] = apiKey;
const QJsonValue loginResult = postJson(m_apiBase + "/api/v1/auth/login", loginBody);
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();
}
@ -270,46 +324,162 @@ void NetworkService::insertTransactionData() {
emit finished();
}
QJsonValue NetworkService::patchJson(const QString &path, const QJsonObject &body, bool withAuth) {
const QUrl url(path);
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
if (withAuth && !m_accessToken.isEmpty()) {
request.setRawHeader("Authorization", ("Bearer " + m_accessToken).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();
QJsonValue result;
if (reply->error() != QNetworkReply::NoError) {
qCritical() << "Network error (PATCH):" << reply->errorString() << path;
} 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 (PATCH):" << root;
}
}
}
reply->deleteLater();
return result;
}
void NetworkService::createDevice() {
const QSettings settings("config.ini", QSettings::IniFormat);
const QString desktopId = settings.value("common/desktop_id").toString();
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() {
QList<DeviceInfo> devices = DeviceDAO::getAllDevices(true);
for (DeviceInfo &device: devices) {
QList<ApplicationInfo> applications = ApplicationDAO::getApplicationsByDeviceId(device.id);
for (ApplicationInfo &app: applications) {
if (app.pinCodeChecked) {
QList<AccountInfo> accounts = AccountDAO::getAccounts(device.id, app.code);
QJsonArray list;
m_running = true;
for (const AccountInfo &account: accounts) {
QJsonObject obj;
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);
}
// Проверяем токен при старте и планируем рефреш по времени жизни
ensureValidToken();
scheduleNextRefresh();
auto *paymentThread = new QThread;
auto *networkService = new NetworkService;
networkService->setDeviceId(device.id);
networkService->setPayload(QJsonDocument(list).toJson());
networkService->moveToThread(paymentThread);
QObject::connect(paymentThread, &QThread::started, networkService, &NetworkService::postAccountsData);
QObject::connect(networkService, &NetworkService::finished, paymentThread, &QThread::quit);
QObject::connect(networkService, &NetworkService::finished, networkService, &QObject::deleteLater);
QObject::connect(paymentThread, &QThread::finished, paymentThread, &QThread::deleteLater);
paymentThread->start();
}
}
}
QTimer *poller = new QTimer(this);
poller->setInterval(1000);
connect(poller, &QTimer::timeout, this, &NetworkService::getPayments);
poller->start();
// TODO: GET /api/v1/task/get_tasks (polling)
}
void NetworkService::stop() {
m_running = false;
// Эмитируем finished() в потоке NetworkService, чтобы корректно завершить QThread
QMetaObject::invokeMethod(this, [this]() { emit finished(); }, Qt::QueuedConnection);
}

Some files were not shown because too many files have changed in this diff Show More