Skip to content

Commit 17221be

Browse files
committed
Query MediaStore for media file URI for setting ringtone
Fixes #4367
1 parent 4948daf commit 17221be

12 files changed

Lines changed: 106 additions & 21 deletions

File tree

app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/DeleteTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ protected final AsyncTaskResult<Boolean> doInBackground(
115115

116116
// delete file from media database
117117
if (!file.isSmb() && !file.isSftp()) {
118-
MediaConnectionUtils.scanFile(
118+
MediaConnectionUtils.scanFiles(
119119
applicationContext, files.toArray(new HybridFile[files.size()]));
120120

121121
if (FileUtils.NOMEDIA_FILE.equals(file.getName()))

app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/MoveFilesTask.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ class MoveFilesTask(
107107
for (hybridFileParcelables in files) {
108108
sourcesFiles.addAll(hybridFileParcelables)
109109
}
110-
MediaConnectionUtils.scanFile(applicationContext, sourcesFiles.toTypedArray())
111-
MediaConnectionUtils.scanFile(applicationContext, targetFiles.toTypedArray())
110+
MediaConnectionUtils.scanFiles(applicationContext, sourcesFiles.toTypedArray())
111+
MediaConnectionUtils.scanFiles(applicationContext, targetFiles.toTypedArray())
112112
}
113113

114114
// updating encrypted db entry if any encrypted file was moved

app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/PreparePasteTask.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import com.afollestad.materialdialogs.DialogAction
3030
import com.afollestad.materialdialogs.MaterialDialog
3131
import com.amaze.filemanager.R
3232
import com.amaze.filemanager.asynchronous.asynctasks.fromTask
33-
import com.amaze.filemanager.asynchronous.asynctasks.movecopy.PreparePasteTask.CopyNode
3433
import com.amaze.filemanager.asynchronous.management.ServiceWatcherUtil
3534
import com.amaze.filemanager.asynchronous.services.CopyService
3635
import com.amaze.filemanager.databinding.CopyDialogBinding
@@ -142,7 +141,7 @@ class PreparePasteTask(strongRefMain: MainActivity) {
142141
filesToCopy[0].getParent(context.get()) == targetPath
143142
) {
144143
Toast.makeText(context.get(), R.string.same_dir_move_error, Toast.LENGTH_SHORT).show()
145-
MediaConnectionUtils.scanFile(context.get() as Context, filesToCopy.toTypedArray())
144+
MediaConnectionUtils.scanFiles(context.get() as Context, filesToCopy.toTypedArray())
146145
return
147146
}
148147

app/src/main/java/com/amaze/filemanager/asynchronous/services/CopyService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ void copyRoot(HybridFileParcelable sourceFile, HybridFile targetFile, boolean mo
469469
e);
470470
failedFOps.add(sourceFile);
471471
}
472-
MediaConnectionUtils.scanFile(c, new HybridFile[] {targetFile});
472+
MediaConnectionUtils.scanFiles(c, new HybridFile[] {targetFile});
473473
}
474474

475475
private void copyFiles(

app/src/main/java/com/amaze/filemanager/filesystem/HybridFile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1581,7 +1581,7 @@ public void restoreFromBin(Context context) {
15811581
if (!source.renameTo(dest)) {
15821582
return false;
15831583
}
1584-
MediaConnectionUtils.scanFile(context, new HybridFile[] {this});
1584+
MediaConnectionUtils.scanFiles(context, new HybridFile[] {this});
15851585
return true;
15861586
});
15871587
}

app/src/main/java/com/amaze/filemanager/filesystem/MediaStoreHack.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import android.provider.MediaStore;
4141
import android.util.Log;
4242

43+
import androidx.annotation.NonNull;
4344
import androidx.annotation.Nullable;
4445

4546
/**
@@ -164,6 +165,43 @@ public static OutputStream getOutputStream(Context context, String str) {
164165
}
165166
}
166167

168+
public static @Nullable Uri getUriForMusicMediaFrom(
169+
@NonNull String path, @NonNull Context context) {
170+
Uri retval = getUriForMusicMediaInternal(path, context);
171+
return retval;
172+
}
173+
174+
private static @Nullable Uri getUriForMusicMediaInternal(
175+
@NonNull String path, @NonNull Context context) {
176+
String[] projection = {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA};
177+
178+
String selection = MediaStore.Audio.Media.DATA + "=?";
179+
String[] selectionArgs = new String[] {path};
180+
181+
try (Cursor cursor =
182+
context
183+
.getContentResolver()
184+
.query(
185+
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
186+
projection,
187+
selection,
188+
selectionArgs,
189+
null)) {
190+
if (cursor != null && cursor.moveToFirst()) {
191+
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
192+
return MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
193+
.buildUpon()
194+
.appendPath(String.valueOf(id))
195+
.build();
196+
} else {
197+
return null;
198+
}
199+
} catch (Exception e) {
200+
Log.e(TAG, "Error querying MediaStore", e);
201+
return null;
202+
}
203+
}
204+
167205
/** Returns an OutputStream to write to the file. The file will be truncated immediately. */
168206
private static int getTemporaryAlbumId(final Context context) {
169207
final File temporaryTrack;

app/src/main/java/com/amaze/filemanager/filesystem/Operations.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ protected void onPostExecute(Void aVoid) {
728728
super.onPostExecute(aVoid);
729729
if (newFile != null && oldFile != null) {
730730
HybridFile[] hybridFiles = {newFile, oldFile};
731-
MediaConnectionUtils.scanFile(context, hybridFiles);
731+
MediaConnectionUtils.scanFiles(context, hybridFiles);
732732
}
733733
}
734734
}.executeOnExecutor(executor);

app/src/main/java/com/amaze/filemanager/filesystem/files/GenericCopyUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ private void startCopy(
269269
// If target file is copied onto the device and copy was successful, trigger media store
270270
// rescan
271271
if (mTargetFile != null) {
272-
MediaConnectionUtils.scanFile(mContext, new HybridFile[] {mTargetFile});
272+
MediaConnectionUtils.scanFiles(mContext, new HybridFile[] {mTargetFile});
273273
}
274274
}
275275
}

app/src/main/java/com/amaze/filemanager/filesystem/files/MediaConnectionUtils.kt

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,14 @@ object MediaConnectionUtils {
3636
* @param hybridFiles files to be scanned
3737
*/
3838
@JvmStatic
39-
fun scanFile(
39+
fun scanFiles(
4040
context: Context,
4141
hybridFiles: Array<HybridFile>,
4242
) {
43-
val paths = arrayOfNulls<String>(hybridFiles.size)
44-
45-
for (i in hybridFiles.indices) paths[i] = hybridFiles[i].path
43+
val paths: Array<String> =
44+
hybridFiles.map {
45+
it.path
46+
}.toTypedArray()
4647

4748
MediaScannerConnection.scanFile(
4849
context,
@@ -72,4 +73,31 @@ object MediaConnectionUtils {
7273
LOG.info("MediaConnectionUtils#scanFile finished scanning path$path")
7374
}
7475
}
76+
77+
/**
78+
* Invokes MediaScannerConnection#scanFile for the given file.
79+
*
80+
* @param context the context
81+
* @param path the file path to be scanned
82+
* @param mimeType the mime type of the file. Optional.
83+
*
84+
*/
85+
@JvmStatic
86+
fun scanFileByFileSystemPathAndMimeType(
87+
context: Context,
88+
path: String,
89+
mimeType: String? = null,
90+
callback: MediaScannerConnection.OnScanCompletedListener? = null,
91+
) {
92+
MediaScannerConnection.scanFile(
93+
context,
94+
arrayOf(path),
95+
mimeType?.let {
96+
arrayOf(it)
97+
},
98+
) { scannedPath: String, uri: Uri? ->
99+
LOG.info("Finished scanning path $scannedPath")
100+
callback?.onScanCompleted(scannedPath, uri)
101+
}
102+
}
75103
}

app/src/main/java/com/amaze/filemanager/ui/activities/MainActivityViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import com.amaze.filemanager.asynchronous.asynctasks.searchfilesystem.SearchResu
4040
import com.amaze.filemanager.asynchronous.asynctasks.searchfilesystem.searchParametersFromBoolean
4141
import com.amaze.filemanager.fileoperations.filesystem.OpenMode
4242
import com.amaze.filemanager.filesystem.HybridFile
43-
import com.amaze.filemanager.filesystem.files.MediaConnectionUtils.scanFile
43+
import com.amaze.filemanager.filesystem.files.MediaConnectionUtils.scanFiles
4444
import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants.PREFERENCE_REGEX
4545
import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants.PREFERENCE_REGEX_MATCHES
4646
import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants.PREFERENCE_SHOW_HIDDENFILES
@@ -235,7 +235,7 @@ class MainActivityViewModel(val applicationContext: Application) :
235235
OpenMode.TRASH_BIN,
236236
originalFilePath,
237237
)
238-
scanFile(applicationContext, arrayOf(hybridFile))
238+
scanFiles(applicationContext, arrayOf(hybridFile))
239239
val intent = Intent(MainActivity.KEY_INTENT_LOAD_LIST)
240240
hybridFile.getParent(applicationContext)?.let {
241241
intent.putExtra(MainActivity.KEY_INTENT_LOAD_LIST_FILE, it)
@@ -292,7 +292,7 @@ class MainActivityViewModel(val applicationContext: Application) :
292292
OpenMode.TRASH_BIN,
293293
source,
294294
)
295-
scanFile(applicationContext, arrayOf(hybridFile))
295+
scanFiles(applicationContext, arrayOf(hybridFile))
296296
val intent = Intent(MainActivity.KEY_INTENT_LOAD_LIST)
297297
hybridFile.getParent(applicationContext)?.let {
298298
intent.putExtra(MainActivity.KEY_INTENT_LOAD_LIST_FILE, it)

0 commit comments

Comments
 (0)