summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/com/wireguard/android/preference/ToolsInstallerPreference.java34
-rw-r--r--app/src/main/java/com/wireguard/android/util/ToolsInstaller.java32
2 files changed, 34 insertions, 32 deletions
diff --git a/app/src/main/java/com/wireguard/android/preference/ToolsInstallerPreference.java b/app/src/main/java/com/wireguard/android/preference/ToolsInstallerPreference.java
index 1620fd10..0836025a 100644
--- a/app/src/main/java/com/wireguard/android/preference/ToolsInstallerPreference.java
+++ b/app/src/main/java/com/wireguard/android/preference/ToolsInstallerPreference.java
@@ -34,15 +34,6 @@ public class ToolsInstallerPreference extends Preference {
this(context, null);
}
- private static State mapResultToState(final int scriptResult) {
- if (scriptResult == OsConstants.EXIT_SUCCESS)
- return State.SUCCESS;
- else if (scriptResult == OsConstants.EALREADY)
- return State.ALREADY;
- else
- return State.FAILURE;
- }
-
@Override
public CharSequence getSummary() {
return getContext().getString(state.messageResourceId);
@@ -61,16 +52,31 @@ public class ToolsInstallerPreference extends Preference {
@Override
protected void onAttachedToActivity() {
super.onAttachedToActivity();
- asyncWorker.supplyAsync(toolsInstaller::areInstalled)
- .thenAccept(installed -> setState(installed ? State.ALREADY : State.INITIAL));
+ asyncWorker.supplyAsync(toolsInstaller::areInstalled).whenComplete(this::onCheckResult);
+ }
+
+ private void onCheckResult(final Integer result, final Throwable throwable) {
+ setState(throwable == null && result == OsConstants.EALREADY ?
+ State.ALREADY : State.INITIAL);
}
@Override
protected void onClick() {
setState(State.WORKING);
- asyncWorker.supplyAsync(toolsInstaller::install)
- .thenApply(ToolsInstallerPreference::mapResultToState)
- .thenAccept(this::setState);
+ asyncWorker.supplyAsync(toolsInstaller::install).whenComplete(this::onInstallResult);
+ }
+
+ private void onInstallResult(final Integer result, final Throwable throwable) {
+ final State nextState;
+ if (throwable != null)
+ nextState = State.FAILURE;
+ else if (result == OsConstants.EXIT_SUCCESS)
+ nextState = State.SUCCESS;
+ else if (result == OsConstants.EALREADY)
+ nextState = State.ALREADY;
+ else
+ nextState = State.FAILURE;
+ setState(nextState);
}
private void setState(@NonNull final State state) {
diff --git a/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java b/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java
index 51c2bbbc..6a3d4e05 100644
--- a/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java
+++ b/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java
@@ -56,9 +56,9 @@ public final class ToolsInstaller {
return null;
}
- public boolean areInstalled() {
+ public int areInstalled() throws NoRootException {
if (INSTALL_DIR == null)
- return false;
+ return OsConstants.ENOENT;
final StringBuilder script = new StringBuilder();
for (final String[] names : EXECUTABLES) {
script.append(String.format("cmp -s '%s' '%s' && ",
@@ -67,13 +67,13 @@ public final class ToolsInstaller {
}
script.append("exit ").append(OsConstants.EALREADY).append(';');
try {
- return rootShell.run(null, script.toString()) == OsConstants.EALREADY;
- } catch (final IOException | NoRootException ignored) {
- return false;
+ return rootShell.run(null, script.toString());
+ } catch (final IOException ignored) {
+ return OsConstants.EXIT_FAILURE;
}
}
- public boolean areSymlinked() {
+ public int areSymlinked() throws NoRootException {
final StringBuilder script = new StringBuilder();
for (final String[] names : EXECUTABLES) {
script.append(String.format("test '%s' -ef '%s' && ",
@@ -82,20 +82,20 @@ public final class ToolsInstaller {
}
script.append("exit ").append(OsConstants.EALREADY).append(';');
try {
- return rootShell.run(null, script.toString()) == OsConstants.EALREADY;
- } catch (final IOException | NoRootException ignored) {
- return false;
+ return rootShell.run(null, script.toString());
+ } catch (final IOException ignored) {
+ return OsConstants.EXIT_FAILURE;
}
}
- public void ensureToolsAvailable() throws FileNotFoundException {
+ public void ensureToolsAvailable() throws FileNotFoundException, NoRootException {
if (areToolsAvailable == null) {
synchronized (this) {
if (areToolsAvailable == null) {
- if (areInstalled()) {
+ if (areInstalled() == OsConstants.EALREADY) {
Log.d(TAG, "Tools are installed to /system");
areToolsAvailable = true;
- } else if (areSymlinked()) {
+ } else if (areSymlinked() == OsConstants.EALREADY) {
Log.d(TAG, "Tools were already symlinked into our private binary dir");
areToolsAvailable = true;
} else if (symlink() == OsConstants.EXIT_SUCCESS) {
@@ -112,7 +112,7 @@ public final class ToolsInstaller {
throw new FileNotFoundException("Required tools unavailable");
}
- public int install() {
+ public int install() throws NoRootException {
if (INSTALL_DIR == null)
return OsConstants.ENOENT;
final StringBuilder script = new StringBuilder("set -ex;");
@@ -126,12 +126,10 @@ public final class ToolsInstaller {
return rootShell.run(null, script.toString());
} catch (final IOException ignored) {
return OsConstants.EXIT_FAILURE;
- } catch (final NoRootException ignored) {
- return OsConstants.EACCES;
}
}
- public int symlink() {
+ public int symlink() throws NoRootException {
final StringBuilder script = new StringBuilder("set -ex;");
for (final String[] names : EXECUTABLES) {
script.append(String.format("ln -fns '%s' '%s'; ",
@@ -142,8 +140,6 @@ public final class ToolsInstaller {
return rootShell.run(null, script.toString());
} catch (final IOException ignored) {
return OsConstants.EXIT_FAILURE;
- } catch (final NoRootException ignored) {
- return OsConstants.EACCES;
}
}
}