diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index 550ad2c..7c97208 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -5917,7 +5917,7 @@
                 // Syncing the picker while waiting for idle fixes tests with the picker db
                 // flag enabled because the picker db is in a consistent state with the external
                 // db after the sync
-                syncPicker();
+                syncAllMedia();
                 ForegroundThread.waitForIdle();
                 final CountDownLatch latch = new CountDownLatch(1);
                 BackgroundThread.getExecutor().execute(() -> {
@@ -6116,7 +6116,7 @@
                 // fall through
             }
             case MediaStore.SYNC_PROVIDERS_CALL: {
-                syncPicker();
+                syncAllMedia();
                 return new Bundle();
             }
             case MediaStore.GET_CLOUD_PROVIDER_CALL: {
@@ -6145,14 +6145,14 @@
         }
     }
 
-    private void syncPicker() {
+    private void syncAllMedia() {
         // Clear the binder calling identity so that we can sync the unexported
         // local_provider while running as MediaProvider
         final long t = Binder.clearCallingIdentity();
         try {
             // TODO(b/190713331): Remove after initial development
             Log.v(TAG, "Developer initiated provider sync");
-            mPickerSyncController.syncPicker();
+            mPickerSyncController.syncAllMedia();
         } finally {
             Binder.restoreCallingIdentity(t);
         }
diff --git a/src/com/android/providers/media/fuse/ExternalStorageServiceImpl.java b/src/com/android/providers/media/fuse/ExternalStorageServiceImpl.java
index a6781e2..95139c3 100644
--- a/src/com/android/providers/media/fuse/ExternalStorageServiceImpl.java
+++ b/src/com/android/providers/media/fuse/ExternalStorageServiceImpl.java
@@ -94,7 +94,7 @@
                 mediaProvider.attachVolume(volume, /* validate */ false);
                 MediaService.queueVolumeScan(mediaProvider.getContext(), volume, REASON_MOUNTED);
                 BackgroundThread.getExecutor().execute(() ->
-                        mediaProvider.getPickerSyncController().syncPicker());
+                        mediaProvider.getPickerSyncController().syncAllMedia());
                 break;
             case Environment.MEDIA_UNMOUNTED:
             case Environment.MEDIA_EJECTING:
diff --git a/src/com/android/providers/media/photopicker/PickerSyncController.java b/src/com/android/providers/media/photopicker/PickerSyncController.java
index 4fa6cbf..f6a6f28 100644
--- a/src/com/android/providers/media/photopicker/PickerSyncController.java
+++ b/src/com/android/providers/media/photopicker/PickerSyncController.java
@@ -127,7 +127,7 @@
     /**
      * Syncs the local and currently enabled cloud {@link CloudMediaProvider} instances
      */
-    public void syncPicker() {
+    public void syncAllMedia() {
         if (!PickerDbFacade.isPickerDbEnabled()) {
             return;
         }
@@ -266,8 +266,8 @@
      * notifications.
      */
     public void notifyMediaEvent() {
-        BackgroundThread.getHandler().removeCallbacks(this::syncPicker);
-        BackgroundThread.getHandler().postDelayed(this::syncPicker, mSyncDelayMs);
+        BackgroundThread.getHandler().removeCallbacks(this::syncAllMedia);
+        BackgroundThread.getHandler().postDelayed(this::syncAllMedia, mSyncDelayMs);
     }
 
     // TODO(b/190713331): Check extra_pages and extra_honored_args
diff --git a/tests/src/com/android/providers/media/photopicker/PickerDataLayerTest.java b/tests/src/com/android/providers/media/photopicker/PickerDataLayerTest.java
index d466a11..9b9fff1 100644
--- a/tests/src/com/android/providers/media/photopicker/PickerDataLayerTest.java
+++ b/tests/src/com/android/providers/media/photopicker/PickerDataLayerTest.java
@@ -142,7 +142,7 @@
         addMedia(mLocalMediaGenerator, LOCAL_ONLY_1);
         addMedia(mCloudPrimaryMediaGenerator, CLOUD_ONLY_1);
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchMedia(buildDefaultQueryArgs())) {
             assertThat(cr.getCount()).isEqualTo(2);
 
@@ -167,7 +167,7 @@
 
         final Bundle defaultQueryArgs = buildDefaultQueryArgs();
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchMedia(defaultQueryArgs)) {
             assertThat(cr.getCount()).isEqualTo(4);
         }
@@ -199,7 +199,7 @@
 
         final Bundle defaultQueryArgs = buildDefaultQueryArgs();
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchMedia(defaultQueryArgs)) {
             assertThat(cr.getCount()).isEqualTo(4);
         }
@@ -230,7 +230,7 @@
 
         final Bundle defaultQueryArgs = buildDefaultQueryArgs();
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchMedia(defaultQueryArgs)) {
             assertThat(cr.getCount()).isEqualTo(4);
         }
@@ -261,7 +261,7 @@
 
         final Bundle defaultQueryArgs = buildDefaultQueryArgs();
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchMedia(defaultQueryArgs)) {
             assertThat(cr.getCount()).isEqualTo(4);
         }
@@ -285,7 +285,7 @@
 
         final Bundle queryArgs = buildQueryArgs(IMAGE_MIME_TYPE, SIZE_BYTES_DEFAULT);
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchMedia(queryArgs)) {
             assertThat(cr.getCount()).isEqualTo(1);
 
@@ -305,7 +305,7 @@
 
         final Bundle queryArgs = buildQueryArgs(IMAGE_MIME_TYPE, SIZE_BYTES - 1);
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchMedia(queryArgs)) {
             assertThat(cr.getCount()).isEqualTo(1);
 
@@ -328,7 +328,7 @@
 
         final Bundle queryArgs = buildQueryArgs(VIDEO_MIME_TYPE, SIZE_BYTES - 1);
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchMedia(queryArgs)) {
             assertThat(cr.getCount()).isEqualTo(1);
 
@@ -354,7 +354,7 @@
 
         final Bundle defaultQueryArgs = buildDefaultQueryArgs();
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchAlbums(defaultQueryArgs)) {
             assertThat(cr.getCount()).isEqualTo(3);
 
@@ -419,7 +419,7 @@
 
         final Bundle mimeTypeQueryArgs = buildQueryArgs(IMAGE_MIME_TYPE, SIZE_BYTES_DEFAULT);
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchAlbums(mimeTypeQueryArgs)) {
             assertThat(cr.getCount()).isEqualTo(2);
 
@@ -466,7 +466,7 @@
 
         final Bundle sizeQueryArgs = buildQueryArgs(MIME_TYPE_DEFAULT, SIZE_BYTES - 1);
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchAlbums(sizeQueryArgs)) {
             assertThat(cr.getCount()).isEqualTo(2);
 
@@ -516,7 +516,7 @@
         final Bundle cloudAlbumAndMimeTypeQueryArgs = buildQueryArgs(ALBUM_ID_2,
                 ALBUM_COLUMN_TYPE_CLOUD, VIDEO_MIME_TYPE, SIZE_BYTES - 1);
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = mDataLayer.fetchAlbums(mimeTypeAndSizeQueryArgs)) {
             assertWithMessage("Local album count").that(cr.getCount()).isEqualTo(2);
 
diff --git a/tests/src/com/android/providers/media/photopicker/PickerSyncControllerTest.java b/tests/src/com/android/providers/media/photopicker/PickerSyncControllerTest.java
index 13fa3e7..603f568 100644
--- a/tests/src/com/android/providers/media/photopicker/PickerSyncControllerTest.java
+++ b/tests/src/com/android/providers/media/photopicker/PickerSyncControllerTest.java
@@ -28,7 +28,6 @@
 import android.os.Bundle;
 import android.os.Process;
 import android.os.SystemClock;
-import android.provider.CloudMediaProviderContract.AlbumColumns;
 import android.provider.CloudMediaProviderContract.MediaColumns;
 import android.provider.MediaStore;
 import android.util.Pair;
@@ -136,16 +135,16 @@
     }
 
     @Test
-    public void testSyncPickerLocalOnly() {
+    public void testSyncAllMediaLocalOnly() {
         // 1. Do nothing
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertEmptyCursor();
 
         // 2. Add local only media
         addMedia(mLocalMediaGenerator, LOCAL_ONLY_1);
         addMedia(mLocalMediaGenerator, LOCAL_ONLY_2);
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(2);
 
@@ -155,7 +154,7 @@
 
         // 3. Delete one local-only media
         deleteMedia(mLocalMediaGenerator, LOCAL_ONLY_1);
-        mController.syncPicker();
+        mController.syncAllMedia();
 
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(1);
@@ -165,7 +164,7 @@
 
         // 4. Reset media without version bump
         mLocalMediaGenerator.resetAll();
-        mController.syncPicker();
+        mController.syncAllMedia();
 
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(1);
@@ -175,28 +174,28 @@
 
         // 5. Bump version
         mLocalMediaGenerator.setVersion(VERSION_2);
-        mController.syncPicker();
+        mController.syncAllMedia();
 
         assertEmptyCursor();
     }
 
 
     @Test
-    public void testSyncPickerCloudOnly() {
+    public void testSyncAllMediaCloudOnly() {
         // 1. Add media before setting primary cloud provider
         addMedia(mCloudPrimaryMediaGenerator, CLOUD_ONLY_1);
         addMedia(mCloudPrimaryMediaGenerator, CLOUD_ONLY_2);
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertEmptyCursor();
 
         // 2. Set secondary cloud provider
         mController.setCloudProvider(CLOUD_SECONDARY_PROVIDER_AUTHORITY);
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertEmptyCursor();
 
         // 3. Set primary cloud provider
         mController.setCloudProvider(CLOUD_PRIMARY_PROVIDER_AUTHORITY);
-        mController.syncPicker();
+        mController.syncAllMedia();
 
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(2);
@@ -207,12 +206,12 @@
 
         // 4. Set secondary cloud provider again
         mController.setCloudProvider(CLOUD_SECONDARY_PROVIDER_AUTHORITY);
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertEmptyCursor();
 
         // 5. Set primary cloud provider once again
         mController.setCloudProvider(CLOUD_PRIMARY_PROVIDER_AUTHORITY);
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(2);
 
@@ -222,7 +221,7 @@
 
         // 6. Clear cloud provider
         mController.setCloudProvider(/* authority */ null);
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertEmptyCursor();
     }
 
@@ -231,13 +230,13 @@
         mController.setCloudProvider(CLOUD_PRIMARY_PROVIDER_AUTHORITY);
 
         // 1. Do nothing
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertEmptyCursor();
 
         // 2. Add cloud-only item
         addMedia(mCloudPrimaryMediaGenerator, CLOUD_ONLY_1);
 
-        mController.syncPicker();
+        mController.syncAllMedia();
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(1);
 
@@ -246,12 +245,12 @@
 
         // 3. Set invalid cloud version
         mCloudPrimaryMediaGenerator.setVersion(/* version */ null);
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertEmptyCursor();
 
         // 4. Set valid cloud version
         mCloudPrimaryMediaGenerator.setVersion(VERSION_1);
-        mController.syncPicker();
+        mController.syncAllMedia();
 
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(1);
@@ -261,7 +260,7 @@
     }
 
     @Test
-    public void testSyncPickerCloudAndLocal() {
+    public void testSyncAllMediaCloudAndLocal() {
         // 1. Do nothing
         assertEmptyCursor();
 
@@ -270,7 +269,7 @@
         addMedia(mCloudPrimaryMediaGenerator, CLOUD_AND_LOCAL_1);
 
         mController.setCloudProvider(CLOUD_PRIMARY_PROVIDER_AUTHORITY);
-        mController.syncPicker();
+        mController.syncAllMedia();
 
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(1);
@@ -280,7 +279,7 @@
 
         // 3. Delete local-only item
         deleteMedia(mLocalMediaGenerator, LOCAL_ONLY_1);
-        mController.syncPicker();
+        mController.syncAllMedia();
 
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(1);
@@ -290,7 +289,7 @@
 
         // 4. Re-add local-only item
         addMedia(mLocalMediaGenerator, LOCAL_ONLY_1);
-        mController.syncPicker();
+        mController.syncAllMedia();
 
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(1);
@@ -300,7 +299,7 @@
 
         // 5. Delete cloud+local item
         deleteMedia(mCloudPrimaryMediaGenerator, CLOUD_AND_LOCAL_1);
-        mController.syncPicker();
+        mController.syncAllMedia();
 
         try (Cursor cr = queryMedia()) {
             assertThat(cr.getCount()).isEqualTo(1);
@@ -310,7 +309,7 @@
 
         // 6. Delete local-only item
         deleteMedia(mLocalMediaGenerator, LOCAL_ONLY_1);
-        mController.syncPicker();
+        mController.syncAllMedia();
 
         assertEmptyCursor();
     }
@@ -330,7 +329,7 @@
         // Assert that setting cloud provider clears facade cloud provider
         // And after syncing, the latest provider is set on the facade
         assertThat(mFacade.getCloudProvider()).isNull();
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertThat(mFacade.getCloudProvider()).isEqualTo(CLOUD_PRIMARY_PROVIDER_AUTHORITY);
 
         // 3. Can clear cloud provider
@@ -340,7 +339,7 @@
         // Assert that setting cloud provider clears facade cloud provider
         // And after syncing, the latest provider is set on the facade
         assertThat(mFacade.getCloudProvider()).isNull();
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertThat(mFacade.getCloudProvider()).isNull();
 
         // 4. Can set cloud proivder
@@ -350,7 +349,7 @@
         // Assert that setting cloud provider clears facade cloud provider
         // And after syncing, the latest provider is set on the facade
         assertThat(mFacade.getCloudProvider()).isNull();
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertThat(mFacade.getCloudProvider()).isEqualTo(CLOUD_PRIMARY_PROVIDER_AUTHORITY);
 
         // Invalid cloud provider is ignored
@@ -360,7 +359,7 @@
         // Assert that unsuccessfully setting cloud provider doesn't clear facade cloud provider
         // And after syncing, nothing changes
         assertThat(mFacade.getCloudProvider()).isEqualTo(CLOUD_PRIMARY_PROVIDER_AUTHORITY);
-        mController.syncPicker();
+        mController.syncAllMedia();
         assertThat(mFacade.getCloudProvider()).isEqualTo(CLOUD_PRIMARY_PROVIDER_AUTHORITY);
     }
 
@@ -426,7 +425,7 @@
                 LOCAL_PROVIDER_AUTHORITY, /* syncDelay */ 0);
 
         addMedia(mLocalMediaGenerator, LOCAL_ONLY_1);
-        controller.syncPicker();
+        controller.syncAllMedia();
 
         try (Cursor cr = queryMedia(facade)) {
             assertThat(cr.getCount()).isEqualTo(1);
@@ -449,7 +448,7 @@
             assertThat(cr.getCount()).isEqualTo(0);
         }
 
-        controller.syncPicker();
+        controller.syncAllMedia();
 
         // Fully synced db
         try (Cursor cr = queryMedia(facade)) {
@@ -468,7 +467,7 @@
                 LOCAL_PROVIDER_AUTHORITY, SYNC_DELAY_MS);
 
         addMedia(mLocalMediaGenerator, LOCAL_ONLY_1);
-        controller.syncPicker();
+        controller.syncAllMedia();
 
         try (Cursor cr = queryMedia(facade)) {
             assertThat(cr.getCount()).isEqualTo(1);
@@ -488,7 +487,7 @@
             assertThat(cr.getCount()).isEqualTo(0);
         }
 
-        controller.syncPicker();
+        controller.syncAllMedia();
 
         // Fully synced db
         try (Cursor cr = queryMedia(facade)) {
@@ -507,7 +506,7 @@
                 LOCAL_PROVIDER_AUTHORITY, SYNC_DELAY_MS);
 
         addMedia(mLocalMediaGenerator, LOCAL_ONLY_1);
-        controller.syncPicker();
+        controller.syncAllMedia();
 
         try (Cursor cr = queryMedia(facade)) {
             assertThat(cr.getCount()).isEqualTo(1);
@@ -528,7 +527,7 @@
             assertThat(cr.getCount()).isEqualTo(0);
         }
 
-        controller.syncPicker();
+        controller.syncAllMedia();
 
         // Fully synced db
         try (Cursor cr = queryMedia(facade)) {
