diff --git a/src/com/android/settings/network/ActiveSubsciptionsListener.java b/src/com/android/settings/network/ActiveSubscriptionsListener.java
similarity index 97%
rename from src/com/android/settings/network/ActiveSubsciptionsListener.java
rename to src/com/android/settings/network/ActiveSubscriptionsListener.java
index 26f6441..91a4c0a 100644
--- a/src/com/android/settings/network/ActiveSubsciptionsListener.java
+++ b/src/com/android/settings/network/ActiveSubscriptionsListener.java
@@ -39,7 +39,7 @@
 /**
  * A listener for active subscription change
  */
-public abstract class ActiveSubsciptionsListener
+public abstract class ActiveSubscriptionsListener
         extends SubscriptionManager.OnSubscriptionsChangedListener
         implements AutoCloseable {
 
@@ -73,7 +73,7 @@
      * @param looper {@code Looper} of this listener
      * @param context {@code Context} of this listener
      */
-    public ActiveSubsciptionsListener(Looper looper, Context context) {
+    public ActiveSubscriptionsListener(Looper looper, Context context) {
         this(looper, context, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
     }
 
@@ -84,7 +84,7 @@
      * @param context {@code Context} of this listener
      * @param subscriptionId for subscription on this listener
      */
-    public ActiveSubsciptionsListener(Looper looper, Context context, int subscriptionId) {
+    public ActiveSubscriptionsListener(Looper looper, Context context, int subscriptionId) {
         super(looper);
         mLooper = looper;
         mContext = context;
diff --git a/src/com/android/settings/network/ProxySubscriptionManager.java b/src/com/android/settings/network/ProxySubscriptionManager.java
index a89cc83..eb1a7d4 100644
--- a/src/com/android/settings/network/ProxySubscriptionManager.java
+++ b/src/com/android/settings/network/ProxySubscriptionManager.java
@@ -77,7 +77,7 @@
         mActiveSubscriptionsListeners =
                 new ArrayList<OnActiveSubscriptionChangedListener>();
 
-        mSubscriptionMonitor = new ActiveSubsciptionsListener(looper, context) {
+        mSubscriptionMonitor = new ActiveSubscriptionsListener(looper, context) {
             public void onChanged() {
                 notifyAllListeners();
             }
@@ -94,7 +94,7 @@
     }
 
     private Lifecycle mLifecycle;
-    private ActiveSubsciptionsListener mSubscriptionMonitor;
+    private ActiveSubscriptionsListener mSubscriptionMonitor;
     private GlobalSettingsChangeListener mAirplaneModeMonitor;
 
     private List<OnActiveSubscriptionChangedListener> mActiveSubscriptionsListeners;
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index f54c18b..adf399f 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -37,7 +37,7 @@
 import com.android.settings.R;
 import com.android.settings.datausage.BillingCyclePreferenceController;
 import com.android.settings.datausage.DataUsageSummaryPreferenceController;
-import com.android.settings.network.ActiveSubsciptionsListener;
+import com.android.settings.network.ActiveSubscriptionsListener;
 import com.android.settings.network.CarrierWifiTogglePreferenceController;
 import com.android.settings.network.telephony.cdma.CdmaSubscriptionPreferenceController;
 import com.android.settings.network.telephony.cdma.CdmaSystemSelectPreferenceController;
@@ -74,9 +74,9 @@
     private UserManager mUserManager;
     private String mClickedPrefKey;
 
-    private ActiveSubsciptionsListener mActiveSubsciptionsListener;
+    private ActiveSubscriptionsListener mActiveSubscriptionsListener;
     private boolean mDropFirstSubscriptionChangeNotify;
-    private int mActiveSubsciptionsListenerCount;
+    private int mActiveSubscriptionsListenerCount;
 
     public MobileNetworkSettings() {
         super(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS);
@@ -218,8 +218,8 @@
         super.onResume();
         // TODO: remove log after fixing b/182326102
         Log.d(LOG_TAG, "onResume() subId=" + mSubId);
-        if (mActiveSubsciptionsListener == null) {
-            mActiveSubsciptionsListener = new ActiveSubsciptionsListener(
+        if (mActiveSubscriptionsListener == null) {
+            mActiveSubscriptionsListener = new ActiveSubscriptionsListener(
                     getContext().getMainLooper(), getContext(), mSubId) {
                 public void onChanged() {
                     onSubscriptionDetailChanged();
@@ -227,7 +227,7 @@
             };
             mDropFirstSubscriptionChangeNotify = true;
         }
-        mActiveSubsciptionsListener.start();
+        mActiveSubscriptionsListener.start();
     }
 
     private void onSubscriptionDetailChanged() {
@@ -236,21 +236,21 @@
             Log.d(LOG_TAG, "Callback during onResume()");
             return;
         }
-        mActiveSubsciptionsListenerCount++;
-        if (mActiveSubsciptionsListenerCount != 1) {
+        mActiveSubscriptionsListenerCount++;
+        if (mActiveSubscriptionsListenerCount != 1) {
             return;
         }
 
         ThreadUtils.postOnMainThread(() -> {
-            mActiveSubsciptionsListenerCount = 0;
+            mActiveSubscriptionsListenerCount = 0;
             redrawPreferenceControllers();
         });
     }
 
     @Override
     public void onDestroy() {
-        if (mActiveSubsciptionsListener != null) {
-            mActiveSubsciptionsListener.stop();
+        if (mActiveSubscriptionsListener != null) {
+            mActiveSubscriptionsListener.stop();
         }
         super.onDestroy();
     }
diff --git a/tests/unit/src/com/android/settings/network/ActiveSubsciptionsListenerTest.java b/tests/unit/src/com/android/settings/network/ActiveSubscriptionsListenerTest.java
similarity index 94%
rename from tests/unit/src/com/android/settings/network/ActiveSubsciptionsListenerTest.java
rename to tests/unit/src/com/android/settings/network/ActiveSubscriptionsListenerTest.java
index efa21ae..27bc40c 100644
--- a/tests/unit/src/com/android/settings/network/ActiveSubsciptionsListenerTest.java
+++ b/tests/unit/src/com/android/settings/network/ActiveSubscriptionsListenerTest.java
@@ -49,7 +49,7 @@
 import java.util.List;
 
 @RunWith(AndroidJUnit4.class)
-public class ActiveSubsciptionsListenerTest {
+public class ActiveSubscriptionsListenerTest {
     private static final int SUB_ID1 = 3;
     private static final int SUB_ID2 = 7;
 
@@ -68,7 +68,7 @@
     private SubscriptionManager mSubscriptionManager;
     private List<SubscriptionInfo> mActiveSubscriptions;
 
-    private ActiveSubsciptionsListenerImpl mListener;
+    private ActiveSubscriptionsListenerImpl mListener;
     private BroadcastReceiver mReceiver;
 
     @Before
@@ -83,7 +83,7 @@
         addMockSubscription(SUB_ID2);
         doReturn(mActiveSubscriptions).when(mSubscriptionManager).getActiveSubscriptionInfoList();
 
-        mListener = spy(new ActiveSubsciptionsListenerImpl(Looper.getMainLooper(), mContext));
+        mListener = spy(new ActiveSubscriptionsListenerImpl(Looper.getMainLooper(), mContext));
         doReturn(mSubscriptionManager).when(mListener).getSubscriptionManager();
         mReceiver = mListener.getSubscriptionChangeReceiver();
     }
@@ -99,8 +99,8 @@
         mListener.close();
     }
 
-    public class ActiveSubsciptionsListenerImpl extends ActiveSubsciptionsListener {
-        public ActiveSubsciptionsListenerImpl(Looper looper, Context context) {
+    public class ActiveSubscriptionsListenerImpl extends ActiveSubscriptionsListener {
+        public ActiveSubscriptionsListenerImpl(Looper looper, Context context) {
             super(looper, context);
         }
 
diff --git a/tests/unit/src/com/android/settings/vpn2/AppPreferenceTest.java b/tests/unit/src/com/android/settings/vpn2/AppPreferenceTest.java
new file mode 100644
index 0000000..1f618cc
--- /dev/null
+++ b/tests/unit/src/com/android/settings/vpn2/AppPreferenceTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.vpn2;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertFalse;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.UserHandle;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/** Unittest for AppPreference */
+@RunWith(AndroidJUnit4.class)
+public class AppPreferenceTest {
+    // Additional mocking of the underying classes is necsesary if another user id is used.
+    private static final int USER_ID = UserHandle.USER_NULL;
+    private static final String PACKAGE_NAME = "test_package";
+    private static final String DIFFERENT_PACKAGE_NAME = "not_test_package";
+
+    @Mock
+    private DevicePolicyManager mDevicePolicyManager;
+
+    private Context mContext;
+    private AppPreference mAppPreference;
+
+    @Before
+    public void setUp() throws NameNotFoundException {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt());
+        doReturn(mContext).when(mContext).createPackageContextAsUser(any(), anyInt(), any());
+        when(mContext.getSystemService(DevicePolicyManager.class)).thenReturn(mDevicePolicyManager);
+    }
+
+    @Test
+    public void getPackageName_returnsAccuratePackageName() {
+        doReturn(DIFFERENT_PACKAGE_NAME).when(mDevicePolicyManager).getAlwaysOnVpnPackage();
+
+        mAppPreference = spy(new AppPreference(mContext, USER_ID, PACKAGE_NAME));
+        assertThat(mAppPreference.getPackageName()).isEqualTo(PACKAGE_NAME);
+    }
+
+    @Test
+    public void disableIfConfiguredByAdmin_packageNameNotEqualsAlwaysOn_shouldEnable() {
+        doReturn(DIFFERENT_PACKAGE_NAME).when(mDevicePolicyManager).getAlwaysOnVpnPackage();
+
+        mAppPreference = spy(new AppPreference(mContext, USER_ID, PACKAGE_NAME));
+        assertFalse(mAppPreference.isDisabledByAdmin());
+    }
+}
