diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b97dbc7d..02930b27 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,10 +11,10 @@
+ android:protectionLevel="dangerous" />
weakSelf;
+ private final CompletableFuture futureBackend = new CompletableFuture<>();
@SuppressWarnings("NullableProblems") private AsyncWorker asyncWorker;
+ @Nullable private Backend backend;
@SuppressWarnings("NullableProblems") private RootShell rootShell;
@SuppressWarnings("NullableProblems") private SharedPreferences sharedPreferences;
@SuppressWarnings("NullableProblems") private ToolsInstaller toolsInstaller;
@SuppressWarnings("NullableProblems") private TunnelManager tunnelManager;
- @Nullable private Backend backend;
- private final CompletableFuture futureBackend = new CompletableFuture<>();
public Application() {
weakSelf = new WeakReference<>(this);
}
- /* The ACRA password can be trivially reverse engineered and is open source anyway,
- * so there's no point in trying to protect it. However, we do want to at least
- * prevent innocent self-builders from uploading stuff to our crash reporter. So, we
- * check the DN of the certs that signed the apk, without even bothering to try
- * validating that they're authentic. It's a good enough heuristic.
- */
- @SuppressWarnings("deprecation")
- @Nullable
- private static String getInstallSource(final Context context) {
- if (BuildConfig.DEBUG)
- return null;
- try {
- final CertificateFactory cf = CertificateFactory.getInstance("X509");
- for (final Signature sig : context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures) {
- try {
- for (final String category : ((X509Certificate) cf.generateCertificate(new ByteArrayInputStream(sig.toByteArray()))).getSubjectDN().getName().split(", *")) {
- final String[] parts = category.split("=", 2);
- if (!"O".equals(parts[0]))
- continue;
- switch (parts[1]) {
- case "Google Inc.":
- return "Play Store";
- case "fdroid.org":
- return "F-Droid";
- }
- }
- } catch (final Exception ignored) { }
- }
- } catch (final Exception ignored) { }
- return null;
- }
-
- @Override
- protected void attachBaseContext(final Context context) {
- super.attachBaseContext(context);
-
- if (BuildConfig.MIN_SDK_VERSION > Build.VERSION.SDK_INT) {
- final Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_HOME);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
- System.exit(0);
- }
-
- final String installSource = getInstallSource(context);
- if (installSource != null) {
- ACRA.init(this);
- ACRA.getErrorReporter().putCustomData("installSource", installSource);
- }
- }
-
public static Application get() {
return weakSelf.get();
}
@@ -149,6 +97,40 @@ public class Application extends android.app.Application {
return get().futureBackend;
}
+ /* The ACRA password can be trivially reverse engineered and is open source anyway,
+ * so there's no point in trying to protect it. However, we do want to at least
+ * prevent innocent self-builders from uploading stuff to our crash reporter. So, we
+ * check the DN of the certs that signed the apk, without even bothering to try
+ * validating that they're authentic. It's a good enough heuristic.
+ */
+ @SuppressWarnings("deprecation")
+ @Nullable
+ private static String getInstallSource(final Context context) {
+ if (BuildConfig.DEBUG)
+ return null;
+ try {
+ final CertificateFactory cf = CertificateFactory.getInstance("X509");
+ for (final Signature sig : context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures) {
+ try {
+ for (final String category : ((X509Certificate) cf.generateCertificate(new ByteArrayInputStream(sig.toByteArray()))).getSubjectDN().getName().split(", *")) {
+ final String[] parts = category.split("=", 2);
+ if (!"O".equals(parts[0]))
+ continue;
+ switch (parts[1]) {
+ case "Google Inc.":
+ return "Play Store";
+ case "fdroid.org":
+ return "F-Droid";
+ }
+ }
+ } catch (final Exception ignored) {
+ }
+ }
+ } catch (final Exception ignored) {
+ }
+ return null;
+ }
+
public static RootShell getRootShell() {
return get().rootShell;
}
@@ -165,6 +147,26 @@ public class Application extends android.app.Application {
return get().tunnelManager;
}
+ @Override
+ protected void attachBaseContext(final Context context) {
+ super.attachBaseContext(context);
+
+ if (BuildConfig.MIN_SDK_VERSION > Build.VERSION.SDK_INT) {
+ final Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_HOME);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent);
+ System.exit(0);
+ }
+
+ final String installSource = getInstallSource(context);
+ if (installSource != null) {
+ ACRA.init(this);
+ ACRA.getErrorReporter().putCustomData("installSource", installSource);
+ }
+ }
+
@Override
public void onCreate() {
super.onCreate();
diff --git a/app/src/main/java/com/wireguard/android/QuickTileService.java b/app/src/main/java/com/wireguard/android/QuickTileService.java
index 28e2b2ee..2463896e 100644
--- a/app/src/main/java/com/wireguard/android/QuickTileService.java
+++ b/app/src/main/java/com/wireguard/android/QuickTileService.java
@@ -40,9 +40,9 @@ public class QuickTileService extends TileService {
private final OnStateChangedCallback onStateChangedCallback = new OnStateChangedCallback();
private final OnTunnelChangedCallback onTunnelChangedCallback = new OnTunnelChangedCallback();
- @Nullable private Tunnel tunnel;
- @Nullable private Icon iconOn;
@Nullable private Icon iconOff;
+ @Nullable private Icon iconOn;
+ @Nullable private Tunnel tunnel;
/* This works around an annoying unsolved frameworks bug some people are hitting. */
@Override
@@ -57,6 +57,22 @@ public class QuickTileService extends TileService {
return ret;
}
+ @Override
+ public void onClick() {
+ if (tunnel != null) {
+ final Tile tile = getQsTile();
+ if (tile != null) {
+ tile.setIcon(tile.getIcon() == iconOn ? iconOff : iconOn);
+ tile.updateTile();
+ }
+ tunnel.setState(State.TOGGLE).whenComplete(this::onToggleFinished);
+ } else {
+ final Intent intent = new Intent(this, MainActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivityAndCollapse(intent);
+ }
+ }
+
@Override
public void onCreate() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
@@ -79,22 +95,6 @@ public class QuickTileService extends TileService {
iconOff = Icon.createWithBitmap(b);
}
- @Override
- public void onClick() {
- if (tunnel != null) {
- final Tile tile = getQsTile();
- if (tile != null) {
- tile.setIcon(tile.getIcon() == iconOn ? iconOff : iconOn);
- tile.updateTile();
- }
- tunnel.setState(State.TOGGLE).whenComplete(this::onToggleFinished);
- } else {
- final Intent intent = new Intent(this, MainActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivityAndCollapse(intent);
- }
- }
-
@Override
public void onStartListening() {
Application.getTunnelManager().addOnPropertyChangedCallback(onTunnelChangedCallback);
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 f8fea403..b827ca1b 100644
--- a/app/src/main/java/com/wireguard/android/activity/SettingsActivity.java
+++ b/app/src/main/java/com/wireguard/android/activity/SettingsActivity.java
@@ -92,8 +92,8 @@ public class SettingsActivity extends ThemeChangeAwareActivity {
public void onCreatePreferences(final Bundle savedInstanceState, final String key) {
addPreferencesFromResource(R.xml.preferences);
final Preference wgQuickOnlyPrefs[] = {
- getPreferenceManager().findPreference("tools_installer"),
- getPreferenceManager().findPreference("restore_on_boot")
+ getPreferenceManager().findPreference("tools_installer"),
+ getPreferenceManager().findPreference("restore_on_boot")
};
for (final Preference pref : wgQuickOnlyPrefs)
pref.setVisible(false);
diff --git a/app/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.java b/app/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.java
index 9a6e2edc..fbae2165 100644
--- a/app/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.java
+++ b/app/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.java
@@ -19,9 +19,9 @@ import java.lang.reflect.Field;
public abstract class ThemeChangeAwareActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = "WireGuard/" + ThemeChangeAwareActivity.class.getSimpleName();
-
- @Nullable private static Resources lastResources;
private static boolean lastDarkMode;
+ @Nullable private static Resources lastResources;
+
private static synchronized void invalidateDrawableCache(final Resources resources, final boolean darkMode) {
if (resources == lastResources && darkMode == lastDarkMode)
return;
@@ -33,7 +33,8 @@ public abstract class ThemeChangeAwareActivity extends AppCompatActivity impleme
f = o.getClass().getDeclaredField("mResourcesImpl");
f.setAccessible(true);
o = f.get(o);
- } catch (final Exception ignored) { }
+ } catch (final Exception ignored) {
+ }
f = o.getClass().getDeclaredField("mDrawableCache");
f.setAccessible(true);
o = f.get(o);
diff --git a/app/src/main/java/com/wireguard/android/backend/Backend.java b/app/src/main/java/com/wireguard/android/backend/Backend.java
index 000a572a..64bb3d02 100644
--- a/app/src/main/java/com/wireguard/android/backend/Backend.java
+++ b/app/src/main/java/com/wireguard/android/backend/Backend.java
@@ -53,14 +53,11 @@ public interface Backend {
Statistics getStatistics(Tunnel tunnel) throws Exception;
/**
- * Set the state of a tunnel.
+ * Determine type name of underlying backend.
*
- * @param tunnel The tunnel to control the state of.
- * @param state The new state for this tunnel. Must be {@code UP}, {@code DOWN}, or
- * {@code TOGGLE}.
- * @return The updated state of the tunnel.
+ * @return Type name
*/
- State setState(Tunnel tunnel, State state) throws Exception;
+ String getTypeName();
/**
* Determine version of underlying backend.
@@ -71,9 +68,12 @@ public interface Backend {
String getVersion() throws Exception;
/**
- * Determine type name of underlying backend.
+ * Set the state of a tunnel.
*
- * @return Type name
+ * @param tunnel The tunnel to control the state of.
+ * @param state The new state for this tunnel. Must be {@code UP}, {@code DOWN}, or
+ * {@code TOGGLE}.
+ * @return The updated state of the tunnel.
*/
- String getTypeName();
+ State setState(Tunnel tunnel, State state) throws Exception;
}
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 0d21c599..295df9d0 100644
--- a/app/src/main/java/com/wireguard/android/backend/GoBackend.java
+++ b/app/src/main/java/com/wireguard/android/backend/GoBackend.java
@@ -59,12 +59,6 @@ public final class GoBackend implements Backend {
private static native String wgVersion();
- @Override
- public String getVersion() { return wgVersion(); }
-
- @Override
- public String getTypeName() { return "Go userspace"; }
-
@Override
public Config applyConfig(final Tunnel tunnel, final Config config) throws Exception {
if (tunnel.getState() == State.UP) {
@@ -101,6 +95,16 @@ public final class GoBackend implements Backend {
return new Statistics();
}
+ @Override
+ public String getTypeName() {
+ return "Go userspace";
+ }
+
+ @Override
+ public String getVersion() {
+ return wgVersion();
+ }
+
@Override
public State setState(final Tunnel tunnel, State state) throws Exception {
final State originalState = getState(tunnel);
diff --git a/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java b/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java
index a4edfc27..bfc363a4 100644
--- a/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java
+++ b/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java
@@ -40,18 +40,6 @@ public final class WgQuickBackend implements Backend {
localTemporaryDir = new File(context.getCacheDir(), "tmp");
}
- @Override
- public String getVersion() throws Exception {
- final List output = new ArrayList<>();
- if (Application.getRootShell()
- .run(output, "cat /sys/module/wireguard/version") != 0 || output.isEmpty())
- throw new Exception("Unable to determine kernel module version");
- return output.get(0);
- }
-
- @Override
- public String getTypeName() { return "Kernel module"; }
-
@Override
public Config applyConfig(final Tunnel tunnel, final Config config) throws Exception {
if (tunnel.getState() == State.UP) {
@@ -94,6 +82,20 @@ public final class WgQuickBackend implements Backend {
return new Statistics();
}
+ @Override
+ public String getTypeName() {
+ return "Kernel module";
+ }
+
+ @Override
+ public String getVersion() throws Exception {
+ final List output = new ArrayList<>();
+ if (Application.getRootShell()
+ .run(output, "cat /sys/module/wireguard/version") != 0 || output.isEmpty())
+ throw new Exception("Unable to determine kernel module version");
+ return output.get(0);
+ }
+
@Override
public State setState(final Tunnel tunnel, State state) throws Exception {
final State originalState = getState(tunnel);
diff --git a/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedRecyclerViewAdapter.java b/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedRecyclerViewAdapter.java
index 0420dee0..26e7687f 100644
--- a/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedRecyclerViewAdapter.java
+++ b/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedRecyclerViewAdapter.java
@@ -40,11 +40,6 @@ public class ObservableKeyedRecyclerViewAdapter>
setList(list);
}
- @Override
- public int getItemCount() {
- return list != null ? list.size() : 0;
- }
-
@Nullable
private E getItem(final int position) {
if (list == null || position < 0 || position >= list.size())
@@ -52,6 +47,11 @@ public class ObservableKeyedRecyclerViewAdapter>
return list.get(position);
}
+ @Override
+ public int getItemCount() {
+ return list != null ? list.size() : 0;
+ }
+
@Override
public long getItemId(final int position) {
final K key = getKey(position);
@@ -64,11 +64,6 @@ public class ObservableKeyedRecyclerViewAdapter>
return item != null ? item.getKey() : null;
}
- @Override
- public ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
- return new ViewHolder(DataBindingUtil.inflate(layoutInflater, layoutId, parent, false));
- }
-
@SuppressWarnings("unchecked")
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
@@ -85,6 +80,11 @@ public class ObservableKeyedRecyclerViewAdapter>
}
}
+ @Override
+ public ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
+ return new ViewHolder(DataBindingUtil.inflate(layoutInflater, layoutId, parent, false));
+ }
+
void setList(@Nullable final ObservableKeyedList newList) {
if (list != null)
list.removeOnListChangedCallback(callback);
@@ -99,6 +99,10 @@ public class ObservableKeyedRecyclerViewAdapter>
this.rowConfigurationHandler = rowConfigurationHandler;
}
+ public interface RowConfigurationHandler {
+ void onConfigureRow(B binding, T item, int position);
+ }
+
private static final class OnListChangedCallback>
extends ObservableList.OnListChangedCallback> {
@@ -152,8 +156,4 @@ public class ObservableKeyedRecyclerViewAdapter>
}
}
- public interface RowConfigurationHandler {
- void onConfigureRow(B binding, T item, int position);
- }
-
}
diff --git a/app/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.java b/app/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.java
index 8bc44ddf..8bf5a22d 100644
--- a/app/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.java
+++ b/app/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.java
@@ -34,9 +34,8 @@ import java.util.List;
public class AppListDialogFragment extends DialogFragment {
private static final String KEY_EXCLUDED_APPS = "excludedApps";
-
- private List currentlyExcludedApps;
private final ObservableKeyedList appData = new ObservableKeyedArrayList<>();
+ private List currentlyExcludedApps;
public static AppListDialogFragment newInstance(final String[] excludedApps, final T target) {
final Bundle extras = new Bundle();
@@ -47,39 +46,6 @@ public class AppListDialogFragment extends DialogFragment {
return fragment;
}
- @Override
- public void onCreate(@Nullable final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- currentlyExcludedApps = Arrays.asList(getArguments().getStringArray(KEY_EXCLUDED_APPS));
- }
-
- @Override
- public Dialog onCreateDialog(final Bundle savedInstanceState) {
- final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
- alertDialogBuilder.setTitle(R.string.excluded_applications);
-
- final AppListDialogFragmentBinding binding = AppListDialogFragmentBinding.inflate(getActivity().getLayoutInflater(), null, false);
- binding.executePendingBindings();
- alertDialogBuilder.setView(binding.getRoot());
-
- alertDialogBuilder.setPositiveButton(R.string.set_exclusions, (dialog, which) -> setExclusionsAndDismiss());
- alertDialogBuilder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
- alertDialogBuilder.setNeutralButton(R.string.deselect_all, (dialog, which) -> { });
-
- binding.setFragment(this);
- binding.setAppData(appData);
-
- loadData();
-
- final AlertDialog dialog = alertDialogBuilder.create();
- dialog.setOnShowListener(d -> dialog.getButton(DialogInterface.BUTTON_NEUTRAL).setOnClickListener(view -> {
- for (final ApplicationData app : appData)
- app.setExcludedFromTunnel(false);
- }));
- return dialog;
- }
-
private void loadData() {
final Activity activity = getActivity();
if (activity == null) {
@@ -113,6 +79,40 @@ public class AppListDialogFragment extends DialogFragment {
}));
}
+ @Override
+ public void onCreate(@Nullable final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ currentlyExcludedApps = Arrays.asList(getArguments().getStringArray(KEY_EXCLUDED_APPS));
+ }
+
+ @Override
+ public Dialog onCreateDialog(final Bundle savedInstanceState) {
+ final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
+ alertDialogBuilder.setTitle(R.string.excluded_applications);
+
+ final AppListDialogFragmentBinding binding = AppListDialogFragmentBinding.inflate(getActivity().getLayoutInflater(), null, false);
+ binding.executePendingBindings();
+ alertDialogBuilder.setView(binding.getRoot());
+
+ alertDialogBuilder.setPositiveButton(R.string.set_exclusions, (dialog, which) -> setExclusionsAndDismiss());
+ alertDialogBuilder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
+ alertDialogBuilder.setNeutralButton(R.string.deselect_all, (dialog, which) -> {
+ });
+
+ binding.setFragment(this);
+ binding.setAppData(appData);
+
+ loadData();
+
+ final AlertDialog dialog = alertDialogBuilder.create();
+ dialog.setOnShowListener(d -> dialog.getButton(DialogInterface.BUTTON_NEUTRAL).setOnClickListener(view -> {
+ for (final ApplicationData app : appData)
+ app.setExcludedFromTunnel(false);
+ }));
+ return dialog;
+ }
+
void setExclusionsAndDismiss() {
final List excludedApps = new ArrayList<>();
for (final ApplicationData data : appData) {
diff --git a/app/src/main/java/com/wireguard/android/fragment/BaseFragment.java b/app/src/main/java/com/wireguard/android/fragment/BaseFragment.java
index ca1b9922..e3003f2e 100644
--- a/app/src/main/java/com/wireguard/android/fragment/BaseFragment.java
+++ b/app/src/main/java/com/wireguard/android/fragment/BaseFragment.java
@@ -33,9 +33,8 @@ import com.wireguard.android.util.ExceptionLoggers;
*/
public abstract class BaseFragment extends Fragment implements OnSelectedTunnelChangedListener {
- private static final String TAG = "WireGuard/" + BaseFragment.class.getSimpleName();
private static final int REQUEST_CODE_VPN_PERMISSION = 23491;
-
+ private static final String TAG = "WireGuard/" + BaseFragment.class.getSimpleName();
@Nullable private BaseActivity activity;
@Nullable private Tunnel pendingTunnel;
@Nullable private Boolean pendingTunnelUp;
@@ -45,6 +44,18 @@ public abstract class BaseFragment extends Fragment implements OnSelectedTunnelC
return activity != null ? activity.getSelectedTunnel() : null;
}
+ @Override
+ public void onActivityResult(final int requestCode, final int resultCode, @Nullable final Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ if (requestCode == REQUEST_CODE_VPN_PERMISSION) {
+ if (pendingTunnel != null && pendingTunnelUp != null)
+ setTunnelStateWithPermissionsResult(pendingTunnel, pendingTunnelUp);
+ pendingTunnel = null;
+ pendingTunnelUp = null;
+ }
+ }
+
@Override
public void onAttach(final Context context) {
super.onAttach(context);
@@ -64,18 +75,6 @@ public abstract class BaseFragment extends Fragment implements OnSelectedTunnelC
super.onDetach();
}
- @Override
- public void onActivityResult(final int requestCode, final int resultCode, @Nullable final Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
-
- if (requestCode == REQUEST_CODE_VPN_PERMISSION) {
- if (pendingTunnel != null && pendingTunnelUp != null)
- setTunnelStateWithPermissionsResult(pendingTunnel, pendingTunnelUp);
- pendingTunnel = null;
- pendingTunnelUp = null;
- }
- }
-
protected void setSelectedTunnel(@Nullable final Tunnel tunnel) {
if (activity != null)
activity.setSelectedTunnel(tunnel);
diff --git a/app/src/main/java/com/wireguard/android/fragment/ConfigNamingDialogFragment.java b/app/src/main/java/com/wireguard/android/fragment/ConfigNamingDialogFragment.java
index 3d2c6294..83799818 100644
--- a/app/src/main/java/com/wireguard/android/fragment/ConfigNamingDialogFragment.java
+++ b/app/src/main/java/com/wireguard/android/fragment/ConfigNamingDialogFragment.java
@@ -13,7 +13,6 @@ import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
-import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import com.wireguard.android.Application;
@@ -27,9 +26,8 @@ import java.util.Objects;
public class ConfigNamingDialogFragment extends DialogFragment {
private static final String KEY_CONFIG_TEXT = "config_text";
-
- @Nullable private Config config;
@Nullable private ConfigNamingDialogFragmentBinding binding;
+ @Nullable private Config config;
@Nullable private InputMethodManager imm;
public static ConfigNamingDialogFragment newInstance(final String configText) {
@@ -40,6 +38,26 @@ public class ConfigNamingDialogFragment extends DialogFragment {
return fragment;
}
+ private void createTunnelAndDismiss() {
+ if (binding != null) {
+ final String name = binding.tunnelNameText.getText().toString();
+
+ Application.getTunnelManager().create(name, config).whenComplete((tunnel, throwable) -> {
+ if (tunnel != null) {
+ dismiss();
+ } else {
+ binding.tunnelNameTextLayout.setError(throwable.getMessage());
+ }
+ });
+ }
+ }
+
+ @Override
+ public void dismiss() {
+ setKeyboardVisible(false);
+ super.dismiss();
+ }
+
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -51,17 +69,6 @@ public class ConfigNamingDialogFragment extends DialogFragment {
}
}
- @Override public void onResume() {
- super.onResume();
-
- final AlertDialog dialog = (AlertDialog) getDialog();
- if (dialog != null) {
- dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(v -> createTunnelAndDismiss());
-
- setKeyboardVisible(true);
- }
- }
-
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
final Activity activity = getActivity();
@@ -81,23 +88,14 @@ public class ConfigNamingDialogFragment extends DialogFragment {
return alertDialogBuilder.create();
}
- @Override
- public void dismiss() {
- setKeyboardVisible(false);
- super.dismiss();
- }
+ @Override public void onResume() {
+ super.onResume();
- private void createTunnelAndDismiss() {
- if (binding != null) {
- final String name = binding.tunnelNameText.getText().toString();
+ final AlertDialog dialog = (AlertDialog) getDialog();
+ if (dialog != null) {
+ dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(v -> createTunnelAndDismiss());
- Application.getTunnelManager().create(name, config).whenComplete((tunnel, throwable) -> {
- if (tunnel != null) {
- dismiss();
- } else {
- binding.tunnelNameTextLayout.setError(throwable.getMessage());
- }
- });
+ setKeyboardVisible(true);
}
}
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 b51feb37..8f319e1e 100644
--- a/app/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.java
+++ b/app/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.java
@@ -48,8 +48,59 @@ public class TunnelEditorFragment extends BaseFragment implements AppExclusionLi
private static final String KEY_LOCAL_CONFIG = "local_config";
private static final String KEY_ORIGINAL_NAME = "original_name";
private static final String TAG = "WireGuard/" + TunnelEditorFragment.class.getSimpleName();
-
+ private final Collection