From 295336f6e8d490a892464d5b4d99a622bcf8f9e2 Mon Sep 17 00:00:00 2001 From: Winson Date: Mon, 6 May 2019 17:01:55 -0700 Subject: [PATCH] Call MediaStore#scanFile directly in RingtoneManager Reproduced the failing case, even without thread pool changes. Since RingtoneManager was blocking on the call anyways, changing it to use the synchronous scanFile method directly should be fine. Bug: 131882699 Test: manual add MP3 with RingtonePickerActivity Change-Id: I53b49ed17403cda93ecfefb6985133b161a96983 --- media/java/android/media/RingtoneManager.java | 56 +------------------ 1 file changed, 1 insertion(+), 55 deletions(-) diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java index 77f756baa1f28..68c0a22b30c7f 100644 --- a/media/java/android/media/RingtoneManager.java +++ b/media/java/android/media/RingtoneManager.java @@ -33,7 +33,6 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; import android.content.res.AssetFileDescriptor; import android.database.Cursor; -import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.net.Uri; import android.os.Environment; import android.os.FileUtils; @@ -50,7 +49,6 @@ import android.util.Log; import com.android.internal.database.SortCursor; -import java.io.Closeable; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -59,7 +57,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; /** * RingtoneManager provides access to ringtones, notification, and other types @@ -927,11 +924,7 @@ public class RingtoneManager { } // Tell MediaScanner about the new file. Wait for it to assign a {@link Uri}. - try (NewRingtoneScanner scanner = new NewRingtoneScanner(outFile)) { - return scanner.take(); - } catch (InterruptedException e) { - throw new IOException("Audio file failed to scan as a ringtone", e); - } + return MediaStore.scanFile(mContext, outFile); } private static final String getExternalDirectoryForType(final int type) { @@ -1108,53 +1101,6 @@ public class RingtoneManager { return AudioManager.hasHapticChannels(ringtoneUri); } - /** - * Creates a {@link android.media.MediaScannerConnection} to scan a ringtone file and add its - * information to the internal database. - * - * It uses a {@link java.util.concurrent.LinkedBlockingQueue} so that the caller can block until - * the scan is completed. - */ - private class NewRingtoneScanner implements Closeable, MediaScannerConnectionClient { - private MediaScannerConnection mMediaScannerConnection; - private File mFile; - private LinkedBlockingQueue mQueue = new LinkedBlockingQueue<>(1); - - public NewRingtoneScanner(File file) { - mFile = file; - mMediaScannerConnection = new MediaScannerConnection(mContext, this); - mMediaScannerConnection.connect(); - } - - @Override - public void close() { - mMediaScannerConnection.disconnect(); - } - - @Override - public void onMediaScannerConnected() { - mMediaScannerConnection.scanFile(mFile.getAbsolutePath(), null); - } - - @Override - public void onScanCompleted(String path, Uri uri) { - if (uri == null) { - // There was some issue with scanning. Delete the copied file so it is not oprhaned. - mFile.delete(); - return; - } - try { - mQueue.put(uri); - } catch (InterruptedException e) { - Log.e(TAG, "Unable to put new ringtone Uri in queue", e); - } - } - - public Uri take() throws InterruptedException { - return mQueue.take(); - } - } - /** * Attempts to create a context for the given user. *