aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2012-11-20 15:37:04 +0100
committerTobias Brunner <tobias@strongswan.org>2012-11-21 18:57:41 +0100
commit50b048983c051d359465e572b6b0f97f122b542e (patch)
tree81f7ca110c5443db3ed46a3052fc547f47dfb700
parentac3c6ff479d9bf517625309ee6908e0e2252f4e7 (diff)
downloadstrongswan-50b048983c051d359465e572b6b0f97f122b542e.tar.bz2
strongswan-50b048983c051d359465e572b6b0f97f122b542e.tar.xz
android: Show confirmation dialog when starting a profile while already connected
-rw-r--r--src/frontends/android/res/values-de/strings.xml6
-rw-r--r--src/frontends/android/res/values-pl/strings.xml6
-rw-r--r--src/frontends/android/res/values/strings.xml6
-rw-r--r--src/frontends/android/src/org/strongswan/android/ui/MainActivity.java118
4 files changed, 127 insertions, 9 deletions
diff --git a/src/frontends/android/res/values-de/strings.xml b/src/frontends/android/res/values-de/strings.xml
index a89425c0e..3181e0a54 100644
--- a/src/frontends/android/res/values-de/strings.xml
+++ b/src/frontends/android/res/values-de/strings.xml
@@ -97,5 +97,11 @@
<string name="error_generic">Unbekannter Fehler während des Verbindens.</string>
<string name="connecting_title">Verbinden: %1$s</string>
<string name="connecting_message">Verbinde mit \""%1$s\".</string>
+ <string name="vpn_connected">VPN verbunden</string>
+ <string name="vpn_profile_connected">Dieses VPN Profil ist momentan verbunden!</string>
+ <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="connect">Verbinden</string>
</resources>
diff --git a/src/frontends/android/res/values-pl/strings.xml b/src/frontends/android/res/values-pl/strings.xml
index 4df32c57e..3ba5e1669 100644
--- a/src/frontends/android/res/values-pl/strings.xml
+++ b/src/frontends/android/res/values-pl/strings.xml
@@ -99,5 +99,11 @@
<string name="error_generic">Nieznany błąd w czasie połączenia</string>
<string name="connecting_title">Łączenie: %1$s</string>
<string name="connecting_message">Tworzenie tunelu VPN z \""%1$s\".</string>
+ <string name="vpn_connected">Połączenie z VPN</string>
+ <string name="vpn_profile_connected">Ten profil VPN jest obecnie połaczony!</string>
+ <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="connect">Połącz</string>
</resources>
diff --git a/src/frontends/android/res/values/strings.xml b/src/frontends/android/res/values/strings.xml
index eba7a667a..c91bce445 100644
--- a/src/frontends/android/res/values/strings.xml
+++ b/src/frontends/android/res/values/strings.xml
@@ -97,5 +97,11 @@
<string name="error_generic">Unspecified failure while connecting.</string>
<string name="connecting_title">Connecting: %1$s</string>
<string name="connecting_message">Establishing VPN with \""%1$s\".</string>
+ <string name="vpn_connected">VPN connected</string>
+ <string name="vpn_profile_connected">This VPN profile is currently connected!</string>
+ <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="connect">Connect</string>
</resources>
diff --git a/src/frontends/android/src/org/strongswan/android/ui/MainActivity.java b/src/frontends/android/src/org/strongswan/android/ui/MainActivity.java
index 8a5d4fedb..2fd00efc9 100644
--- a/src/frontends/android/src/org/strongswan/android/ui/MainActivity.java
+++ b/src/frontends/android/src/org/strongswan/android/ui/MainActivity.java
@@ -22,6 +22,8 @@ import org.strongswan.android.data.VpnProfile;
import org.strongswan.android.data.VpnProfileDataSource;
import org.strongswan.android.logic.CharonVpnService;
import org.strongswan.android.logic.TrustedCertificateManager;
+import org.strongswan.android.logic.VpnStateService;
+import org.strongswan.android.logic.VpnStateService.State;
import org.strongswan.android.ui.VpnProfileListFragment.OnVpnProfileSelectedListener;
import android.app.ActionBar;
@@ -30,12 +32,16 @@ import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.DialogFragment;
+import android.app.Service;
import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.ServiceConnection;
import android.net.VpnService;
import android.os.AsyncTask;
import android.os.Bundle;
+import android.os.IBinder;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -50,8 +56,30 @@ public class MainActivity extends Activity implements OnVpnProfileSelectedListen
public static final String START_PROFILE = "org.strongswan.android.action.START_PROFILE";
public static final String EXTRA_VPN_PROFILE_ID = "org.strongswan.android.VPN_PROFILE_ID";
private static final int PREPARE_VPN_SERVICE = 0;
+ 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 Bundle mProfileInfo;
+ private VpnStateService mService;
+ private final ServiceConnection mServiceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceDisconnected(ComponentName name)
+ {
+ mService = null;
+ }
+
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service)
+ {
+ mService = ((VpnStateService.LocalBinder)service).getService();
+
+ if (START_PROFILE.equals(getIntent().getAction()))
+ {
+ startVpnProfile(getIntent());
+ }
+ }
+ };
@Override
public void onCreate(Bundle savedInstanceState)
@@ -60,15 +88,23 @@ public class MainActivity extends Activity implements OnVpnProfileSelectedListen
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);
+ this.bindService(new Intent(this, VpnStateService.class),
+ mServiceConnection, Service.BIND_AUTO_CREATE);
+
ActionBar bar = getActionBar();
bar.setDisplayShowTitleEnabled(false);
/* load CA certificates in a background task */
new CertificateLoadTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, false);
+ }
- if (START_PROFILE.equals(getIntent().getAction()))
+ @Override
+ protected void onDestroy()
+ {
+ super.onDestroy();
+ if (mService != null)
{
- startVpnProfile(getIntent());
+ this.unbindService(mServiceConnection);
}
}
@@ -175,18 +211,37 @@ public class MainActivity extends Activity implements OnVpnProfileSelectedListen
Bundle profileInfo = new Bundle();
profileInfo.putLong(VpnProfileDataSource.KEY_ID, profile.getId());
profileInfo.putString(VpnProfileDataSource.KEY_USERNAME, profile.getUsername());
- if (profile.getVpnType().getRequiresUsernamePassword() &&
- profile.getPassword() == null)
+ profileInfo.putString(VpnProfileDataSource.KEY_PASSWORD, profile.getPassword());
+ profileInfo.putBoolean(PROFILE_REQUIRES_PASSWORD, profile.getVpnType().getRequiresUsernamePassword());
+ profileInfo.putString(PROFILE_NAME, profile.getName());
+
+ if (mService != null && mService.getState() == State.CONNECTED)
+ {
+ profileInfo.putBoolean(PROFILE_RECONNECT, mService.getProfile().getId() == profile.getId());
+
+ ConfirmationDialog dialog = new ConfirmationDialog();
+ dialog.setArguments(profileInfo);
+ dialog.show(this.getFragmentManager(), "ConfirmationDialog");
+ return;
+ }
+ startVpnProfile(profileInfo);
+ }
+
+ /**
+ * Start the given VPN profile asking the user for a password if required.
+ * @param profileInfo data about the profile
+ */
+ private void startVpnProfile(Bundle profileInfo)
+ {
+ if (profileInfo.getBoolean(PROFILE_REQUIRES_PASSWORD) &&
+ profileInfo.getString(VpnProfileDataSource.KEY_PASSWORD) == null)
{
LoginDialog login = new LoginDialog();
login.setArguments(profileInfo);
login.show(getFragmentManager(), "LoginDialog");
+ return;
}
- else
- {
- profileInfo.putString(VpnProfileDataSource.KEY_PASSWORD, profile.getPassword());
- prepareVpnService(profileInfo);
- }
+ prepareVpnService(profileInfo);
}
/**
@@ -243,6 +298,51 @@ public class MainActivity extends Activity implements OnVpnProfileSelectedListen
}
/**
+ * Class that displays a confirmation dialog if a VPN profile is already connected
+ * and then initiates the selected VPN profile if the user confirms the dialog.
+ */
+ public static class ConfirmationDialog extends DialogFragment
+ {
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState)
+ {
+ final Bundle profileInfo = getArguments();
+ int icon = android.R.drawable.ic_dialog_alert;
+ int title = R.string.connect_profile_question;
+ int message = R.string.replaces_active_connection;
+ int button = R.string.connect;
+
+ if (profileInfo.getBoolean(PROFILE_RECONNECT))
+ {
+ icon = android.R.drawable.ic_dialog_info;
+ title = R.string.vpn_connected;
+ message = R.string.vpn_profile_connected;
+ button = R.string.reconnect;
+ }
+
+ return new AlertDialog.Builder(getActivity())
+ .setIcon(icon)
+ .setTitle(String.format(getString(title), profileInfo.getString(PROFILE_NAME)))
+ .setMessage(message)
+ .setPositiveButton(button, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton)
+ {
+ MainActivity activity = (MainActivity)getActivity();
+ activity.startVpnProfile(profileInfo);
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which)
+ {
+ dismiss();
+ }
+ }).create();
+ }
+ }
+
+ /**
* Class that displays a login dialog and initiates the selected VPN
* profile if the user confirms the dialog.
*/