ToolsInstaller: Propagate NoRootException properly
Signed-off-by: Samuel Holland <samuel@sholland.org>
This commit is contained in:
parent
52e8eef9ce
commit
426fa7d50b
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user