Merge "Fix a race condition where the extra view may not update timely."
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 22f1627..19f1022 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -329,7 +329,8 @@
                 mApplications.setExtraViewController(new MusicViewHolderController(
                         context,
                         new StorageStatsSource(context),
-                        mVolumeUuid));
+                        mVolumeUuid,
+                        UserHandle.of(UserHandle.getUserId(mCurrentUid))));
             }
             mListView.setAdapter(mApplications);
             mListView.setRecyclerListener(mApplications);
@@ -870,6 +871,12 @@
 
         public void setExtraViewController(FileViewHolderController extraViewController) {
             mExtraViewController = extraViewController;
+            mBgHandler.post(() -> {
+                mExtraViewController.queryStats();
+                mFgHandler.post(() -> {
+                    onExtraViewCompleted();
+                });
+            });
         }
 
         public void resume(int sort) {
@@ -957,10 +964,6 @@
                     break;
             }
 
-            if (mExtraViewController != null) {
-                mExtraViewController.queryStats();
-            }
-
             filterObj = new CompoundFilter(filterObj, ApplicationsState.FILTER_NOT_HIDE);
             AppFilter finalFilterObj = filterObj;
             mBgHandler.post(() -> {
@@ -1178,6 +1181,23 @@
             }
         }
 
+        public void onExtraViewCompleted() {
+            int size = mActive.size();
+            // If we have no elements, don't do anything.
+            if (size < 1) {
+                return;
+            }
+            AppViewHolder holder = (AppViewHolder) mActive.get(size - 1).getTag();
+
+            // HACK: The extra view has no AppEntry -- and should be the only element without one.
+            // Thus, if the last active element has no AppEntry, it is the extra view.
+            if (holder == null || holder.entry != null) {
+                return;
+            }
+
+            mExtraViewController.setupView(holder);
+        }
+
         public int getCount() {
             if (mEntries == null) {
                 return 0;
diff --git a/src/com/android/settings/applications/MusicViewHolderController.java b/src/com/android/settings/applications/MusicViewHolderController.java
index 18c87db..fd7e320 100644
--- a/src/com/android/settings/applications/MusicViewHolderController.java
+++ b/src/com/android/settings/applications/MusicViewHolderController.java
@@ -38,18 +38,20 @@
     private StorageStatsSource mSource;
     private String mVolumeUuid;
     private long mMusicSize;
+    private UserHandle mUser;
 
     public MusicViewHolderController(
-            Context context, StorageStatsSource source, String volumeUuid) {
+            Context context, StorageStatsSource source, String volumeUuid, UserHandle user) {
         mContext = context;
         mSource = source;
         mVolumeUuid = volumeUuid;
+        mUser = user;
     }
 
     @Override
     @WorkerThread
     public void queryStats() {
-        mMusicSize = mSource.getExternalStorageStats(mVolumeUuid, UserHandle.CURRENT).audioBytes;
+        mMusicSize = mSource.getExternalStorageStats(mVolumeUuid, mUser).audioBytes;
     }
 
     @Override
@@ -69,7 +71,7 @@
         Intent intent = new Intent(DocumentsContract.ACTION_BROWSE);
         intent.setData(DocumentsContract.buildRootUri(AUTHORITY_MEDIA, "audio_root"));
         intent.addCategory(Intent.CATEGORY_DEFAULT);
-        intent.putExtra(Intent.EXTRA_USER_ID, UserHandle.CURRENT);
+        intent.putExtra(Intent.EXTRA_USER_ID, mUser);
         Utils.launchIntent(fragment, intent);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java b/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java
index 2a2de66..4af0707 100644
--- a/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java
@@ -66,7 +66,8 @@
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
         mVolume = new VolumeInfo("id", 0, null, "id");
-        mController = new MusicViewHolderController(mContext, mSource, mVolume.fsUuid);
+        mController = new MusicViewHolderController(mContext, mSource, mVolume.fsUuid,
+                new UserHandle(0));
 
         LayoutInflater inflater = LayoutInflater.from(mContext);
         mHolder = AppViewHolder.createOrRecycle(inflater, null);