diff --git a/apk/controller/app/build.gradle b/apk/controller/app/build.gradle
index ed5cdf0..fa313b6 100644
--- a/apk/controller/app/build.gradle
+++ b/apk/controller/app/build.gradle
@@ -9,8 +9,8 @@ android {
applicationId "org.iiab.controller"
minSdkVersion 24
targetSdkVersion 34
- versionCode 27
- versionName "v0.1.31beta"
+ versionCode 28
+ versionName "v0.1.32beta"
setProperty("archivesBaseName", "$applicationId-$versionName")
ndk {
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
diff --git a/apk/controller/app/release/output-metadata.json b/apk/controller/app/release/output-metadata.json
index 8239e44..cff0147 100644
--- a/apk/controller/app/release/output-metadata.json
+++ b/apk/controller/app/release/output-metadata.json
@@ -11,9 +11,9 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
- "versionCode": 27,
- "versionName": "v0.1.31beta",
- "outputFile": "org.iiab.controller-v0.1.31beta-release.apk"
+ "versionCode": 28,
+ "versionName": "v0.1.32beta",
+ "outputFile": "org.iiab.controller-v0.1.32beta-release.apk"
}
],
"elementType": "File",
@@ -22,14 +22,14 @@
"minApi": 28,
"maxApi": 30,
"baselineProfiles": [
- "baselineProfiles/1/org.iiab.controller-v0.1.31beta-release.dm"
+ "baselineProfiles/1/org.iiab.controller-v0.1.32beta-release.dm"
]
},
{
"minApi": 31,
"maxApi": 2147483647,
"baselineProfiles": [
- "baselineProfiles/0/org.iiab.controller-v0.1.31beta-release.dm"
+ "baselineProfiles/0/org.iiab.controller-v0.1.32beta-release.dm"
]
}
],
diff --git a/apk/controller/app/src/main/AndroidManifest.xml b/apk/controller/app/src/main/AndroidManifest.xml
index 3940303..72845c8 100644
--- a/apk/controller/app/src/main/AndroidManifest.xml
+++ b/apk/controller/app/src/main/AndroidManifest.xml
@@ -92,4 +92,5 @@
tools:ignore="QueryAllPackagesPermission" />
+
diff --git a/apk/controller/app/src/main/java/org/iiab/controller/IIABWatchdog.java b/apk/controller/app/src/main/java/org/iiab/controller/IIABWatchdog.java
index eb9bf43..c0adcb4 100644
--- a/apk/controller/app/src/main/java/org/iiab/controller/IIABWatchdog.java
+++ b/apk/controller/app/src/main/java/org/iiab/controller/IIABWatchdog.java
@@ -86,11 +86,11 @@ public class IIABWatchdog {
context.startService(intent);
} catch (SecurityException e) {
// This catches specific permission errors on newer Android versions
- Log.e(TAG, "Permission Denied: Ensure manifest has RUN_COMMAND and app is not restricted.", e);
+ Log.e(TAG, context.getString(R.string.permission_denied_log), e);
writeToBlackBox(context, context.getString(R.string.critical_os_blocked));
} catch (Exception e) {
- Log.e(TAG, "Unexpected error sending intent to Termux", e);
- writeToBlackBox(context, "Pulse Error: " + e.getMessage());
+ Log.e(TAG, context.getString(R.string.unexpected_error_termux), e);
+ writeToBlackBox(context, context.getString(R.string.pulse_error_log, e.getMessage()));
}
}
@@ -143,7 +143,7 @@ public class IIABWatchdog {
writer.append(datePrefix).append(" - ").append(message).append("\n");
broadcastLog(context, message);
} catch (IOException e) {
- Log.e(TAG, "Failed to write to BlackBox", e);
+ Log.e(TAG, context.getString(R.string.failed_write_blackbox), e);
}
}
@@ -199,7 +199,7 @@ public class IIABWatchdog {
pw.println(l);
}
} catch (IOException e) {
- Log.e(TAG, "Maintenance write failed", e);
+ Log.e(TAG, context.getString(R.string.maintenance_write_failed), e);
}
}
diff --git a/apk/controller/app/src/main/java/org/iiab/controller/LogManager.java b/apk/controller/app/src/main/java/org/iiab/controller/LogManager.java
index c3a1f8e..4c48512 100644
--- a/apk/controller/app/src/main/java/org/iiab/controller/LogManager.java
+++ b/apk/controller/app/src/main/java/org/iiab/controller/LogManager.java
@@ -74,11 +74,11 @@ public class LogManager {
long size = logFile.exists() ? logFile.length() : 0;
if (size < 1024) {
- return size + " B";
+ return context.getString(R.string.log_size_bytes, size);
} else if (size < 1024 * 1024) {
- return String.format(Locale.getDefault(), "%.1f KB", size / 1024.0);
+ return String.format(Locale.getDefault(), context.getString(R.string.log_size_kb), size / 1024.0);
} else {
- return String.format(Locale.getDefault(), "%.2f MB", size / (1024.0 * 1024.0));
+ return String.format(Locale.getDefault(), context.getString(R.string.log_size_mb), size / (1024.0 * 1024.0));
}
}
-}
\ No newline at end of file
+}
diff --git a/apk/controller/app/src/main/java/org/iiab/controller/MainActivity.java b/apk/controller/app/src/main/java/org/iiab/controller/MainActivity.java
index d8e8fcb..2f7d1a2 100644
--- a/apk/controller/app/src/main/java/org/iiab/controller/MainActivity.java
+++ b/apk/controller/app/src/main/java/org/iiab/controller/MainActivity.java
@@ -220,9 +220,9 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
result -> {
for (Map.Entry entry : result.entrySet()) {
if (entry.getKey().equals(TERMUX_PERMISSION)) {
- addToLog(entry.getValue() ? "Termux permission granted" : "Termux permission denied");
+ addToLog(getString(entry.getValue() ? R.string.termux_perm_granted : R.string.termux_perm_denied));
} else if (entry.getKey().equals(Manifest.permission.POST_NOTIFICATIONS)) {
- addToLog(entry.getValue() ? "Notification permission granted" : "Notification permission denied");
+ addToLog(getString(entry.getValue() ? R.string.notif_perm_granted : R.string.notif_perm_denied));
}
}
prepareVpn();
@@ -298,7 +298,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
if (targetServerState != null) return;
// Freeze the transition text and define the TARGET state
- serverTransitionText = !isServerAlive ? "Booting..." : "Shutting down...";
+ serverTransitionText = !isServerAlive ? getString(R.string.server_booting) : getString(R.string.server_shutting_down);
targetServerState = !isServerAlive;
// Lock the UI and start infinite animation
@@ -311,7 +311,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
targetServerState = null; // Abort transition
btnServerControl.stopProgress();
updateUIColorsAndVisibility();
- addToLog("Warning: Server state transition timed out.");
+ addToLog(getString(R.string.server_timeout_warning));
}
};
timeoutHandler.postDelayed(timeoutRunnable, getResources().getInteger(R.integer.server_cool_off_duration_ms));
@@ -560,7 +560,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
String version = pInfo.versionName;
versionFooter.setText(version);
} catch (PackageManager.NameNotFoundException e) {
- versionFooter.setText("v0.1.x");
+ versionFooter.setText(R.string.default_version);
}
}
@@ -629,7 +629,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
private void toggleVisibility(View view, TextView label, String text) {
boolean isGone = view.getVisibility() == View.GONE;
view.setVisibility(isGone ? View.VISIBLE : View.GONE);
- label.setText((isGone ? "▼ " : "▶ ") + text);
+ label.setText(String.format(getString(isGone ? R.string.label_separator_down : R.string.label_separator_up), text));
}
@Override
@@ -931,7 +931,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
// STATE: NORMAL (Unlocked)
btnServerControl.setAlpha(1.0f);
if (isServerAlive) {
- btnServerControl.setText("🛑 Stop Server");
+ btnServerControl.setText(R.string.stop_server);
if (isWatchdogOn) {
deckContainer.setBackgroundColor(Color.parseColor("#44FF9800"));
btnServerControl.setBackgroundTintList(ContextCompat.getColorStateList(this, R.color.btn_watchdog_on));
@@ -943,7 +943,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
}
} else {
deckContainer.setBackgroundColor(Color.TRANSPARENT);
- btnServerControl.setText("🚀 Launch Server");
+ btnServerControl.setText(R.string.launch_server);
btnServerControl.setBackgroundTintList(ContextCompat.getColorStateList(this, R.color.btn_success));
watchdogControl.setBackgroundTintList(ContextCompat.getColorStateList(this, isWatchdogOn ? R.color.btn_watchdog_on : R.color.btn_watchdog_off));
}
@@ -1040,9 +1040,9 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
} else {
startService(intent);
}
- addToLog("Sent to Termux: " + actionFlag);
+ addToLog(getString(R.string.sent_to_termux, actionFlag));
} catch (Exception e) {
- addToLog("CRITICAL: Failed Termux Intent: " + e.getMessage());
+ addToLog(getString(R.string.failed_termux_intent, e.getMessage()));
}
}
diff --git a/apk/controller/app/src/main/java/org/iiab/controller/PortalActivity.java b/apk/controller/app/src/main/java/org/iiab/controller/PortalActivity.java
index cd5a903..98738ad 100644
--- a/apk/controller/app/src/main/java/org/iiab/controller/PortalActivity.java
+++ b/apk/controller/app/src/main/java/org/iiab/controller/PortalActivity.java
@@ -95,11 +95,11 @@ public class PortalActivity extends AppCompatActivity {
rawUrl = "http://localhost:8085/home";
}
- // 1. Damos alcance global seguro a la URL para todos los lambdas de aquí en adelante
+ // We are giving the URL secure global reach for all lambdas from now on
final String finalTargetUrl = rawUrl;
btnHome.setOnClickListener(v -> {
- webView.loadUrl(finalTargetUrl); // Usamos la variable final
+ webView.loadUrl(finalTargetUrl);
resetTimer.run();
});
@@ -108,9 +108,9 @@ public class PortalActivity extends AppCompatActivity {
if (isPageLoading) {
webView.stopLoading();
} else {
- // 1. Disable cache temporarily
+ // Disable cache temporarily
webView.getSettings().setCacheMode(android.webkit.WebSettings.LOAD_NO_CACHE);
- // 2. Force download from scratch
+ // Force download from scratch
webView.reload();
}
resetTimer.run();
@@ -123,12 +123,12 @@ public class PortalActivity extends AppCompatActivity {
String url = request.getUrl().toString();
String host = request.getUrl().getHost();
- // 1. Internal server link (Box)
+ // Internal server link (Box)
if (host != null && (host.equals("box") || host.equals("127.0.0.1") || host.equals("localhost"))) {
return false; // Remains in our app and travels through the proxy
}
- // 2. External link (Real Internet)
+ // External link (Real Internet)
try {
// Tell Android to find the correct app to open this (Chrome, YouTube, etc.)
Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl());
@@ -184,11 +184,11 @@ public class PortalActivity extends AppCompatActivity {
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
- // 2. Port and Mirror logic
+ // Port and Mirror logic
int tempPort = prefs.getSocksPort();
if (tempPort <= 0) tempPort = 1080;
- // 3. Restauramos la variable segura para el puerto
+ // We restored the secure variable for the port
final int finalProxyPort = tempPort;
// 4. Proxy block (ONLY IF VPN IS ACTIVE)
@@ -216,7 +216,7 @@ public class PortalActivity extends AppCompatActivity {
}
}
- // 4. Cleanup (Important to not leave the proxy active)
+ // Cleanup (Important to not leave the proxy active)
@Override
protected void onDestroy() {
super.onDestroy();
diff --git a/apk/controller/app/src/main/java/org/iiab/controller/SetupActivity.java b/apk/controller/app/src/main/java/org/iiab/controller/SetupActivity.java
index 9518241..e43b722 100644
--- a/apk/controller/app/src/main/java/org/iiab/controller/SetupActivity.java
+++ b/apk/controller/app/src/main/java/org/iiab/controller/SetupActivity.java
@@ -154,7 +154,7 @@ public class SetupActivity extends AppCompatActivity {
intent.setData(Uri.parse("package:com.termux"));
startActivity(intent);
} catch (Exception e) {
- Snackbar.make(v, "Termux is not installed or device not supported.", Snackbar.LENGTH_LONG).show();
+ Snackbar.make(v, R.string.termux_not_installed_error, Snackbar.LENGTH_LONG).show();
}
});
@@ -165,7 +165,7 @@ public class SetupActivity extends AppCompatActivity {
intent.setData(Uri.parse("package:com.termux"));
startActivity(intent);
} catch (Exception e) {
- Snackbar.make(v, "Termux is not installed.", Snackbar.LENGTH_LONG).show();
+ Snackbar.make(v, R.string.termux_not_installed, Snackbar.LENGTH_LONG).show();
}
});
}
@@ -189,8 +189,8 @@ public class SetupActivity extends AppCompatActivity {
switchView.startAnimation(shake);
// Show Snackbar with action to go to Settings
- Snackbar.make(findViewById(android.R.id.content), "To revoke permissions, you must do it from system settings.", Snackbar.LENGTH_LONG)
- .setAction("SETTINGS", v -> openAppSettings()).show();
+ Snackbar.make(findViewById(android.R.id.content), R.string.revoke_permission_warning, Snackbar.LENGTH_LONG)
+ .setAction(R.string.settings_label, v -> openAppSettings()).show();
}
private void openAppSettings() {
@@ -242,4 +242,4 @@ public class SetupActivity extends AppCompatActivity {
}
return true;
}
-}
\ No newline at end of file
+}
diff --git a/apk/controller/app/src/main/java/org/iiab/controller/TProxyService.java b/apk/controller/app/src/main/java/org/iiab/controller/TProxyService.java
index 141c30a..8e08804 100644
--- a/apk/controller/app/src/main/java/org/iiab/controller/TProxyService.java
+++ b/apk/controller/app/src/main/java/org/iiab/controller/TProxyService.java
@@ -76,7 +76,7 @@ public class TProxyService extends VpnService {
private void syncWatchdogLocks() {
Preferences prefs = new Preferences(this);
boolean watchdogEnabled = prefs.getWatchdogEnable();
- Log.d(TAG, "Syncing Watchdog state. Enabled: " + watchdogEnabled);
+ Log.d(TAG, getString(R.string.syncing_watchdog, watchdogEnabled));
if (watchdogEnabled) {
acquireLocks();
@@ -94,7 +94,7 @@ public class TProxyService extends VpnService {
IIABWatchdog.logSessionStart(this);
watchdogThread = new Thread(() -> {
- Log.i(TAG, "Watchdog Thread: Started loop");
+ Log.i(TAG, getString(R.string.watchdog_thread_started));
while (isWatchdogRunning) {
try {
// Perform only the heartbeat stimulus (Intent-based)
@@ -106,13 +106,13 @@ public class TProxyService extends VpnService {
// Sleep for 30 seconds
Thread.sleep(30000);
} catch (InterruptedException e) {
- Log.i(TAG, "Watchdog Thread: Interrupted, stopping...");
+ Log.i(TAG, getString(R.string.watchdog_thread_interrupted));
break;
} catch (Exception e) {
- Log.e(TAG, "Watchdog Thread: Error in loop", e);
+ Log.e(TAG, getString(R.string.watchdog_thread_error), e);
}
}
- Log.i(TAG, "Watchdog Thread: Loop ended");
+ Log.i(TAG, getString(R.string.watchdog_thread_ended));
});
watchdogThread.setName("IIAB-Watchdog-Thread");
watchdogThread.start();
@@ -133,16 +133,16 @@ public class TProxyService extends VpnService {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "IIAB:TProxyWakeLock");
wakeLock.acquire();
- Log.i(TAG, "CPU WakeLock acquired under VPN shield");
+ Log.i(TAG, getString(R.string.cpu_wakelock_acquired));
}
if (wifiLock == null) {
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "IIAB:TProxyWifiLock");
wifiLock.acquire();
- Log.i(TAG, "Wi-Fi Lock acquired under VPN shield");
+ Log.i(TAG, getString(R.string.wifi_lock_acquired));
}
} catch (Exception e) {
- Log.e(TAG, "Error acquiring locks", e);
+ Log.e(TAG, getString(R.string.error_acquiring_locks), e);
}
}
@@ -150,12 +150,12 @@ public class TProxyService extends VpnService {
if (wakeLock != null && wakeLock.isHeld()) {
wakeLock.release();
wakeLock = null;
- Log.i(TAG, "CPU WakeLock released");
+ Log.i(TAG, getString(R.string.cpu_wakelock_released));
}
if (wifiLock != null && wifiLock.isHeld()) {
wifiLock.release();
wifiLock = null;
- Log.i(TAG, "Wi-Fi Lock released");
+ Log.i(TAG, getString(R.string.wifi_lock_released));
}
}
@@ -228,7 +228,7 @@ public class TProxyService extends VpnService {
builder.addDisallowedApplication(selfName);
if (prefs.getMaintenanceMode()) { // Verify if the maintenance mode is enabled
builder.addDisallowedApplication("com.termux");
- Log.i(TAG, "Maintenance mode enabled: Termux has direct Internet access");
+ Log.i(TAG, getString(R.string.maintenance_mode_enabled));
}
} catch (NameNotFoundException e) {
}
@@ -283,7 +283,7 @@ public class TProxyService extends VpnService {
TProxyStartService(tproxy_file.getAbsolutePath(), tunFd.getFd());
prefs.setEnable(true);
- String channelName = "socks5";
+ String channelName = getString(R.string.tproxy_channel_name);
initNotificationChannel(channelName);
createNotification(channelName);
diff --git a/apk/controller/app/src/main/java/org/iiab/controller/VpnRecoveryReceiver.java b/apk/controller/app/src/main/java/org/iiab/controller/VpnRecoveryReceiver.java
index 709db7e..85f47f2 100644
--- a/apk/controller/app/src/main/java/org/iiab/controller/VpnRecoveryReceiver.java
+++ b/apk/controller/app/src/main/java/org/iiab/controller/VpnRecoveryReceiver.java
@@ -34,7 +34,7 @@ public class VpnRecoveryReceiver extends BroadcastReceiver {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
- CHANNEL_ID, "VPN Recovery",
+ CHANNEL_ID, context.getString(R.string.recovery_channel_name),
NotificationManager.IMPORTANCE_HIGH
);
channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
@@ -52,8 +52,8 @@ public class VpnRecoveryReceiver extends BroadcastReceiver {
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(android.R.drawable.ic_dialog_alert)
- .setContentTitle("Safe Pocket Web Interrupted")
- .setContentText("Tap to restore secure environment immediately.")
+ .setContentTitle(context.getString(R.string.recovery_notif_title))
+ .setContentText(context.getString(R.string.recovery_notif_text))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_ALARM)
.setAutoCancel(true)
diff --git a/apk/controller/app/src/main/java/org/iiab/controller/WatchdogService.java b/apk/controller/app/src/main/java/org/iiab/controller/WatchdogService.java
index 38b3eb0..9b79487 100644
--- a/apk/controller/app/src/main/java/org/iiab/controller/WatchdogService.java
+++ b/apk/controller/app/src/main/java/org/iiab/controller/WatchdogService.java
@@ -63,12 +63,12 @@ public class WatchdogService extends Service {
@Override
public void onDestroy() {
- // 1. Avisamos inmediatamente a la UI que nos estamos apagando
+ // We immediately notify the UI that we are shutting down.
Intent stopIntent = new Intent(ACTION_STATE_STOPPED);
stopIntent.setPackage(getPackageName());
sendBroadcast(stopIntent);
- // 2. Limpiamos la basura
+ // We clean up the trash
cancelHeartbeat();
IIABWatchdog.logSessionStop(this);
stopForeground(true);
@@ -85,6 +85,7 @@ public class WatchdogService extends Service {
return PendingIntent.getService(this, 0, intent, flags);
}
+ @android.annotation.SuppressLint("ScheduleExactAlarm")
private void scheduleHeartbeat() {
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = getHeartbeatPendingIntent();
@@ -92,12 +93,12 @@ public class WatchdogService extends Service {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// This wakes up the device even in Doze Mode
alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- SystemClock.elapsedRealtime() + HEARTBEAT_INTERVAL_MS,
- pendingIntent);
+ SystemClock.elapsedRealtime() + HEARTBEAT_INTERVAL_MS,
+ pendingIntent);
} else {
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- SystemClock.elapsedRealtime() + HEARTBEAT_INTERVAL_MS,
- pendingIntent);
+ SystemClock.elapsedRealtime() + HEARTBEAT_INTERVAL_MS,
+ pendingIntent);
}
}
@@ -117,10 +118,10 @@ public class WatchdogService extends Service {
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
- CHANNEL_ID, "IIAB Watchdog Service",
+ CHANNEL_ID, getString(R.string.watchdog_channel_name),
NotificationManager.IMPORTANCE_HIGH
);
- channel.setDescription("Ensures services remain active when screen is off.");
+ channel.setDescription(getString(R.string.watchdog_channel_desc));
NotificationManager manager = getSystemService(NotificationManager.class);
if (manager != null) {
manager.createNotificationChannel(channel);
@@ -134,8 +135,8 @@ public class WatchdogService extends Service {
PendingIntent.FLAG_IMMUTABLE);
return new NotificationCompat.Builder(this, CHANNEL_ID)
- .setContentTitle("IIAB Watchdog Active")
- .setContentText("Protecting Termux environment...")
+ .setContentTitle(getString(R.string.watchdog_notif_title))
+ .setContentText(getString(R.string.watchdog_notif_text))
.setSmallIcon(android.R.drawable.ic_lock_idle_lock)
.setContentIntent(pendingIntent)
.setPriority(NotificationCompat.PRIORITY_HIGH)
diff --git a/apk/controller/app/src/main/res/values-es/strings.xml b/apk/controller/app/src/main/res/values-es/strings.xml
index d773a31..b3151d1 100644
--- a/apk/controller/app/src/main/res/values-es/strings.xml
+++ b/apk/controller/app/src/main/res/values-es/strings.xml
@@ -1,96 +1,155 @@
- Initial Setup
- Welcome to the %1$s setup wizard.\n\nIn order to work properly, we need the following permissions:
- Push Notifications
- Termux Execution
- Safe Pocket Web (VPN)
- Disable Battery Optimization
- Continue
- IIAB-oA Controller
- Dirección Socks:
- Dirección UDP Socks:
- Puerto Socks:
- Usuario Socks:
- Contraseña Socks:
- DNS IPv4:
- DNS IPv6:
- Relé UDP sobre TCP
- DNS Remoto
- IPv4
- IPv6
- Global
- Aplicaciones
- Guardar
- Activar Safe Pocket Web
- Desactivar Safe Pocket Web
- Habilite URLs amigables. Bloquee las amenazas.
- Activar\nWatchdog Maestro
- Desactivar\nWatchdog Maestro
- ¿Reiniciar historial de log?
- Esto borrará permanentemente todos los logs de conexión guardados. Esta acción no se puede deshacer.
- El archivo de log está creciendo demasiado rápido, verifique si algo está fallando
+
+ IIAB-oA Controller
+ v0.1.x
+ Guardar
+ Cancelar
+ Guardado
+ Ajustes Guardados
+ CORREGIR
+ Configuración
+ Ajustes del Túnel
+ Log de Conexión
+ AJUSTES
-
- 🚀 Explorar Contenido
- Protege Termux del modo Doze y mantiene el Wi-Fi activo.
- Reiniciar Log
- Copiar Todo
- Sistema listo...\n
- Configuración
- Ajustes del Túnel
- Log de Conexión
- Aplicación Iniciada
- --- No se encontró el archivo BlackBox ---
- --- Cargando Historial ---
- Error al leer el historial: %s
- --- Fin del Historial ---
- Pulso de recuperación recibido del sistema. Forzando VPN...
- Optimización de Batería
- Para que el Watchdog funcione de manera confiable, desactive las optimizaciones de batería para esta aplicación.
- Ir a Ajustes
- Cancelar
- Guardado
- Ajustes Guardados
- Log reiniciado
- Log reiniciado por el usuario
- Log copiado al portapapeles
- Watchdog Detenido
- Watchdog Iniciado
- Deteniendo VPN...
- Iniciando VPN...
- Log borrado
- Error al reiniciar log: %s
- Desbloquear Watchdog Maestro
- Se requiere autenticación para detener la protección de Termux
- Autenticación exitosa. Desconectando...
- Autenticación requerida
- Autentíquese para desactivar el entorno seguro
- Seguridad Requerida
- Debe configurar un PIN, Patrón o Huella digital en su dispositivo antes de activar el entorno seguro.
- Conexión iniciada por el usuario
- Permiso de VPN concedido. Conectando...
+
+ Configuración Inicial
+ Bienvenido al asistente de configuración de %1$s.\n\nPara funcionar correctamente, necesitamos los siguientes permisos:
+ Notificaciones Push
+ Ejecución de Termux
+ Safe Pocket Web (VPN)
+ Desactivar Optimización de Batería
+ Continuar
+ Para revocar permisos, debe hacerlo desde los ajustes del sistema.
+ Termux no está instalado o el dispositivo no es compatible.
+ Termux no está instalado.
-
- Pulso: Estimulando Termux...
- CRÍTICO: El SO bloqueó el estímulo a Termux (SecurityException).
- PING 8085: OK
- PING 8085: ERROR (%s)
- SESIÓN DE LATIDO INICIADA
- SESIÓN DE LATIDO DETENIDA
+
+ Activar Safe Pocket Web
+ Desactivar Safe Pocket Web
+ Habilite URLs amigables. Bloquee las amenazas.
+ Dirección Socks:
+ Dirección UDP Socks:
+ Puerto Socks:
+ Usuario Socks:
+ Contraseña Socks:
+ DNS IPv4:
+ DNS IPv6:
+ Relé UDP sobre TCP
+ DNS Remoto
+ IPv4
+ IPv6
+ Global
+ Aplicaciones
+ Deteniendo VPN...
+ Iniciando VPN...
+ Conexión iniciada por el usuario
+ Permiso de VPN concedido. Conectando...
+ socks5
-
- [Termux] Estímulo OK (exit 0)
- [Termux] Error de pulso (exit %1$d): %2$s
+
+ Activar\nWatchdog Maestro
+ Desactivar\nWatchdog Maestro
+ Protege Termux del modo Doze y mantiene el Wi-Fi activo.
+ Watchdog Detenido
+ Watchdog Iniciado
+ Servicio IIAB Watchdog
+ Asegura que los servicios permanezcan activos cuando la pantalla está apagada.
+ IIAB Watchdog Activo
+ Protegiendo el entorno Termux...
+ Sincronizando estado del Watchdog. Activado: %b
+ Watchdog Thread: Bucle iniciado
+ Watchdog Thread: Interrumpido, deteniéndose...
+ Watchdog Thread: Error en el bucle
+ Watchdog Thread: Bucle finalizado
+ CPU WakeLock adquirido bajo protección VPN
+ Wi-Fi Lock adquirido bajo protección VPN
+ Error al adquirir bloqueos
+ CPU WakeLock liberado
+ Wi-Fi Lock liberado
- Tamaño: %1$s / 10MB
- [...]
- For the app to work 100%, please disable battery optimization.
- FIX
- Please launch the server to share over the network.
- Please enable Wi-Fi or Hotspot to share over the network.
- Wi-Fi Network
- Hotspot Network
- Switch Network
- [...]
-
\ No newline at end of file
+
+ Pulso: Estimulando Termux...
+ CRÍTICO: El SO bloqueó el estímulo a Termux (SecurityException).
+ PING 8085: OK
+ PING 8085: FALLO (%s)
+ SESIÓN DE LATIDO INICIADA
+ SESIÓN DE LATIDO DETENIDA
+ Permiso denegado: Asegúrese de que el manifiesto tiene RUN_COMMAND y la app no está restringida.
+ Error inesperado enviando intent a Termux
+ Error de Pulso: %s
+ Fallo en la escritura de mantenimiento
+ Fallo al escribir en BlackBox
+ Pulso de recuperación recibido del sistema. Forzando VPN...
+
+
+ [Termux] Estímulo OK (exit 0)
+ [Termux] Error de pulso (exit %1$d): %2$s
+ Advertencia: Tiempo de espera agotado en la transición de estado del servidor.
+ Iniciando...
+ Apagando...
+ CRÍTICO: Fallo en el Intent de Termux: %s
+ Enviado a Termux: %s
+ Modo de mantenimiento activado: Termux tiene acceso directo a Internet
+ 🛑 Detener Servidor
+ 🚀 Iniciar Servidor
+ Permiso de Termux concedido
+ Permiso de Termux denegado
+ Permiso de notificaciones concedido
+ Permiso de notificaciones denegado
+
+
+ ¿Reiniciar historial de log?
+ Esto borrará permanentemente todos los logs de conexión guardados. Esta acción no se puede deshacer.
+ El archivo de log está creciendo demasiado rápido, verifique si algo está fallando
+ Reiniciar Log
+ Copiar Todo
+ Log reiniciado
+ Log reiniciado por el usuario
+ Log copiado al portapapeles
+ Log borrado
+ Fallo al reiniciar el log: %s
+ Tamaño: %1$s / 10MB
+ %d B
+ %.1f KB
+ %.2f MB
+ --- No se encontró el archivo BlackBox ---
+ --- Cargando Historial ---
+ Error al leer el historial: %s
+ --- Fin del Historial ---
+
+
+ Optimización de Batería
+ Para que el Watchdog funcione de manera confiable, desactive las optimizaciones de batería para esta aplicación.
+ Ir a Ajustes
+ \n\nOPPO/Realme detectado: Asegúrese de activar \'Permitir actividad en segundo plano\' en los ajustes de esta aplicación.
+ \n\nXiaomi detectado: Establezca el ahorro de batería a \'Sin restricciones\' en los ajustes.
+ Para que la app funcione al 100%, desactive la optimización de batería.
+
+
+ 🚀 Explorar Contenido
+ Sistema listo...\n
+ Aplicación Iniciada
+ ▼ %s
+ ▶ %s
+ Inicie el servidor para compartir contenido a través de la red.
+ Active Wi-Fi o Hotspot para compartir contenido a través de la red.
+ Red Wi-Fi
+ Red Hotspot
+ Cambiar Red
+
+
+ Desbloquear Watchdog Maestro
+ Se requiere autenticación para detener la protección de Termux
+ Autenticación exitosa. Desconectando...
+ Autenticación requerida
+ Autentíquese para desactivar el entorno seguro
+ Seguridad Requerida
+ Debe configurar un PIN, Patrón o Huella digital en su dispositivo antes de activar el entorno seguro.
+
+
+ Recuperación VPN
+ Safe Pocket Web Interrumpido
+ Toque para restaurar el entorno seguro inmediatamente.
+
diff --git a/apk/controller/app/src/main/res/values-ru-rRU/strings.xml b/apk/controller/app/src/main/res/values-ru-rRU/strings.xml
index 46516ca..429dede 100644
--- a/apk/controller/app/src/main/res/values-ru-rRU/strings.xml
+++ b/apk/controller/app/src/main/res/values-ru-rRU/strings.xml
@@ -1,98 +1,155 @@
- Initial Setup
- Welcome to the %1$s setup wizard.\n\nIn order to work properly, we need the following permissions:
- Push Notifications
- Termux Execution
- Safe Pocket Web (VPN)
- Disable Battery Optimization
- Continue
- IIAB-oA Controller
- Socks Address:
- Socks UDP Address:
- Socks Port:
- Socks Username:
- Socks Password:
- DNS IPv4:
- DNS IPv6:
- UDP relay over TCP
- Remote DNS
- IPv4
- IPv6
- Global
- Apps
- Save
- Enable Safe Pocket Web
- Disable Safe Pocket Web
- Enable friendly URLs. Lock out the threats.
- Enable\nMaster Watchdog
- Disable\nMaster Watchdog
- Reset Log History?
- This will permanently delete all stored connection logs. This action cannot be undone.
- The logging file is growing too rapidly, you might want to check if something is failing
+
+ IIAB-oA Controller
+ v0.1.x
+ Сохранить
+ Отмена
+ Сохранено
+ Настройки сохранены
+ ИСПРАВИТЬ
+ Конфигурация
+ Настройки туннеля
+ Журнал подключений
+ НАСТРОЙКИ
-
- 🚀 Explore Content
- Protects Termux from Doze mode and keeps Wi-Fi active.
- Reset Log
- Copy All
- System ready...\n
- Configuration
- Tunnel Settings
- Connection Log
- Application Started
- --- No BlackBox file found ---
- --- Loading History ---
- Error reading history: %s
- --- End of History ---
- Recovery Pulse Received from System. Enforcing VPN...
- Battery Optimization
- For the Watchdog to work reliably, please disable battery optimizations for this app.
- Go to Settings
- Cancel
- Saved
- Settings Saved
- Log reset
- Log reset by user
- Log copied to clipboard
- Watchdog Stopped
- Watchdog Started
- VPN Stopping...
- VPN Starting...
- Log cleared
- Failed to reset log: %s
- Unlock Master Watchdog
- Authentication required to stop Termux protection
- Authentication Success. Disconnecting...
- Authentication required
- Authenticate to disable the secure environment
- Security Required
- You must set up a PIN, Pattern, or Fingerprint on your device before enabling the secure environment.
- User initiated connection
- VPN Permission Granted. Connecting...
+
+ Начальная настройка
+ Добро пожаловать в мастер настройки %1$s.\n\nДля правильной работы нам нужны следующие разрешения:
+ Push-уведомления
+ Выполнение Termux
+ Safe Pocket Web (VPN)
+ Отключить оптимизацию батареи
+ Продолжить
+ Чтобы отозвать разрешения, это нужно сделать в настройках системы.
+ Termux не установлен или устройство не поддерживается.
+ Termux не установлен.
-
- Pulse: Stimulating Termux...
- CRITICAL: OS blocked Termux stimulus (SecurityException).
- PING 8085: OK
- PING 8085: FAIL (%s)
- HEARTBEAT SESSION STARTED
- HEARTBEAT SESSION STOPPED
+
+ Включить Safe Pocket Web
+ Выключить Safe Pocket Web
+ Включить дружественные URL. Блокировать угрозы.
+ Адрес Socks:
+ UDP адрес Socks:
+ Порт Socks:
+ Имя пользователя Socks:
+ Пароль Socks:
+ DNS IPv4:
+ DNS IPv6:
+ UDP ретрансляция через TCP
+ Удаленный DNS
+ IPv4
+ IPv6
+ Глобально
+ Приложения
+ Остановка VPN...
+ Запуск VPN...
+ Соединение инициировано пользователем
+ Разрешение VPN получено. Подключение...
+ socks5
-
- [Termux] Stimulus OK (exit 0)
- [Termux] Pulse Error (exit %1$d): %2$s
+
+ Включить\nМастер Watchdog
+ Выключить\nМастер Watchdog
+ Защищает Termux от режима Doze и поддерживает Wi-Fi активным.
+ Watchdog остановлен
+ Watchdog запущен
+ Служба IIAB Watchdog
+ Гарантирует, что службы остаются активными при выключенном экране.
+ IIAB Watchdog активен
+ Защита окружения Termux...
+ Синхронизация состояния Watchdog. Включено: %b
+ Watchdog Thread: Цикл запущен
+ Watchdog Thread: Прервано, остановка...
+ Watchdog Thread: Ошибка в цикле
+ Watchdog Thread: Цикл завершен
+ CPU WakeLock получен под защитой VPN
+ Wi-Fi Lock получен под защитой VPN
+ Ошибка получения блокировок
+ CPU WakeLock освобожден
+ Wi-Fi Lock освобожден
- Size: %1$s / 10MB
+
+ Пульс: Стимуляция Termux...
+ КРИТИЧЕСКАЯ ОШИБКА: ОС заблокировала стимуляцию Termux (SecurityException).
+ PING 8085: OK
+ PING 8085: ОШИБКА (%s)
+ СЕАНС СЕРДЦЕБИЕНИЯ ЗАПУЩЕН
+ СЕАНС СЕРДЦЕБИЕНИЯ ОСТАНОВЛЕН
+ В доступе отказано: убедитесь, что в манифесте есть RUN_COMMAND и приложение не ограничено.
+ Непредвиденная ошибка при отправке intent в Termux
+ Ошибка пульса: %s
+ Ошибка записи обслуживания
+ Ошибка записи в BlackBox
+ Пульс восстановления получен от системы. Принудительный VPN...
-
- \n\nOPPO/Realme detected: Please ensure you also enable \'Allow background activity\' in this app\'s settings.
- \n\nXiaomi detected: Please set battery saver to \'No restrictions\' in settings.
- For the app to work 100%, please disable battery optimization.
- FIX
- Please launch the server to share over the network.
- Please enable Wi-Fi or Hotspot to share over the network.
- Wi-Fi Network
- Hotspot Network
- Switch Network
-
\ No newline at end of file
+
+ [Termux] Стимул OK (exit 0)
+ [Termux] Ошибка пульса (exit %1$d): %2$s
+ Предупреждение: Время ожидания перехода состояния сервера истекло.
+ Загрузка...
+ Выключение...
+ КРИТИЧЕСКАЯ ОШИБКА: Ошибка Intent Termux: %s
+ Отправлено в Termux: %s
+ Режим обслуживания включен: Termux имеет прямой доступ в Интернет
+ 🛑 Остановить сервер
+ 🚀 Запустить сервер
+ Разрешение Termux предоставлено
+ Разрешение Termux отклонено
+ Разрешение на уведомления предоставлено
+ Разрешение на уведомления отклонено
+
+
+ Сбросить историю журнала?
+ Это безвозвратно удалит все сохраненные журналы подключений. Это действие нельзя отменить.
+ Файл журнала растет слишком быстро, возможно, стоит проверить, нет ли ошибки
+ Сбросить журнал
+ Скопировать все
+ Журнал сброшен
+ Журнал сброшен пользователем
+ Журнал скопирован в буфер обмена
+ Журнал очищен
+ Ошибка сброса журнала: %s
+ Размер: %1$s / 10MB
+ %d B
+ %.1f KB
+ %.2f MB
+ --- Файл BlackBox не найден ---
+ --- Загрузка истории ---
+ Ошибка чтения истории: %s
+ --- Конец истории ---
+
+
+ Оптимизация батареи
+ Для надежной работы Watchdog, пожалуйста, отключите оптимизацию батареи для этого приложения.
+ Перейти к настройкам
+ \n\nOPPO/Realme обнаружен: Пожалуйста, убедитесь, что вы включили "Разрешить фоновую активность" в настройках этого приложения.
+ \n\nXiaomi обнаружен: Пожалуйста, установите экономию заряда батареи на "Без ограничений" в настройках.
+ Для 100% работы приложения, пожалуйста, отключите оптимизацию батареи.
+
+
+ 🚀 Исследовать контент
+ Система готова...\n
+ Приложение запущено
+ ▼ %s
+ ▶ %s
+ Запустите сервер, чтобы поделиться контентом по сети.
+ Включите Wi-Fi или точку доступа, чтобы поделиться контентом по сети.
+ Сеть Wi-Fi
+ Сеть точки доступа
+ Переключить сеть
+
+
+ Разблокировать Мастер Watchdog
+ Требуется аутентификация для остановки защиты Termux
+ Аутентификация успешна. Отключение...
+ Требуется аутентификация
+ Пройдите аутентификацию, чтобы отключить безопасное окружение
+ Требуется безопасность
+ Перед активацией безопасного окружения необходимо установить PIN-код, графический ключ или отпечаток пальца на устройстве.
+
+
+ Восстановление VPN
+ Safe Pocket Web прерван
+ Нажмите, чтобы немедленно восстановить безопасное окружение.
+
diff --git a/apk/controller/app/src/main/res/values/strings.xml b/apk/controller/app/src/main/res/values/strings.xml
index da8c395..4630937 100644
--- a/apk/controller/app/src/main/res/values/strings.xml
+++ b/apk/controller/app/src/main/res/values/strings.xml
@@ -1,99 +1,155 @@
- Initial Setup
- Welcome to the %1$s setup wizard.\n\nIn order to work properly, we need the following permissions:
+
+ IIAB-oA Controller
+ v0.1.x
+ Save
+ Cancel
+ Saved
+ Settings Saved
+ FIX
+ Configuration
+ Tunnel Settings
+ Connection Log
+ SETTINGS
+
+
+ Initial Setup
+ Welcome to the %1$s setup wizard.\n\nIn order to work properly, we need the following permissions:
Push Notifications
Termux Execution
Safe Pocket Web (VPN)
Disable Battery Optimization
Continue
- IIAB-oA Controller
- Socks Address:
- Socks UDP Address:
- Socks Port:
- Socks Username:
- Socks Password:
- DNS IPv4:
- DNS IPv6:
- UDP relay over TCP
- Remote DNS
- IPv4
- IPv6
- Global
- Apps
- Save
- Enable Safe Pocket Web
- Disable Safe Pocket Web
- Enable friendly URLs. Lock out the threats.
- Enable\nMaster Watchdog
- Disable\nMaster Watchdog
- Reset Log History?
- This will permanently delete all stored connection logs. This action cannot be undone.
- The logging file is growing too rapidly, you might want to check if something is failing
+ To revoke permissions, you must do it from system settings.
+ Termux is not installed or device not supported.
+ Termux is not installed.
-
- 🚀 Explore Content
- Protects Termux from Doze mode and keeps Wi-Fi active.
- Reset Log
- Copy All
- System ready...\n
- Configuration
- Tunnel Settings
- Connection Log
- Application Started
- --- No BlackBox file found ---
- --- Loading History ---
- Error reading history: %s
- --- End of History ---
- Recovery Pulse Received from System. Enforcing VPN...
- Battery Optimization
- For the Watchdog to work reliably, please disable battery optimizations for this app.
- Go to Settings
- Cancel
- Saved
- Settings Saved
- Log reset
- Log reset by user
- Log copied to clipboard
- Watchdog Stopped
- Watchdog Started
- VPN Stopping...
- VPN Starting...
- Log cleared
- Failed to reset log: %s
- Unlock Master Watchdog
- Authentication required to stop Termux protection
- Authentication Success. Disconnecting...
- Authentication required
- Authenticate to disable the secure environment
- Security Required
- You must set up a PIN, Pattern, or Fingerprint on your device before enabling the secure environment.
- User initiated connection
- VPN Permission Granted. Connecting...
+
+ Enable Safe Pocket Web
+ Disable Safe Pocket Web
+ Enable friendly URLs. Lock out the threats.
+ Socks Address:
+ Socks UDP Address:
+ Socks Port:
+ Socks Username:
+ Socks Password:
+ DNS IPv4:
+ DNS IPv6:
+ UDP relay over TCP
+ Remote DNS
+ IPv4
+ IPv6
+ Global
+ Apps
+ VPN Stopping...
+ VPN Starting...
+ User initiated connection
+ VPN Permission Granted. Connecting...
+ socks5
-
- Pulse: Stimulating Termux...
- CRITICAL: OS blocked Termux stimulus (SecurityException).
- PING 8085: OK
- PING 8085: FAIL (%s)
- HEARTBEAT SESSION STARTED
- HEARTBEAT SESSION STOPPED
+
+ Enable\nMaster Watchdog
+ Disable\nMaster Watchdog
+ Protects Termux from Doze mode and keeps Wi-Fi active.
+ Watchdog Stopped
+ Watchdog Started
+ IIAB Watchdog Service
+ Ensures services remain active when screen is off.
+ IIAB Watchdog Active
+ Protecting Termux environment...
+ Syncing Watchdog state. Enabled: %b
+ Watchdog Thread: Started loop
+ Watchdog Thread: Interrupted, stopping...
+ Watchdog Thread: Error in loop
+ Watchdog Thread: Loop ended
+ CPU WakeLock acquired under VPN shield
+ Wi-Fi Lock acquired under VPN shield
+ Error acquiring locks
+ CPU WakeLock released
+ Wi-Fi Lock released
-
- [Termux] Stimulus OK (exit 0)
- [Termux] Pulse Error (exit %1$d): %2$s
+
+ Pulse: Stimulating Termux...
+ CRITICAL: OS blocked Termux stimulus (SecurityException).
+ PING 8085: OK
+ PING 8085: FAIL (%s)
+ HEARTBEAT SESSION STARTED
+ HEARTBEAT SESSION STOPPED
+ Permission Denied: Ensure manifest has RUN_COMMAND and app is not restricted.
+ Unexpected error sending intent to Termux
+ Pulse Error: %s
+ Maintenance write failed
+ Failed to write to BlackBox
+ Recovery Pulse Received from System. Enforcing VPN...
- Size: %1$s / 10MB
+
+ [Termux] Stimulus OK (exit 0)
+ [Termux] Pulse Error (exit %1$d): %2$s
+ Warning: Server state transition timed out.
+ Booting...
+ Shutting down...
+ CRITICAL: Failed Termux Intent: %s
+ Sent to Termux: %s
+ Maintenance mode enabled: Termux has direct Internet access
+ 🛑 Stop Server
+ 🚀 Launch Server
+ Termux permission granted
+ Termux permission denied
+ Notification permission granted
+ Notification permission denied
-
- \n\nOPPO/Realme detected: Please ensure you also enable \'Allow background activity\' in this app\'s settings.
- \n\nXiaomi detected: Please set battery saver to \'No restrictions\' in settings.
+
+ Reset Log History?
+ This will permanently delete all stored connection logs. This action cannot be undone.
+ The logging file is growing too rapidly, you might want to check if something is failing
+ Reset Log
+ Copy All
+ Log reset
+ Log reset by user
+ Log copied to clipboard
+ Log cleared
+ Failed to reset log: %s
+ Size: %1$s / 10MB
+ %d B
+ %.1f KB
+ %.2f MB
+ --- No BlackBox file found ---
+ --- Loading History ---
+ Error reading history: %s
+ --- End of History ---
+
+
+ Battery Optimization
+ For the Watchdog to work reliably, please disable battery optimizations for this app.
+ Go to Settings
+ \n\nOPPO/Realme detected: Please ensure you also enable \'Allow background activity\' in this app\'s settings.
+ \n\nXiaomi detected: Please set battery saver to \'No restrictions\' in settings.
For the app to work 100%, please disable battery optimization.
- FIX
- Please launch the server to share over the network.
- Please enable Wi-Fi or Hotspot to share over the network.
- Wi-Fi Network
- Hotspot Network
- Switch Network
-
\ No newline at end of file
+
+ 🚀 Explore Content
+ System ready...\n
+ Application Started
+ ▼ %s
+ ▶ %s
+ Launch the server to share content over the network.
+ Enable Wi-Fi or Hotspot to share content over the network.
+ Wi-Fi Network
+ Hotspot Network
+ Switch Network
+
+
+ Unlock Master Watchdog
+ Authentication required to stop Termux protection
+ Authentication Success. Disconnecting...
+ Authentication required
+ Authenticate to disable the secure environment
+ Security Required
+ You must set up a PIN, Pattern, or Fingerprint on your device before enabling the secure environment.
+
+
+ VPN Recovery
+ Safe Pocket Web Interrupted
+ Tap to restore secure environment immediately.
+