diff options
Diffstat (limited to 'app/src/main/java/com/wireguard/android')
8 files changed, 131 insertions, 138 deletions
diff --git a/app/src/main/java/com/wireguard/android/Application.java b/app/src/main/java/com/wireguard/android/Application.java index c1b21373..f3cf0887 100644 --- a/app/src/main/java/com/wireguard/android/Application.java +++ b/app/src/main/java/com/wireguard/android/Application.java @@ -55,11 +55,11 @@ public class Application extends android.app.Application { public interface ApplicationComponent { AsyncWorker getAsyncWorker(); + Class getBackendType(); + ToolsInstaller getToolsInstaller(); TunnelManager getTunnelManager(); - - Class getBackendType(); } @Qualifier diff --git a/app/src/main/java/com/wireguard/android/activity/SettingsActivity.java b/app/src/main/java/com/wireguard/android/activity/SettingsActivity.java index e48b6d88..fb5e7a09 100644 --- a/app/src/main/java/com/wireguard/android/activity/SettingsActivity.java +++ b/app/src/main/java/com/wireguard/android/activity/SettingsActivity.java @@ -23,11 +23,6 @@ import java.util.List; */ public class SettingsActivity extends AppCompatActivity { - @FunctionalInterface - public interface PermissionRequestCallback { - void done(String[] permissions, int[] grantResults); - } - private HashMap<Integer, PermissionRequestCallback> permissionRequestCallbacks = new HashMap<>(); private int permissionRequestCounter = 0; @@ -49,15 +44,6 @@ public class SettingsActivity extends AppCompatActivity { } @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - final PermissionRequestCallback f = permissionRequestCallbacks.get(requestCode); - if (f != null) { - permissionRequestCallbacks.remove(requestCode); - f.done(permissions, grantResults); - } - } - - @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) { @@ -78,6 +64,20 @@ public class SettingsActivity extends AppCompatActivity { } } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + final PermissionRequestCallback f = permissionRequestCallbacks.get(requestCode); + if (f != null) { + permissionRequestCallbacks.remove(requestCode); + f.done(permissions, grantResults); + } + } + + @FunctionalInterface + public interface PermissionRequestCallback { + void done(String[] permissions, int[] grantResults); + } + public static class SettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(final Bundle savedInstanceState, final String key) { diff --git a/app/src/main/java/com/wireguard/android/backend/GoBackend.java b/app/src/main/java/com/wireguard/android/backend/GoBackend.java index 8201b116..519f7427 100644 --- a/app/src/main/java/com/wireguard/android/backend/GoBackend.java +++ b/app/src/main/java/com/wireguard/android/backend/GoBackend.java @@ -27,48 +27,20 @@ import java9.util.concurrent.CompletableFuture; public final class GoBackend implements Backend { private static final String TAG = "WireGuard/" + GoBackend.class.getSimpleName(); + private static CompletableFuture<VpnService> vpnService = new CompletableFuture<>(); static { System.loadLibrary("wg-go"); } + private Context context; private Tunnel currentTunnel; private int currentTunnelHandle = -1; - private Context context; - public GoBackend(Context context) { this.context = context; } - private void startVpnService() { - context.startService(new Intent(context, VpnService.class)); - } - - public static class VpnService extends android.net.VpnService { - @Override - public void onCreate() { - vpnService.complete(this); - super.onCreate(); - } - - @Override - public void onDestroy() { - for (final Tunnel tunnel : Application.getComponent().getTunnelManager().getTunnels()) { - if (tunnel != null && tunnel.getState() != State.DOWN) - tunnel.setState(State.DOWN); - } - vpnService = vpnService.newIncompleteFuture(); - super.onDestroy(); - } - - public Builder getBuilder() { - return new Builder(); - } - } - - private static CompletableFuture<VpnService> vpnService = new CompletableFuture<>(); - private static native int wgGetSocketV4(int handle); private static native int wgGetSocketV6(int handle); @@ -219,4 +191,30 @@ public final class GoBackend implements Backend { currentTunnelHandle = -1; } } + + private void startVpnService() { + context.startService(new Intent(context, VpnService.class)); + } + + public static class VpnService extends android.net.VpnService { + public Builder getBuilder() { + return new Builder(); + } + + @Override + public void onCreate() { + vpnService.complete(this); + super.onCreate(); + } + + @Override + public void onDestroy() { + for (final Tunnel tunnel : Application.getComponent().getTunnelManager().getTunnels()) { + if (tunnel != null && tunnel.getState() != State.DOWN) + tunnel.setState(State.DOWN); + } + vpnService = vpnService.newIncompleteFuture(); + super.onDestroy(); + } + } } diff --git a/app/src/main/java/com/wireguard/android/fragment/TunnelDetailFragment.java b/app/src/main/java/com/wireguard/android/fragment/TunnelDetailFragment.java index 8d0ae4cf..01fa594b 100644 --- a/app/src/main/java/com/wireguard/android/fragment/TunnelDetailFragment.java +++ b/app/src/main/java/com/wireguard/android/fragment/TunnelDetailFragment.java @@ -20,6 +20,10 @@ import com.wireguard.config.Config; public class TunnelDetailFragment extends BaseFragment { private TunnelDetailFragmentBinding binding; + private void onConfigLoaded(final String name, final Config config) { + binding.setConfig(new Config.Observable(config, name)); + } + @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -46,10 +50,6 @@ public class TunnelDetailFragment extends BaseFragment { super.onDestroyView(); } - private void onConfigLoaded(final String name, final Config config) { - binding.setConfig(new Config.Observable(config, name)); - } - @Override public void onSelectedTunnelChanged(final Tunnel oldTunnel, final Tunnel newTunnel) { if (binding == null) diff --git a/app/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.java b/app/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.java index b7467b14..a3760ed9 100644 --- a/app/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.java +++ b/app/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.java @@ -3,8 +3,6 @@ package com.wireguard.android.fragment; import android.app.Activity; import android.content.Context; import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; @@ -41,6 +39,24 @@ public class TunnelEditorFragment extends BaseFragment { binding.setConfig(new Config.Observable(config, name)); } + private void onConfigSaved(final Tunnel savedTunnel, final Config config, + final Throwable throwable) { + final String message; + if (throwable == null) { + message = getString(R.string.config_save_success, savedTunnel.getName()); + Log.d(TAG, message); + onFinished(); + } else { + final String error = ExceptionLoggers.unwrap(throwable).getMessage(); + message = getString(R.string.config_save_error, savedTunnel.getName(), error); + Log.e(TAG, message, throwable); + if (binding != null) { + final CoordinatorLayout container = binding.mainContainer; + Snackbar.make(container, message, Snackbar.LENGTH_LONG).show(); + } + } + } + @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -48,40 +64,6 @@ public class TunnelEditorFragment extends BaseFragment { } @Override - public void onSelectedTunnelChanged(final Tunnel oldTunnel, final Tunnel newTunnel) { - tunnel = newTunnel; - if (binding == null) - return; - binding.setConfig(new Config.Observable(null, null)); - if (tunnel != null) - tunnel.getConfigAsync().thenAccept(a -> onConfigLoaded(tunnel.getName(), a)); - } - - @Override - public void onSaveInstanceState(@NonNull final Bundle outState) { - outState.putParcelable(KEY_LOCAL_CONFIG, binding.getConfig()); - outState.putString(KEY_ORIGINAL_NAME, tunnel == null ? null : tunnel.getName()); - super.onSaveInstanceState(outState); - } - - @Override - public void onViewStateRestored(final Bundle savedInstanceState) { - if (savedInstanceState == null) { - onSelectedTunnelChanged(null, getSelectedTunnel()); - } else { - tunnel = getSelectedTunnel(); - Config.Observable config = savedInstanceState.getParcelable(KEY_LOCAL_CONFIG); - String originalName = savedInstanceState.getString(KEY_ORIGINAL_NAME); - if (tunnel != null && !tunnel.getName().equals(originalName)) - onSelectedTunnelChanged(null, tunnel); - else - binding.setConfig(config); - } - - super.onViewStateRestored(savedInstanceState); - } - - @Override public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { inflater.inflate(R.menu.config_editor, menu); } @@ -159,22 +141,21 @@ public class TunnelEditorFragment extends BaseFragment { } } - private void onConfigSaved(final Tunnel savedTunnel, final Config config, - final Throwable throwable) { - final String message; - if (throwable == null) { - message = getString(R.string.config_save_success, savedTunnel.getName()); - Log.d(TAG, message); - onFinished(); - } else { - final String error = ExceptionLoggers.unwrap(throwable).getMessage(); - message = getString(R.string.config_save_error, savedTunnel.getName(), error); - Log.e(TAG, message, throwable); - if (binding != null) { - final CoordinatorLayout container = binding.mainContainer; - Snackbar.make(container, message, Snackbar.LENGTH_LONG).show(); - } - } + @Override + public void onSaveInstanceState(@NonNull final Bundle outState) { + outState.putParcelable(KEY_LOCAL_CONFIG, binding.getConfig()); + outState.putString(KEY_ORIGINAL_NAME, tunnel == null ? null : tunnel.getName()); + super.onSaveInstanceState(outState); + } + + @Override + public void onSelectedTunnelChanged(final Tunnel oldTunnel, final Tunnel newTunnel) { + tunnel = newTunnel; + if (binding == null) + return; + binding.setConfig(new Config.Observable(null, null)); + if (tunnel != null) + tunnel.getConfigAsync().thenAccept(a -> onConfigLoaded(tunnel.getName(), a)); } private void onTunnelCreated(final Tunnel newTunnel, final Throwable throwable) { @@ -214,4 +195,21 @@ public class TunnelEditorFragment extends BaseFragment { } } } + + @Override + public void onViewStateRestored(final Bundle savedInstanceState) { + if (savedInstanceState == null) { + onSelectedTunnelChanged(null, getSelectedTunnel()); + } else { + tunnel = getSelectedTunnel(); + Config.Observable config = savedInstanceState.getParcelable(KEY_LOCAL_CONFIG); + String originalName = savedInstanceState.getString(KEY_ORIGINAL_NAME); + if (tunnel != null && !tunnel.getName().equals(originalName)) + onSelectedTunnelChanged(null, tunnel); + else + binding.setConfig(config); + } + + super.onViewStateRestored(savedInstanceState); + } } diff --git a/app/src/main/java/com/wireguard/android/fragment/TunnelListFragment.java b/app/src/main/java/com/wireguard/android/fragment/TunnelListFragment.java index 719960af..5291d8fb 100644 --- a/app/src/main/java/com/wireguard/android/fragment/TunnelListFragment.java +++ b/app/src/main/java/com/wireguard/android/fragment/TunnelListFragment.java @@ -27,7 +27,6 @@ import android.widget.AbsListView.MultiChoiceModeListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; -import android.widget.TextView; import com.wireguard.android.Application; import com.wireguard.android.Application.ApplicationComponent; @@ -44,7 +43,6 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.zip.ZipEntry; @@ -70,6 +68,14 @@ public class TunnelListFragment extends BaseFragment { private TunnelListFragmentBinding binding; private TunnelManager tunnelManager; + public boolean collapseActionMenu() { + if (binding.createMenu.isExpanded()) { + binding.createMenu.collapse(); + return true; + } + return false; + } + private void importTunnel(final Uri uri) { final Activity activity = getActivity(); if (activity == null) @@ -199,14 +205,6 @@ public class TunnelListFragment extends BaseFragment { super.onDestroyView(); } - public boolean collapseActionMenu() { - if (binding.createMenu.isExpanded()) { - binding.createMenu.collapse(); - return true; - } - return false; - } - public void onRequestCreateConfig(@SuppressWarnings("unused") final View view) { startActivity(new Intent(getActivity(), TunnelCreatorActivity.class)); if (binding != null) @@ -254,7 +252,7 @@ public class TunnelListFragment extends BaseFragment { if (tunnels.size() == 1 && throwables.isEmpty()) message = getString(R.string.import_success, tunnels.get(0).getName()); else if (tunnels.isEmpty() && throwables.size() == 1) - /* Use the exception message from above. */; + /* Use the exception message from above. */ ; else if (throwables.isEmpty()) message = getString(R.string.import_total_success, tunnels.size()); else if (!throwables.isEmpty()) diff --git a/app/src/main/java/com/wireguard/android/model/TunnelManager.java b/app/src/main/java/com/wireguard/android/model/TunnelManager.java index e4667c82..72980f5e 100644 --- a/app/src/main/java/com/wireguard/android/model/TunnelManager.java +++ b/app/src/main/java/com/wireguard/android/model/TunnelManager.java @@ -128,15 +128,6 @@ public final class TunnelManager extends BaseObservable { return tunnels; } - public void refreshTunnelStates() { - asyncWorker.supplyAsync(backend::enumerate) - .thenAccept(running -> { - for (final Tunnel tunnel : tunnels) - tunnel.onStateChanged(running.contains(tunnel.getName()) ? State.UP : State.DOWN); - }) - .whenComplete(ExceptionLoggers.E); - } - public void onCreate() { asyncWorker.supplyAsync(configStore::enumerate) .thenAcceptBoth(asyncWorker.supplyAsync(backend::enumerate), this::onTunnelsLoaded) @@ -151,6 +142,15 @@ public final class TunnelManager extends BaseObservable { setLastUsedTunnel(tunnels.get(lastUsedName)); } + public void refreshTunnelStates() { + asyncWorker.supplyAsync(backend::enumerate) + .thenAccept(running -> { + for (final Tunnel tunnel : tunnels) + tunnel.onStateChanged(running.contains(tunnel.getName()) ? State.UP : State.DOWN); + }) + .whenComplete(ExceptionLoggers.E); + } + public CompletionStage<Void> restoreState() { if (!preferences.getBoolean(KEY_RESTORE_ON_BOOT, false)) return CompletableFuture.completedFuture(null); diff --git a/app/src/main/java/com/wireguard/android/preference/ZipExporterPreference.java b/app/src/main/java/com/wireguard/android/preference/ZipExporterPreference.java index 421be1df..b10d8388 100644 --- a/app/src/main/java/com/wireguard/android/preference/ZipExporterPreference.java +++ b/app/src/main/java/com/wireguard/android/preference/ZipExporterPreference.java @@ -6,9 +6,9 @@ import android.content.pm.PackageManager; import android.os.Environment; import android.support.design.widget.Snackbar; import android.support.v7.preference.Preference; -import android.view.ContextThemeWrapper; import android.util.AttributeSet; import android.util.Log; +import android.view.ContextThemeWrapper; import com.wireguard.android.Application; import com.wireguard.android.Application.ApplicationComponent; @@ -25,7 +25,6 @@ import java.io.FileOutputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -50,19 +49,6 @@ public class ZipExporterPreference extends Preference { tunnelManager = applicationComponent.getTunnelManager(); } - @Override - public CharSequence getSummary() { - if (exportedFilePath == null) - return getContext().getString(R.string.export_summary); - else - return getContext().getString(R.string.export_success, exportedFilePath); - } - - @Override - public CharSequence getTitle() { - return getContext().getString(R.string.zip_exporter_title); - } - private void exportZip() { List<Tunnel> tunnels = new ArrayList<>(tunnelManager.getTunnels()); List<CompletableFuture<Config>> futureConfigs = new ArrayList<>(tunnels.size()); @@ -124,9 +110,22 @@ public class ZipExporterPreference extends Preference { } @Override + public CharSequence getSummary() { + if (exportedFilePath == null) + return getContext().getString(R.string.export_summary); + else + return getContext().getString(R.string.export_success, exportedFilePath); + } + + @Override + public CharSequence getTitle() { + return getContext().getString(R.string.zip_exporter_title); + } + + @Override protected void onClick() { getPrefActivity(this).ensurePermissions( - new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, (permissions, granted) -> { if (granted.length > 0 && granted[0] == PackageManager.PERMISSION_GRANTED) exportZip(); |