summaryrefslogtreecommitdiffhomepage
path: root/app/src/main/java/com/wireguard/android
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/com/wireguard/android')
-rw-r--r--app/src/main/java/com/wireguard/android/NotSupportedActivity.java26
-rw-r--r--app/src/main/java/com/wireguard/android/backends/VpnService.java51
2 files changed, 66 insertions, 11 deletions
diff --git a/app/src/main/java/com/wireguard/android/NotSupportedActivity.java b/app/src/main/java/com/wireguard/android/NotSupportedActivity.java
new file mode 100644
index 00000000..65612855
--- /dev/null
+++ b/app/src/main/java/com/wireguard/android/NotSupportedActivity.java
@@ -0,0 +1,26 @@
+package com.wireguard.android;
+
+import android.app.Activity;
+import android.databinding.DataBindingUtil;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.Html;
+import android.text.Spanned;
+
+import com.wireguard.android.databinding.NotSupportedActivityBinding;
+
+public class NotSupportedActivity extends Activity {
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ final NotSupportedActivityBinding binding =
+ DataBindingUtil.setContentView(this, R.layout.not_supported_activity);
+ final String messageHtml = getString(R.string.not_supported_message);
+ final Spanned messageText;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
+ messageText = Html.fromHtml(messageHtml, Html.FROM_HTML_MODE_COMPACT);
+ else
+ messageText = Html.fromHtml(messageHtml);
+ binding.notSupportedMessage.setText(messageText);
+ }
+}
diff --git a/app/src/main/java/com/wireguard/android/backends/VpnService.java b/app/src/main/java/com/wireguard/android/backends/VpnService.java
index 8f4ba5a6..b97f532c 100644
--- a/app/src/main/java/com/wireguard/android/backends/VpnService.java
+++ b/app/src/main/java/com/wireguard/android/backends/VpnService.java
@@ -17,7 +17,9 @@ import android.service.quicksettings.TileService;
import android.util.Log;
import android.widget.Toast;
+import com.wireguard.android.NotSupportedActivity;
import com.wireguard.android.QuickTileService;
+import com.wireguard.android.R;
import com.wireguard.android.bindings.ObservableSortedMap;
import com.wireguard.android.bindings.ObservableTreeMap;
import com.wireguard.config.Config;
@@ -245,8 +247,11 @@ public class VpnService extends Service
@Override
protected void onPostExecute(final Boolean result) {
config.setIsEnabled(!result);
- if (!result)
+ if (!result) {
+ Toast.makeText(getApplicationContext(), getString(R.string.error_down),
+ Toast.LENGTH_SHORT).show();
return;
+ }
enabledConfigs.remove(config.getName());
preferences.edit().putStringSet(KEY_ENABLED_CONFIGS, enabledConfigs).apply();
if (config.getName().equals(primaryName))
@@ -254,7 +259,7 @@ public class VpnService extends Service
}
}
- private class ConfigEnabler extends AsyncTask<Void, Void, Boolean> {
+ private class ConfigEnabler extends AsyncTask<Void, Void, Integer> {
private final Config config;
private ConfigEnabler(final Config config) {
@@ -262,17 +267,43 @@ public class VpnService extends Service
}
@Override
- protected Boolean doInBackground(final Void... voids) {
+ protected Integer doInBackground(final Void... voids) {
+ if (!new File("/sys/module/wireguard").exists())
+ return -0xfff0001;
+ if (!existsInUsualSuspects("wg") || !existsInUsualSuspects("wg-quick"))
+ return -0xfff0002;
Log.i(TAG, "Running wg-quick up for " + config.getName());
final File configFile = new File(getFilesDir(), config.getName() + ".conf");
- return rootShell.run(null, "wg-quick up '" + configFile.getPath() + "'") == 0;
+ return rootShell.run(null, "wg-quick up '" + configFile.getPath() + "'");
+ }
+
+ private boolean existsInUsualSuspects(final String file) {
+ return new File("/system/bin/" + file).exists() ||
+ new File("/system/xbin/" + file).exists() ||
+ new File("/system/sbin/" + file).exists() ||
+ new File("/bin/" + file).exists() ||
+ new File("/xbin/" + file).exists() ||
+ new File("/sbin/" + file).exists() ||
+ new File("/usr/bin/" + file).exists() ||
+ new File("/usr/xbin/" + file).exists() ||
+ new File("/usr/sbin/" + file).exists();
}
@Override
- protected void onPostExecute(final Boolean result) {
- config.setIsEnabled(result);
- if (!result)
+ protected void onPostExecute(final Integer ret) {
+ config.setIsEnabled(ret == 0);
+ if (ret != 0) {
+ if (ret == -0xfff0001) {
+ startActivity(new Intent(getApplicationContext(), NotSupportedActivity.class));
+ } else if (ret == -0xfff0002) {
+ Toast.makeText(getApplicationContext(), getString(R.string.error_missing),
+ Toast.LENGTH_LONG).show();
+ } else {
+ Toast.makeText(getApplicationContext(), getString(R.string.error_up),
+ Toast.LENGTH_SHORT).show();
+ }
return;
+ }
enabledConfigs.add(config.getName());
preferences.edit().putStringSet(KEY_ENABLED_CONFIGS, enabledConfigs).apply();
if (config.getName().equals(primaryName))
@@ -378,10 +409,8 @@ public class VpnService extends Service
config.setName(configName);
configs.add(config);
} catch (IllegalArgumentException | IOException e) {
- try {
- file.delete();
- } catch (Exception e2) {
- Log.w(TAG, "Could not remove " + fileName, e2);
+ if (!file.delete()) {
+ Log.e(TAG, "Could not delete configuration for config " + configName);
}
Log.w(TAG, "Failed to load config from " + fileName, e);
publishProgress(fileName + ": " + e.getMessage());