Fix Settings crash when click uninstall button

am: 2d709131ba

Change-Id: I1e6228b5e4ecf10aa58bd41d2d8019b3d727b935
This commit is contained in:
Raff Tsai
2019-09-06 01:47:19 -07:00
committed by android-build-merger
2 changed files with 34 additions and 15 deletions

View File

@@ -160,7 +160,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
// TODO(b/37313605): Re-enable once this controller supports instant apps // 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 @Override
@@ -189,7 +189,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
@Override @Override
public void onResume() { public void onResume() {
if (isAvailable() && !mFinishing) { if (isAvailable()) {
mAppsControlDisallowedBySystem = RestrictedLockUtilsInternal.hasBaseUserRestriction( mAppsControlDisallowedBySystem = RestrictedLockUtilsInternal.hasBaseUserRestriction(
mActivity, UserManager.DISALLOW_APPS_CONTROL, mUserId); mActivity, UserManager.DISALLOW_APPS_CONTROL, mUserId);
mAppsControlDisallowedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced( mAppsControlDisallowedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(

View File

@@ -19,8 +19,8 @@ package com.android.settings.applications.appinfo;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
@@ -39,8 +39,8 @@ import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.om.OverlayManager;
import android.content.om.OverlayInfo; import android.content.om.OverlayInfo;
import android.content.om.OverlayManager;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@@ -49,6 +49,8 @@ import android.os.UserManager;
import android.util.ArraySet; import android.util.ArraySet;
import android.view.View; import android.view.View;
import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.InstrumentedPreferenceFragment;
@@ -59,7 +61,6 @@ import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.widget.ActionButtonsPreference; import com.android.settingslib.widget.ActionButtonsPreference;
import java.util.Set;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -70,12 +71,15 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements; import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter; import org.robolectric.annotation.Resetter;
import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers;
import java.util.Set;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class AppButtonsPreferenceControllerTest { public class AppButtonsPreferenceControllerTest {
@@ -112,10 +116,9 @@ public class AppButtonsPreferenceControllerTest {
@Mock @Mock
private UserManager mUserManager; private UserManager mUserManager;
@Mock @Mock
private Application mApplication;
@Mock
private PackageInfo mPackageInfo; private PackageInfo mPackageInfo;
private Context mContext;
private Intent mUninstallIntent; private Intent mUninstallIntent;
private ActionButtonsPreference mButtonPrefs; private ActionButtonsPreference mButtonPrefs;
private AppButtonsPreferenceController mController; private AppButtonsPreferenceController mController;
@@ -125,14 +128,15 @@ public class AppButtonsPreferenceControllerTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
FakeFeatureFactory.setupForTest(); FakeFeatureFactory.setupForTest();
mContext = RuntimeEnvironment.application;
doReturn(mDpm).when(mSettingsActivity).getSystemService(Context.DEVICE_POLICY_SERVICE); doReturn(mDpm).when(mSettingsActivity).getSystemService(Context.DEVICE_POLICY_SERVICE);
doReturn(mUserManager).when(mSettingsActivity).getSystemService(Context.USER_SERVICE); doReturn(mUserManager).when(mSettingsActivity).getSystemService(Context.USER_SERVICE);
doReturn(mPackageManger).when(mSettingsActivity).getPackageManager(); doReturn(mPackageManger).when(mSettingsActivity).getPackageManager();
doReturn(mAm).when(mSettingsActivity).getSystemService(Context.ACTIVITY_SERVICE); doReturn(mAm).when(mSettingsActivity).getSystemService(Context.ACTIVITY_SERVICE);
doReturn(mOverlayManager).when(mSettingsActivity). doReturn(mOverlayManager).when(mSettingsActivity).
getSystemService(OverlayManager.class); getSystemService(OverlayManager.class);
doReturn(mAppEntry).when(mState).getEntry(anyString(), anyInt()); 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); when(mSettingsActivity.getResources().getString(anyInt())).thenReturn(RESOURCE_STRING);
mController = spy(new AppButtonsPreferenceController(mSettingsActivity, mFragment, mController = spy(new AppButtonsPreferenceController(mSettingsActivity, mFragment,
@@ -161,6 +165,21 @@ public class AppButtonsPreferenceControllerTest {
ShadowAppUtils.reset(); ShadowAppUtils.reset();
} }
@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 @Test
public void retrieveAppEntry_hasAppEntry_notNull() public void retrieveAppEntry_hasAppEntry_notNull()
throws PackageManager.NameNotFoundException { throws PackageManager.NameNotFoundException {
@@ -306,10 +325,10 @@ public class AppButtonsPreferenceControllerTest {
@Test @Test
public void updateUninstallButton_isNonSystemRro_setButtonDisable() public void updateUninstallButton_isNonSystemRro_setButtonDisable()
throws RemoteException { throws RemoteException {
when(mAppInfo.isResourceOverlay()).thenReturn(true); when(mAppInfo.isResourceOverlay()).thenReturn(true);
when(mOverlayManager.getOverlayInfo(anyString(), any())) when(mOverlayManager.getOverlayInfo(anyString(), any()))
.thenReturn(OVERLAY_ENABLED); .thenReturn(OVERLAY_ENABLED);
mController.updateUninstallButton(); mController.updateUninstallButton();
@@ -318,10 +337,10 @@ public class AppButtonsPreferenceControllerTest {
@Test @Test
public void updateUninstallButton_isNonSystemRro_setButtonEnable() public void updateUninstallButton_isNonSystemRro_setButtonEnable()
throws RemoteException { throws RemoteException {
when(mAppInfo.isResourceOverlay()).thenReturn(true); when(mAppInfo.isResourceOverlay()).thenReturn(true);
when(mOverlayManager.getOverlayInfo(anyString(), any())) when(mOverlayManager.getOverlayInfo(anyString(), any()))
.thenReturn(OVERLAY_DISABLED); .thenReturn(OVERLAY_DISABLED);
mController.updateUninstallButton(); mController.updateUninstallButton();
@@ -423,7 +442,7 @@ public class AppButtonsPreferenceControllerTest {
@Test @Test
public void onPackageListChanged_available_shouldRefreshUi() { public void onPackageListChanged_available_shouldRefreshUi() {
doReturn(AppButtonsPreferenceController.AVAILABLE) doReturn(AppButtonsPreferenceController.AVAILABLE)
.when(mController).getAvailabilityStatus(); .when(mController).getAvailabilityStatus();
doReturn(true).when(mController).refreshUi(); doReturn(true).when(mController).refreshUi();
mController.onPackageListChanged(); mController.onPackageListChanged();
@@ -434,7 +453,7 @@ public class AppButtonsPreferenceControllerTest {
@Test @Test
public void onPackageListChanged_notAvailable_shouldNotRefreshUiAndNoCrash() { public void onPackageListChanged_notAvailable_shouldNotRefreshUiAndNoCrash() {
doReturn(AppButtonsPreferenceController.DISABLED_FOR_USER) doReturn(AppButtonsPreferenceController.DISABLED_FOR_USER)
.when(mController).getAvailabilityStatus(); .when(mController).getAvailabilityStatus();
mController.onPackageListChanged(); mController.onPackageListChanged();