Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88228c33 authored by Raff Tsai's avatar Raff Tsai
Browse files

Fix Settings crash when click uninstall button

When mPackageName is null, mFinish is true. OnResume() doesn't
invoke refreshUI(). It causes uninstall button is still enabled.
The solution is hiding AppButtonsPreference when mFinish is true.

Fixes: 138524326
Test: make RunSettingsRoboTests ROBOTEST_FILTER
Change-Id: I9759e53f002afbd4c88d8d536df3bf01c343135e
parent cd87fa6a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -161,7 +161,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
    @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 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp

    @Override
    public void onResume() {
        if (isAvailable() && !mFinishing) {
        if (isAvailable()) {
            mAppsControlDisallowedBySystem = RestrictedLockUtilsInternal.hasBaseUserRestriction(
                    mActivity, UserManager.DISALLOW_APPS_CONTROL, mUserId);
            mAppsControlDisallowedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
+32 −13
Original line number Diff line number Diff line
@@ -21,8 +21,8 @@ import static com.android.settings.applications.appinfo.AppButtonsPreferenceCont
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.admin.DevicePolicyManager;
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.os.UserManager;
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.applications.instantapps.InstantAppDataProvider;
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.Mock;
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 @@ public class AppButtonsPreferenceControllerTest {
    @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,6 +130,7 @@ public class AppButtonsPreferenceControllerTest {
        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();
@@ -134,7 +138,7 @@ public class AppButtonsPreferenceControllerTest {
        doReturn(mOverlayManager).when(mSettingsActivity).
                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,
@@ -163,6 +167,21 @@ public class AppButtonsPreferenceControllerTest {
        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
    public void retrieveAppEntry_hasAppEntry_notNull()
            throws PackageManager.NameNotFoundException {