update
This commit is contained in:
parent
e11a767758
commit
b228b719ca
@ -2,9 +2,9 @@ package com.offline.music.task.player
|
||||
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingAudio
|
||||
import com.offline.music.task.player.db.bean.ResourcesList
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingLocalAudio
|
||||
import com.offline.music.task.player.db.bean.LocalResourcesList
|
||||
import com.offline.music.task.player.db.tools.CurrentAudioManager
|
||||
import com.offline.music.task.player.db.tools.DatabaseManager
|
||||
import com.offline.music.task.player.tools.media.MediaControllerManager
|
||||
@ -25,20 +25,20 @@ class ProApp : Application() {
|
||||
private set
|
||||
lateinit var databaseManager: DatabaseManager
|
||||
private set
|
||||
var currentPlayingAudio: CurrentPlayingAudio? = null
|
||||
var currentPlayingLocalAudio: CurrentPlayingLocalAudio? = null
|
||||
private set
|
||||
lateinit var importList: List<Audio>
|
||||
lateinit var importList: List<LocalAudio>
|
||||
private set
|
||||
lateinit var resourcesList: ResourcesList
|
||||
lateinit var localResourcesList: LocalResourcesList
|
||||
private set
|
||||
|
||||
lateinit var realHumanVoiceList: List<Audio>
|
||||
lateinit var realHumanVoiceList: List<LocalAudio>
|
||||
private set
|
||||
|
||||
lateinit var soundsOfAppliancesList: List<Audio>
|
||||
lateinit var soundsOfAppliancesList: List<LocalAudio>
|
||||
private set
|
||||
|
||||
lateinit var soundsOfNatureList: List<Audio>
|
||||
lateinit var soundsOfNatureList: List<LocalAudio>
|
||||
private set
|
||||
|
||||
private var isInitialized = false
|
||||
@ -46,7 +46,7 @@ class ProApp : Application() {
|
||||
fun initialize(context: Context) {
|
||||
if (!isInitialized) {
|
||||
val jsonString = readAssetsFile(context)
|
||||
resourcesList = parseResources(context, jsonString)
|
||||
localResourcesList = parseResources(context, jsonString)
|
||||
splitResourcesList()
|
||||
isInitialized = true
|
||||
}
|
||||
@ -54,11 +54,11 @@ class ProApp : Application() {
|
||||
|
||||
fun initCurrentPlayingAudio() {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
currentPlayingAudio = currentAudioManager.getCurrentPlayingAudio()
|
||||
currentPlayingLocalAudio = currentAudioManager.getCurrentPlayingAudio()
|
||||
}
|
||||
}
|
||||
|
||||
fun initImportAudio(callback: (List<Audio>) -> Unit = {}) {
|
||||
fun initImportAudio(callback: (List<LocalAudio>) -> Unit = {}) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
importList = databaseManager.getAllAudioFiles()
|
||||
withContext(Dispatchers.Main) {
|
||||
@ -84,11 +84,11 @@ class ProApp : Application() {
|
||||
soundsOfAppliancesList = mutableListOf()
|
||||
soundsOfNatureList = mutableListOf()
|
||||
|
||||
for (category in resourcesList.categories) {
|
||||
for (category in localResourcesList.categories) {
|
||||
when (category.name) {
|
||||
"Sound of instrument" -> realHumanVoiceList = category.audios
|
||||
"White noise" -> soundsOfAppliancesList = category.audios
|
||||
"Voice of Nature" -> soundsOfNatureList = category.audios
|
||||
"Sound of instrument" -> realHumanVoiceList = category.localAudios
|
||||
"White noise" -> soundsOfAppliancesList = category.localAudios
|
||||
"Voice of Nature" -> soundsOfNatureList = category.localAudios
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,5 +4,5 @@ import java.io.Serializable
|
||||
|
||||
data class Category(
|
||||
val name: String,
|
||||
val audios: List<Audio>
|
||||
val localAudios: List<LocalAudio>
|
||||
) : Serializable
|
||||
@ -5,7 +5,7 @@ import androidx.room.Entity
|
||||
import androidx.room.PrimaryKey
|
||||
|
||||
@Entity(tableName = "current_playing_audio")
|
||||
data class CurrentPlayingAudio(
|
||||
data class CurrentPlayingLocalAudio(
|
||||
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
||||
@ColumnInfo(name = "name") val name: String,
|
||||
@ColumnInfo(name = "file") val file: String,
|
||||
@ -8,16 +8,16 @@ import androidx.room.Query
|
||||
import androidx.room.Update
|
||||
|
||||
@Dao
|
||||
interface CurrentPlayingAudioDao {
|
||||
interface CurrentPlayingLocalAudioDao {
|
||||
@Query("SELECT * FROM current_playing_audio LIMIT 1")
|
||||
suspend fun getCurrentPlayingAudio(): CurrentPlayingAudio?
|
||||
suspend fun getCurrentPlayingAudio(): CurrentPlayingLocalAudio?
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
suspend fun insertCurrentPlayingAudio(audio: CurrentPlayingAudio)
|
||||
suspend fun insertCurrentPlayingAudio(audio: CurrentPlayingLocalAudio)
|
||||
|
||||
@Update
|
||||
suspend fun updateCurrentPlayingAudio(audio: CurrentPlayingAudio)
|
||||
suspend fun updateCurrentPlayingAudio(audio: CurrentPlayingLocalAudio)
|
||||
|
||||
@Delete
|
||||
suspend fun deleteCurrentPlayingAudio(audio: CurrentPlayingAudio)
|
||||
suspend fun deleteCurrentPlayingAudio(audio: CurrentPlayingLocalAudio)
|
||||
}
|
||||
@ -8,7 +8,7 @@ import java.io.Serializable
|
||||
|
||||
@Keep
|
||||
@Entity
|
||||
data class Audio(
|
||||
data class LocalAudio(
|
||||
@ColumnInfo(name = "name") var name: String,
|
||||
@ColumnInfo(name = "file") var file: String,
|
||||
@ColumnInfo(name = "image") var image: String,
|
||||
@ -11,32 +11,32 @@ import androidx.room.Update
|
||||
interface LocalAudioDao {
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
suspend fun insertAudioFile(barcode: Audio)
|
||||
suspend fun insertAudioFile(barcode: LocalAudio)
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
suspend fun insertAudioFiles(audios: List<Audio>)
|
||||
suspend fun insertAudioFiles(localAudios: List<LocalAudio>)
|
||||
|
||||
@Query("SELECT * FROM Audio")
|
||||
suspend fun getAllAudioFile(): List<Audio>
|
||||
@Query("SELECT * FROM LocalAudio")
|
||||
suspend fun getAllAudioFile(): List<LocalAudio>
|
||||
|
||||
@Delete
|
||||
suspend fun deleteAudioFile(barcode: Audio)
|
||||
suspend fun deleteAudioFile(barcode: LocalAudio)
|
||||
|
||||
@Query("DELETE FROM Audio")
|
||||
@Query("DELETE FROM LocalAudio")
|
||||
suspend fun deleteAllAudioFile()
|
||||
|
||||
@Update
|
||||
suspend fun updateAudioFile(audioFile: Audio)
|
||||
suspend fun updateAudioFile(localAudioFile: LocalAudio)
|
||||
|
||||
@Query("SELECT * FROM Audio WHERE name = :path LIMIT 1")
|
||||
suspend fun getAudioFileByPath(path: String): Audio?
|
||||
@Query("SELECT * FROM LocalAudio WHERE name = :path LIMIT 1")
|
||||
suspend fun getAudioFileByPath(path: String): LocalAudio?
|
||||
|
||||
@Query("SELECT * FROM Audio WHERE selected = 1")
|
||||
suspend fun getAudioBySelected(): List<Audio>
|
||||
@Query("SELECT * FROM LocalAudio WHERE selected = 1")
|
||||
suspend fun getAudioBySelected(): List<LocalAudio>
|
||||
|
||||
@Query("update Audio set collect = 0")
|
||||
@Query("update LocalAudio set collect = 0")
|
||||
suspend fun deleteAllCollect()
|
||||
|
||||
@Query("select * from Audio where collect = :collect ")
|
||||
suspend fun getCollectData(collect: Boolean = true): List<Audio>
|
||||
@Query("select * from LocalAudio where collect = :collect ")
|
||||
suspend fun getCollectData(collect: Boolean = true): List<LocalAudio>
|
||||
}
|
||||
|
||||
@ -2,6 +2,6 @@ package com.offline.music.task.player.db.bean
|
||||
|
||||
import java.io.Serializable
|
||||
|
||||
data class ResourcesList(
|
||||
data class LocalResourcesList(
|
||||
val categories: List<Category>
|
||||
) : Serializable
|
||||
@ -3,10 +3,10 @@ package com.offline.music.task.player.db.tools
|
||||
|
||||
import androidx.room.Database
|
||||
import androidx.room.RoomDatabase
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.db.bean.LocalAudioDao
|
||||
|
||||
@Database(entities = [Audio::class], version = 1, exportSchema = false)
|
||||
@Database(entities = [LocalAudio::class], version = 1, exportSchema = false)
|
||||
abstract class AppDatabase : RoomDatabase() {
|
||||
abstract fun localAudioDao(): LocalAudioDao
|
||||
}
|
||||
@ -3,10 +3,10 @@ package com.offline.music.task.player.db.tools
|
||||
|
||||
import androidx.room.Database
|
||||
import androidx.room.RoomDatabase
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingAudio
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingAudioDao
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingLocalAudio
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingLocalAudioDao
|
||||
|
||||
@Database(entities = [CurrentPlayingAudio::class], version = 1, exportSchema = false)
|
||||
@Database(entities = [CurrentPlayingLocalAudio::class], version = 1, exportSchema = false)
|
||||
abstract class CurrentAudioDatabase : RoomDatabase() {
|
||||
abstract fun currentPlayingAudioDao(): CurrentPlayingAudioDao
|
||||
abstract fun currentPlayingAudioDao(): CurrentPlayingLocalAudioDao
|
||||
}
|
||||
@ -2,8 +2,8 @@ package com.offline.music.task.player.db.tools
|
||||
|
||||
import android.content.Context
|
||||
import androidx.room.Room
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingAudio
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingAudioDao
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingLocalAudio
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingLocalAudioDao
|
||||
|
||||
class CurrentAudioManager private constructor(context: Context) {
|
||||
private val database: CurrentAudioDatabase = Room.databaseBuilder(
|
||||
@ -11,20 +11,20 @@ class CurrentAudioManager private constructor(context: Context) {
|
||||
CurrentAudioDatabase::class.java, "current_audio_app_database"
|
||||
).build()
|
||||
|
||||
private val currentPlayingAudioDao: CurrentPlayingAudioDao = database.currentPlayingAudioDao()
|
||||
private val currentPlayingLocalAudioDao: CurrentPlayingLocalAudioDao = database.currentPlayingAudioDao()
|
||||
|
||||
suspend fun getCurrentPlayingAudio(): CurrentPlayingAudio? {
|
||||
return currentPlayingAudioDao.getCurrentPlayingAudio()
|
||||
suspend fun getCurrentPlayingAudio(): CurrentPlayingLocalAudio? {
|
||||
return currentPlayingLocalAudioDao.getCurrentPlayingAudio()
|
||||
}
|
||||
|
||||
suspend fun setCurrentPlayingAudio(audio: CurrentPlayingAudio) {
|
||||
suspend fun setCurrentPlayingAudio(audio: CurrentPlayingLocalAudio) {
|
||||
val currentAudio = getCurrentPlayingAudio()
|
||||
if (currentAudio == null) {
|
||||
currentPlayingAudioDao.insertCurrentPlayingAudio(audio)
|
||||
currentPlayingLocalAudioDao.insertCurrentPlayingAudio(audio)
|
||||
} else {
|
||||
// 如果已有数据,先删除现有数据,然后再插入新数据
|
||||
currentPlayingAudioDao.deleteCurrentPlayingAudio(currentAudio)
|
||||
currentPlayingAudioDao.insertCurrentPlayingAudio(audio)
|
||||
currentPlayingLocalAudioDao.deleteCurrentPlayingAudio(currentAudio)
|
||||
currentPlayingLocalAudioDao.insertCurrentPlayingAudio(audio)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@ package com.offline.music.task.player.db.tools
|
||||
|
||||
import android.content.Context
|
||||
import androidx.room.Room
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
@ -15,20 +15,20 @@ class DatabaseManager private constructor(context: Context) {
|
||||
|
||||
private val audioFileDao = database.localAudioDao()
|
||||
|
||||
suspend fun insertAudioFile(audio: Audio) {
|
||||
suspend fun insertAudioFile(localAudio: LocalAudio) {
|
||||
withContext(Dispatchers.IO) {
|
||||
val existingAudioFile = getAudioFileByPath(audio.name)
|
||||
val existingAudioFile = getAudioFileByPath(localAudio.name)
|
||||
if (existingAudioFile == null) {
|
||||
audioFileDao.insertAudioFile(audio)
|
||||
audioFileDao.insertAudioFile(localAudio)
|
||||
} else {
|
||||
audioFileDao.updateAudioFile(audio)
|
||||
audioFileDao.updateAudioFile(localAudio)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun insertAudioFiles(audios: List<Audio>) {
|
||||
suspend fun insertAudioFiles(localAudios: List<LocalAudio>) {
|
||||
withContext(Dispatchers.IO) {
|
||||
for (audio in audios) {
|
||||
for (audio in localAudios) {
|
||||
val existingAudioFile = getAudioFileByPath(audio.file)
|
||||
if (existingAudioFile == null) {
|
||||
audioFileDao.insertAudioFile(audio)
|
||||
@ -39,15 +39,15 @@ class DatabaseManager private constructor(context: Context) {
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun getAllAudioFiles(): List<Audio> {
|
||||
suspend fun getAllAudioFiles(): List<LocalAudio> {
|
||||
return withContext(Dispatchers.IO) {
|
||||
audioFileDao.getAllAudioFile()
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun deleteAudioFile(audioFile: Audio) {
|
||||
suspend fun deleteAudioFile(localAudioFile: LocalAudio) {
|
||||
withContext(Dispatchers.IO) {
|
||||
audioFileDao.deleteAudioFile(audioFile)
|
||||
audioFileDao.deleteAudioFile(localAudioFile)
|
||||
}
|
||||
}
|
||||
|
||||
@ -57,17 +57,17 @@ class DatabaseManager private constructor(context: Context) {
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun updateAudioFiles(audioFile: Audio) {
|
||||
suspend fun updateAudioFiles(localAudioFile: LocalAudio) {
|
||||
withContext(Dispatchers.IO) {
|
||||
audioFileDao.updateAudioFile(audioFile)
|
||||
audioFileDao.updateAudioFile(localAudioFile)
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun getAudioFileByPath(path: String): Audio? {
|
||||
suspend fun getAudioFileByPath(path: String): LocalAudio? {
|
||||
return audioFileDao.getAudioFileByPath(path)
|
||||
}
|
||||
|
||||
suspend fun getAudioBySelect(): List<Audio> {
|
||||
suspend fun getAudioBySelect(): List<LocalAudio> {
|
||||
return audioFileDao.getAudioBySelected()
|
||||
}
|
||||
|
||||
|
||||
@ -13,8 +13,8 @@ import com.google.common.util.concurrent.MoreExecutors
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingAudio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingLocalAudio
|
||||
import com.offline.music.task.player.service.LocalPlaybackService
|
||||
import com.offline.music.task.player.tools.util.containsContent
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@ -46,18 +46,18 @@ object MediaControllerManager {
|
||||
}
|
||||
}
|
||||
|
||||
fun setupMedia(context: Context, audio: Audio, listener: Player.Listener) {
|
||||
if (currentAudioFile != audio.file) {
|
||||
currentAudioFile = audio.file
|
||||
fun setupMedia(context: Context, localAudio: LocalAudio, listener: Player.Listener) {
|
||||
if (currentAudioFile != localAudio.file) {
|
||||
currentAudioFile = localAudio.file
|
||||
|
||||
val uri: Uri? = if (containsContent(audio.file)) {
|
||||
Uri.parse(audio.file)
|
||||
val uri: Uri? = if (containsContent(localAudio.file)) {
|
||||
Uri.parse(localAudio.file)
|
||||
} else {
|
||||
Uri.parse("file:///android_asset/$currentAudioFile")
|
||||
}
|
||||
val resourceId = R.mipmap.ic_launcher
|
||||
val imgUri: Uri? = if (audio.image.isNotEmpty()) {
|
||||
Uri.parse("file:///android_asset/${audio.image}")
|
||||
val imgUri: Uri? = if (localAudio.image.isNotEmpty()) {
|
||||
Uri.parse("file:///android_asset/${localAudio.image}")
|
||||
} else {
|
||||
Uri.parse("android.resource://${context.packageName}/$resourceId")
|
||||
}
|
||||
@ -67,8 +67,8 @@ object MediaControllerManager {
|
||||
.setUri(uri)
|
||||
.setMediaMetadata(
|
||||
MediaMetadata.Builder()
|
||||
.setArtist(audio.name)
|
||||
.setTitle(audio.name)
|
||||
.setArtist(localAudio.name)
|
||||
.setTitle(localAudio.name)
|
||||
.setArtworkUri(imgUri)
|
||||
.build()
|
||||
)
|
||||
@ -80,17 +80,17 @@ object MediaControllerManager {
|
||||
it.repeatMode = Player.REPEAT_MODE_ONE
|
||||
it.prepare()
|
||||
it.play()
|
||||
val currentPlayingAudio =
|
||||
CurrentPlayingAudio(
|
||||
audio.id,
|
||||
audio.name,
|
||||
audio.file,
|
||||
audio.image,
|
||||
audio.duration,
|
||||
val currentPlayingLocalAudio =
|
||||
CurrentPlayingLocalAudio(
|
||||
localAudio.id,
|
||||
localAudio.name,
|
||||
localAudio.file,
|
||||
localAudio.image,
|
||||
localAudio.duration,
|
||||
false
|
||||
)
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
ProApp.currentAudioManager.setCurrentPlayingAudio(currentPlayingAudio)
|
||||
ProApp.currentAudioManager.setCurrentPlayingAudio(currentPlayingLocalAudio)
|
||||
withContext(Dispatchers.Main) {
|
||||
ProApp.initCurrentPlayingAudio()//更新到入口变量中
|
||||
}
|
||||
@ -100,7 +100,7 @@ object MediaControllerManager {
|
||||
}
|
||||
}
|
||||
|
||||
fun setupMedia(context: Context, audio: CurrentPlayingAudio, listener: Player.Listener) {
|
||||
fun setupMedia(context: Context, audio: CurrentPlayingLocalAudio, listener: Player.Listener) {
|
||||
if (currentAudioFile != audio.file) {
|
||||
currentAudioFile = audio.file
|
||||
|
||||
@ -137,8 +137,8 @@ object MediaControllerManager {
|
||||
it.repeatMode = Player.REPEAT_MODE_ONE
|
||||
it.prepare()
|
||||
it.play()
|
||||
val currentPlayingAudio =
|
||||
CurrentPlayingAudio(
|
||||
val currentPlayingLocalAudio =
|
||||
CurrentPlayingLocalAudio(
|
||||
audio.id,
|
||||
audio.name,
|
||||
audio.file,
|
||||
@ -147,7 +147,7 @@ object MediaControllerManager {
|
||||
false
|
||||
)
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
ProApp.currentAudioManager.setCurrentPlayingAudio(currentPlayingAudio)
|
||||
ProApp.currentAudioManager.setCurrentPlayingAudio(currentPlayingLocalAudio)
|
||||
withContext(Dispatchers.Main) {
|
||||
ProApp.initCurrentPlayingAudio()//更新到入口变量中
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@ import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.widget.Toast
|
||||
|
||||
const val PRIVACY_POLICY_URL = "https://promusicapp.mystrikingly.com/privacy\n"
|
||||
const val PRIVACY_POLICY_URL = "https://promusicapp.mystrikingly.com/privacy"
|
||||
const val TERMS_OF_SERVICE_URL = "https://promusicapp.mystrikingly.com/terms"
|
||||
|
||||
const val EMAIL = "vivien11520@gmail.com"
|
||||
|
||||
@ -2,12 +2,12 @@ package com.offline.music.task.player.tools.util
|
||||
|
||||
import android.content.Context
|
||||
import android.media.MediaMetadataRetriever
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.db.bean.Category
|
||||
import com.offline.music.task.player.db.bean.ResourcesList
|
||||
import com.offline.music.task.player.db.bean.LocalResourcesList
|
||||
import org.json.JSONObject
|
||||
|
||||
fun parseResources(context: Context, jsonString: String): ResourcesList {
|
||||
fun parseResources(context: Context, jsonString: String): LocalResourcesList {
|
||||
val jsonObject = JSONObject(jsonString)
|
||||
val categoriesArray = jsonObject.getJSONArray("categories")
|
||||
val categories = mutableListOf<Category>()
|
||||
@ -16,28 +16,28 @@ fun parseResources(context: Context, jsonString: String): ResourcesList {
|
||||
val categoryObject = categoriesArray.getJSONObject(i)
|
||||
val categoryName = categoryObject.getString("name")
|
||||
val audiosArray = categoryObject.getJSONArray("audios")
|
||||
val audios = mutableListOf<Audio>()
|
||||
val localAudios = mutableListOf<LocalAudio>()
|
||||
|
||||
for (j in 0 until audiosArray.length()) {
|
||||
val audioObject = audiosArray.getJSONObject(j)
|
||||
val audioName = audioObject.getString("name")
|
||||
val audioFile = audioObject.getString("file")
|
||||
val audioImage = audioObject.getString("image")
|
||||
val audio = Audio(
|
||||
val localAudio = LocalAudio(
|
||||
audioName,
|
||||
audioFile,
|
||||
audioImage,
|
||||
getAudioDurationFromAssets(context, audioFile),
|
||||
false
|
||||
)
|
||||
audios.add(audio)
|
||||
localAudios.add(localAudio)
|
||||
}
|
||||
|
||||
val category = Category(categoryName, audios)
|
||||
val category = Category(categoryName, localAudios)
|
||||
categories.add(category)
|
||||
}
|
||||
|
||||
return ResourcesList(categories)
|
||||
return LocalResourcesList(categories)
|
||||
}
|
||||
|
||||
fun getAudioDurationFromAssets(context: Context, fileName: String): Long {
|
||||
|
||||
@ -14,7 +14,7 @@ import com.bumptech.glide.Glide
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.ActivityMainBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.tools.media.MediaControllerManager
|
||||
import com.offline.music.task.player.ui.fragment.HomeFragment
|
||||
@ -43,11 +43,11 @@ class MainActivity : BaseActivity() {
|
||||
super.onResume()
|
||||
val currentPlayer = MediaControllerManager.getController()
|
||||
|
||||
if (ProApp.currentPlayingAudio == null) {
|
||||
if (ProApp.currentPlayingLocalAudio == null) {
|
||||
binding.playingStatusLayout.visibility = View.GONE
|
||||
} else {
|
||||
binding.playingStatusLayout.visibility = View.VISIBLE
|
||||
val currentAudio = ProApp.currentPlayingAudio
|
||||
val currentAudio = ProApp.currentPlayingLocalAudio
|
||||
|
||||
val maxProgress = try {
|
||||
getAudioDurationFromAssets(this, currentAudio?.file!!)
|
||||
@ -94,7 +94,7 @@ class MainActivity : BaseActivity() {
|
||||
}
|
||||
|
||||
binding.playingStatusLayout.setOnClickListener {
|
||||
val currentAudio = ProApp.currentPlayingAudio
|
||||
val currentAudio = ProApp.currentPlayingLocalAudio
|
||||
val duration = try {
|
||||
getAudioDurationFromAssets(
|
||||
this, currentAudio?.file!!
|
||||
@ -103,7 +103,7 @@ class MainActivity : BaseActivity() {
|
||||
currentAudio?.duration!!
|
||||
}
|
||||
|
||||
val audio = Audio(
|
||||
val localAudio = LocalAudio(
|
||||
currentAudio?.name!!,
|
||||
currentAudio.file,
|
||||
currentAudio.image,
|
||||
@ -111,7 +111,7 @@ class MainActivity : BaseActivity() {
|
||||
false
|
||||
)
|
||||
val intent = Intent(this, PlayerActivity::class.java);
|
||||
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, localAudio)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
@ -128,7 +128,7 @@ class MainActivity : BaseActivity() {
|
||||
}
|
||||
updateProgressState()
|
||||
} else {
|
||||
MediaControllerManager.setupMedia(this@MainActivity, ProApp.currentPlayingAudio!!,
|
||||
MediaControllerManager.setupMedia(this@MainActivity, ProApp.currentPlayingLocalAudio!!,
|
||||
object : Player.Listener {
|
||||
override fun onPlayWhenReadyChanged(
|
||||
playWhenReady: Boolean,
|
||||
|
||||
@ -15,7 +15,7 @@ import com.google.android.material.slider.Slider.OnChangeListener
|
||||
import com.gyf.immersionbar.ktx.immersionBar
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.ActivityPlayDetailsBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.tools.util.containsContent
|
||||
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
@ -28,7 +28,7 @@ class PlayerActivity : BaseActivity() {
|
||||
}
|
||||
|
||||
private lateinit var binding: ActivityPlayDetailsBinding
|
||||
private var audio: Audio? = null
|
||||
private var localAudio: LocalAudio? = null
|
||||
private var rotationAnimator: ValueAnimator? = null
|
||||
|
||||
|
||||
@ -38,8 +38,8 @@ class PlayerActivity : BaseActivity() {
|
||||
binding = ActivityPlayDetailsBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
initImmersionBar()
|
||||
audio = intent.getSerializableExtra(KEY_DETAILS_AUDIO) as Audio?
|
||||
if (audio == null) {
|
||||
localAudio = intent.getSerializableExtra(KEY_DETAILS_AUDIO) as LocalAudio?
|
||||
if (localAudio == null) {
|
||||
onBackPressed()
|
||||
Toast.makeText(this, getString(R.string.data_error), Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
@ -57,22 +57,22 @@ class PlayerActivity : BaseActivity() {
|
||||
@OptIn(UnstableApi::class)
|
||||
private fun initView() {
|
||||
|
||||
if (audio?.image?.isNotEmpty() == true) {
|
||||
if (localAudio?.image?.isNotEmpty() == true) {
|
||||
Glide.with(this)
|
||||
.load("file:///android_asset/${audio?.image}")
|
||||
.load("file:///android_asset/${localAudio?.image}")
|
||||
.into(binding.image)
|
||||
} else {
|
||||
binding.image.setImageResource(R.mipmap.default_list_img)
|
||||
}
|
||||
binding.seekBar.value = 0f
|
||||
binding.nameTv.text = audio?.name
|
||||
binding.descTv.text = audio?.name
|
||||
binding.nameTv.text = localAudio?.name
|
||||
binding.descTv.text = localAudio?.name
|
||||
|
||||
if (containsContent(audio?.file!!)) {
|
||||
binding.totalDurationTv.text = convertMillisToMinutesAndSecondsString(audio?.duration!!)
|
||||
binding.seekBar.valueTo = audio?.duration!!.toFloat()
|
||||
if (containsContent(localAudio?.file!!)) {
|
||||
binding.totalDurationTv.text = convertMillisToMinutesAndSecondsString(localAudio?.duration!!)
|
||||
binding.seekBar.valueTo = localAudio?.duration!!.toFloat()
|
||||
} else {
|
||||
val s = getAudioDurationFromAssets(this, audio?.file!!)
|
||||
val s = getAudioDurationFromAssets(this, localAudio?.file!!)
|
||||
binding.totalDurationTv.text = convertMillisToMinutesAndSecondsString(s)
|
||||
|
||||
binding.seekBar.valueTo = s.toFloat()
|
||||
@ -109,7 +109,7 @@ class PlayerActivity : BaseActivity() {
|
||||
}
|
||||
}
|
||||
MediaControllerManager.setupMedia(this,
|
||||
audio!!,
|
||||
localAudio!!,
|
||||
object : Player.Listener {
|
||||
override fun onPlayWhenReadyChanged(
|
||||
playWhenReady: Boolean,
|
||||
|
||||
@ -9,14 +9,14 @@ import com.bumptech.glide.Glide
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.RealHumanVoiceLayoutBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||
|
||||
class HomeRecommendAdapter(
|
||||
private val context: Context,
|
||||
private val pdfList: List<Audio>,
|
||||
private val pdfList: List<LocalAudio>,
|
||||
) :
|
||||
RecyclerView.Adapter<HomeRecommendAdapter.PDFViewHolder>() {
|
||||
|
||||
@ -41,17 +41,17 @@ class HomeRecommendAdapter(
|
||||
inner class PDFViewHolder(private val binding: RealHumanVoiceLayoutBinding) :
|
||||
RecyclerView.ViewHolder(binding.root) {
|
||||
|
||||
fun bind(audio: Audio) {
|
||||
fun bind(localAudio: LocalAudio) {
|
||||
binding.apply {
|
||||
Glide.with(context)
|
||||
.load("file:///android_asset/${audio.image}")
|
||||
.load("file:///android_asset/${localAudio.image}")
|
||||
.into(realImg)
|
||||
name.text = audio.name
|
||||
val s = getAudioDurationFromAssets(context, audio.file)
|
||||
name.text = localAudio.name
|
||||
val s = getAudioDurationFromAssets(context, localAudio.file)
|
||||
desc.text = convertMillisToMinutesAndSecondsString(s)
|
||||
|
||||
if (ProApp.currentPlayingAudio != null) {
|
||||
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
||||
if (ProApp.currentPlayingLocalAudio != null) {
|
||||
if (ProApp.currentPlayingLocalAudio?.file == localAudio.file) {
|
||||
stateImg.setImageResource(R.drawable.playing_white_icon)
|
||||
name.setTextColor(context.getColor(R.color.blue))
|
||||
desc.setTextColor(context.getColor(R.color.blue))
|
||||
|
||||
@ -10,7 +10,7 @@ import com.bumptech.glide.Glide
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.SoundsOfNatureLayoutBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||
@ -18,7 +18,7 @@ import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||
|
||||
class HomeVoiceOfNatureAdapter(
|
||||
private val context: Context,
|
||||
private val pdfList: List<Audio>,
|
||||
private val pdfList: List<LocalAudio>,
|
||||
) :
|
||||
RecyclerView.Adapter<HomeVoiceOfNatureAdapter.PDFViewHolder>() {
|
||||
|
||||
@ -38,8 +38,8 @@ class HomeVoiceOfNatureAdapter(
|
||||
val s = getAudioDurationFromAssets(context, audio.file)
|
||||
desc.text = convertMillisToMinutesAndSecondsString(s)
|
||||
|
||||
if (ProApp.currentPlayingAudio != null) {
|
||||
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
||||
if (ProApp.currentPlayingLocalAudio != null) {
|
||||
if (ProApp.currentPlayingLocalAudio?.file == audio.file) {
|
||||
playingLayout.visibility = View.VISIBLE
|
||||
name.setTextColor(context.getColor(R.color.blue))
|
||||
desc.setTextColor(context.getColor(R.color.blue))
|
||||
|
||||
@ -10,14 +10,14 @@ import com.bumptech.glide.Glide
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.SoundsOfAppliancesLayoutBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||
|
||||
class HomeWhiteNoiseAdapter(
|
||||
private val context: Context,
|
||||
private val pdfList: List<Audio>,
|
||||
private val pdfList: List<LocalAudio>,
|
||||
) :
|
||||
RecyclerView.Adapter<HomeWhiteNoiseAdapter.PDFViewHolder>() {
|
||||
|
||||
@ -36,8 +36,8 @@ class HomeWhiteNoiseAdapter(
|
||||
val s = getAudioDurationFromAssets(context, audio.file)
|
||||
holder.binding.desc.text = convertMillisToMinutesAndSecondsString(s)
|
||||
|
||||
if (ProApp.currentPlayingAudio != null) {
|
||||
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
||||
if (ProApp.currentPlayingLocalAudio != null) {
|
||||
if (ProApp.currentPlayingLocalAudio?.file == audio.file) {
|
||||
holder.binding.playingLayout.visibility = View.VISIBLE
|
||||
holder.binding.name.setTextColor(context.getColor(R.color.blue))
|
||||
holder.binding.desc.setTextColor(context.getColor(R.color.blue))
|
||||
|
||||
@ -9,7 +9,7 @@ import androidx.recyclerview.widget.RecyclerView
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.ParentsVoiceLayoutBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.tools.util.containsContent
|
||||
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
@ -18,7 +18,7 @@ import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||
//LOGO
|
||||
class MeLocalSongAdapter(
|
||||
private val context: Context,
|
||||
private val pdfList: List<Audio>,
|
||||
private val pdfList: List<LocalAudio>,
|
||||
) :
|
||||
RecyclerView.Adapter<MeLocalSongAdapter.ViewHolder>() {
|
||||
|
||||
@ -42,20 +42,20 @@ class MeLocalSongAdapter(
|
||||
inner class ViewHolder(private val binding: ParentsVoiceLayoutBinding) :
|
||||
RecyclerView.ViewHolder(binding.root) {
|
||||
|
||||
fun bind(audio: Audio) {
|
||||
fun bind(localAudio: LocalAudio) {
|
||||
binding.apply {
|
||||
image.setImageResource(R.mipmap.default_list_img)
|
||||
name.text = audio.name
|
||||
name.text = localAudio.name
|
||||
name.requestFocus()
|
||||
if (containsContent(audio.file)) {
|
||||
desc.text = convertMillisToMinutesAndSecondsString(audio.duration)
|
||||
if (containsContent(localAudio.file)) {
|
||||
desc.text = convertMillisToMinutesAndSecondsString(localAudio.duration)
|
||||
} else {
|
||||
val s = getAudioDurationFromAssets(context, audio.file)
|
||||
val s = getAudioDurationFromAssets(context, localAudio.file)
|
||||
desc.text = convertMillisToMinutesAndSecondsString(s)
|
||||
}
|
||||
|
||||
if (ProApp.currentPlayingAudio != null) {
|
||||
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
||||
if (ProApp.currentPlayingLocalAudio != null) {
|
||||
if (ProApp.currentPlayingLocalAudio?.file == localAudio.file) {
|
||||
playingLayout.visibility = View.VISIBLE
|
||||
name.setTextColor(context.getColor(R.color.blue))
|
||||
desc.setTextColor(context.getColor(R.color.blue))
|
||||
|
||||
@ -45,9 +45,9 @@ class HomeFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun initView() {
|
||||
if (ProApp.resourcesList.categories.isNotEmpty()) {
|
||||
binding.soundsName.text = ProApp.resourcesList.categories[1].name
|
||||
binding.natureName.text = ProApp.resourcesList.categories[2].name
|
||||
if (ProApp.localResourcesList.categories.isNotEmpty()) {
|
||||
binding.soundsName.text = ProApp.localResourcesList.categories[1].name
|
||||
binding.natureName.text = ProApp.localResourcesList.categories[2].name
|
||||
}
|
||||
}
|
||||
|
||||
@ -80,10 +80,10 @@ class HomeFragment : Fragment() {
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
if (ProApp.currentPlayingAudio != null) {
|
||||
if (ProApp.currentPlayingLocalAudio != null) {
|
||||
if (ProApp.realHumanVoiceList.isNotEmpty()) {
|
||||
for ((index, audio) in ProApp.realHumanVoiceList.withIndex()) {
|
||||
if (audio.file == ProApp.currentPlayingAudio?.file) {
|
||||
if (audio.file == ProApp.currentPlayingLocalAudio?.file) {
|
||||
notifyDataSetChanged()
|
||||
break
|
||||
}
|
||||
@ -91,7 +91,7 @@ class HomeFragment : Fragment() {
|
||||
}
|
||||
if (ProApp.soundsOfAppliancesList.isNotEmpty()) {
|
||||
for ((index, audio) in ProApp.soundsOfAppliancesList.withIndex()) {
|
||||
if (audio.file == ProApp.currentPlayingAudio?.file) {
|
||||
if (audio.file == ProApp.currentPlayingLocalAudio?.file) {
|
||||
notifyDataSetChanged()
|
||||
break
|
||||
}
|
||||
@ -99,7 +99,7 @@ class HomeFragment : Fragment() {
|
||||
}
|
||||
if (ProApp.soundsOfNatureList.isNotEmpty()) {
|
||||
for ((index, audio) in ProApp.soundsOfNatureList.withIndex()) {
|
||||
if (audio.file == ProApp.currentPlayingAudio?.file) {
|
||||
if (audio.file == ProApp.currentPlayingLocalAudio?.file) {
|
||||
notifyDataSetChanged()
|
||||
break
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ import com.gyf.immersionbar.ktx.immersionBar
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.FragmentMeBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.LocalAudio
|
||||
import com.offline.music.task.player.ui.adapter.MeLocalSongAdapter
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@ -33,7 +33,7 @@ import kotlinx.coroutines.withContext
|
||||
class MeFragment : Fragment() {
|
||||
private lateinit var binding: FragmentMeBinding
|
||||
private var meLocalSongAdapter: MeLocalSongAdapter? = null
|
||||
private var importAdapterList: MutableList<Audio> = mutableListOf()
|
||||
private var importAdapterList: MutableList<LocalAudio> = mutableListOf()
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
@ -102,12 +102,12 @@ class MeFragment : Fragment() {
|
||||
binding.noContentLayout.visibility = View.VISIBLE
|
||||
}
|
||||
|
||||
if (ProApp.currentPlayingAudio != null) {
|
||||
if (ProApp.currentPlayingLocalAudio != null) {
|
||||
if (ProApp.importList.isNotEmpty()) {
|
||||
importAdapterList.clear()
|
||||
importAdapterList.addAll(ProApp.importList)
|
||||
for ((index, audio) in importAdapterList.withIndex()) {
|
||||
if (audio.file == ProApp.currentPlayingAudio?.file) {
|
||||
if (audio.file == ProApp.currentPlayingLocalAudio?.file) {
|
||||
meLocalSongAdapter?.notifyDataSetChanged()
|
||||
break
|
||||
}
|
||||
@ -181,15 +181,15 @@ class MeFragment : Fragment() {
|
||||
id
|
||||
)
|
||||
val duration2 = getAudioDuration(contentUri)
|
||||
val audio = Audio(name, contentUri.toString(), "", duration2, false)
|
||||
val localAudio = LocalAudio(name, contentUri.toString(), "", duration2, false)
|
||||
|
||||
musicFiles.add(contentUri.toString())
|
||||
// 如果你想要获取文件的具体路径,可以使用 data 变量
|
||||
// musicFiles.add(data)
|
||||
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
if (audio.duration > 0) {
|
||||
ProApp.databaseManager.insertAudioFile(audio)
|
||||
if (localAudio.duration > 0) {
|
||||
ProApp.databaseManager.insertAudioFile(localAudio)
|
||||
}
|
||||
withContext(Dispatchers.Main) {
|
||||
ProApp.initImportAudio {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user