aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2017-07-03 10:39:33 +0200
committerTobias Brunner <tobias@strongswan.org>2017-07-03 10:40:37 +0200
commitc0990c187b317deb727e9babfa47a9e3f2d1b921 (patch)
treeac060f5c0d59d533d2654bbc1e05b86f14bf1bfb
parentaea901bbbe097b1ad0612e2e0b90c422ff96e5fe (diff)
parent6333a756eee462a4ae071b24fe3af218493cf9c5 (diff)
downloadstrongswan-c0990c187b317deb727e9babfa47a9e3f2d1b921.tar.bz2
strongswan-c0990c187b317deb727e9babfa47a9e3f2d1b921.tar.xz
Merge branch '2309-android-disconnect-button'
Adds a disconnect button to the permanent notification. Fixes #2309.
-rw-r--r--src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java5
-rw-r--r--src/frontends/android/app/src/main/java/org/strongswan/android/ui/MainActivity.java91
-rw-r--r--src/frontends/android/app/src/main/res/drawable-hdpi/ic_notification_disconnect.pngbin0 -> 584 bytes
-rw-r--r--src/frontends/android/app/src/main/res/drawable-mdpi/ic_notification_disconnect.pngbin0 -> 390 bytes
-rw-r--r--src/frontends/android/app/src/main/res/drawable-xhdpi/ic_notification_disconnect.pngbin0 -> 794 bytes
-rw-r--r--src/frontends/android/app/src/main/res/values-de/strings.xml2
-rw-r--r--src/frontends/android/app/src/main/res/values-pl/strings.xml2
-rw-r--r--src/frontends/android/app/src/main/res/values-ru/strings.xml2
-rw-r--r--src/frontends/android/app/src/main/res/values-ua/strings.xml2
-rw-r--r--src/frontends/android/app/src/main/res/values-zh-rCN/strings.xml2
-rw-r--r--src/frontends/android/app/src/main/res/values-zh-rTW/strings.xml2
-rw-r--r--src/frontends/android/app/src/main/res/values/strings.xml2
12 files changed, 104 insertions, 6 deletions
diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java
index 235681772..cfed2e384 100644
--- a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java
+++ b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java
@@ -365,6 +365,11 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
builder.setContentTitle(getString(s));
if (!publicVersion)
{
+ Intent intent = new Intent(getApplicationContext(), MainActivity.class);
+ intent.setAction(MainActivity.DISCONNECT);
+ PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ builder.addAction(R.drawable.ic_notification_disconnect, getString(R.string.disconnect), pending);
builder.setContentText(name);
builder.setPublicVersion(buildNotification(true));
}
diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/MainActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/MainActivity.java
index 5ba1061c2..efdeddd48 100644
--- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/MainActivity.java
+++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/MainActivity.java
@@ -2,7 +2,7 @@
* Copyright (C) 2012-2017 Tobias Brunner
* Copyright (C) 2012 Giuliano Grassi
* Copyright (C) 2012 Ralf Sager
- * Hochschule fuer Technik Rapperswil
+ * HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -58,6 +58,7 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
{
public static final String CONTACT_EMAIL = "android@strongswan.org";
public static final String START_PROFILE = "org.strongswan.android.action.START_PROFILE";
+ public static final String DISCONNECT = "org.strongswan.android.action.DISCONNECT";
public static final String EXTRA_VPN_PROFILE_ID = "org.strongswan.android.VPN_PROFILE_ID";
/**
* Use "bring your own device" (BYOD) features
@@ -67,8 +68,11 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
private static final String PROFILE_NAME = "org.strongswan.android.MainActivity.PROFILE_NAME";
private static final String PROFILE_REQUIRES_PASSWORD = "org.strongswan.android.MainActivity.REQUIRES_PASSWORD";
private static final String PROFILE_RECONNECT = "org.strongswan.android.MainActivity.RECONNECT";
+ private static final String PROFILE_DISCONNECT = "org.strongswan.android.MainActivity.DISCONNECT";
+ private static final String PROFILE_FOREGROUND = "org.strongswan.android.MainActivity.PROFILE_FOREGROUND";
private static final String DIALOG_TAG = "Dialog";
+ private boolean mIsVisible;
private Bundle mProfileInfo;
private VpnStateService mService;
private final ServiceConnection mServiceConnection = new ServiceConnection()
@@ -86,7 +90,11 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
if (START_PROFILE.equals(getIntent().getAction()))
{
- startVpnProfile(getIntent());
+ startVpnProfile(getIntent(), false);
+ }
+ else if (DISCONNECT.equals(getIntent().getAction()))
+ {
+ disconnect(false);
}
}
};
@@ -120,6 +128,20 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
}
}
+ @Override
+ protected void onStart()
+ {
+ super.onStart();
+ mIsVisible = true;
+ }
+
+ @Override
+ protected void onStop()
+ {
+ super.onStop();
+ mIsVisible = false;
+ }
+
/**
* Due to launchMode=singleTop this is called if the Activity already exists
*/
@@ -130,7 +152,11 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
if (START_PROFILE.equals(intent.getAction()))
{
- startVpnProfile(intent);
+ startVpnProfile(intent, mIsVisible);
+ }
+ else if (DISCONNECT.equals(intent.getAction()))
+ {
+ disconnect(mIsVisible);
}
}
@@ -236,6 +262,17 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
@Override
public void onVpnProfileSelected(VpnProfile profile)
{
+ startVpnProfile(profile, true);
+ }
+
+ /**
+ * Start the given VPN profile
+ *
+ * @param profile VPN profile
+ * @param foreground whether this was initiated when the activity was visible
+ */
+ public void startVpnProfile(VpnProfile profile, boolean foreground)
+ {
Bundle profileInfo = new Bundle();
profileInfo.putLong(VpnProfileDataSource.KEY_ID, profile.getId());
profileInfo.putString(VpnProfileDataSource.KEY_USERNAME, profile.getUsername());
@@ -248,6 +285,7 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
if (mService != null && (mService.getState() == State.CONNECTED || mService.getState() == State.CONNECTING))
{
profileInfo.putBoolean(PROFILE_RECONNECT, mService.getProfile().getId() == profile.getId());
+ profileInfo.putBoolean(PROFILE_FOREGROUND, foreground);
ConfirmationDialog dialog = new ConfirmationDialog();
dialog.setArguments(profileInfo);
@@ -280,8 +318,9 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
* if the profile doesn't exist.
*
* @param intent Intent that caused us to start this
+ * @param foreground whether this was initiated when the activity was visible
*/
- private void startVpnProfile(Intent intent)
+ private void startVpnProfile(Intent intent, boolean foreground)
{
long profileId = intent.getLongExtra(EXTRA_VPN_PROFILE_ID, 0);
if (profileId <= 0)
@@ -295,7 +334,7 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
if (profile != null)
{
- onVpnProfileSelected(profile);
+ startVpnProfile(profile, foreground);
}
else
{
@@ -304,6 +343,25 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
}
/**
+ * Disconnect the current connection, if any (silently ignored if there is no connection).
+ */
+ private void disconnect(boolean foreground)
+ {
+ removeFragmentByTag(DIALOG_TAG);
+
+ if (mService != null && (mService.getState() == State.CONNECTED || mService.getState() == State.CONNECTING))
+ {
+ Bundle args = new Bundle();
+ args.putBoolean(PROFILE_DISCONNECT, true);
+ args.putBoolean(PROFILE_FOREGROUND, foreground);
+
+ ConfirmationDialog dialog = new ConfirmationDialog();
+ dialog.setArguments(args);
+ dialog.show(this.getSupportFragmentManager(), DIALOG_TAG);
+ }
+ }
+
+ /**
* Class that loads the cached CA certificates.
*/
private class LoadCertificatesTask extends AsyncTask<Void, Void, TrustedCertificateManager>
@@ -364,6 +422,12 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
message = R.string.vpn_profile_connected;
button = R.string.reconnect;
}
+ else if (profileInfo.getBoolean(PROFILE_DISCONNECT))
+ {
+ title = R.string.disconnect_question;
+ message = R.string.disconnect_active_connection;
+ button = R.string.disconnect;
+ }
return new AlertDialog.Builder(getActivity())
.setIcon(icon)
@@ -375,7 +439,17 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
public void onClick(DialogInterface dialog, int whichButton)
{
MainActivity activity = (MainActivity)getActivity();
- activity.startVpnProfile(profileInfo);
+ if (profileInfo.getBoolean(PROFILE_DISCONNECT))
+ {
+ if (activity.mService != null)
+ {
+ activity.mService.disconnect();
+ }
+ }
+ else
+ {
+ activity.startVpnProfile(profileInfo);
+ }
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener()
@@ -384,6 +458,11 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
public void onClick(DialogInterface dialog, int which)
{
dismiss();
+ if (!profileInfo.getBoolean(PROFILE_FOREGROUND))
+ { /* if the app was not in the foreground before this action was triggered
+ * externally, we just close the activity if canceled */
+ getActivity().finish();
+ }
}
}).create();
}
diff --git a/src/frontends/android/app/src/main/res/drawable-hdpi/ic_notification_disconnect.png b/src/frontends/android/app/src/main/res/drawable-hdpi/ic_notification_disconnect.png
new file mode 100644
index 000000000..1c94d195f
--- /dev/null
+++ b/src/frontends/android/app/src/main/res/drawable-hdpi/ic_notification_disconnect.png
Binary files differ
diff --git a/src/frontends/android/app/src/main/res/drawable-mdpi/ic_notification_disconnect.png b/src/frontends/android/app/src/main/res/drawable-mdpi/ic_notification_disconnect.png
new file mode 100644
index 000000000..82c7277c0
--- /dev/null
+++ b/src/frontends/android/app/src/main/res/drawable-mdpi/ic_notification_disconnect.png
Binary files differ
diff --git a/src/frontends/android/app/src/main/res/drawable-xhdpi/ic_notification_disconnect.png b/src/frontends/android/app/src/main/res/drawable-xhdpi/ic_notification_disconnect.png
new file mode 100644
index 000000000..6dc5e5112
--- /dev/null
+++ b/src/frontends/android/app/src/main/res/drawable-xhdpi/ic_notification_disconnect.png
Binary files differ
diff --git a/src/frontends/android/app/src/main/res/values-de/strings.xml b/src/frontends/android/app/src/main/res/values-de/strings.xml
index 34fe84609..bc6927d51 100644
--- a/src/frontends/android/app/src/main/res/values-de/strings.xml
+++ b/src/frontends/android/app/src/main/res/values-de/strings.xml
@@ -166,6 +166,8 @@
<string name="reconnect">Neu verbinden</string>
<string name="connect_profile_question">Verbinde %1$s?</string>
<string name="replaces_active_connection">Dies ersetzt die aktuelle VPN Verbindung!</string>
+ <string name="disconnect_question">VPN Verbindung trennen?</string>
+ <string name="disconnect_active_connection">Dies trennt die aktuelle VPN Verbindung!</string>
<string name="connect">Verbinden</string>
</resources>
diff --git a/src/frontends/android/app/src/main/res/values-pl/strings.xml b/src/frontends/android/app/src/main/res/values-pl/strings.xml
index a87381aa1..424837adf 100644
--- a/src/frontends/android/app/src/main/res/values-pl/strings.xml
+++ b/src/frontends/android/app/src/main/res/values-pl/strings.xml
@@ -166,6 +166,8 @@
<string name="reconnect">Połączyć ponownie</string>
<string name="connect_profile_question">Połącz %1$s?</string>
<string name="replaces_active_connection">To zastąpi aktywne połączenie VPN!</string>
+ <string name="disconnect_question">Disconnect VPN?</string>
+ <string name="disconnect_active_connection">This will disconnect the active VPN connection!</string>
<string name="connect">Połącz</string>
</resources>
diff --git a/src/frontends/android/app/src/main/res/values-ru/strings.xml b/src/frontends/android/app/src/main/res/values-ru/strings.xml
index 0ce54e56e..a53772014 100644
--- a/src/frontends/android/app/src/main/res/values-ru/strings.xml
+++ b/src/frontends/android/app/src/main/res/values-ru/strings.xml
@@ -163,6 +163,8 @@
<string name="reconnect">Переподключить</string>
<string name="connect_profile_question">Подключить %1$s?</string>
<string name="replaces_active_connection">Это заменит ваше текущее VPN соединение!</string>
+ <string name="disconnect_question">Disconnect VPN?</string>
+ <string name="disconnect_active_connection">This will disconnect the active VPN connection!</string>
<string name="connect">Соединить</string>
</resources>
diff --git a/src/frontends/android/app/src/main/res/values-ua/strings.xml b/src/frontends/android/app/src/main/res/values-ua/strings.xml
index 5b769b787..4d3600952 100644
--- a/src/frontends/android/app/src/main/res/values-ua/strings.xml
+++ b/src/frontends/android/app/src/main/res/values-ua/strings.xml
@@ -164,6 +164,8 @@
<string name="reconnect">Перепідключитися</string>
<string name="connect_profile_question">Підключити %1$s?</string>
<string name="replaces_active_connection">Ця дія замінить ваше поточне VPN з\'єднання!</string>
+ <string name="disconnect_question">Disconnect VPN?</string>
+ <string name="disconnect_active_connection">This will disconnect the active VPN connection!</string>
<string name="connect">Підключити</string>
</resources>
diff --git a/src/frontends/android/app/src/main/res/values-zh-rCN/strings.xml b/src/frontends/android/app/src/main/res/values-zh-rCN/strings.xml
index 4202c5f84..606bd2783 100644
--- a/src/frontends/android/app/src/main/res/values-zh-rCN/strings.xml
+++ b/src/frontends/android/app/src/main/res/values-zh-rCN/strings.xml
@@ -163,6 +163,8 @@
<string name="reconnect">重连</string>
<string name="connect_profile_question">是否连接%1$s?</string>
<string name="replaces_active_connection">这将覆盖您当前活跃的VPN连接!</string>
+ <string name="disconnect_question">Disconnect VPN?</string>
+ <string name="disconnect_active_connection">This will disconnect the active VPN connection!</string>
<string name="connect">连接</string>
</resources>
diff --git a/src/frontends/android/app/src/main/res/values-zh-rTW/strings.xml b/src/frontends/android/app/src/main/res/values-zh-rTW/strings.xml
index 6c0e104b5..52f21f8da 100644
--- a/src/frontends/android/app/src/main/res/values-zh-rTW/strings.xml
+++ b/src/frontends/android/app/src/main/res/values-zh-rTW/strings.xml
@@ -163,6 +163,8 @@
<string name="reconnect">重新連線</string>
<string name="connect_profile_question">是否連線%1$s?</string>
<string name="replaces_active_connection">這將會覆蓋您當前運作的VPN連線!</string>
+ <string name="disconnect_question">Disconnect VPN?</string>
+ <string name="disconnect_active_connection">This will disconnect the active VPN connection!</string>
<string name="connect">連線</string>
</resources>
diff --git a/src/frontends/android/app/src/main/res/values/strings.xml b/src/frontends/android/app/src/main/res/values/strings.xml
index f99f7dea5..4ee6be390 100644
--- a/src/frontends/android/app/src/main/res/values/strings.xml
+++ b/src/frontends/android/app/src/main/res/values/strings.xml
@@ -166,6 +166,8 @@
<string name="reconnect">Reconnect</string>
<string name="connect_profile_question">Connect %1$s?</string>
<string name="replaces_active_connection">This will replace your active VPN connection!</string>
+ <string name="disconnect_question">Disconnect VPN?</string>
+ <string name="disconnect_active_connection">This will disconnect the active VPN connection!</string>
<string name="connect">Connect</string>
</resources>