android: Close activity when dialog is canceled if it was not visible before
authorTobias Brunner <tobias@strongswan.org>
Fri, 30 Jun 2017 07:46:56 +0000 (09:46 +0200)
committerTobias Brunner <tobias@strongswan.org>
Mon, 3 Jul 2017 08:39:26 +0000 (10:39 +0200)
onPause/onResume() won't work because onPause() is called right before
onNewIntent().

src/frontends/android/app/src/main/java/org/strongswan/android/ui/MainActivity.java

index 76aef72..efdeddd 100644 (file)
@@ -69,8 +69,10 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
        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()
@@ -88,11 +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();
+                               disconnect(false);
                        }
                }
        };
@@ -126,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
         */
@@ -136,11 +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();
+                       disconnect(mIsVisible);
                }
        }
 
@@ -246,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());
@@ -258,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);
@@ -290,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)
@@ -305,7 +334,7 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
 
                if (profile != null)
                {
-                       onVpnProfileSelected(profile);
+                       startVpnProfile(profile, foreground);
                }
                else
                {
@@ -316,7 +345,7 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
        /**
         * Disconnect the current connection, if any (silently ignored if there is no connection).
         */
-       private void disconnect()
+       private void disconnect(boolean foreground)
        {
                removeFragmentByTag(DIALOG_TAG);
 
@@ -324,11 +353,11 @@ public class MainActivity extends AppCompatActivity implements OnVpnProfileSelec
                {
                        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);
-                       return;
                }
        }
 
@@ -429,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();
                }