151 lines
4.8 KiB
Java
151 lines
4.8 KiB
Java
package com.cbcren.vpn;
|
|
|
|
import android.app.Activity;
|
|
import android.os.Bundle;
|
|
import android.os.CountDownTimer;
|
|
import android.view.View;
|
|
import android.widget.Button;
|
|
import android.widget.TextView;
|
|
import android.widget.Toast;
|
|
import android.content.Intent;
|
|
|
|
// Imports de WireGuard
|
|
import com.wireguard.android.backend.Backend;
|
|
import com.wireguard.android.backend.GoBackend;
|
|
import com.wireguard.android.backend.Tunnel;
|
|
import com.wireguard.config.Config;
|
|
import com.wireguard.config.Interface;
|
|
import com.wireguard.config.Peer;
|
|
import com.wireguard.config.InetEndpoint;
|
|
import com.wireguard.config.InetNetwork;
|
|
|
|
import java.util.Collections;
|
|
|
|
public class MainActivity extends Activity {
|
|
|
|
private TextView statusText;
|
|
private Button connectBtn;
|
|
private Backend backend;
|
|
private Config config;
|
|
private Tunnel tunnel;
|
|
private CountDownTimer timer;
|
|
|
|
// --- CONFIGURACIÓN QUEMADA ---
|
|
private static final String CLIENT_PRIV_KEY = "ULfX2KspqzSv9cgfvYxGjbL/3FkOS27iCVCyL+LWGmE=";
|
|
private static final String SERVER_PUB_KEY = "44dNaTOCc/nY6vkqy3fJ+L1RqWDqFqEaEq1IBL/InRM=";
|
|
private static final String SERVER_ENDPOINT = "194.163.191.200:51820";
|
|
private static final String CLIENT_IP = "10.66.66.2/32";
|
|
// -----------------------------
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
setContentView(R.layout.activity_main);
|
|
|
|
statusText = findViewById(R.id.statusText);
|
|
connectBtn = findViewById(R.id.connectBtn);
|
|
|
|
// Inicializar Backend
|
|
try {
|
|
backend = new GoBackend(getApplicationContext());
|
|
tunnel = new SimpleTunnel("XuperTunnel");
|
|
config = createConfig();
|
|
} catch (Exception e) {
|
|
statusText.setText("Error Init: " + e.getMessage());
|
|
}
|
|
|
|
connectBtn.setOnClickListener(v -> startVpnSequence());
|
|
}
|
|
|
|
private Config createConfig() throws Exception {
|
|
Interface.Builder interfaceBuilder = new Interface.Builder();
|
|
interfaceBuilder.parsePrivateKey(CLIENT_PRIV_KEY);
|
|
interfaceBuilder.parseAddresses(CLIENT_IP);
|
|
interfaceBuilder.parseDnsServers("8.8.8.8");
|
|
|
|
Peer.Builder peerBuilder = new Peer.Builder();
|
|
peerBuilder.parsePublicKey(SERVER_PUB_KEY);
|
|
peerBuilder.parseEndpoint(SERVER_ENDPOINT);
|
|
peerBuilder.parseAllowedIPs("0.0.0.0/0"); // Todo por el tunel
|
|
|
|
return new Config.Builder()
|
|
.setInterface(interfaceBuilder.build())
|
|
.addPeer(peerBuilder.build())
|
|
.build();
|
|
}
|
|
|
|
private void startVpnSequence() {
|
|
if (backend == null) return;
|
|
|
|
connectBtn.setEnabled(false);
|
|
statusText.setText("Conectando...");
|
|
|
|
// Lanzar Intent de VPN (El sistema pedirá permiso la primera vez)
|
|
Intent intent = GoBackend.VpnService.prepare(this);
|
|
if (intent != null) {
|
|
startActivityForResult(intent, 0);
|
|
return;
|
|
}
|
|
|
|
connectTunnel();
|
|
}
|
|
|
|
@Override
|
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
if (resultCode == RESULT_OK) {
|
|
connectTunnel();
|
|
} else {
|
|
statusText.setText("Permiso denegado");
|
|
connectBtn.setEnabled(true);
|
|
}
|
|
}
|
|
|
|
private void connectTunnel() {
|
|
try {
|
|
// Si ya está corriendo, apagar primero
|
|
backend.setState(tunnel, Tunnel.State.DOWN, null);
|
|
|
|
// Encender
|
|
backend.setState(tunnel, Tunnel.State.UP, config);
|
|
|
|
startTimer();
|
|
} catch (Exception e) {
|
|
statusText.setText("Error Conexión: " + e.getMessage());
|
|
connectBtn.setEnabled(true);
|
|
}
|
|
}
|
|
|
|
private void startTimer() {
|
|
timer = new CountDownTimer(60000, 1000) {
|
|
public void onTick(long millisUntilFinished) {
|
|
statusText.setText("VPN ACTIVA\n" + (millisUntilFinished / 1000) + " segundos");
|
|
}
|
|
|
|
public void onFinish() {
|
|
disconnectTunnel();
|
|
}
|
|
}.start();
|
|
}
|
|
|
|
private void disconnectTunnel() {
|
|
try {
|
|
if (backend != null) {
|
|
backend.setState(tunnel, Tunnel.State.DOWN, null);
|
|
}
|
|
statusText.setText("Desconectado.\nAbre XuperTV.");
|
|
connectBtn.setEnabled(true);
|
|
connectBtn.setText("RECONECTAR");
|
|
} catch (Exception e) {
|
|
// Ignorar
|
|
}
|
|
}
|
|
|
|
// Clase auxiliar simple para identificar el tunel
|
|
private static class SimpleTunnel implements Tunnel {
|
|
private final String name;
|
|
SimpleTunnel(String name) { this.name = name; }
|
|
@Override public String getName() { return name; }
|
|
@Override public void onStateChange(State newState) {}
|
|
}
|
|
}
|