android: Cleanup classes
- Use final modifer wherever possible - Use try-with-resources for input/output streams Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
4986d92f3d
commit
4671f59c67
@ -100,7 +100,7 @@ public class SettingsActivity extends AppCompatActivity implements Topic.Subscri
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTopicPublished(Topic topic) {
|
public void onTopicPublished(final Topic topic) {
|
||||||
recreate();
|
recreate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ public class SettingsActivity extends AppCompatActivity implements Topic.Subscri
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
|
||||||
if ("dark_theme".equals(key)) {
|
if ("dark_theme".equals(key)) {
|
||||||
AppCompatDelegate.setDefaultNightMode(
|
AppCompatDelegate.setDefaultNightMode(
|
||||||
sharedPreferences.getBoolean(key, false) ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO);
|
sharedPreferences.getBoolean(key, false) ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO);
|
||||||
|
@ -137,7 +137,7 @@ public final class GoBackend implements Backend {
|
|||||||
// Build config
|
// Build config
|
||||||
final Interface iface = config.getInterface();
|
final Interface iface = config.getInterface();
|
||||||
final String goConfig;
|
final String goConfig;
|
||||||
try (Formatter fmt = new Formatter(new StringBuilder())) {
|
try (final Formatter fmt = new Formatter(new StringBuilder())) {
|
||||||
fmt.format("replace_peers=true\n");
|
fmt.format("replace_peers=true\n");
|
||||||
if (iface.getPrivateKey() != null)
|
if (iface.getPrivateKey() != null)
|
||||||
fmt.format("private_key=%s\n", KeyEncoding.keyToHex(KeyEncoding.keyFromBase64(iface.getPrivateKey())));
|
fmt.format("private_key=%s\n", KeyEncoding.keyToHex(KeyEncoding.keyFromBase64(iface.getPrivateKey())));
|
||||||
@ -184,11 +184,12 @@ public final class GoBackend implements Backend {
|
|||||||
builder.setMtu(mtu);
|
builder.setMtu(mtu);
|
||||||
|
|
||||||
builder.setBlocking(true);
|
builder.setBlocking(true);
|
||||||
final ParcelFileDescriptor tun = builder.establish();
|
try (final ParcelFileDescriptor tun = builder.establish()) {
|
||||||
if (tun == null)
|
if (tun == null)
|
||||||
throw new Exception("Unable to create tun device");
|
throw new Exception("Unable to create tun device");
|
||||||
|
|
||||||
currentTunnelHandle = wgTurnOn(tunnel.getName(), tun.detachFd(), goConfig);
|
currentTunnelHandle = wgTurnOn(tunnel.getName(), tun.detachFd(), goConfig);
|
||||||
|
}
|
||||||
if (currentTunnelHandle < 0)
|
if (currentTunnelHandle < 0)
|
||||||
throw new Exception("Unable to turn tunnel on (wgTurnOn return " + currentTunnelHandle + ')');
|
throw new Exception("Unable to turn tunnel on (wgTurnOn return " + currentTunnelHandle + ')');
|
||||||
|
|
||||||
@ -237,7 +238,7 @@ public final class GoBackend implements Backend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
public int onStartCommand(final Intent intent, final int flags, final int startId) {
|
||||||
vpnService.complete(this);
|
vpnService.complete(this);
|
||||||
if (intent == null || intent.getComponent() == null || !intent.getComponent().getPackageName().equals(getPackageName())) {
|
if (intent == null || intent.getComponent() == null || !intent.getComponent().getPackageName().equals(getPackageName())) {
|
||||||
Log.d(TAG, "Service started by Always-on VPN feature");
|
Log.d(TAG, "Service started by Always-on VPN feature");
|
||||||
|
@ -106,7 +106,7 @@ public final class WgQuickBackend implements Backend {
|
|||||||
private void setStateInternal(final Tunnel tunnel, final Config config, final State state)
|
private void setStateInternal(final Tunnel tunnel, final Config config, final State state)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
final File tempFile = new File(localTemporaryDir, tunnel.getName() + ".conf");
|
final File tempFile = new File(localTemporaryDir, tunnel.getName() + ".conf");
|
||||||
try (FileOutputStream stream = new FileOutputStream(tempFile, false)) {
|
try (final FileOutputStream stream = new FileOutputStream(tempFile, false)) {
|
||||||
stream.write(config.toString().getBytes(StandardCharsets.UTF_8));
|
stream.write(config.toString().getBytes(StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
final String command = String.format("wg-quick %s '%s'",
|
final String command = String.format("wg-quick %s '%s'",
|
||||||
|
@ -42,7 +42,7 @@ public final class FileConfigStore implements ConfigStore {
|
|||||||
final File file = fileFor(name);
|
final File file = fileFor(name);
|
||||||
if (!file.createNewFile())
|
if (!file.createNewFile())
|
||||||
throw new IOException("Configuration file " + file.getName() + " already exists");
|
throw new IOException("Configuration file " + file.getName() + " already exists");
|
||||||
try (FileOutputStream stream = new FileOutputStream(file, false)) {
|
try (final FileOutputStream stream = new FileOutputStream(file, false)) {
|
||||||
stream.write(config.toString().getBytes(StandardCharsets.UTF_8));
|
stream.write(config.toString().getBytes(StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
return config;
|
return config;
|
||||||
@ -70,7 +70,7 @@ public final class FileConfigStore implements ConfigStore {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Config load(final String name) throws IOException {
|
public Config load(final String name) throws IOException {
|
||||||
try (FileInputStream stream = new FileInputStream(fileFor(name))) {
|
try (final FileInputStream stream = new FileInputStream(fileFor(name))) {
|
||||||
return Config.from(stream);
|
return Config.from(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -95,7 +95,7 @@ public final class FileConfigStore implements ConfigStore {
|
|||||||
final File file = fileFor(name);
|
final File file = fileFor(name);
|
||||||
if (!file.isFile())
|
if (!file.isFile())
|
||||||
throw new FileNotFoundException("Configuration file " + file.getName() + " not found");
|
throw new FileNotFoundException("Configuration file " + file.getName() + " not found");
|
||||||
try (FileOutputStream stream = new FileOutputStream(file, false)) {
|
try (final FileOutputStream stream = new FileOutputStream(file, false)) {
|
||||||
stream.write(config.toString().getBytes(StandardCharsets.UTF_8));
|
stream.write(config.toString().getBytes(StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
return config;
|
return config;
|
||||||
|
@ -57,7 +57,7 @@ public final class TunnelManager extends BaseObservable {
|
|||||||
new ObservableSortedKeyedArrayList<>(COMPARATOR);
|
new ObservableSortedKeyedArrayList<>(COMPARATOR);
|
||||||
private Tunnel lastUsedTunnel;
|
private Tunnel lastUsedTunnel;
|
||||||
private boolean haveLoaded;
|
private boolean haveLoaded;
|
||||||
private ArrayList<CompletableFuture<Void>> delayedLoadRestoreTunnels = new ArrayList<>();
|
private final ArrayList<CompletableFuture<Void>> delayedLoadRestoreTunnels = new ArrayList<>();
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public TunnelManager(final AsyncWorker asyncWorker, final Backend backend,
|
public TunnelManager(final AsyncWorker asyncWorker, final Backend backend,
|
||||||
@ -150,7 +150,7 @@ public final class TunnelManager extends BaseObservable {
|
|||||||
final String lastUsedName = preferences.getString(KEY_LAST_USED_TUNNEL, null);
|
final String lastUsedName = preferences.getString(KEY_LAST_USED_TUNNEL, null);
|
||||||
if (lastUsedName != null)
|
if (lastUsedName != null)
|
||||||
setLastUsedTunnel(tunnels.get(lastUsedName));
|
setLastUsedTunnel(tunnels.get(lastUsedName));
|
||||||
CompletableFuture<Void> toComplete[];
|
final CompletableFuture<Void>[] toComplete;
|
||||||
synchronized (delayedLoadRestoreTunnels) {
|
synchronized (delayedLoadRestoreTunnels) {
|
||||||
haveLoaded = true;
|
haveLoaded = true;
|
||||||
toComplete = delayedLoadRestoreTunnels.toArray(new CompletableFuture[delayedLoadRestoreTunnels.size()]);
|
toComplete = delayedLoadRestoreTunnels.toArray(new CompletableFuture[delayedLoadRestoreTunnels.size()]);
|
||||||
@ -175,12 +175,12 @@ public final class TunnelManager extends BaseObservable {
|
|||||||
.whenComplete(ExceptionLoggers.E);
|
.whenComplete(ExceptionLoggers.E);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CompletionStage<Void> restoreState(boolean force) {
|
public CompletionStage<Void> restoreState(final boolean force) {
|
||||||
if (!force && !preferences.getBoolean(KEY_RESTORE_ON_BOOT, false))
|
if (!force && !preferences.getBoolean(KEY_RESTORE_ON_BOOT, false))
|
||||||
return CompletableFuture.completedFuture(null);
|
return CompletableFuture.completedFuture(null);
|
||||||
synchronized (delayedLoadRestoreTunnels) {
|
synchronized (delayedLoadRestoreTunnels) {
|
||||||
if (!haveLoaded) {
|
if (!haveLoaded) {
|
||||||
CompletableFuture<Void> f = new CompletableFuture<>();
|
final CompletableFuture<Void> f = new CompletableFuture<>();
|
||||||
delayedLoadRestoreTunnels.add(f);
|
delayedLoadRestoreTunnels.add(f);
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,8 @@ public class LogExporterPreference extends Preference {
|
|||||||
throw new Exception(errors.toString());
|
throw new Exception(errors.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (final Exception e) {
|
||||||
|
// noinspection ResultOfMethodCallIgnored
|
||||||
file.delete();
|
file.delete();
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
@ -27,10 +27,9 @@ public class VersionPreference extends Preference {
|
|||||||
versionSummary = getContext().getString(R.string.version_userspace_summary, GoBackend.getVersion());
|
versionSummary = getContext().getString(R.string.version_userspace_summary, GoBackend.getVersion());
|
||||||
} else if (Application.getComponent().getBackendType() == WgQuickBackend.class) {
|
} else if (Application.getComponent().getBackendType() == WgQuickBackend.class) {
|
||||||
Application.getComponent().getToolsInstaller().getVersion().whenComplete((version, exception) -> {
|
Application.getComponent().getToolsInstaller().getVersion().whenComplete((version, exception) -> {
|
||||||
if (exception == null)
|
versionSummary = exception == null
|
||||||
versionSummary = getContext().getString(R.string.version_kernel_summary, version);
|
? getContext().getString(R.string.version_kernel_summary, version)
|
||||||
else
|
: getContext().getString(R.string.version_kernel_unknown_summary);
|
||||||
versionSummary = getContext().getString(R.string.version_kernel_unknown_summary);
|
|
||||||
notifyChanged();
|
notifyChanged();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -81,8 +81,7 @@ public class ZipExporterPreference extends Preference {
|
|||||||
toString().getBytes(StandardCharsets.UTF_8));
|
toString().getBytes(StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
zip.closeEntry();
|
zip.closeEntry();
|
||||||
zip.close();
|
} catch (final Exception e) {
|
||||||
} catch (Exception e) {
|
|
||||||
// noinspection ResultOfMethodCallIgnored
|
// noinspection ResultOfMethodCallIgnored
|
||||||
file.delete();
|
file.delete();
|
||||||
throw e;
|
throw e;
|
||||||
|
@ -22,7 +22,7 @@ public final class SharedLibraryLoader {
|
|||||||
private SharedLibraryLoader() {
|
private SharedLibraryLoader() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final void loadSharedLibrary(final Context context, final String libName) {
|
public static void loadSharedLibrary(final Context context, final String libName) {
|
||||||
Throwable noAbiException;
|
Throwable noAbiException;
|
||||||
try {
|
try {
|
||||||
System.loadLibrary(libName);
|
System.loadLibrary(libName);
|
||||||
@ -35,12 +35,12 @@ public final class SharedLibraryLoader {
|
|||||||
final ZipFile zipFile;
|
final ZipFile zipFile;
|
||||||
try {
|
try {
|
||||||
zipFile = new ZipFile(new File(context.getApplicationInfo().sourceDir), ZipFile.OPEN_READ);
|
zipFile = new ZipFile(new File(context.getApplicationInfo().sourceDir), ZipFile.OPEN_READ);
|
||||||
} catch (IOException e) {
|
} catch (final IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
final String mappedLibName = System.mapLibraryName(libName);
|
final String mappedLibName = System.mapLibraryName(libName);
|
||||||
byte buffer[] = new byte[1024 * 32];
|
final byte[] buffer = new byte[1024 * 32];
|
||||||
for (final String abi : Build.SUPPORTED_ABIS) {
|
for (final String abi : Build.SUPPORTED_ABIS) {
|
||||||
final String libZipPath = "lib" + File.separatorChar + abi + File.separatorChar + mappedLibName;
|
final String libZipPath = "lib" + File.separatorChar + abi + File.separatorChar + mappedLibName;
|
||||||
final ZipEntry zipEntry = zipFile.getEntry(libZipPath);
|
final ZipEntry zipEntry = zipFile.getEntry(libZipPath);
|
||||||
@ -50,13 +50,13 @@ public final class SharedLibraryLoader {
|
|||||||
try {
|
try {
|
||||||
f = File.createTempFile("lib", ".so", context.getCacheDir());
|
f = File.createTempFile("lib", ".so", context.getCacheDir());
|
||||||
Log.d(TAG, "Extracting apk:/" + libZipPath + " to " + f.getAbsolutePath() + " and loading");
|
Log.d(TAG, "Extracting apk:/" + libZipPath + " to " + f.getAbsolutePath() + " and loading");
|
||||||
FileOutputStream out = new FileOutputStream(f);
|
try (final FileOutputStream out = new FileOutputStream(f);
|
||||||
InputStream in = zipFile.getInputStream(zipEntry);
|
final InputStream in = zipFile.getInputStream(zipEntry)) {
|
||||||
int len;
|
int len;
|
||||||
while ((len = in.read(buffer)) != -1) {
|
while ((len = in.read(buffer)) != -1) {
|
||||||
out.write(buffer, 0, len);
|
out.write(buffer, 0, len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
out.close();
|
|
||||||
System.load(f.getAbsolutePath());
|
System.load(f.getAbsolutePath());
|
||||||
return;
|
return;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -64,6 +64,7 @@ public final class SharedLibraryLoader {
|
|||||||
noAbiException = e;
|
noAbiException = e;
|
||||||
} finally {
|
} finally {
|
||||||
if (f != null)
|
if (f != null)
|
||||||
|
// noinspection ResultOfMethodCallIgnored
|
||||||
f.delete();
|
f.delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ public final class ToolsInstaller {
|
|||||||
|
|
||||||
public CompletionStage<String> getVersion() {
|
public CompletionStage<String> getVersion() {
|
||||||
return Application.getComponent().getAsyncWorker().supplyAsync(() -> {
|
return Application.getComponent().getAsyncWorker().supplyAsync(() -> {
|
||||||
final ArrayList<String> output = new ArrayList<>();
|
final List<String> output = new ArrayList<>();
|
||||||
if (rootShell.run(output, "cat /sys/module/wireguard/version") != 0 || output.isEmpty())
|
if (rootShell.run(output, "cat /sys/module/wireguard/version") != 0 || output.isEmpty())
|
||||||
throw new RuntimeException("Unable to determine kernel module version");
|
throw new RuntimeException("Unable to determine kernel module version");
|
||||||
return output.get(0);
|
return output.get(0);
|
||||||
|
@ -28,7 +28,7 @@ public class Topic {
|
|||||||
subscribers = new SyncArrayList<>();
|
subscribers = new SyncArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void subscribe(Subscriber sub) {
|
public synchronized void subscribe(final Subscriber sub) {
|
||||||
subscribers.add(new WeakReference<>(sub));
|
subscribers.add(new WeakReference<>(sub));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,10 +36,10 @@ public class Topic {
|
|||||||
subscribers = new SyncArrayList<>();
|
subscribers = new SyncArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void unsubscribe(Subscriber sub) {
|
public synchronized void unsubscribe(final Subscriber sub) {
|
||||||
List<WeakReference<Subscriber>> subs = subscribers;
|
List<WeakReference<Subscriber>> subs = subscribers;
|
||||||
subscribers = new ArrayList<>();
|
subscribers = new ArrayList<>();
|
||||||
for (WeakReference<Subscriber> subscriber : subs) {
|
for (final WeakReference<Subscriber> subscriber : subs) {
|
||||||
if (subscriber.get() != null && subscriber.get() != sub)
|
if (subscriber.get() != null && subscriber.get() != sub)
|
||||||
subscribers.add(subscriber);
|
subscribers.add(subscriber);
|
||||||
}
|
}
|
||||||
@ -64,7 +64,7 @@ public class Topic {
|
|||||||
this.results = results;
|
this.results = results;
|
||||||
// Snapshot
|
// Snapshot
|
||||||
List<WeakReference<Subscriber>> subs = subscribers;
|
List<WeakReference<Subscriber>> subs = subscribers;
|
||||||
for (WeakReference<Subscriber> subscriber : subs) {
|
for (final WeakReference<Subscriber> subscriber : subs) {
|
||||||
if (subscriber != null && subscriber.get() != null)
|
if (subscriber != null && subscriber.get() != null)
|
||||||
subscriber.get().onTopicPublished(this);
|
subscriber.get().onTopicPublished(this);
|
||||||
}
|
}
|
||||||
@ -84,7 +84,7 @@ public class Topic {
|
|||||||
|
|
||||||
public interface Subscriber {
|
public interface Subscriber {
|
||||||
default void subscribeTopics() {
|
default void subscribeTopics() {
|
||||||
for (Topic topic : getSubscription()) {
|
for (final Topic topic : getSubscription()) {
|
||||||
if (topic.isPublished()) {
|
if (topic.isPublished()) {
|
||||||
onTopicPublished(topic);
|
onTopicPublished(topic);
|
||||||
}
|
}
|
||||||
@ -92,7 +92,7 @@ public class Topic {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
default void unsubscribeTopics() {
|
default void unsubscribeTopics() {
|
||||||
for (Topic event : getSubscription()) {
|
for (final Topic event : getSubscription()) {
|
||||||
event.unsubscribe(this);
|
event.unsubscribe(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -102,7 +102,7 @@ public class Topic {
|
|||||||
|
|
||||||
private static class SyncArrayList<E> extends ArrayList<E> {
|
private static class SyncArrayList<E> extends ArrayList<E> {
|
||||||
@Override
|
@Override
|
||||||
public synchronized boolean add(E e) {
|
public synchronized boolean add(final E e) {
|
||||||
return super.add(e);
|
return super.add(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user