Merge "Stop using AppState for app icon in DomainAppPreference."
This commit is contained in:
committed by
Android (Google) Code Review
commit
2c032fdd19
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user