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

Commit ccfa7fa9 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Fix potential crash in AppAllServicesPreferenceController"

parents 48c386e5 e8a0ba68
Loading
Loading
Loading
Loading
+6 −22
Original line number Diff line number Diff line
@@ -47,19 +47,10 @@ public class AppAllServicesPreferenceController extends AppInfoPreferenceControl

    private String mPackageName;

    private boolean mCanPackageHandleAllServicesIntent;
    private boolean mIsLocationProvider;


    public AppAllServicesPreferenceController(Context context,
            String preferenceKey) {
        super(context, preferenceKey);
        mPackageManager = context.getPackageManager();

        // Set to false till we can confirm that the package can handle the intent.
        mCanPackageHandleAllServicesIntent = false;
        // Set to false till we can confirm that the package is a location provider.
        mIsLocationProvider = false;
    }

    @Override
@@ -71,9 +62,8 @@ public class AppAllServicesPreferenceController extends AppInfoPreferenceControl
        }
    }

    @VisibleForTesting
    @Nullable
    CharSequence getStorageSummary() {
    private CharSequence getStorageSummary() {
        ResolveInfo resolveInfo = getResolveInfo(PackageManager.GET_META_DATA);
        if (resolveInfo == null) {
            Log.d(TAG, "mResolveInfo is null.");
@@ -96,18 +86,20 @@ public class AppAllServicesPreferenceController extends AppInfoPreferenceControl

    @Override
    public int getAvailabilityStatus() {
        if (mCanPackageHandleAllServicesIntent && mIsLocationProvider) {
        if (canPackageHandleIntent() && isLocationProvider()) {
            return AVAILABLE;
        }
        return CONDITIONALLY_UNAVAILABLE;
    }

    private boolean isLocationProvider() {
    @VisibleForTesting
    boolean isLocationProvider() {
        return Objects.requireNonNull(
                mContext.getSystemService(LocationManager.class)).isProviderPackage(mPackageName);
    }

    private boolean canPackageHandleIntent() {
    @VisibleForTesting
    boolean canPackageHandleIntent() {
        return getResolveInfo(0) != null;
    }

@@ -127,14 +119,6 @@ public class AppAllServicesPreferenceController extends AppInfoPreferenceControl
     */
    public void setPackageName(String packageName) {
        mPackageName = packageName;

        //Once we have package name. Update conditions for availability.
        updateAvailabilityConditions();
    }

    private void updateAvailabilityConditions() {
        mCanPackageHandleAllServicesIntent = canPackageHandleIntent();
        mIsLocationProvider = isLocationProvider();
    }

    private void startAllServicesActivity() {
+102 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.applications.appinfo;

import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

import android.content.Context;

import androidx.preference.Preference;
import androidx.test.core.app.ApplicationProvider;

import com.android.settings.core.BasePreferenceController;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;

@RunWith(RobolectricTestRunner.class)
public class AppAllServicesPreferenceControllerTest {

    @Mock
    private AppInfoDashboardFragment mFragment;
    @Mock
    private Preference mPreference;

    private final Context mContext = ApplicationProvider.getApplicationContext();
    private AppAllServicesPreferenceController mController;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mController = spy(new AppAllServicesPreferenceController(mContext, "test_key"));
        mController.setParentFragment(mFragment);
        mController.setPackageName("Package1");
        final String key = mController.getPreferenceKey();
        when(mPreference.getKey()).thenReturn(key);
    }

    @Test
    public void getAvailabilityStatus_shouldReturnAvailable() {
        doReturn(true).when(mController).canPackageHandleIntent();
        doReturn(true).when(mController).isLocationProvider();

        assertThat(mController.getAvailabilityStatus()).isEqualTo(
                BasePreferenceController.AVAILABLE);
    }

    @Test
    public void getAvailabilityStatus_canNotHandleIntent_shouldReturnConditionallyUnavailable() {
        doReturn(false).when(mController).canPackageHandleIntent();
        doReturn(true).when(mController).isLocationProvider();

        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
    }

    @Test
    public void getAvailabilityStatus_isNotLocationProvider_shouldReturnConditionallyUnavailable() {
        doReturn(true).when(mController).canPackageHandleIntent();
        doReturn(false).when(mController).isLocationProvider();

        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
    }

    @Test
    public void getAvailabilityStatus_shouldReturnConditionallyUnavailable() {
        doReturn(false).when(mController).canPackageHandleIntent();
        doReturn(false).when(mController).isLocationProvider();

        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
    }

    @Test
    public void canPackageHandleIntent_nullPackageInfo_shouldNotCrash() {
        mController.setPackageName(null);
        mController.canPackageHandleIntent();
        // no crash
    }

}