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