Fix cached app icon being used in app list.

- change to use the icon from IconDrawableFactory instead of from app
info when building the application list.

Fixes: 63978676
Test: manual, reinstall an app with updated icon and launch
settings->Apps & notifications->See all apps and check the app icon.

Change-Id: I99028ef97fb4fec8c90708b26caaddb7325c1ddb
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index de4558e..a64f461 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -54,6 +54,7 @@
 import android.preference.PreferenceFrameLayout;
 import android.text.TextUtils;
 import android.util.ArraySet;
+import android.util.IconDrawableFactory;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -862,6 +863,7 @@
         private final Context mContext;
         private final AppStateBaseBridge mExtraInfoBridge;
         private final LoadingViewController mLoadingViewController;
+        private final IconDrawableFactory mIconDrawableFactory;
 
         private AppFilterItem mAppFilter;
         private ArrayList<ApplicationsState.AppEntry> mEntries;
@@ -894,6 +896,7 @@
                     mManageApplications.mListContainer
             );
             mContext = manageApplications.getActivity();
+            mIconDrawableFactory = IconDrawableFactory.newInstance(mContext);
             mAppFilter = appFilter;
             if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) {
                 mExtraInfoBridge = new AppStateNotificationBridge(mContext, mState, this,
@@ -1318,8 +1321,7 @@
                 ApplicationsState.AppEntry entry = mEntries.get(position);
                 synchronized (entry) {
                     holder.setTitle(entry.label);
-                    mState.ensureIcon(entry);
-                    holder.setIcon(entry.icon);
+                    holder.setIcon(mIconDrawableFactory.getBadgedIcon(entry.info));
                     updateSummary(holder, entry);
                     updateSwitch(holder, entry);
                     holder.updateDisableView(entry.info);
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
index d31e3e0..cc0308c 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
@@ -37,6 +37,9 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.Looper;
 import android.os.UserManager;
@@ -74,6 +77,14 @@
     private ApplicationsState.Session mSession;
     @Mock
     private Menu mMenu;
+    @Mock
+    private FragmentActivity mActivity;
+    @Mock
+    private Resources mResources;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private PackageManager mPackageManager;
     private MenuItem mAppReset;
     private MenuItem mSortRecent;
     private MenuItem mSortFrequent;
@@ -89,7 +100,11 @@
         when(mState.newSession(any())).thenReturn(mSession);
         when(mState.getBackgroundLooper()).thenReturn(Looper.myLooper());
 
-        mFragment = new ManageApplications();
+        mFragment = spy(new ManageApplications());
+        when(mFragment.getActivity()).thenReturn(mActivity);
+        when(mActivity.getResources()).thenReturn(mResources);
+        when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager);
+        when(mActivity.getPackageManager()).thenReturn(mPackageManager);
     }
 
     @Test
@@ -126,10 +141,8 @@
 
     @Test
     public void onCreateView_shouldNotShowLoadingContainer() {
-        final ManageApplications fragment = spy(new ManageApplications());
-        ReflectionHelpers.setField(fragment, "mResetAppsHelper",
-                mock(ResetAppsHelper.class));
-        doNothing().when(fragment).createHeader();
+        ReflectionHelpers.setField(mFragment, "mResetAppsHelper", mock(ResetAppsHelper.class));
+        doNothing().when(mFragment).createHeader();
 
         final LayoutInflater layoutInflater = mock(LayoutInflater.class);
         final View view = mock(View.class);
@@ -137,19 +150,17 @@
         when(layoutInflater.inflate(anyInt(), eq(null))).thenReturn(view);
         when(view.findViewById(R.id.loading_container)).thenReturn(loadingContainer);
 
-        fragment.onCreateView(layoutInflater, mock(ViewGroup.class), null);
+        mFragment.onCreateView(layoutInflater, mock(ViewGroup.class), null);
 
         verify(loadingContainer, never()).setVisibility(View.VISIBLE);
     }
 
     @Test
     public void updateLoading_appLoaded_shouldNotDelayCallToHandleLoadingContainer() {
-        final ManageApplications fragment = mock(ManageApplications.class);
-        ReflectionHelpers.setField(fragment, "mLoadingContainer", mock(View.class));
-        ReflectionHelpers.setField(fragment, "mListContainer", mock(View.class));
-        when(fragment.getActivity()).thenReturn(mock(FragmentActivity.class));
+        ReflectionHelpers.setField(mFragment, "mLoadingContainer", mock(View.class));
+        ReflectionHelpers.setField(mFragment, "mListContainer", mock(View.class));
         final ManageApplications.ApplicationsAdapter adapter =
-                spy(new ManageApplications.ApplicationsAdapter(mState, fragment,
+                spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
                         AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle()));
         final LoadingViewController loadingViewController =
                 mock(LoadingViewController.class);
@@ -168,12 +179,10 @@
 
     @Test
     public void updateLoading_appNotLoaded_shouldDelayCallToHandleLoadingContainer() {
-        final ManageApplications fragment = mock(ManageApplications.class);
-        ReflectionHelpers.setField(fragment, "mLoadingContainer", mock(View.class));
-        ReflectionHelpers.setField(fragment, "mListContainer", mock(View.class));
-        when(fragment.getActivity()).thenReturn(mock(FragmentActivity.class));
+        ReflectionHelpers.setField(mFragment, "mLoadingContainer", mock(View.class));
+        ReflectionHelpers.setField(mFragment, "mListContainer", mock(View.class));
         final ManageApplications.ApplicationsAdapter adapter =
-                spy(new ManageApplications.ApplicationsAdapter(mState, fragment,
+                spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
                         AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle()));
         final LoadingViewController loadingViewController =
                 mock(LoadingViewController.class);
@@ -200,21 +209,19 @@
     @Test
     public void onRebuildComplete_shouldHideLoadingView() {
         final Context context = RuntimeEnvironment.application;
-        final ManageApplications fragment = mock(ManageApplications.class);
         final RecyclerView recyclerView = mock(RecyclerView.class);
         final View emptyView = mock(View.class);
-        ReflectionHelpers.setField(fragment, "mRecyclerView", recyclerView);
-        ReflectionHelpers.setField(fragment, "mEmptyView", emptyView);
+        ReflectionHelpers.setField(mFragment, "mRecyclerView", recyclerView);
+        ReflectionHelpers.setField(mFragment, "mEmptyView", emptyView);
         final View loadingContainer = mock(View.class);
         when(loadingContainer.getContext()).thenReturn(context);
         final View listContainer = mock(View.class);
         when(listContainer.getVisibility()).thenReturn(View.INVISIBLE);
         when(listContainer.getContext()).thenReturn(context);
-        ReflectionHelpers.setField(fragment, "mLoadingContainer", loadingContainer);
-        ReflectionHelpers.setField(fragment, "mListContainer", listContainer);
-        when(fragment.getActivity()).thenReturn(mock(FragmentActivity.class));
+        ReflectionHelpers.setField(mFragment, "mLoadingContainer", loadingContainer);
+        ReflectionHelpers.setField(mFragment, "mListContainer", listContainer);
         final ManageApplications.ApplicationsAdapter adapter =
-                spy(new ManageApplications.ApplicationsAdapter(mState, fragment,
+                spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
                         AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle()));
         final LoadingViewController loadingViewController =
                 mock(LoadingViewController.class);
@@ -231,6 +238,8 @@
         final ArrayList<ApplicationsState.AppEntry> appList = new ArrayList<>();
         appList.add(mock(ApplicationsState.AppEntry.class));
         when(mSession.getAllApps()).thenReturn(appList);
+        ReflectionHelpers.setField(
+                mFragment, "mFilterAdapter", mock(ManageApplications.FilterSpinnerAdapter.class));
 
         adapter.onRebuildComplete(null);
 
@@ -241,8 +250,7 @@
     public void notifyItemChange_recyclerViewIdle_shouldNotify() {
         final RecyclerView recyclerView = mock(RecyclerView.class);
         final ManageApplications.ApplicationsAdapter adapter =
-                spy(new ManageApplications.ApplicationsAdapter(mState,
-                        mock(ManageApplications.class),
+                spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
                         AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle()));
 
         adapter.onAttachedToRecyclerView(recyclerView);
@@ -256,8 +264,7 @@
     public void notifyItemChange_recyclerViewScrolling_shouldNotifyWhenIdle() {
         final RecyclerView recyclerView = mock(RecyclerView.class);
         final ManageApplications.ApplicationsAdapter adapter =
-                spy(new ManageApplications.ApplicationsAdapter(mState,
-                        mock(ManageApplications.class),
+                spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
                         AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle()));
 
         adapter.onAttachedToRecyclerView(recyclerView);
@@ -273,20 +280,19 @@
 
     @Test
     public void applicationsAdapter_onBindViewHolder_updateSwitch_notifications() {
-        ManageApplications manageApplications = mock(ManageApplications.class);
-        when(manageApplications.getActivity()).thenReturn(mock(FragmentActivity.class));
-        UserManager um = mock(UserManager.class);
-        when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
-        ReflectionHelpers.setField(manageApplications, "mUserManager", um);
-        manageApplications.mListType = LIST_TYPE_NOTIFICATION;
+        when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
+        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
+        mFragment.mListType = LIST_TYPE_NOTIFICATION;
         ApplicationViewHolder holder = mock(ApplicationViewHolder.class);
         ReflectionHelpers.setField(holder, "itemView", mock(View.class));
         ManageApplications.ApplicationsAdapter adapter =
                 new ManageApplications.ApplicationsAdapter(mState,
-                        manageApplications, mock(AppFilterItem.class),
+                    mFragment, mock(AppFilterItem.class),
                         mock(Bundle.class));
         final ArrayList<ApplicationsState.AppEntry> appList = new ArrayList<>();
-        appList.add(mock(ApplicationsState.AppEntry.class));
+        final ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
+        appEntry.info = mock(ApplicationInfo.class);
+        appList.add(appEntry);
         ReflectionHelpers.setField(adapter, "mEntries", appList);
 
         adapter.onBindViewHolder(holder, 0);
@@ -295,19 +301,17 @@
 
     @Test
     public void applicationsAdapter_onBindViewHolder_updateSwitch_notNotifications() {
-        ManageApplications manageApplications = mock(ManageApplications.class);
-        manageApplications.mListType = LIST_TYPE_MAIN;
+        mFragment.mListType = LIST_TYPE_MAIN;
         ApplicationViewHolder holder = mock(ApplicationViewHolder.class);
         ReflectionHelpers.setField(holder, "itemView", mock(View.class));
-        UserManager um = mock(UserManager.class);
-        when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
-        ReflectionHelpers.setField(manageApplications, "mUserManager", um);
-        ManageApplications.ApplicationsAdapter adapter =
-                new ManageApplications.ApplicationsAdapter(mState,
-                        manageApplications, mock(AppFilterItem.class),
-                        mock(Bundle.class));
+        when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
+        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
+        ManageApplications.ApplicationsAdapter adapter = new ManageApplications.ApplicationsAdapter(
+                mState, mFragment, mock(AppFilterItem.class), mock(Bundle.class));
         final ArrayList<ApplicationsState.AppEntry> appList = new ArrayList<>();
-        appList.add(mock(ApplicationsState.AppEntry.class));
+        final ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
+        appEntry.info = mock(ApplicationInfo.class);
+        appList.add(appEntry);
         ReflectionHelpers.setField(adapter, "mEntries", appList);
 
         adapter.onBindViewHolder(holder, 0);
@@ -316,23 +320,18 @@
 
     @Test
     public void sortOrderSavedOnRebuild() {
-        ManageApplications manageApplications = mock(ManageApplications.class);
-        when(manageApplications.getActivity()).thenReturn(mock(FragmentActivity.class));
-        UserManager um = mock(UserManager.class);
-        when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
-        ReflectionHelpers.setField(manageApplications, "mUserManager", um);
-        manageApplications.mListType = LIST_TYPE_NOTIFICATION;
-        manageApplications.mSortOrder = -1;
-        ManageApplications.ApplicationsAdapter adapter =
-                new ManageApplications.ApplicationsAdapter(mState,
-                        manageApplications, mock(AppFilterItem.class),
-                        mock(Bundle.class));
+        when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
+        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
+        mFragment.mListType = LIST_TYPE_NOTIFICATION;
+        mFragment.mSortOrder = -1;
+        ManageApplications.ApplicationsAdapter adapter = new ManageApplications.ApplicationsAdapter(
+                mState, mFragment, mock(AppFilterItem.class), mock(Bundle.class));
 
         adapter.rebuild(mSortRecent.getItemId());
-        assertThat(manageApplications.mSortOrder).isEqualTo(mSortRecent.getItemId());
+        assertThat(mFragment.mSortOrder).isEqualTo(mSortRecent.getItemId());
 
         adapter.rebuild(mSortFrequent.getItemId());
-        assertThat(manageApplications.mSortOrder).isEqualTo(mSortFrequent.getItemId());
+        assertThat(mFragment.mSortOrder).isEqualTo(mSortFrequent.getItemId());
     }
 
     private void setUpOptionMenus() {