Merge "Fix Settings crash when click uninstall button"
diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
index 1676829..1b14402 100644
--- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
@@ -161,7 +161,7 @@
     @Override
     public int getAvailabilityStatus() {
         // TODO(b/37313605): Re-enable once this controller supports instant apps
-        return isInstantApp() || isSystemModule() ? DISABLED_FOR_USER : AVAILABLE;
+        return mFinishing || isInstantApp() || isSystemModule() ? DISABLED_FOR_USER : AVAILABLE;
     }
 
     @Override
@@ -190,7 +190,7 @@
 
     @Override
     public void onResume() {
-        if (isAvailable() && !mFinishing) {
+        if (isAvailable()) {
             mAppsControlDisallowedBySystem = RestrictedLockUtilsInternal.hasBaseUserRestriction(
                     mActivity, UserManager.DISALLOW_APPS_CONTROL, mUserId);
             mAppsControlDisallowedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
index eee2da7..ca2a800 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
@@ -21,8 +21,8 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doAnswer;
@@ -41,8 +41,8 @@
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
-import android.content.om.OverlayManager;
 import android.content.om.OverlayInfo;
+import android.content.om.OverlayManager;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
@@ -51,6 +51,8 @@
 import android.util.ArraySet;
 import android.view.View;
 
+import androidx.preference.PreferenceScreen;
+
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.core.InstrumentedPreferenceFragment;
@@ -61,7 +63,6 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.widget.ActionButtonsPreference;
 
-import java.util.Set;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -72,12 +73,15 @@
 import org.mockito.MockitoAnnotations;
 import org.mockito.stubbing.Answer;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.Resetter;
 import org.robolectric.util.ReflectionHelpers;
 
+import java.util.Set;
+
 @RunWith(RobolectricTestRunner.class)
 public class AppButtonsPreferenceControllerTest {
 
@@ -114,10 +118,9 @@
     @Mock
     private UserManager mUserManager;
     @Mock
-    private Application mApplication;
-    @Mock
     private PackageInfo mPackageInfo;
 
+    private Context mContext;
     private Intent mUninstallIntent;
     private ActionButtonsPreference mButtonPrefs;
     private AppButtonsPreferenceController mController;
@@ -127,14 +130,15 @@
         MockitoAnnotations.initMocks(this);
 
         FakeFeatureFactory.setupForTest();
+        mContext = RuntimeEnvironment.application;
         doReturn(mDpm).when(mSettingsActivity).getSystemService(Context.DEVICE_POLICY_SERVICE);
         doReturn(mUserManager).when(mSettingsActivity).getSystemService(Context.USER_SERVICE);
         doReturn(mPackageManger).when(mSettingsActivity).getPackageManager();
         doReturn(mAm).when(mSettingsActivity).getSystemService(Context.ACTIVITY_SERVICE);
         doReturn(mOverlayManager).when(mSettingsActivity).
-            getSystemService(OverlayManager.class);
+                getSystemService(OverlayManager.class);
         doReturn(mAppEntry).when(mState).getEntry(anyString(), anyInt());
-        when(mSettingsActivity.getApplication()).thenReturn(mApplication);
+        doReturn(mContext).when(mSettingsActivity).getApplicationContext();
         when(mSettingsActivity.getResources().getString(anyInt())).thenReturn(RESOURCE_STRING);
 
         mController = spy(new AppButtonsPreferenceController(mSettingsActivity, mFragment,
@@ -164,6 +168,21 @@
     }
 
     @Test
+    @Config(shadows = ShadowAppUtils.class)
+    public void isAvailable_validPackageName_isTrue() {
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_nullPackageName_isFalse() {
+        final AppButtonsPreferenceController controller = spy(
+                new AppButtonsPreferenceController(mSettingsActivity, mFragment,
+                        mLifecycle, null, mState, REQUEST_UNINSTALL, REQUEST_REMOVE_DEVICE_ADMIN));
+
+        assertThat(controller.isAvailable()).isFalse();
+    }
+
+    @Test
     public void retrieveAppEntry_hasAppEntry_notNull()
             throws PackageManager.NameNotFoundException {
         doReturn(mPackageInfo).when(mPackageManger).getPackageInfo(anyString(), anyInt());
@@ -308,10 +327,10 @@
 
     @Test
     public void updateUninstallButton_isNonSystemRro_setButtonDisable()
-                throws RemoteException {
+            throws RemoteException {
         when(mAppInfo.isResourceOverlay()).thenReturn(true);
         when(mOverlayManager.getOverlayInfo(anyString(), any()))
-            .thenReturn(OVERLAY_ENABLED);
+                .thenReturn(OVERLAY_ENABLED);
 
         mController.updateUninstallButton();
 
@@ -320,10 +339,10 @@
 
     @Test
     public void updateUninstallButton_isNonSystemRro_setButtonEnable()
-                throws RemoteException {
+            throws RemoteException {
         when(mAppInfo.isResourceOverlay()).thenReturn(true);
         when(mOverlayManager.getOverlayInfo(anyString(), any()))
-            .thenReturn(OVERLAY_DISABLED);
+                .thenReturn(OVERLAY_DISABLED);
 
         mController.updateUninstallButton();
 
@@ -425,7 +444,7 @@
     @Test
     public void onPackageListChanged_available_shouldRefreshUi() {
         doReturn(AppButtonsPreferenceController.AVAILABLE)
-            .when(mController).getAvailabilityStatus();
+                .when(mController).getAvailabilityStatus();
         doReturn(true).when(mController).refreshUi();
 
         mController.onPackageListChanged();
@@ -436,7 +455,7 @@
     @Test
     public void onPackageListChanged_notAvailable_shouldNotRefreshUiAndNoCrash() {
         doReturn(AppButtonsPreferenceController.DISABLED_FOR_USER)
-            .when(mController).getAvailabilityStatus();
+                .when(mController).getAvailabilityStatus();
 
         mController.onPackageListChanged();