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

Commit 179f5371 authored by Fan Zhang's avatar Fan Zhang
Browse files

Stop using AppState for app icon in DomainAppPreference.

Change-Id: I080ed9d2d7d70c092bec54ed4e4b6bb2b6c8f453
Fixes: 77967533
Test: robotest
parent 74ba1a51
Loading
Loading
Loading
Loading
+7 −23
Original line number Diff line number Diff line
@@ -20,52 +20,35 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserHandle;
import android.util.ArraySet;
import android.util.IconDrawableFactory;
import android.view.View;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.widget.AppPreference;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry;

import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceViewHolder;

@VisibleForTesting
public class DomainAppPreference extends AppPreference {

    private final AppEntry mEntry;
    private final PackageManager mPm;
    private final ApplicationsState mApplicationsState;
    private final IconDrawableFactory mIconDrawableFactory;

    public DomainAppPreference(final Context context, ApplicationsState applicationsState,
    public DomainAppPreference(final Context context, IconDrawableFactory iconFactory,
            AppEntry entry) {
        super(context);
        mApplicationsState = applicationsState;
        mIconDrawableFactory = iconFactory;
        mPm = context.getPackageManager();
        mEntry = entry;
        mEntry.ensureLabel(getContext());

        setState();
        if (mEntry.icon != null) {
            setIcon(mEntry.icon);
        }
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        if (mEntry.icon == null) {
            holder.itemView.post(new Runnable() {
                @Override
                public void run() {
                    // Ensure we have an icon before binding.
                    if (mApplicationsState != null) {
                        mApplicationsState.ensureIcon(mEntry);
                    }
                    // This might trigger us to bind again, but it gives an easy way to only
                    // load the icon once its needed, so its probably worth it.
                    setIcon(mEntry.icon);
                }
            });
        }
        super.onBindViewHolder(holder);
        holder.itemView.findViewById(R.id.appendix).setVisibility(View.GONE);
    }
@@ -81,6 +64,7 @@ public class DomainAppPreference extends AppPreference {

    private void setState() {
        setTitle(mEntry.label);
        setIcon(mIconDrawableFactory.getBadgedIcon(mEntry.info));
        setSummary(getDomainsSummary(mEntry.info.packageName));
    }

+6 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.app.Application;
import android.content.Context;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.IconDrawableFactory;

import com.android.settings.R;
import com.android.settings.applications.AppInfoBase;
@@ -154,12 +155,14 @@ public class DomainAppPreferenceController extends BasePreferenceController impl
    private void rebuildAppList(PreferenceGroup group, ArrayList<AppEntry> apps) {
        cacheAllPrefs(group);
        final int size = apps.size();
        final Context context = group.getContext();
        final IconDrawableFactory iconDrawableFactory = IconDrawableFactory.newInstance(context);
        for (int i = 0; i < size; i++) {
            AppEntry entry = apps.get(i);
            String key = entry.info.packageName + "|" + entry.info.uid;
            final AppEntry entry = apps.get(i);
            final String key = entry.info.packageName + "|" + entry.info.uid;
            DomainAppPreference preference = (DomainAppPreference) getCachedPreference(key);
            if (preference == null) {
                preference = new DomainAppPreference(group.getContext(), mApplicationsState, entry);
                preference = new DomainAppPreference(context, iconDrawableFactory, entry);
                preference.setKey(key);
                group.addPreference(preference);
            } else {
+21 −13
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import static org.mockito.Mockito.when;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.graphics.drawable.Drawable;
import android.util.IconDrawableFactory;
import android.view.View;
import android.widget.ProgressBar;

@@ -34,40 +34,39 @@ import com.android.settingslib.applications.ApplicationsState;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;

import java.util.UUID;

import androidx.preference.PreferenceViewHolder;

@RunWith(SettingsRobolectricTestRunner.class)
public class DomainAppPreferenceControllerTest {

    @Mock
    private ApplicationsState.AppEntry mAppEntry;
    private Context mContext;
    private IconDrawableFactory mIconDrawableFactory;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = RuntimeEnvironment.application;
        mIconDrawableFactory = IconDrawableFactory.newInstance(mContext);
        mAppEntry = new ApplicationsState.AppEntry(
                mContext, createApplicationInfo(mContext.getPackageName()), 0);
    }

    @Test
    public void domainAppPreferenceShouldUseAppPreferenceLayout() {
        mAppEntry.info = new ApplicationInfo();
        mAppEntry.info.packageName = "com.android.settings.test";
        final DomainAppPreference pref = new DomainAppPreference(mContext, null, mAppEntry);
    public void getLayoutResource_shouldUseAppPreferenceLayout() {
        final DomainAppPreference pref = new DomainAppPreference(
                mContext, mIconDrawableFactory, mAppEntry);

        assertThat(pref.getLayoutResource()).isEqualTo(R.layout.preference_app);
    }

    @Test
    public void onBindViewHolder_shouldSetAppendixViewToGone() {
        mAppEntry.info = new ApplicationInfo();
        mAppEntry.info.packageName = "com.android.settings.test";
        mAppEntry.icon = mock(Drawable.class);
        final DomainAppPreference pref = new DomainAppPreference(mContext, null, mAppEntry);
        final DomainAppPreference pref = new DomainAppPreference(
                mContext, mIconDrawableFactory, mAppEntry);
        final View holderView = mock(View.class);
        final View appendixView = mock(View.class);
        when(holderView.findViewById(R.id.summary_container)).thenReturn(mock(View.class));
@@ -78,4 +77,13 @@ public class DomainAppPreferenceControllerTest {

        verify(appendixView).setVisibility(View.GONE);
    }

    private ApplicationInfo createApplicationInfo(String packageName) {
        ApplicationInfo appInfo = new ApplicationInfo();
        appInfo.sourceDir = "foo";
        appInfo.flags |= ApplicationInfo.FLAG_INSTALLED;
        appInfo.storageUuid = UUID.randomUUID();
        appInfo.packageName = packageName;
        return appInfo;
    }
}