Extracted deprecated methods to functions e.g. Environment.getExternalStorageDirectory()
This commit is contained in:
parent
aaee076718
commit
3105da068d
24 changed files with 94 additions and 67 deletions
|
@ -37,6 +37,8 @@ object Constants {
|
||||||
const val IS_MUSIC =
|
const val IS_MUSIC =
|
||||||
MediaStore.Audio.AudioColumns.IS_MUSIC + "=1" + " AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''"
|
MediaStore.Audio.AudioColumns.IS_MUSIC + "=1" + " AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''"
|
||||||
|
|
||||||
|
const val DATA = "_data"
|
||||||
|
|
||||||
@Suppress("Deprecation")
|
@Suppress("Deprecation")
|
||||||
val baseProjection = arrayOf(
|
val baseProjection = arrayOf(
|
||||||
BaseColumns._ID, // 0
|
BaseColumns._ID, // 0
|
||||||
|
@ -44,7 +46,7 @@ object Constants {
|
||||||
MediaStore.Audio.AudioColumns.TRACK, // 2
|
MediaStore.Audio.AudioColumns.TRACK, // 2
|
||||||
MediaStore.Audio.AudioColumns.YEAR, // 3
|
MediaStore.Audio.AudioColumns.YEAR, // 3
|
||||||
MediaStore.Audio.AudioColumns.DURATION, // 4
|
MediaStore.Audio.AudioColumns.DURATION, // 4
|
||||||
MediaStore.Audio.AudioColumns.DATA, // 5
|
DATA, // 5
|
||||||
MediaStore.Audio.AudioColumns.DATE_MODIFIED, // 6
|
MediaStore.Audio.AudioColumns.DATE_MODIFIED, // 6
|
||||||
MediaStore.Audio.AudioColumns.ALBUM_ID, // 7
|
MediaStore.Audio.AudioColumns.ALBUM_ID, // 7
|
||||||
MediaStore.Audio.AudioColumns.ALBUM, // 8
|
MediaStore.Audio.AudioColumns.ALBUM, // 8
|
||||||
|
|
|
@ -10,13 +10,14 @@ import androidx.fragment.app.DialogFragment
|
||||||
import code.name.monkey.appthemehelper.util.VersionUtils
|
import code.name.monkey.appthemehelper.util.VersionUtils
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.extensions.materialDialog
|
import code.name.monkey.retromusic.extensions.materialDialog
|
||||||
|
import code.name.monkey.retromusic.util.getExternalStorageDirectory
|
||||||
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
import com.afollestad.materialdialogs.list.listItems
|
import com.afollestad.materialdialogs.list.listItems
|
||||||
import com.afollestad.materialdialogs.list.updateListItems
|
import com.afollestad.materialdialogs.list.updateListItems
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class BlacklistFolderChooserDialog : DialogFragment() {
|
class BlacklistFolderChooserDialog : DialogFragment() {
|
||||||
private var initialPath: String = Environment.getExternalStorageDirectory().absolutePath
|
private var initialPath: String = getExternalStorageDirectory().absolutePath
|
||||||
private var parentFolder: File? = null
|
private var parentFolder: File? = null
|
||||||
private var parentContents: Array<File>? = null
|
private var parentContents: Array<File>? = null
|
||||||
private var canGoUp = false
|
private var canGoUp = false
|
||||||
|
@ -97,7 +98,7 @@ class BlacklistFolderChooserDialog : DialogFragment() {
|
||||||
parentFolder = parentContents?.getOrNull(if (canGoUp) i - 1 else i)
|
parentFolder = parentContents?.getOrNull(if (canGoUp) i - 1 else i)
|
||||||
canGoUp = true
|
canGoUp = true
|
||||||
if (parentFolder?.absolutePath == "/storage/emulated") {
|
if (parentFolder?.absolutePath == "/storage/emulated") {
|
||||||
parentFolder = Environment.getExternalStorageDirectory()
|
parentFolder = getExternalStorageDirectory()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
reload()
|
reload()
|
||||||
|
|
|
@ -120,7 +120,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
binding.albumCoverContainer.transitionName = arguments.extraAlbumId.toString()
|
binding.albumCoverContainer.transitionName = arguments.extraAlbumId.toString()
|
||||||
postponeEnterTransition()
|
postponeEnterTransition()
|
||||||
detailsViewModel.getAlbum().observe(viewLifecycleOwner) {
|
detailsViewModel.getAlbum().observe(viewLifecycleOwner) {
|
||||||
requireView().doOnPreDraw {
|
view.doOnPreDraw {
|
||||||
startPostponedEnterTransition()
|
startPostponedEnterTransition()
|
||||||
}
|
}
|
||||||
albumArtistExists = !it.albumArtist.isNullOrEmpty()
|
albumArtistExists = !it.albumArtist.isNullOrEmpty()
|
||||||
|
|
|
@ -91,7 +91,7 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
binding.artistCoverContainer.transitionName = (artistId ?: artistName).toString()
|
binding.artistCoverContainer.transitionName = (artistId ?: artistName).toString()
|
||||||
postponeEnterTransition()
|
postponeEnterTransition()
|
||||||
detailsViewModel.getArtist().observe(viewLifecycleOwner) {
|
detailsViewModel.getArtist().observe(viewLifecycleOwner) {
|
||||||
requireView().doOnPreDraw {
|
view.doOnPreDraw {
|
||||||
startPostponedEnterTransition()
|
startPostponedEnterTransition()
|
||||||
}
|
}
|
||||||
showArtist(it)
|
showArtist(it)
|
||||||
|
|
|
@ -58,6 +58,8 @@ import code.name.monkey.retromusic.util.FileUtil
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil.startDirectory
|
import code.name.monkey.retromusic.util.PreferenceUtil.startDirectory
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil
|
import code.name.monkey.retromusic.util.RetroColorUtil
|
||||||
import code.name.monkey.retromusic.util.ThemedFastScroller.create
|
import code.name.monkey.retromusic.util.ThemedFastScroller.create
|
||||||
|
import code.name.monkey.retromusic.util.getExternalStorageDirectory
|
||||||
|
import code.name.monkey.retromusic.util.getExternalStoragePublicDirectory
|
||||||
import code.name.monkey.retromusic.views.BreadCrumbLayout.Crumb
|
import code.name.monkey.retromusic.views.BreadCrumbLayout.Crumb
|
||||||
import code.name.monkey.retromusic.views.BreadCrumbLayout.SelectionCallback
|
import code.name.monkey.retromusic.views.BreadCrumbLayout.SelectionCallback
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
import com.afollestad.materialcab.attached.AttachedCab
|
||||||
|
@ -420,7 +422,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
if (_binding != null) {
|
if (_binding != null) {
|
||||||
binding.recyclerView.updatePadding(
|
binding.recyclerView.updatePadding(
|
||||||
bottom = if (count > 0 && playingQueue.isNotEmpty()) dip(R.dimen.mini_player_height_expanded)
|
bottom = if (count > 0 && playingQueue.isNotEmpty()) dip(R.dimen.mini_player_height_expanded)
|
||||||
else dip(R.dimen.mini_player_height_expanded)
|
else dip(R.dimen.mini_player_height)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -654,11 +656,11 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
val defaultStartDirectory: File
|
val defaultStartDirectory: File
|
||||||
get() {
|
get() {
|
||||||
val musicDir =
|
val musicDir =
|
||||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
|
getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
|
||||||
val startFolder = if (musicDir.exists() && musicDir.isDirectory) {
|
val startFolder = if (musicDir.exists() && musicDir.isDirectory) {
|
||||||
musicDir
|
musicDir
|
||||||
} else {
|
} else {
|
||||||
val externalStorage = Environment.getExternalStorageDirectory()
|
val externalStorage = getExternalStorageDirectory()
|
||||||
if (externalStorage.exists() && externalStorage.isDirectory) {
|
if (externalStorage.exists() && externalStorage.isDirectory) {
|
||||||
externalStorage
|
externalStorage
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -19,7 +19,6 @@ import android.view.Menu
|
||||||
import android.view.MenuInflater
|
import android.view.MenuInflater
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.activity.addCallback
|
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
|
@ -46,10 +45,6 @@ GenresFragment : AbsRecyclerViewFragment<GenreAdapter, LinearLayoutManager>(),
|
||||||
else
|
else
|
||||||
adapter?.swapDataSet(listOf())
|
adapter?.swapDataSet(listOf())
|
||||||
}
|
}
|
||||||
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
|
|
||||||
remove()
|
|
||||||
requireActivity().onBackPressed()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createLayoutManager(): LinearLayoutManager {
|
override fun createLayoutManager(): LinearLayoutManager {
|
||||||
|
|
|
@ -93,10 +93,6 @@ class HomeFragment :
|
||||||
binding.appBarLayout.statusBarForeground =
|
binding.appBarLayout.statusBarForeground =
|
||||||
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
||||||
binding.toolbar.drawNextToNavbar()
|
binding.toolbar.drawNextToNavbar()
|
||||||
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
|
|
||||||
remove()
|
|
||||||
requireActivity().onBackPressed()
|
|
||||||
}
|
|
||||||
view.doOnLayout {
|
view.doOnLayout {
|
||||||
adjustPlaylistButtons()
|
adjustPlaylistButtons()
|
||||||
}
|
}
|
||||||
|
|
|
@ -318,9 +318,11 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
libraryViewModel.clearHistory()
|
libraryViewModel.clearHistory()
|
||||||
|
|
||||||
val snackBar =
|
val snackBar =
|
||||||
Snackbar.make(binding.container,
|
Snackbar.make(
|
||||||
|
binding.container,
|
||||||
getString(R.string.history_cleared),
|
getString(R.string.history_cleared),
|
||||||
Snackbar.LENGTH_LONG)
|
Snackbar.LENGTH_LONG
|
||||||
|
)
|
||||||
.setAction(getString(R.string.history_undo_button)) {
|
.setAction(getString(R.string.history_undo_button)) {
|
||||||
libraryViewModel.restoreHistory()
|
libraryViewModel.restoreHistory()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package code.name.monkey.retromusic.fragments.playlists
|
package code.name.monkey.retromusic.fragments.playlists
|
||||||
|
|
||||||
|
import android.graphics.Color
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuInflater
|
import android.view.MenuInflater
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.activity.addCallback
|
|
||||||
import androidx.core.view.doOnPreDraw
|
import androidx.core.view.doOnPreDraw
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
|
@ -31,6 +31,8 @@ import com.afollestad.materialcab.attached.destroy
|
||||||
import com.afollestad.materialcab.attached.isActive
|
import com.afollestad.materialcab.attached.isActive
|
||||||
import com.afollestad.materialcab.createCab
|
import com.afollestad.materialcab.createCab
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
|
import com.google.android.material.transition.MaterialArcMotion
|
||||||
|
import com.google.android.material.transition.MaterialContainerTransform
|
||||||
import com.google.android.material.transition.MaterialSharedAxis
|
import com.google.android.material.transition.MaterialSharedAxis
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator
|
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator
|
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator
|
||||||
|
@ -52,6 +54,16 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
|
||||||
private lateinit var playlist: PlaylistWithSongs
|
private lateinit var playlist: PlaylistWithSongs
|
||||||
private lateinit var playlistSongAdapter: OrderablePlaylistSongAdapter
|
private lateinit var playlistSongAdapter: OrderablePlaylistSongAdapter
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
sharedElementEnterTransition = MaterialContainerTransform(requireContext(), true).apply {
|
||||||
|
drawingViewId = R.id.fragment_container
|
||||||
|
scrimColor = Color.TRANSPARENT
|
||||||
|
setAllContainerColors(surfaceColor())
|
||||||
|
setPathMotion(MaterialArcMotion())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
_binding = FragmentPlaylistDetailBinding.bind(view)
|
_binding = FragmentPlaylistDetailBinding.bind(view)
|
||||||
|
@ -72,13 +84,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
postponeEnterTransition()
|
postponeEnterTransition()
|
||||||
requireView().doOnPreDraw { startPostponedEnterTransition() }
|
view.doOnPreDraw { startPostponedEnterTransition() }
|
||||||
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
|
|
||||||
if (!handleBackPress()) {
|
|
||||||
remove()
|
|
||||||
requireActivity().onBackPressed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
binding.appBarLayout.statusBarForeground =
|
binding.appBarLayout.statusBarForeground =
|
||||||
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
||||||
}
|
}
|
||||||
|
@ -201,5 +207,4 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
|
||||||
}
|
}
|
||||||
return cab as AttachedCab
|
return cab as AttachedCab
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.playlists
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import androidx.activity.addCallback
|
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.core.view.MenuCompat
|
import androidx.core.view.MenuCompat
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
|
@ -46,10 +45,6 @@ class PlaylistsFragment :
|
||||||
else
|
else
|
||||||
adapter?.swapDataSet(listOf())
|
adapter?.swapDataSet(listOf())
|
||||||
}
|
}
|
||||||
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
|
|
||||||
remove()
|
|
||||||
requireActivity().onBackPressed()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override val titleRes: Int
|
override val titleRes: Int
|
||||||
|
|
|
@ -11,6 +11,7 @@ import code.name.monkey.retromusic.helper.BackupContent.*
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.repository.Repository
|
import code.name.monkey.retromusic.repository.Repository
|
||||||
import code.name.monkey.retromusic.repository.SongRepository
|
import code.name.monkey.retromusic.repository.SongRepository
|
||||||
|
import code.name.monkey.retromusic.util.getExternalStoragePublicDirectory
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.koin.core.component.KoinComponent
|
import org.koin.core.component.KoinComponent
|
||||||
|
@ -249,7 +250,7 @@ object BackupHelper : KoinComponent {
|
||||||
|
|
||||||
fun getBackupRoot(): File {
|
fun getBackupRoot(): File {
|
||||||
return File(
|
return File(
|
||||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),
|
getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),
|
||||||
"RetroMusic/Backups"
|
"RetroMusic/Backups"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@ import android.app.Activity
|
||||||
import android.content.*
|
import android.content.*
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Environment
|
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
import android.provider.DocumentsContract
|
import android.provider.DocumentsContract
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
@ -30,6 +29,7 @@ import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.repository.SongRepository
|
import code.name.monkey.retromusic.repository.SongRepository
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
|
import code.name.monkey.retromusic.util.getExternalStorageDirectory
|
||||||
import org.koin.core.component.KoinComponent
|
import org.koin.core.component.KoinComponent
|
||||||
import org.koin.core.component.inject
|
import org.koin.core.component.inject
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
@ -440,7 +440,7 @@ object MusicPlayerRemote : KoinComponent {
|
||||||
var songFile: File? = null
|
var songFile: File? = null
|
||||||
if (uri.authority != null && uri.authority == "com.android.externalstorage.documents") {
|
if (uri.authority != null && uri.authority == "com.android.externalstorage.documents") {
|
||||||
songFile = File(
|
songFile = File(
|
||||||
Environment.getExternalStorageDirectory(),
|
getExternalStorageDirectory(),
|
||||||
uri.path?.split(":".toRegex(), 2)?.get(1)
|
uri.path?.split(":".toRegex(), 2)?.get(1)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
package code.name.monkey.retromusic.providers;
|
package code.name.monkey.retromusic.providers;
|
||||||
|
|
||||||
import static code.name.monkey.retromusic.service.MusicService.MEDIA_STORE_CHANGED;
|
import static code.name.monkey.retromusic.service.MusicService.MEDIA_STORE_CHANGED;
|
||||||
|
import static code.name.monkey.retromusic.util.FileUtilsKt.getExternalStoragePublicDirectory;
|
||||||
|
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
@ -50,11 +51,11 @@ public class BlacklistStore extends SQLiteOpenHelper {
|
||||||
if (!PreferenceUtil.INSTANCE.isInitializedBlacklist()) {
|
if (!PreferenceUtil.INSTANCE.isInitializedBlacklist()) {
|
||||||
// blacklisted by default
|
// blacklisted by default
|
||||||
sInstance.addPathImpl(
|
sInstance.addPathImpl(
|
||||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS));
|
getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS));
|
||||||
sInstance.addPathImpl(
|
sInstance.addPathImpl(
|
||||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS));
|
getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS));
|
||||||
sInstance.addPathImpl(
|
sInstance.addPathImpl(
|
||||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES));
|
getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES));
|
||||||
|
|
||||||
PreferenceUtil.INSTANCE.setInitializedBlacklist(true);
|
PreferenceUtil.INSTANCE.setInitializedBlacklist(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ import androidx.annotation.Nullable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import code.name.monkey.retromusic.App;
|
import code.name.monkey.retromusic.App;
|
||||||
|
import code.name.monkey.retromusic.Constants;
|
||||||
import code.name.monkey.retromusic.model.Song;
|
import code.name.monkey.retromusic.model.Song;
|
||||||
import code.name.monkey.retromusic.repository.RealSongRepository;
|
import code.name.monkey.retromusic.repository.RealSongRepository;
|
||||||
|
|
||||||
|
@ -128,7 +129,7 @@ public class MusicPlaybackQueueStore extends SQLiteOpenHelper {
|
||||||
builder.append(AudioColumns.DURATION);
|
builder.append(AudioColumns.DURATION);
|
||||||
builder.append(" LONG NOT NULL,");
|
builder.append(" LONG NOT NULL,");
|
||||||
|
|
||||||
builder.append(AudioColumns.DATA);
|
builder.append(Constants.DATA);
|
||||||
builder.append(" STRING NOT NULL,");
|
builder.append(" STRING NOT NULL,");
|
||||||
|
|
||||||
builder.append(AudioColumns.DATE_MODIFIED);
|
builder.append(AudioColumns.DATE_MODIFIED);
|
||||||
|
@ -192,7 +193,7 @@ public class MusicPlaybackQueueStore extends SQLiteOpenHelper {
|
||||||
values.put(AudioColumns.TRACK, song.getTrackNumber());
|
values.put(AudioColumns.TRACK, song.getTrackNumber());
|
||||||
values.put(AudioColumns.YEAR, song.getYear());
|
values.put(AudioColumns.YEAR, song.getYear());
|
||||||
values.put(AudioColumns.DURATION, song.getDuration());
|
values.put(AudioColumns.DURATION, song.getDuration());
|
||||||
values.put(AudioColumns.DATA, song.getData());
|
values.put(Constants.DATA, song.getData());
|
||||||
values.put(AudioColumns.DATE_MODIFIED, song.getDateModified());
|
values.put(AudioColumns.DATE_MODIFIED, song.getDateModified());
|
||||||
values.put(AudioColumns.ALBUM_ID, song.getAlbumId());
|
values.put(AudioColumns.ALBUM_ID, song.getAlbumId());
|
||||||
values.put(AudioColumns.ALBUM, song.getAlbumName());
|
values.put(AudioColumns.ALBUM, song.getAlbumName());
|
||||||
|
|
|
@ -148,7 +148,7 @@ class RealPlaylistRepository(
|
||||||
val trackNumber = cursor.getInt(AudioColumns.TRACK)
|
val trackNumber = cursor.getInt(AudioColumns.TRACK)
|
||||||
val year = cursor.getInt(AudioColumns.YEAR)
|
val year = cursor.getInt(AudioColumns.YEAR)
|
||||||
val duration = cursor.getLong(AudioColumns.DURATION)
|
val duration = cursor.getLong(AudioColumns.DURATION)
|
||||||
val data = cursor.getString(AudioColumns.DATA)
|
val data = cursor.getString(Constants.DATA)
|
||||||
val dateModified = cursor.getLong(AudioColumns.DATE_MODIFIED)
|
val dateModified = cursor.getLong(AudioColumns.DATE_MODIFIED)
|
||||||
val albumId = cursor.getLong(AudioColumns.ALBUM_ID)
|
val albumId = cursor.getLong(AudioColumns.ALBUM_ID)
|
||||||
val albumName = cursor.getString(AudioColumns.ALBUM)
|
val albumName = cursor.getString(AudioColumns.ALBUM)
|
||||||
|
@ -202,7 +202,7 @@ class RealPlaylistRepository(
|
||||||
AudioColumns.TRACK, // 2
|
AudioColumns.TRACK, // 2
|
||||||
AudioColumns.YEAR, // 3
|
AudioColumns.YEAR, // 3
|
||||||
AudioColumns.DURATION, // 4
|
AudioColumns.DURATION, // 4
|
||||||
AudioColumns.DATA, // 5
|
Constants.DATA, // 5
|
||||||
AudioColumns.DATE_MODIFIED, // 6
|
AudioColumns.DATE_MODIFIED, // 6
|
||||||
AudioColumns.ALBUM_ID, // 7
|
AudioColumns.ALBUM_ID, // 7
|
||||||
AudioColumns.ALBUM, // 8
|
AudioColumns.ALBUM, // 8
|
||||||
|
|
|
@ -18,6 +18,7 @@ import android.content.Context
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
import android.provider.MediaStore.Audio.AudioColumns
|
import android.provider.MediaStore.Audio.AudioColumns
|
||||||
import android.provider.MediaStore.Audio.Playlists.Members
|
import android.provider.MediaStore.Audio.Playlists.Members
|
||||||
|
import code.name.monkey.retromusic.Constants
|
||||||
import code.name.monkey.retromusic.Constants.IS_MUSIC
|
import code.name.monkey.retromusic.Constants.IS_MUSIC
|
||||||
import code.name.monkey.retromusic.extensions.getInt
|
import code.name.monkey.retromusic.extensions.getInt
|
||||||
import code.name.monkey.retromusic.extensions.getLong
|
import code.name.monkey.retromusic.extensions.getLong
|
||||||
|
@ -75,7 +76,7 @@ object PlaylistSongsLoader {
|
||||||
val trackNumber = cursor.getInt(AudioColumns.TRACK)
|
val trackNumber = cursor.getInt(AudioColumns.TRACK)
|
||||||
val year = cursor.getInt(AudioColumns.YEAR)
|
val year = cursor.getInt(AudioColumns.YEAR)
|
||||||
val duration = cursor.getLong(AudioColumns.DURATION)
|
val duration = cursor.getLong(AudioColumns.DURATION)
|
||||||
val data = cursor.getString(AudioColumns.DATA)
|
val data = cursor.getString(Constants.DATA)
|
||||||
val dateModified = cursor.getLong(AudioColumns.DATE_MODIFIED)
|
val dateModified = cursor.getLong(AudioColumns.DATE_MODIFIED)
|
||||||
val albumId = cursor.getLong(AudioColumns.ALBUM_ID)
|
val albumId = cursor.getLong(AudioColumns.ALBUM_ID)
|
||||||
val albumName = cursor.getString(AudioColumns.ALBUM)
|
val albumName = cursor.getString(AudioColumns.ALBUM)
|
||||||
|
@ -113,7 +114,7 @@ object PlaylistSongsLoader {
|
||||||
AudioColumns.TRACK, // 2
|
AudioColumns.TRACK, // 2
|
||||||
AudioColumns.YEAR, // 3
|
AudioColumns.YEAR, // 3
|
||||||
AudioColumns.DURATION, // 4
|
AudioColumns.DURATION, // 4
|
||||||
AudioColumns.DATA, // 5
|
Constants.DATA, // 5
|
||||||
AudioColumns.DATE_MODIFIED, // 6
|
AudioColumns.DATE_MODIFIED, // 6
|
||||||
AudioColumns.ALBUM_ID, // 7
|
AudioColumns.ALBUM_ID, // 7
|
||||||
AudioColumns.ALBUM, // 8
|
AudioColumns.ALBUM, // 8
|
||||||
|
|
|
@ -22,6 +22,7 @@ import android.provider.MediaStore
|
||||||
import android.provider.MediaStore.Audio.AudioColumns
|
import android.provider.MediaStore.Audio.AudioColumns
|
||||||
import android.provider.MediaStore.Audio.Media
|
import android.provider.MediaStore.Audio.Media
|
||||||
import code.name.monkey.appthemehelper.util.VersionUtils
|
import code.name.monkey.appthemehelper.util.VersionUtils
|
||||||
|
import code.name.monkey.retromusic.Constants
|
||||||
import code.name.monkey.retromusic.Constants.IS_MUSIC
|
import code.name.monkey.retromusic.Constants.IS_MUSIC
|
||||||
import code.name.monkey.retromusic.Constants.baseProjection
|
import code.name.monkey.retromusic.Constants.baseProjection
|
||||||
import code.name.monkey.retromusic.extensions.getInt
|
import code.name.monkey.retromusic.extensions.getInt
|
||||||
|
@ -32,6 +33,7 @@ import code.name.monkey.retromusic.helper.SortOrder
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.providers.BlacklistStore
|
import code.name.monkey.retromusic.providers.BlacklistStore
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
|
import code.name.monkey.retromusic.util.getExternalStoragePublicDirectory
|
||||||
import java.text.Collator
|
import java.text.Collator
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -118,7 +120,7 @@ class RealSongRepository(private val context: Context) : SongRepository {
|
||||||
override fun songsByFilePath(filePath: String, ignoreBlacklist: Boolean): List<Song> {
|
override fun songsByFilePath(filePath: String, ignoreBlacklist: Boolean): List<Song> {
|
||||||
return songs(
|
return songs(
|
||||||
makeSongCursor(
|
makeSongCursor(
|
||||||
AudioColumns.DATA + "=?",
|
Constants.DATA + "=?",
|
||||||
arrayOf(filePath),
|
arrayOf(filePath),
|
||||||
ignoreBlacklist = ignoreBlacklist
|
ignoreBlacklist = ignoreBlacklist
|
||||||
)
|
)
|
||||||
|
@ -133,7 +135,7 @@ class RealSongRepository(private val context: Context) : SongRepository {
|
||||||
val trackNumber = cursor.getInt(AudioColumns.TRACK)
|
val trackNumber = cursor.getInt(AudioColumns.TRACK)
|
||||||
val year = cursor.getInt(AudioColumns.YEAR)
|
val year = cursor.getInt(AudioColumns.YEAR)
|
||||||
val duration = cursor.getLong(AudioColumns.DURATION)
|
val duration = cursor.getLong(AudioColumns.DURATION)
|
||||||
val data = cursor.getString(AudioColumns.DATA)
|
val data = cursor.getString(Constants.DATA)
|
||||||
val dateModified = cursor.getLong(AudioColumns.DATE_MODIFIED)
|
val dateModified = cursor.getLong(AudioColumns.DATE_MODIFIED)
|
||||||
val albumId = cursor.getLong(AudioColumns.ALBUM_ID)
|
val albumId = cursor.getLong(AudioColumns.ALBUM_ID)
|
||||||
val albumName = cursor.getStringOrNull(AudioColumns.ALBUM)
|
val albumName = cursor.getStringOrNull(AudioColumns.ALBUM)
|
||||||
|
@ -177,10 +179,10 @@ class RealSongRepository(private val context: Context) : SongRepository {
|
||||||
// Whitelist
|
// Whitelist
|
||||||
if (PreferenceUtil.isWhiteList) {
|
if (PreferenceUtil.isWhiteList) {
|
||||||
selectionFinal =
|
selectionFinal =
|
||||||
selectionFinal + " AND " + AudioColumns.DATA + " LIKE ?"
|
selectionFinal + " AND " + Constants.DATA + " LIKE ?"
|
||||||
selectionValuesFinal = addSelectionValues(
|
selectionValuesFinal = addSelectionValues(
|
||||||
selectionValuesFinal, arrayListOf(
|
selectionValuesFinal, arrayListOf(
|
||||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).canonicalPath
|
getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).canonicalPath
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
@ -219,9 +221,9 @@ class RealSongRepository(private val context: Context) : SongRepository {
|
||||||
): String {
|
): String {
|
||||||
val newSelection = StringBuilder(
|
val newSelection = StringBuilder(
|
||||||
if (selection != null && selection.trim { it <= ' ' } != "") "$selection AND " else "")
|
if (selection != null && selection.trim { it <= ' ' } != "") "$selection AND " else "")
|
||||||
newSelection.append(AudioColumns.DATA + " NOT LIKE ?")
|
newSelection.append(Constants.DATA + " NOT LIKE ?")
|
||||||
for (i in 0 until pathCount - 1) {
|
for (i in 0 until pathCount - 1) {
|
||||||
newSelection.append(" AND " + AudioColumns.DATA + " NOT LIKE ?")
|
newSelection.append(" AND " + Constants.DATA + " NOT LIKE ?")
|
||||||
}
|
}
|
||||||
return newSelection.toString()
|
return newSelection.toString()
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,10 +5,10 @@ import java.io.File
|
||||||
|
|
||||||
object FilePathUtil {
|
object FilePathUtil {
|
||||||
fun blacklistFilePaths(): List<String> {
|
fun blacklistFilePaths(): List<String> {
|
||||||
return listOf<File>(
|
return listOf(
|
||||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS),
|
getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS),
|
||||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES),
|
getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES),
|
||||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS)
|
getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS)
|
||||||
).map {
|
).map {
|
||||||
FileUtil.safeGetCanonicalPath(it)
|
FileUtil.safeGetCanonicalPath(it)
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
|
|
||||||
package code.name.monkey.retromusic.util;
|
package code.name.monkey.retromusic.util;
|
||||||
|
|
||||||
|
import static code.name.monkey.retromusic.util.FileUtilsKt.getExternalStorageDirectory;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
|
@ -22,6 +24,7 @@ import android.webkit.MimeTypeMap;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.core.os.EnvironmentCompat;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
@ -40,6 +43,7 @@ import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
import code.name.monkey.retromusic.Constants;
|
||||||
import code.name.monkey.retromusic.adapter.Storage;
|
import code.name.monkey.retromusic.adapter.Storage;
|
||||||
import code.name.monkey.retromusic.model.Song;
|
import code.name.monkey.retromusic.model.Song;
|
||||||
import code.name.monkey.retromusic.repository.RealSongRepository;
|
import code.name.monkey.retromusic.repository.RealSongRepository;
|
||||||
|
@ -87,7 +91,7 @@ public final class FileUtil {
|
||||||
if (files.size() > 0
|
if (files.size() > 0
|
||||||
&& files.size() < 999) { // 999 is the max amount Androids SQL implementation can handle.
|
&& files.size() < 999) { // 999 is the max amount Androids SQL implementation can handle.
|
||||||
selection =
|
selection =
|
||||||
MediaStore.Audio.AudioColumns.DATA + " IN (" + makePlaceholders(files.size()) + ")";
|
Constants.DATA + " IN (" + makePlaceholders(files.size()) + ")";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +100,7 @@ public final class FileUtil {
|
||||||
|
|
||||||
return songCursor == null
|
return songCursor == null
|
||||||
? null
|
? null
|
||||||
: new SortedCursor(songCursor, paths, MediaStore.Audio.AudioColumns.DATA);
|
: new SortedCursor(songCursor, paths, Constants.DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String makePlaceholders(int len) {
|
private static String makePlaceholders(int len) {
|
||||||
|
@ -268,7 +272,7 @@ public final class FileUtil {
|
||||||
public static ArrayList<Storage> listRoots() {
|
public static ArrayList<Storage> listRoots() {
|
||||||
ArrayList<Storage> storageItems = new ArrayList<>();
|
ArrayList<Storage> storageItems = new ArrayList<>();
|
||||||
HashSet<String> paths = new HashSet<>();
|
HashSet<String> paths = new HashSet<>();
|
||||||
String defaultPath = Environment.getExternalStorageDirectory().getPath();
|
String defaultPath = getExternalStorageDirectory().getPath();
|
||||||
String defaultPathState = Environment.getExternalStorageState();
|
String defaultPathState = Environment.getExternalStorageState();
|
||||||
if (defaultPathState.equals(Environment.MEDIA_MOUNTED) || defaultPathState.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
|
if (defaultPathState.equals(Environment.MEDIA_MOUNTED) || defaultPathState.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
|
||||||
Storage ext = new Storage();
|
Storage ext = new Storage();
|
||||||
|
@ -277,7 +281,7 @@ public final class FileUtil {
|
||||||
} else {
|
} else {
|
||||||
ext.title = "Internal Storage";
|
ext.title = "Internal Storage";
|
||||||
}
|
}
|
||||||
ext.file = Environment.getExternalStorageDirectory();
|
ext.file = getExternalStorageDirectory();
|
||||||
storageItems.add(ext);
|
storageItems.add(ext);
|
||||||
paths.add(defaultPath);
|
paths.add(defaultPath);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package code.name.monkey.retromusic.util
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import android.os.Environment
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
@ -23,7 +24,13 @@ object FileUtils {
|
||||||
* @return the file
|
* @return the file
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
fun createFile(context: Context, directoryName: String, fileName: String, body: String, fileType: String): File {
|
fun createFile(
|
||||||
|
context: Context,
|
||||||
|
directoryName: String,
|
||||||
|
fileName: String,
|
||||||
|
body: String,
|
||||||
|
fileType: String
|
||||||
|
): File {
|
||||||
val root = createDirectory(context, directoryName)
|
val root = createDirectory(context, directoryName)
|
||||||
val filePath = "$root/$fileName$fileType"
|
val filePath = "$root/$fileName$fileType"
|
||||||
val file = File(filePath)
|
val file = File(filePath)
|
||||||
|
@ -57,4 +64,13 @@ object FileUtils {
|
||||||
}
|
}
|
||||||
return file
|
return file
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@Suppress("Deprecation")
|
||||||
|
fun getExternalStorageDirectory(): File {
|
||||||
|
return Environment.getExternalStorageDirectory()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("Deprecation")
|
||||||
|
fun getExternalStoragePublicDirectory(type: String): File {
|
||||||
|
return Environment.getExternalStoragePublicDirectory(type)
|
||||||
}
|
}
|
|
@ -26,7 +26,7 @@ import java.io.*
|
||||||
*/
|
*/
|
||||||
object LyricUtil {
|
object LyricUtil {
|
||||||
private val lrcRootPath =
|
private val lrcRootPath =
|
||||||
Environment.getExternalStorageDirectory().toString() + "/RetroMusic/lyrics/"
|
getExternalStorageDirectory().toString() + "/RetroMusic/lyrics/"
|
||||||
private const val TAG = "LyricUtil"
|
private const val TAG = "LyricUtil"
|
||||||
fun writeLrcToLoc(
|
fun writeLrcToLoc(
|
||||||
title: String, artist: String, lrcContext: String
|
title: String, artist: String, lrcContext: String
|
||||||
|
|
|
@ -5,7 +5,6 @@ import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Environment
|
|
||||||
import android.provider.BaseColumns
|
import android.provider.BaseColumns
|
||||||
import android.provider.MediaStore
|
import android.provider.MediaStore
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
@ -14,6 +13,7 @@ import androidx.core.content.contentValuesOf
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import code.name.monkey.appthemehelper.util.VersionUtils
|
import code.name.monkey.appthemehelper.util.VersionUtils
|
||||||
|
import code.name.monkey.retromusic.Constants
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.db.PlaylistEntity
|
import code.name.monkey.retromusic.db.PlaylistEntity
|
||||||
import code.name.monkey.retromusic.db.SongEntity
|
import code.name.monkey.retromusic.db.SongEntity
|
||||||
|
@ -79,7 +79,7 @@ object MusicUtil : KoinComponent {
|
||||||
|
|
||||||
private fun createAlbumArtDir(context: Context): File {
|
private fun createAlbumArtDir(context: Context): File {
|
||||||
val albumArtDir = File(
|
val albumArtDir = File(
|
||||||
if (VersionUtils.hasR()) context.cacheDir else Environment.getExternalStorageDirectory(),
|
if (VersionUtils.hasR()) context.cacheDir else getExternalStorageDirectory(),
|
||||||
"/albumthumbs/"
|
"/albumthumbs/"
|
||||||
)
|
)
|
||||||
if (!albumArtDir.exists()) {
|
if (!albumArtDir.exists()) {
|
||||||
|
@ -385,7 +385,7 @@ object MusicUtil : KoinComponent {
|
||||||
) {
|
) {
|
||||||
val songRepository: SongRepository = get()
|
val songRepository: SongRepository = get()
|
||||||
val projection = arrayOf(
|
val projection = arrayOf(
|
||||||
BaseColumns._ID, MediaStore.MediaColumns.DATA
|
BaseColumns._ID, Constants.DATA
|
||||||
)
|
)
|
||||||
// Split the query into multiple batches, and merge the resulting cursors
|
// Split the query into multiple batches, and merge the resulting cursors
|
||||||
var batchStart: Int
|
var batchStart: Int
|
||||||
|
|
|
@ -16,6 +16,8 @@ package code.name.monkey.retromusic.util;
|
||||||
|
|
||||||
import static android.provider.MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
|
import static android.provider.MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
|
||||||
|
|
||||||
|
import static code.name.monkey.retromusic.util.FileUtilsKt.getExternalStorageDirectory;
|
||||||
|
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
@ -295,12 +297,12 @@ public class PlaylistsUtil {
|
||||||
|
|
||||||
public static File savePlaylist(Context context, Playlist playlist) throws IOException {
|
public static File savePlaylist(Context context, Playlist playlist) throws IOException {
|
||||||
return M3UWriter.write(
|
return M3UWriter.write(
|
||||||
new File(Environment.getExternalStorageDirectory(), "Playlists"), playlist);
|
new File(getExternalStorageDirectory(), "Playlists"), playlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static File savePlaylistWithSongs(PlaylistWithSongs playlist) throws IOException {
|
public static File savePlaylistWithSongs(PlaylistWithSongs playlist) throws IOException {
|
||||||
return M3UWriter.writeIO(
|
return M3UWriter.writeIO(
|
||||||
new File(Environment.getExternalStorageDirectory(), "Playlists"), playlist);
|
new File(getExternalStorageDirectory(), "Playlists"), playlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean doesPlaylistExist(@NonNull final Context context, final int playlistId) {
|
public static boolean doesPlaylistExist(@NonNull final Context context, final int playlistId) {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.provider.MediaStore
|
import android.provider.MediaStore
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
|
import code.name.monkey.retromusic.Constants
|
||||||
|
|
||||||
object UriUtil {
|
object UriUtil {
|
||||||
@RequiresApi(Build.VERSION_CODES.Q)
|
@RequiresApi(Build.VERSION_CODES.Q)
|
||||||
|
@ -13,7 +14,7 @@ object UriUtil {
|
||||||
val uri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)
|
val uri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)
|
||||||
val proj = arrayOf(MediaStore.Files.FileColumns._ID)
|
val proj = arrayOf(MediaStore.Files.FileColumns._ID)
|
||||||
context.contentResolver.query(
|
context.contentResolver.query(
|
||||||
uri, proj, MediaStore.Files.FileColumns.DATA + "=?", arrayOf(path), null
|
uri, proj, Constants.DATA + "=?", arrayOf(path), null
|
||||||
)?.use { cursor ->
|
)?.use { cursor ->
|
||||||
if (cursor.count != 0) {
|
if (cursor.count != 0) {
|
||||||
cursor.moveToFirst()
|
cursor.moveToFirst()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue