package com.simplecity.amp_library.utils;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.util.Log;
import com.simplecity.amp_library.ShuttleApplication;
import java.util.List;
public class CustomMediaScanner implements MediaScannerConnection.MediaScannerConnectionClient {
private static final String TAG = "CustomMediaScanner";
public interface ScanCompletionListener {
void onPathScanned(String path);
void onScanCompleted();
}
private final List<String> paths;
@Nullable private final ScanCompletionListener scanCompletionListener;
private MediaScannerConnection connection;
private int nextPath;
private Handler handler;
private CustomMediaScanner(List<String> paths, @Nullable ScanCompletionListener listener) {
this.paths = paths;
scanCompletionListener = listener;
handler = new Handler(ShuttleApplication.getInstance().getMainLooper());
}
public static void scanFiles(List<String> paths, @Nullable ScanCompletionListener listener) {
CustomMediaScanner client = new CustomMediaScanner(paths, listener);
MediaScannerConnection connection = new MediaScannerConnection(ShuttleApplication.getInstance(), client);
client.connection = connection;
connection.connect();
}
@Override
public void onMediaScannerConnected() {
scanNextPath();
}
@Override
public void onScanCompleted(String path, Uri uri) {
Log.d(TAG, "Scan complete. Path: " + path);
scanNextPath();
}
private void scanNextPath() {
if (nextPath >= paths.size()) {
scanComplete();
return;
}
String path = paths.get(nextPath);
connection.scanFile(path, null);
nextPath++;
if (scanCompletionListener != null) {
if (handler != null) {
handler.post(() -> scanCompletionListener.onPathScanned(path));
}
}
Log.d(TAG, "Scanning file: " + path);
}
private void scanComplete() {
connection.disconnect();
//Notify all media uris of change. This will in turn update any content observers.
ShuttleApplication.getInstance().getContentResolver().notifyChange(Uri.parse("content://media"), null);
if (handler != null) {
handler.post(() -> {
if (scanCompletionListener != null) {
scanCompletionListener.onScanCompleted();
}
cleanup();
});
}
}
private void cleanup() {
if (handler != null) {
handler.removeCallbacksAndMessages(null);
handler = null;
}
}
}