diff options
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 Binary files differnew file mode 100644 index 000000000..1c94d195f --- /dev/null +++ b/src/frontends/android/app/src/main/res/drawable-hdpi/ic_notification_disconnect.png 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 Binary files differnew file mode 100644 index 000000000..82c7277c0 --- /dev/null +++ b/src/frontends/android/app/src/main/res/drawable-mdpi/ic_notification_disconnect.png 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 Binary files differnew file mode 100644 index 000000000..6dc5e5112 --- /dev/null +++ b/src/frontends/android/app/src/main/res/drawable-xhdpi/ic_notification_disconnect.png 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> |