Merge "Fix the flashing list on Opening link page" into tm-dev am: e99683f013

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/18087633

Change-Id: I41d3aa20a651b9609422db2f6a8cb8433450118d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2022-05-03 08:46:01 +00:00
committed by Automerger Merge Worker
4 changed files with 43 additions and 17 deletions

View File

@@ -19,27 +19,30 @@ package com.android.settings.applications.managedomainurls;
import android.content.Context; import android.content.Context;
import android.content.pm.verify.domain.DomainVerificationManager; import android.content.pm.verify.domain.DomainVerificationManager;
import android.content.pm.verify.domain.DomainVerificationUserState; import android.content.pm.verify.domain.DomainVerificationUserState;
import android.util.IconDrawableFactory; import android.graphics.drawable.Drawable;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.applications.intentpicker.IntentPickerUtils; import com.android.settings.applications.intentpicker.IntentPickerUtils;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.AppEntry;
import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.widget.AppPreference; import com.android.settingslib.widget.AppPreference;
public class DomainAppPreference extends AppPreference { public class DomainAppPreference extends AppPreference {
private Drawable mCacheIcon;
private final AppEntry mEntry; private final AppEntry mEntry;
private final DomainVerificationManager mDomainVerificationManager; private final DomainVerificationManager mDomainVerificationManager;
private final IconDrawableFactory mIconDrawableFactory;
public DomainAppPreference(final Context context, IconDrawableFactory iconFactory, public DomainAppPreference(final Context context, AppEntry entry) {
AppEntry entry) {
super(context); super(context);
mIconDrawableFactory = iconFactory;
mDomainVerificationManager = context.getSystemService(DomainVerificationManager.class); mDomainVerificationManager = context.getSystemService(DomainVerificationManager.class);
mEntry = entry; mEntry = entry;
mEntry.ensureLabel(getContext()); mEntry.ensureLabel(getContext());
mCacheIcon = AppUtils.getIconFromCache(mEntry);
setState(); setState();
} }
@@ -54,7 +57,12 @@ public class DomainAppPreference extends AppPreference {
private void setState() { private void setState() {
setTitle(mEntry.label); setTitle(mEntry.label);
setIcon(mIconDrawableFactory.getBadgedIcon(mEntry.info));
if (mCacheIcon != null) {
setIcon(mCacheIcon);
} else {
setIcon(R.drawable.empty_icon);
}
setSummary(getDomainsSummary(mEntry.info.packageName)); setSummary(getDomainsSummary(mEntry.info.packageName));
} }
@@ -69,4 +77,18 @@ public class DomainAppPreference extends AppPreference {
packageName); packageName);
return userState == null ? false : userState.isLinkHandlingAllowed(); return userState == null ? false : userState.isLinkHandlingAllowed();
} }
@Override
public void onBindViewHolder(PreferenceViewHolder view) {
if (mCacheIcon == null) {
ThreadUtils.postOnBackgroundThread(() -> {
final Drawable icon = AppUtils.getIcon(getContext(), mEntry);
ThreadUtils.postOnMainThread(() -> {
setIcon(icon);
mCacheIcon = icon;
});
});
}
super.onBindViewHolder(view);
}
} }

View File

@@ -20,7 +20,6 @@ import android.app.Application;
import android.content.Context; import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.IconDrawableFactory;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceGroup;
@@ -30,6 +29,7 @@ import com.android.settings.R;
import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppInfoBase;
import com.android.settings.applications.intentpicker.AppLaunchSettings; import com.android.settings.applications.intentpicker.AppLaunchSettings;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.AppEntry;
@@ -98,6 +98,10 @@ public class DomainAppPreferenceController extends BasePreferenceController impl
if (mContext == null) { if (mContext == null) {
return; return;
} }
// Preload top visible icons of app list.
AppUtils.preloadTopIcons(mContext, apps,
mContext.getResources().getInteger(R.integer.config_num_visible_app_icons));
rebuildAppList(mDomainAppList, apps); rebuildAppList(mDomainAppList, apps);
} }
@@ -157,13 +161,12 @@ public class DomainAppPreferenceController extends BasePreferenceController impl
cacheAllPrefs(group); cacheAllPrefs(group);
final int size = apps.size(); final int size = apps.size();
final Context context = group.getContext(); final Context context = group.getContext();
final IconDrawableFactory iconDrawableFactory = IconDrawableFactory.newInstance(context);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
final AppEntry entry = apps.get(i); final AppEntry entry = apps.get(i);
final String key = entry.info.packageName + "|" + entry.info.uid; final String key = entry.info.packageName + "|" + entry.info.uid;
DomainAppPreference preference = (DomainAppPreference) getCachedPreference(key); DomainAppPreference preference = (DomainAppPreference) getCachedPreference(key);
if (preference == null) { if (preference == null) {
preference = new DomainAppPreference(context, iconDrawableFactory, entry); preference = new DomainAppPreference(context, entry);
preference.setKey(key); preference.setKey(key);
group.addPreference(preference); group.addPreference(preference);
} else { } else {

View File

@@ -24,6 +24,7 @@ import android.content.Context;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.applications.AppIconCacheManager;
import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.search.SearchIndexable;
/** /**
@@ -58,4 +59,10 @@ public class ManageDomainUrls extends DashboardFragment {
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.manage_domain_url_settings); new BaseSearchIndexProvider(R.xml.manage_domain_url_settings);
@Override
public void onDestroyView() {
super.onDestroyView();
AppIconCacheManager.getInstance().release();
}
} }

View File

@@ -29,7 +29,6 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.verify.domain.DomainVerificationManager; import android.content.pm.verify.domain.DomainVerificationManager;
import android.content.pm.verify.domain.DomainVerificationUserState; import android.content.pm.verify.domain.DomainVerificationUserState;
import android.util.IconDrawableFactory;
import com.android.settings.R; import com.android.settings.R;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
@@ -49,18 +48,14 @@ public class DomainAppPreferenceControllerTest {
private ApplicationsState.AppEntry mAppEntry; private ApplicationsState.AppEntry mAppEntry;
private Context mContext; private Context mContext;
private IconDrawableFactory mIconDrawableFactory;
@Mock @Mock
private DomainVerificationManager mDomainVerificationManager; private DomainVerificationManager mDomainVerificationManager;
@Mock
private DomainVerificationUserState mDomainVerificationUserState;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
mIconDrawableFactory = IconDrawableFactory.newInstance(mContext);
mAppEntry = new ApplicationsState.AppEntry( mAppEntry = new ApplicationsState.AppEntry(
mContext, createApplicationInfo(mContext.getPackageName()), 0); mContext, createApplicationInfo(mContext.getPackageName()), 0);
when(mContext.getSystemService(DomainVerificationManager.class)).thenReturn( when(mContext.getSystemService(DomainVerificationManager.class)).thenReturn(
@@ -75,8 +70,7 @@ public class DomainAppPreferenceControllerTest {
doReturn(domainVerificationUserState).when( doReturn(domainVerificationUserState).when(
mDomainVerificationManager).getDomainVerificationUserState(anyString()); mDomainVerificationManager).getDomainVerificationUserState(anyString());
doReturn(true).when(domainVerificationUserState).isLinkHandlingAllowed(); doReturn(true).when(domainVerificationUserState).isLinkHandlingAllowed();
final DomainAppPreference pref = new DomainAppPreference( final DomainAppPreference pref = new DomainAppPreference(mContext, mAppEntry);
mContext, mIconDrawableFactory, mAppEntry);
assertThat(pref.getLayoutResource()).isEqualTo(R.layout.preference_app); assertThat(pref.getLayoutResource()).isEqualTo(R.layout.preference_app);
} }