Merge "Stop using AppState for app icon in DomainAppPreference."

This commit is contained in:
TreeHugger Robot
2018-05-30 20:31:54 +00:00
committed by Android (Google) Code Review
3 changed files with 34 additions and 39 deletions

View File

@@ -20,52 +20,35 @@ import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.IconDrawableFactory;
import android.view.View; import android.view.View;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.widget.AppPreference; import com.android.settings.widget.AppPreference;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.AppEntry;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceViewHolder; import androidx.preference.PreferenceViewHolder;
@VisibleForTesting
public class DomainAppPreference extends AppPreference { public class DomainAppPreference extends AppPreference {
private final AppEntry mEntry; private final AppEntry mEntry;
private final PackageManager mPm; 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) { AppEntry entry) {
super(context); super(context);
mApplicationsState = applicationsState; mIconDrawableFactory = iconFactory;
mPm = context.getPackageManager(); mPm = context.getPackageManager();
mEntry = entry; mEntry = entry;
mEntry.ensureLabel(getContext()); mEntry.ensureLabel(getContext());
setState(); setState();
if (mEntry.icon != null) {
setIcon(mEntry.icon);
}
} }
@Override @Override
public void onBindViewHolder(PreferenceViewHolder holder) { 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); super.onBindViewHolder(holder);
holder.itemView.findViewById(R.id.appendix).setVisibility(View.GONE); holder.itemView.findViewById(R.id.appendix).setVisibility(View.GONE);
} }
@@ -81,6 +64,7 @@ public class DomainAppPreference extends AppPreference {
private void setState() { private void setState() {
setTitle(mEntry.label); setTitle(mEntry.label);
setIcon(mIconDrawableFactory.getBadgedIcon(mEntry.info));
setSummary(getDomainsSummary(mEntry.info.packageName)); setSummary(getDomainsSummary(mEntry.info.packageName));
} }

View File

@@ -20,6 +20,7 @@ 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 com.android.settings.R; import com.android.settings.R;
import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppInfoBase;
@@ -154,12 +155,14 @@ public class DomainAppPreferenceController extends BasePreferenceController impl
private void rebuildAppList(PreferenceGroup group, ArrayList<AppEntry> apps) { private void rebuildAppList(PreferenceGroup group, ArrayList<AppEntry> apps) {
cacheAllPrefs(group); cacheAllPrefs(group);
final int size = apps.size(); final int size = apps.size();
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++) {
AppEntry entry = apps.get(i); final AppEntry entry = apps.get(i);
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(group.getContext(), mApplicationsState, entry); preference = new DomainAppPreference(context, iconDrawableFactory, entry);
preference.setKey(key); preference.setKey(key);
group.addPreference(preference); group.addPreference(preference);
} else { } else {

View File

@@ -23,7 +23,7 @@ import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.graphics.drawable.Drawable; import android.util.IconDrawableFactory;
import android.view.View; import android.view.View;
import android.widget.ProgressBar; import android.widget.ProgressBar;
@@ -34,40 +34,39 @@ import com.android.settingslib.applications.ApplicationsState;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import java.util.UUID;
import androidx.preference.PreferenceViewHolder; import androidx.preference.PreferenceViewHolder;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
public class DomainAppPreferenceControllerTest { public class DomainAppPreferenceControllerTest {
@Mock
private ApplicationsState.AppEntry mAppEntry; private ApplicationsState.AppEntry mAppEntry;
private Context mContext; private Context mContext;
private IconDrawableFactory mIconDrawableFactory;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
mIconDrawableFactory = IconDrawableFactory.newInstance(mContext);
mAppEntry = new ApplicationsState.AppEntry(
mContext, createApplicationInfo(mContext.getPackageName()), 0);
} }
@Test @Test
public void domainAppPreferenceShouldUseAppPreferenceLayout() { public void getLayoutResource_shouldUseAppPreferenceLayout() {
mAppEntry.info = new ApplicationInfo(); final DomainAppPreference pref = new DomainAppPreference(
mAppEntry.info.packageName = "com.android.settings.test"; mContext, mIconDrawableFactory, mAppEntry);
final DomainAppPreference pref = new DomainAppPreference(mContext, null, mAppEntry);
assertThat(pref.getLayoutResource()).isEqualTo(R.layout.preference_app); assertThat(pref.getLayoutResource()).isEqualTo(R.layout.preference_app);
} }
@Test @Test
public void onBindViewHolder_shouldSetAppendixViewToGone() { public void onBindViewHolder_shouldSetAppendixViewToGone() {
mAppEntry.info = new ApplicationInfo(); final DomainAppPreference pref = new DomainAppPreference(
mAppEntry.info.packageName = "com.android.settings.test"; mContext, mIconDrawableFactory, mAppEntry);
mAppEntry.icon = mock(Drawable.class);
final DomainAppPreference pref = new DomainAppPreference(mContext, null, mAppEntry);
final View holderView = mock(View.class); final View holderView = mock(View.class);
final View appendixView = mock(View.class); final View appendixView = mock(View.class);
when(holderView.findViewById(R.id.summary_container)).thenReturn(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); 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;
}
} }