Merge "Have a method to stop VPN and send event to VPN app" am: 4e08dae7d2 am: e3325d736a

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2194337

Change-Id: I08276ff4885f12e9273bb4ef310ec32c26c53409
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index b4e91b5..481c5db 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -1196,25 +1196,7 @@
                 mContext.unbindService(mConnection);
                 cleanupVpnStateLocked();
             } else if (mVpnRunner != null) {
-                // Build intent first because the sessionKey will be reset after performing
-                // VpnRunner.exit(). Also, cache mOwnerUID even if ownerUID will not be changed in
-                // VpnRunner.exit() to prevent design being changed in the future.
-                // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from
-                //  ConnectivityServiceTest.
-                final int ownerUid = mOwnerUID;
-                Intent intent = null;
-                if (SdkLevel.isAtLeastT() && isVpnApp(mPackage)) {
-                    intent = buildVpnManagerEventIntent(
-                            VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER,
-                            -1 /* errorClass */, -1 /* errorCode*/, mPackage,
-                            getSessionKeyLocked(), makeVpnProfileStateLocked(),
-                            null /* underlyingNetwork */, null /* nc */, null /* lp */);
-                }
-                // cleanupVpnStateLocked() is called from mVpnRunner.exit()
-                mVpnRunner.exit();
-                if (intent != null && isVpnApp(mPackage)) {
-                    notifyVpnManagerVpnStopped(mPackage, ownerUid, intent);
-                }
+                stopVpnRunnerAndNotifyAppLocked(mPackage);
             }
 
             try {
@@ -4068,6 +4050,29 @@
         }
     }
 
+    @GuardedBy("this")
+    private void stopVpnRunnerAndNotifyAppLocked(@NonNull String packageName) {
+        // Build intent first because the sessionKey will be reset after performing
+        // VpnRunner.exit(). Also, cache mOwnerUID even if ownerUID will not be changed in
+        // VpnRunner.exit() to prevent design being changed in the future.
+        // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from
+        //  ConnectivityServiceTest.
+        final int ownerUid = mOwnerUID;
+        Intent intent = null;
+        if (SdkLevel.isAtLeastT() && isVpnApp(packageName)) {
+            intent = buildVpnManagerEventIntent(
+                    VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER,
+                    -1 /* errorClass */, -1 /* errorCode*/, packageName,
+                    getSessionKeyLocked(), makeVpnProfileStateLocked(),
+                    null /* underlyingNetwork */, null /* nc */, null /* lp */);
+        }
+        // cleanupVpnStateLocked() is called from mVpnRunner.exit()
+        mVpnRunner.exit();
+        if (intent != null && isVpnApp(packageName)) {
+            notifyVpnManagerVpnStopped(packageName, ownerUid, intent);
+        }
+    }
+
     /**
      * Stops an already running VPN Profile for the given package.
      *
@@ -4084,18 +4089,7 @@
         // To stop the VPN profile, the caller must be the current prepared package and must be
         // running an Ikev2VpnProfile.
         if (isCurrentIkev2VpnLocked(packageName)) {
-            // Build intent first because the sessionKey will be reset after performing
-            // VpnRunner.exit(). Also, cache mOwnerUID even if ownerUID will not be changed in
-            // VpnRunner.exit() to prevent design being changed in the future.
-            final int ownerUid = mOwnerUID;
-            final Intent intent = buildVpnManagerEventIntent(
-                    VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER,
-                    -1 /* errorClass */, -1 /* errorCode*/, packageName,
-                    getSessionKeyLocked(), makeVpnProfileStateLocked(),
-                    null /* underlyingNetwork */, null /* nc */, null /* lp */);
-
-            mVpnRunner.exit();
-            notifyVpnManagerVpnStopped(packageName, ownerUid, intent);
+            stopVpnRunnerAndNotifyAppLocked(packageName);
         }
     }