diff --git a/ChangeLog.md b/ChangeLog.md
index 5f278e31c..1fb921b4e 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -124,3 +124,6 @@
**InviZible Pro beta 0.6.3**
* Implemented Fix TTL option based on the local VPN (root is still required).
* Fixes.
+
+**InviZible Pro beta 0.6.4**
+* Bug fixes and stability improvements.
diff --git a/fastlane/metadata/android/en-US/changelogs/100064.txt b/fastlane/metadata/android/en-US/changelogs/100064.txt
new file mode 100644
index 000000000..f1cb5d951
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/100064.txt
@@ -0,0 +1,2 @@
+**InviZible Pro beta 0.6.4**
+* Bug fixes and stability improvements.
\ No newline at end of file
diff --git a/tordnscrypt/build.gradle b/tordnscrypt/build.gradle
index 60bf68bc2..59b240d0d 100644
--- a/tordnscrypt/build.gradle
+++ b/tordnscrypt/build.gradle
@@ -10,7 +10,7 @@ android {
fdroid{
applicationId "pan.alexander.tordnscrypt"
- versionName "0.6.3-beta"
+ versionName "0.6.4-beta"
dimension = 'version'
resValue 'string', 'package_name', applicationId
}
@@ -40,7 +40,7 @@ android {
defaultConfig {
minSdkVersion 19
targetSdkVersion 29
- versionCode 63
+ versionCode 64
resConfigs "en", "ru-rRU" , "ru-rUA", "pl"
diff --git a/tordnscrypt/owner.gradle b/tordnscrypt/owner.gradle
index e4346fd3d..ac3a8f7cf 100644
--- a/tordnscrypt/owner.gradle
+++ b/tordnscrypt/owner.gradle
@@ -45,7 +45,7 @@ android {
beta {
applicationId "pan.alexander.tordnscrypt"
- versionName "0.6.3"
+ versionName "0.6.4"
dimension = 'version'
signingConfig signingConfigs.betasign
resValue 'string', 'package_name', applicationId
@@ -86,7 +86,7 @@ android {
defaultConfig {
minSdkVersion 19
targetSdkVersion 29
- versionCode 63
+ versionCode 64
resConfigs "en", "ru-rRU", "ru-rUA", "pl"
diff --git a/tordnscrypt/src/google_play/AndroidManifest.xml b/tordnscrypt/src/google_play/AndroidManifest.xml
index 638f708a5..64b38bf16 100644
--- a/tordnscrypt/src/google_play/AndroidManifest.xml
+++ b/tordnscrypt/src/google_play/AndroidManifest.xml
@@ -99,11 +99,8 @@
-
-
-
diff --git a/tordnscrypt/src/main/AndroidManifest.xml b/tordnscrypt/src/main/AndroidManifest.xml
index add02d2de..1c9328fa4 100644
--- a/tordnscrypt/src/main/AndroidManifest.xml
+++ b/tordnscrypt/src/main/AndroidManifest.xml
@@ -94,11 +94,8 @@
-
-
-
diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/BootCompleteReceiver.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/BootCompleteReceiver.java
index ff798dc04..09e7b3ac9 100644
--- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/BootCompleteReceiver.java
+++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/BootCompleteReceiver.java
@@ -58,6 +58,8 @@ public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
+ Log.i(LOG_TAG, "Receive Boot Completed");
+
final String BOOT_COMPLETE = "android.intent.action.BOOT_COMPLETED";
this.context = context.getApplicationContext();
diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptFragmentPresenter.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptFragmentPresenter.java
index 9aaddd2a0..faa0a17ca 100644
--- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptFragmentPresenter.java
+++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptFragmentPresenter.java
@@ -618,7 +618,7 @@ public void startButtonOnClick(Context context) {
view.setDNSCryptStartButtonEnabled(false);
- cleanLogFileNoRootMethod(context);
+ //cleanLogFileNoRootMethod(context);
if (new PrefManager(context).getBoolPref("Tor Running")
diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDFragmentPresenter.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDFragmentPresenter.java
index e8ced64f5..38713eb07 100644
--- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDFragmentPresenter.java
+++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDFragmentPresenter.java
@@ -453,7 +453,7 @@ public void startButtonOnClick(Context context) {
view.setITPDStartButtonEnabled(false);
- cleanLogFileNoRootMethod();
+ //cleanLogFileNoRootMethod();
if (!new PrefManager(Objects.requireNonNull(context)).getBoolPref("I2PD Running")
&& new PrefManager(Objects.requireNonNull(context)).getBoolPref("Tor Running")
diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesBroadcastReceiver.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesBroadcastReceiver.java
index eb7cdac43..15570956b 100644
--- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesBroadcastReceiver.java
+++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesBroadcastReceiver.java
@@ -62,6 +62,8 @@ public class ModulesBroadcastReceiver extends BroadcastReceiver {
private int currentNetworkHash = 0;
private static final String apStateFilterAction = "android.net.wifi.WIFI_AP_STATE_CHANGED";
private static final String tetherStateFilterAction = "android.net.conn.TETHER_STATE_CHANGED";
+ private static final String shutdownFilterAction = "android.intent.action.ACTION_SHUTDOWN";
+ private static final String powerOFFFilterAction = "android.intent.action.QUICKBOOT_POWEROFF";
public ModulesBroadcastReceiver(Context context) {
this.context = context;
@@ -69,23 +71,27 @@ public ModulesBroadcastReceiver(Context context) {
@Override
public void onReceive(Context context, Intent intent) {
- if (intent.getAction() == null) {
+ String action = intent.getAction();
+
+ if (action == null) {
return;
}
- if (intent.getAction().equals(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED)
+ if (action.equalsIgnoreCase(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED)
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Log.i(LOG_TAG, "ModulesBroadcastReceiver Received " + intent);
idleStateChanged(context);
- } else if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
+ } else if (action.equalsIgnoreCase(ConnectivityManager.CONNECTIVITY_ACTION)) {
connectivityStateChanged(intent);
- } else if (intent.getAction().equals(apStateFilterAction)) {
+ } else if (action.equalsIgnoreCase(apStateFilterAction)) {
apStateChanged();
- } else if (intent.getAction().equals(tetherStateFilterAction)) {
+ } else if (action.equalsIgnoreCase(tetherStateFilterAction)) {
tetherStateChanged();
+ } else if (action.equalsIgnoreCase(powerOFFFilterAction) || action.equalsIgnoreCase(shutdownFilterAction)) {
+ powerOFFDetected();
}
}
@@ -94,6 +100,7 @@ void registerReceivers() {
registerConnectivityChanges();
registerAPisOn();
registerUSBModemIsOn();
+ registerPowerOFF();
}
void unregisterReceivers() {
@@ -148,6 +155,14 @@ private void registerUSBModemIsOn() {
receiverRegistered = true;
}
+ private void registerPowerOFF() {
+ IntentFilter powerOFF = new IntentFilter();
+ powerOFF.addAction(shutdownFilterAction);
+ powerOFF.addAction(powerOFFFilterAction);
+ context.registerReceiver(this, powerOFF);
+ receiverRegistered = true;
+ }
+
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void listenNetworkChanges() {
// Listen for network changes
@@ -281,6 +296,14 @@ private void tetherStateChanged() {
Log.i(LOG_TAG, "ModulesBroadcastReceiver USB modem state is " + (Tethering.usbTetherOn ? "ON" : "OFF"));
}
+ private void powerOFFDetected() {
+ new PrefManager(context).setBoolPref("DNSCrypt Running", false);
+ new PrefManager(context).setBoolPref("Tor Running", false);
+ new PrefManager(context).setBoolPref("I2PD Running", false);
+
+ ModulesAux.stopModulesIfRunning(context);
+ }
+
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void unlistenNetworkChanges() {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesService.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesService.java
index 201f9e92b..e9ea0eb48 100644
--- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesService.java
+++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesService.java
@@ -33,6 +33,11 @@
import androidx.preference.PreferenceManager;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.DatagramSocket;
+import java.net.ServerSocket;
import java.util.Objects;
import java.util.Timer;
import java.util.concurrent.TimeUnit;
@@ -43,6 +48,8 @@
import pan.alexander.tordnscrypt.utils.enums.OperationMode;
import pan.alexander.tordnscrypt.vpn.service.ServiceVPNHelper;
+import static pan.alexander.tordnscrypt.TopFragment.DNSCryptVersion;
+import static pan.alexander.tordnscrypt.TopFragment.TorVersion;
import static pan.alexander.tordnscrypt.utils.RootExecService.LOG_TAG;
import static pan.alexander.tordnscrypt.utils.enums.ModuleState.RESTARTING;
import static pan.alexander.tordnscrypt.utils.enums.ModuleState.RUNNING;
@@ -177,33 +184,33 @@ private void startDNSCrypt() {
if (!modulesStatus.isUseModulesWithRoot()) {
Thread previousDnsCryptThread = modulesKiller.getDnsCryptThread();
- try {
- if (previousDnsCryptThread != null && previousDnsCryptThread.isAlive()) {
- Log.w(LOG_TAG, "ModulesService previous DNSCrypt thread is alive! Try stop!");
- previousDnsCryptThread.interrupt();
- ModulesKiller.stopDNSCrypt(this);
- Toast.makeText(this, getText(R.string.please_wait), Toast.LENGTH_LONG).show();
- return;
- }
- } catch (Exception e) {
- Log.e(LOG_TAG, "ModulesService previous DNSCrypt thread interrupt exception "
- + e.getMessage() + e.getCause() + "\nStop service");
- System.exit(0);
+ if (previousDnsCryptThread != null && previousDnsCryptThread.isAlive()) {
+ changeDNSCryptStatus(previousDnsCryptThread);
+ return;
}
-
}
new Thread(() -> {
try {
+ Thread previousDnsCryptThread = checkPreviouslyRunningDNSCryptModule();
- if (!stopPreviouslyRunningDNSCryptModule()) {
+ if (previousDnsCryptThread != null && previousDnsCryptThread.isAlive()) {
+ changeDNSCryptStatus(previousDnsCryptThread);
return;
}
+ if (stopDNSCryptIfPortIsBusy()) {
+ changeDNSCryptStatus(modulesKiller.getDnsCryptThread());
+ return;
+ }
+
+ cleanLogFileNoRootMethod(pathVars.getAppDataDir() + "/logs/DnsCrypt.log",
+ ModulesService.this.getResources().getString(R.string.tvDNSDefaultLog) + " " + DNSCryptVersion);
ModulesStarterHelper modulesStarterHelper = new ModulesStarterHelper(ModulesService.this, mHandler, pathVars);
Thread dnsCryptThread = new Thread(modulesStarterHelper.getDNSCryptStarterRunnable());
+ dnsCryptThread.setName("DNSCryptThread");
dnsCryptThread.setDaemon(false);
try {
dnsCryptThread.setPriority(Thread.NORM_PRIORITY);
@@ -222,30 +229,20 @@ private void startDNSCrypt() {
}).start();
}
- private boolean stopPreviouslyRunningDNSCryptModule() {
- boolean result = false;
-
- try {
- if (isDnsCryptSavedStateRunning() && modulesStatus.getDnsCryptState() != RESTARTING) {
-
- Thread killerThread = new Thread(modulesKiller.getDNSCryptKillerRunnable());
- killerThread.start();
+ private Thread checkPreviouslyRunningDNSCryptModule() {
- while (killerThread.isAlive()) {
- killerThread.join();
- }
+ if (modulesStatus.isUseModulesWithRoot()) {
+ return null;
+ }
- makeDelay(5);
+ Thread result = null;
- if (modulesStatus.getDnsCryptState() != RUNNING) {
- result = true;
- }
-
- } else {
- result = true;
+ try {
+ if (modulesStatus.getDnsCryptState() != RESTARTING) {
+ result = findThreadByName("DNSCryptThread");
}
} catch (Exception e) {
- Log.e(LOG_TAG, "DnsCrypt was unable to stop previously running module " + e.getMessage());
+ Log.e(LOG_TAG, "checkPreviouslyRunningDNSCryptModule exception " + e.getMessage());
}
return result;
@@ -274,6 +271,31 @@ private void changeDNSCryptStatus(final Thread dnsCryptThread) {
}
}
+ private boolean stopDNSCryptIfPortIsBusy() {
+ if (!isAvailable(pathVars.getDNSCryptPort())) {
+ try {
+ modulesStatus.setDnsCryptState(RESTARTING);
+
+ Thread killerThread = new Thread(modulesKiller.getDNSCryptKillerRunnable());
+ killerThread.start();
+
+ while (killerThread.isAlive()) {
+ killerThread.join();
+ }
+
+ makeDelay(5);
+
+ if (modulesStatus.getDnsCryptState() == RUNNING) {
+ return true;
+ }
+
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "ModulesService restartDNSCrypt join interrupted!");
+ }
+ }
+ return false;
+ }
+
private void startTor() {
if (modulesStatus.getTorState() == STOPPED) {
@@ -283,30 +305,32 @@ private void startTor() {
if (!modulesStatus.isUseModulesWithRoot()) {
Thread previousTorThread = modulesKiller.getTorThread();
- try {
- if (previousTorThread != null && previousTorThread.isAlive()) {
- Log.w(LOG_TAG, "ModulesService previous Tor thread is alive! Try stop!");
- previousTorThread.interrupt();
- ModulesKiller.stopTor(this);
- Toast.makeText(this, getText(R.string.please_wait), Toast.LENGTH_LONG).show();
- return;
- }
- } catch (Exception e) {
- Log.e(LOG_TAG, "ModulesService previous Tor thread interrupt exception "
- + e.getMessage() + e.getCause() + "\nStop service");
- System.exit(0);
+ if (previousTorThread != null && previousTorThread.isAlive()) {
+ changeTorStatus(previousTorThread);
+ return;
}
-
}
new Thread(() -> {
try {
- if (!stopPreviouslyRunningTorModule()) {
+ Thread previousTorThread = checkPreviouslyRunningTorModule();
+
+ if (previousTorThread != null && previousTorThread.isAlive()) {
+ changeTorStatus(previousTorThread);
+ return;
+ }
+
+ if (stopTorIfPortsIsBusy()) {
+ changeTorStatus(modulesKiller.getTorThread());
return;
}
+ cleanLogFileNoRootMethod(pathVars.getAppDataDir() + "/logs/Tor.log",
+ ModulesService.this.getResources().getString(R.string.tvTorDefaultLog) + " " + TorVersion);
+
ModulesStarterHelper modulesStarterHelper = new ModulesStarterHelper(ModulesService.this, mHandler, pathVars);
Thread torThread = new Thread(modulesStarterHelper.getTorStarterRunnable());
+ torThread.setName("TorThread");
torThread.setDaemon(false);
try {
torThread.setPriority(Thread.NORM_PRIORITY);
@@ -325,30 +349,20 @@ private void startTor() {
}
- private boolean stopPreviouslyRunningTorModule() {
- boolean result = false;
-
- try {
- if (isTorSavedStateRunning() && modulesStatus.getTorState() != RESTARTING) {
-
- Thread killerThread = new Thread(modulesKiller.getTorKillerRunnable());
- killerThread.start();
-
- while (killerThread.isAlive()) {
- killerThread.join();
- }
+ private Thread checkPreviouslyRunningTorModule() {
- makeDelay(5);
+ if (modulesStatus.isUseModulesWithRoot()) {
+ return null;
+ }
- if (modulesStatus.getTorState() != RUNNING) {
- result = true;
- }
+ Thread result = null;
- } else {
- result = true;
+ try {
+ if (modulesStatus.getTorState() != RESTARTING) {
+ result = findThreadByName("TorThread");
}
} catch (Exception e) {
- Log.e(LOG_TAG, "Tor was unable to stop previously running module " + e.getMessage());
+ Log.e(LOG_TAG, "checkPreviouslyRunningTorModule exception " + e.getMessage());
}
return result;
@@ -377,6 +391,36 @@ private void changeTorStatus(final Thread torThread) {
}
}
+ private boolean stopTorIfPortsIsBusy() {
+ boolean stopRequired = !isAvailable(pathVars.getTorDNSPort())
+ || !isAvailable(pathVars.getTorSOCKSPort())
+ || !isAvailable(pathVars.getTorTransPort() )
+ || !isAvailable(pathVars.getTorHTTPTunnelPort());
+
+ if (stopRequired) {
+ try {
+ modulesStatus.setTorState(RESTARTING);
+
+ Thread killerThread = new Thread(modulesKiller.getTorKillerRunnable());
+ killerThread.start();
+
+ while (killerThread.isAlive()) {
+ killerThread.join();
+ }
+
+ makeDelay(5);
+
+ if (modulesStatus.getTorState() == RUNNING) {
+ return true;
+ }
+
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "ModulesService restartTor join interrupted!");
+ }
+ }
+ return false;
+ }
+
private void startITPD() {
if (modulesStatus.getItpdState() == STOPPED) {
@@ -386,30 +430,31 @@ private void startITPD() {
if (!modulesStatus.isUseModulesWithRoot()) {
Thread previousITPDThread = modulesKiller.getItpdThread();
- try {
- if (previousITPDThread != null && previousITPDThread.isAlive()) {
- Log.w(LOG_TAG, "ModulesService previous ITPD thread is alive! Try stop!");
- previousITPDThread.interrupt();
- ModulesKiller.stopITPD(this);
- Toast.makeText(this, getText(R.string.please_wait), Toast.LENGTH_LONG).show();
- return;
- }
- } catch (Exception e) {
- Log.e(LOG_TAG, "ModulesService previous ITPD thread interrupt exception "
- + e.getMessage() + e.getCause() + "\nStop service");
- System.exit(0);
+ if (previousITPDThread != null && previousITPDThread.isAlive()) {
+ changeITPDStatus(previousITPDThread);
+ return;
}
-
}
new Thread(() -> {
try {
- if (!stopPreviouslyRunningITPDModule()) {
+ Thread previousITPDThread = checkPreviouslyRunningITPDModule();
+
+ if (previousITPDThread != null && previousITPDThread.isAlive()) {
+ changeITPDStatus(previousITPDThread);
return;
}
+ if (stopITPDIfPortsIsBusy()) {
+ changeITPDStatus(modulesKiller.getItpdThread());
+ return;
+ }
+
+ cleanLogFileNoRootMethod(pathVars.getAppDataDir() + "/logs/i2pd.log", "");
+
ModulesStarterHelper modulesStarterHelper = new ModulesStarterHelper(ModulesService.this, mHandler, pathVars);
Thread itpdThread = new Thread(modulesStarterHelper.getITPDStarterRunnable());
+ itpdThread.setName("ITPDThread");
itpdThread.setDaemon(false);
try {
itpdThread.setPriority(Thread.NORM_PRIORITY);
@@ -427,30 +472,20 @@ private void startITPD() {
}).start();
}
- private boolean stopPreviouslyRunningITPDModule() {
- boolean result = false;
-
- try {
- if (isITPDSavedStateRunning() && modulesStatus.getItpdState() != RESTARTING) {
+ private Thread checkPreviouslyRunningITPDModule() {
- Thread killerThread = new Thread(modulesKiller.getITPDKillerRunnable());
- killerThread.start();
-
- while (killerThread.isAlive()) {
- killerThread.join();
- }
-
- makeDelay(5);
+ if (modulesStatus.isUseModulesWithRoot()) {
+ return null;
+ }
- if (modulesStatus.getItpdState() != RUNNING) {
- result = true;
- }
+ Thread result = null;
- } else {
- result = true;
+ try {
+ if (modulesStatus.getItpdState() != RESTARTING) {
+ result = findThreadByName("ITPDThread");
}
} catch (Exception e) {
- Log.e(LOG_TAG, "I2PD was unable to stop previously running module " + e.getMessage());
+ Log.e(LOG_TAG, "checkPreviouslyRunningITPDModule exception " + e.getMessage());
}
return result;
@@ -479,6 +514,37 @@ private void changeITPDStatus(final Thread itpdThread) {
}
}
+ private boolean stopITPDIfPortsIsBusy() {
+ boolean stopRequired = !isAvailable(pathVars.getITPDSOCKSPort())
+ || !isAvailable(pathVars.getITPDHttpProxyPort())
+ || !isAvailable(pathVars.getITPDTeleSocksProxyPort1())
+ || !isAvailable(pathVars.getITPDTeleSocksProxyPort2())
+ || !isAvailable(pathVars.getITPDTeleSocksProxyPort3());
+
+ if (stopRequired) {
+ try {
+ modulesStatus.setItpdState(RESTARTING);
+
+ Thread killerThread = new Thread(modulesKiller.getITPDKillerRunnable());
+ killerThread.start();
+
+ while (killerThread.isAlive()) {
+ killerThread.join();
+ }
+
+ makeDelay(5);
+
+ if (modulesStatus.getItpdState() == RUNNING) {
+ return true;
+ }
+
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "ModulesService restartITPD join interrupted!");
+ }
+ }
+ return false;
+ }
+
private void stopDNSCrypt() {
new Thread(modulesKiller.getDNSCryptKillerRunnable()).start();
}
@@ -708,4 +774,88 @@ private void makeDelay(int sec) {
}
}
+ public Thread findThreadByName(String threadName) {
+ Thread currentThread = Thread.currentThread();
+ ThreadGroup threadGroup = getRootThreadGroup(currentThread);
+ int allActiveThreads = threadGroup.activeCount();
+ Thread[] allThreads = new Thread[allActiveThreads];
+ threadGroup.enumerate(allThreads);
+
+ for (Thread thread : allThreads) {
+ String name = thread.getName();
+ //Log.i(LOG_TAG, "Current threads " + name);
+ if (name.equals(threadName)) {
+ Log.i(LOG_TAG, "Found old module thread " + name);
+ return thread;
+ }
+ }
+
+ return null;
+ }
+
+ private ThreadGroup getRootThreadGroup(Thread thread) {
+ ThreadGroup rootGroup = thread.getThreadGroup();
+ while (rootGroup != null) {
+ ThreadGroup parentGroup = rootGroup.getParent();
+ if (parentGroup == null) {
+ break;
+ }
+ rootGroup = parentGroup;
+ }
+ return rootGroup;
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+
+ if (!modulesStatus.isUseModulesWithRoot()) {
+ ModulesAux.stopModulesIfRunning(this);
+ }
+
+ super.finalize();
+ }
+
+ private boolean isAvailable(String portStr) {
+
+ int port = Integer.parseInt(portStr);
+
+ ServerSocket ss = null;
+ DatagramSocket ds = null;
+ try {
+ ss = new ServerSocket(port);
+ ss.setReuseAddress(true);
+ ds = new DatagramSocket(port);
+ ds.setReuseAddress(true);
+ return true;
+ } catch (IOException ignored) {
+ } finally {
+ if (ds != null) {
+ ds.close();
+ }
+
+ if (ss != null) {
+ try {
+ ss.close();
+ } catch (IOException ignored) {
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private void cleanLogFileNoRootMethod(String logFilePath, String text) {
+ try {
+ File f = new File(pathVars.getAppDataDir() + "/logs");
+
+ if (f.mkdirs() && f.setReadable(true) && f.setWritable(true))
+ Log.i(LOG_TAG, "log dir created");
+
+ PrintWriter writer = new PrintWriter(logFilePath, "UTF-8");
+ writer.println(text);
+ writer.close();
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "Unable to create dnsCrypt log file " + e.getMessage());
+ }
+ }
}
diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java
index 0e271b4e6..658d7d0d4 100644
--- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java
+++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java
@@ -549,7 +549,7 @@ public void startButtonOnClick(Context context) {
view.setTorStartButtonEnabled(false);
- cleanLogFileNoRootMethod(context);
+ //cleanLogFileNoRootMethod(context);
Thread thread = new Thread(() -> {
diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/AppExitDetectService.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/AppExitDetectService.java
index 60d82e135..3f59df802 100644
--- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/AppExitDetectService.java
+++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/AppExitDetectService.java
@@ -24,6 +24,8 @@
import android.os.IBinder;
import android.util.Log;
+import pan.alexander.tordnscrypt.modules.ModulesAux;
+import pan.alexander.tordnscrypt.modules.ModulesStatus;
import pan.alexander.tordnscrypt.utils.file_operations.FileOperations;
import static pan.alexander.tordnscrypt.utils.RootExecService.LOG_TAG;
@@ -50,6 +52,10 @@ public void onDestroy() {
FileOperations.removeAllOnFileOperationsListeners();
+ if (!ModulesStatus.getInstance().isUseModulesWithRoot()) {
+ ModulesAux.stopModulesIfRunning(this);
+ }
+
Log.i(LOG_TAG, "App Exit");
}
}
diff --git a/tordnscrypt/src/main/res/drawable/button_main_border.xml b/tordnscrypt/src/main/res/drawable/button_main_border.xml
new file mode 100644
index 000000000..e4fa6d503
--- /dev/null
+++ b/tordnscrypt/src/main/res/drawable/button_main_border.xml
@@ -0,0 +1,11 @@
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tordnscrypt/src/main/res/layout/main_fragment.xml b/tordnscrypt/src/main/res/layout/main_fragment.xml
index 900f03100..aff261142 100644
--- a/tordnscrypt/src/main/res/layout/main_fragment.xml
+++ b/tordnscrypt/src/main/res/layout/main_fragment.xml
@@ -1,9 +1,10 @@
-
+ app:cardUseCompatPadding="true">
@@ -58,36 +59,49 @@
android:id="@+id/cardView5"
android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_weight="1"
app:cardBackgroundColor="@color/cardsColor"
app:cardCornerRadius="5dp"
app:cardUseCompatPadding="true"
- app:contentPadding="8dp"
- app:layout_constraintBottom_toTopOf="@+id/cardView4"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/cardView3">
-
-
-
-
+ app:contentPadding="8dp">
+
+
+
+
+
+
+
@@ -98,16 +112,13 @@
android:layout_marginBottom="4dp"
app:cardBackgroundColor="@color/cardsColor"
app:cardCornerRadius="5dp"
- app:cardUseCompatPadding="true"
- app:contentPadding="8dp"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent">
+ app:cardUseCompatPadding="true">
@@ -115,6 +126,7 @@
@@ -122,7 +134,6 @@
android:id="@+id/tvTorMainFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_margin="4dp"
android:layout_weight="1"
android:gravity="center"
android:text="@string/tvTorStop" />
@@ -131,12 +142,14 @@
android:id="@+id/pbTorMainFragment"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:layout_weight="1" />
@@ -144,7 +157,6 @@
android:id="@+id/tvDNSMainFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_margin="4dp"
android:layout_weight="1"
android:gravity="center"
android:text="@string/tvDNSStop" />
@@ -153,13 +165,15 @@
android:id="@+id/pbDNSMainFragment"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:layout_weight="1" />
@@ -167,7 +181,6 @@
android:id="@+id/tvITPDMainFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_margin="4dp"
android:layout_weight="1"
android:gravity="center"
android:text="@string/tvITPDStop" />
@@ -176,11 +189,12 @@
android:id="@+id/pbITPDMainFragment"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:layout_weight="1" />
-
\ No newline at end of file
+
\ No newline at end of file