This commit is contained in:
ocean 2024-06-05 10:54:38 +08:00
parent e11a767758
commit b228b719ca
22 changed files with 159 additions and 159 deletions

View File

@ -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
} }
} }
} }

View File

@ -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

View File

@ -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,

View File

@ -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)
} }

View File

@ -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,

View File

@ -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>
} }

View File

@ -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

View File

@ -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
} }

View File

@ -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
} }

View File

@ -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)
} }
} }

View File

@ -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()
} }

View File

@ -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()//更新到入口变量中
} }

View File

@ -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"

View File

@ -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 {

View File

@ -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,

View File

@ -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,

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -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
} }

View File

@ -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 {