update
This commit is contained in:
parent
3f389e24e9
commit
e11a767758
@ -28,7 +28,7 @@
|
||||
tools:targetApi="31">
|
||||
|
||||
<activity
|
||||
android:name=".ui.activity.LaunchActivity"
|
||||
android:name=".ui.activity.SplashActivity"
|
||||
android:exported="true"
|
||||
android:screenOrientation="portrait">
|
||||
<intent-filter>
|
||||
@ -41,7 +41,7 @@
|
||||
android:name=".ui.activity.MainActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
<activity
|
||||
android:name=".ui.activity.PlayDetailsActivity"
|
||||
android:name=".ui.activity.PlayerActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
<activity
|
||||
android:name=".ui.activity.AboutActivity"
|
||||
|
||||
@ -8,7 +8,7 @@ import com.offline.music.task.player.db.bean.ResourcesList
|
||||
import com.offline.music.task.player.db.tools.CurrentAudioManager
|
||||
import com.offline.music.task.player.db.tools.DatabaseManager
|
||||
import com.offline.music.task.player.tools.media.MediaControllerManager
|
||||
import com.offline.music.task.player.tools.parseResources
|
||||
import com.offline.music.task.player.tools.util.parseResources
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@ -1,38 +0,0 @@
|
||||
package com.offline.music.task.player.db.tools
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import androidx.room.Room
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class CollectViewModel : ViewModel() {
|
||||
private var likeData: MutableLiveData<List<Audio>> = MutableLiveData<List<Audio>>()
|
||||
|
||||
private val database = Room.databaseBuilder(
|
||||
ProApp.appContext, AppDatabase::class.java, "local_audio_viewer_database"
|
||||
).build()
|
||||
|
||||
private val audioFileDao = database.localAudioDao()
|
||||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
likeData.value = audioFileDao.getCollectData()
|
||||
}
|
||||
}
|
||||
|
||||
fun update() {
|
||||
viewModelScope.launch {
|
||||
likeData.value = audioFileDao.getCollectData()
|
||||
}
|
||||
}
|
||||
|
||||
fun getList() = likeData
|
||||
|
||||
override fun onCleared() {
|
||||
super.onCleared()
|
||||
}
|
||||
|
||||
}
|
||||
@ -16,7 +16,7 @@ import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.db.bean.CurrentPlayingAudio
|
||||
import com.offline.music.task.player.service.LocalPlaybackService
|
||||
import com.offline.music.task.player.tools.containsContent
|
||||
import com.offline.music.task.player.tools.util.containsContent
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@ -1,66 +0,0 @@
|
||||
package com.offline.music.task.player.tools.sp
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import androidx.core.content.edit
|
||||
import kotlin.properties.ReadWriteProperty
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
class SharedPreferencesHelper(context: Context) {
|
||||
companion object {
|
||||
const val CURRENT_PLAYING_AUDIO = "current_playing_audio"
|
||||
}
|
||||
|
||||
private val preferences: SharedPreferences = context.getSharedPreferences(context.packageName, Context.MODE_PRIVATE)
|
||||
|
||||
var currentPlayingAudio: Boolean by preferences.boolean(
|
||||
key = CURRENT_PLAYING_AUDIO,
|
||||
defaultValue = false
|
||||
)
|
||||
|
||||
private inline fun <reified T : Any> SharedPreferences.boolean(
|
||||
key: String,
|
||||
defaultValue: T
|
||||
): ReadWriteProperty<Any, T> {
|
||||
return object : ReadWriteProperty<Any, T> {
|
||||
override fun getValue(thisRef: Any, property: KProperty<*>): T {
|
||||
return when (T::class) {
|
||||
Boolean::class -> getBoolean(key, defaultValue as Boolean) as T
|
||||
else -> throw IllegalArgumentException("Unsupported type")
|
||||
}
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
|
||||
edit {
|
||||
when (T::class) {
|
||||
Boolean::class -> putBoolean(key, value as Boolean)
|
||||
else -> throw IllegalArgumentException("Unsupported type")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private inline fun <reified T : Any> SharedPreferences.string(
|
||||
key: String,
|
||||
defaultValue: T
|
||||
): ReadWriteProperty<Any, T> {
|
||||
return object : ReadWriteProperty<Any, T> {
|
||||
override fun getValue(thisRef: Any, property: KProperty<*>): T {
|
||||
return when (T::class) {
|
||||
String::class -> getString(key, defaultValue as String) as T
|
||||
else -> throw IllegalArgumentException("Unsupported type")
|
||||
}
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
|
||||
edit {
|
||||
when (T::class) {
|
||||
String::class -> putString(key, value as String)
|
||||
else -> throw IllegalArgumentException("Unsupported type")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package com.offline.music.task.player.tools
|
||||
package com.offline.music.task.player.tools.util
|
||||
|
||||
import android.content.Context
|
||||
import android.content.pm.PackageManager
|
||||
@ -1,4 +1,4 @@
|
||||
package com.offline.music.task.player.tools
|
||||
package com.offline.music.task.player.tools.util
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Rect
|
||||
@ -1,4 +1,4 @@
|
||||
package com.offline.music.task.player.tools
|
||||
package com.offline.music.task.player.tools.util
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Rect
|
||||
@ -1,4 +1,4 @@
|
||||
package com.offline.music.task.player.tools
|
||||
package com.offline.music.task.player.tools.util
|
||||
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.content.Context
|
||||
@ -1,4 +1,4 @@
|
||||
package com.offline.music.task.player.tools
|
||||
package com.offline.music.task.player.tools.util
|
||||
|
||||
import android.content.Context
|
||||
import android.media.MediaMetadataRetriever
|
||||
@ -4,7 +4,7 @@ import android.os.Bundle
|
||||
import com.gyf.immersionbar.ktx.immersionBar
|
||||
import com.offline.music.task.player.databinding.ActivityAboutBinding
|
||||
|
||||
import com.offline.music.task.player.tools.getAppVersion
|
||||
import com.offline.music.task.player.tools.util.getAppVersion
|
||||
|
||||
class AboutActivity : BaseActivity() {
|
||||
|
||||
|
||||
@ -15,7 +15,7 @@ import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.ActivityMainBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.tools.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.ui.fragment.HomeFragment
|
||||
import com.offline.music.task.player.ui.fragment.MeFragment
|
||||
@ -110,8 +110,8 @@ class MainActivity : BaseActivity() {
|
||||
duration,
|
||||
false
|
||||
)
|
||||
val intent = Intent(this, PlayDetailsActivity::class.java);
|
||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
||||
val intent = Intent(this, PlayerActivity::class.java);
|
||||
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
|
||||
@ -16,12 +16,12 @@ import com.gyf.immersionbar.ktx.immersionBar
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.ActivityPlayDetailsBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.tools.containsContent
|
||||
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.tools.util.containsContent
|
||||
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.tools.media.MediaControllerManager
|
||||
|
||||
class PlayDetailsActivity : BaseActivity() {
|
||||
class PlayerActivity : BaseActivity() {
|
||||
|
||||
companion object {
|
||||
const val KEY_DETAILS_AUDIO = "key_details_audio"
|
||||
@ -9,7 +9,7 @@ import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class LaunchActivity : BaseActivity() {
|
||||
class SplashActivity : BaseActivity() {
|
||||
private lateinit var binding: ActivityLaunchBinding
|
||||
private val coroutineScope = CoroutineScope(Dispatchers.Main)
|
||||
private val countTime: Long = 3000
|
||||
@ -10,15 +10,15 @@ import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.RealHumanVoiceLayoutBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayDetailsActivity
|
||||
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||
|
||||
class RealHumanVoiceAdapter(
|
||||
class HomeRecommendAdapter(
|
||||
private val context: Context,
|
||||
private val pdfList: List<Audio>,
|
||||
) :
|
||||
RecyclerView.Adapter<RealHumanVoiceAdapter.PDFViewHolder>() {
|
||||
RecyclerView.Adapter<HomeRecommendAdapter.PDFViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
||||
val binding =
|
||||
@ -30,8 +30,8 @@ class RealHumanVoiceAdapter(
|
||||
val audio = pdfList[position]
|
||||
holder.bind(audio)
|
||||
holder.itemView.setOnClickListener {
|
||||
val intent = Intent(context, PlayDetailsActivity::class.java);
|
||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
||||
val intent = Intent(context, PlayerActivity::class.java);
|
||||
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||
context.startActivity(intent)
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,64 @@
|
||||
package com.offline.music.task.player.ui.adapter
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.bumptech.glide.Glide
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.SoundsOfNatureLayoutBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||
|
||||
|
||||
class HomeVoiceOfNatureAdapter(
|
||||
private val context: Context,
|
||||
private val pdfList: List<Audio>,
|
||||
) :
|
||||
RecyclerView.Adapter<HomeVoiceOfNatureAdapter.PDFViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
||||
val binding =
|
||||
SoundsOfNatureLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
||||
return PDFViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: PDFViewHolder, position: Int) {
|
||||
val audio = pdfList[position]
|
||||
holder.binding.apply {
|
||||
Glide.with(context)
|
||||
.load("file:///android_asset/${audio.image}")
|
||||
.into(image)
|
||||
name.text = audio.name
|
||||
val s = getAudioDurationFromAssets(context, audio.file)
|
||||
desc.text = convertMillisToMinutesAndSecondsString(s)
|
||||
|
||||
if (ProApp.currentPlayingAudio != null) {
|
||||
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
||||
playingLayout.visibility = View.VISIBLE
|
||||
name.setTextColor(context.getColor(R.color.blue))
|
||||
desc.setTextColor(context.getColor(R.color.blue))
|
||||
} else {
|
||||
playingLayout.visibility = View.GONE
|
||||
name.setTextColor(context.getColor(R.color.white))
|
||||
desc.setTextColor(context.getColor(R.color.white_60))
|
||||
}
|
||||
}
|
||||
}
|
||||
holder.itemView.setOnClickListener {
|
||||
val intent = Intent(context, PlayerActivity::class.java);
|
||||
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||
context.startActivity(intent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = pdfList.size
|
||||
|
||||
inner class PDFViewHolder(val binding: SoundsOfNatureLayoutBinding) :
|
||||
RecyclerView.ViewHolder(binding.root)
|
||||
}
|
||||
@ -0,0 +1,71 @@
|
||||
package com.offline.music.task.player.ui.adapter
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.bumptech.glide.Glide
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.SoundsOfAppliancesLayoutBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||
|
||||
class HomeWhiteNoiseAdapter(
|
||||
private val context: Context,
|
||||
private val pdfList: List<Audio>,
|
||||
) :
|
||||
RecyclerView.Adapter<HomeWhiteNoiseAdapter.PDFViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
||||
val binding =
|
||||
SoundsOfAppliancesLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
||||
return PDFViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: PDFViewHolder, position: Int) {
|
||||
val audio = pdfList[position]
|
||||
Glide.with(context)
|
||||
.load("file:///android_asset/${audio.image}")
|
||||
.into(holder.binding.image)
|
||||
holder.binding.name.text = audio.name
|
||||
val s = getAudioDurationFromAssets(context, audio.file)
|
||||
holder.binding.desc.text = convertMillisToMinutesAndSecondsString(s)
|
||||
|
||||
if (ProApp.currentPlayingAudio != null) {
|
||||
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
||||
holder.binding.playingLayout.visibility = View.VISIBLE
|
||||
holder.binding.name.setTextColor(context.getColor(R.color.blue))
|
||||
holder.binding.desc.setTextColor(context.getColor(R.color.blue))
|
||||
} else {
|
||||
holder.binding.playingLayout.visibility = View.GONE
|
||||
holder.binding.name.setTextColor(context.getColor(R.color.white))
|
||||
holder.binding.desc.setTextColor(context.getColor(R.color.white_60))
|
||||
}
|
||||
}
|
||||
holder.itemView.setOnClickListener {
|
||||
val intent = Intent(context, PlayerActivity::class.java);
|
||||
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||
context.startActivity(intent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = pdfList.size
|
||||
|
||||
inner class PDFViewHolder(val binding: SoundsOfAppliancesLayoutBinding) :
|
||||
RecyclerView.ViewHolder(binding.root)
|
||||
|
||||
private var itemClickListener: OnItemClickListener? = null
|
||||
|
||||
fun setOnItemClickListener(listener: OnItemClickListener) {
|
||||
itemClickListener = listener
|
||||
}
|
||||
|
||||
interface OnItemClickListener {
|
||||
fun onItemClick(position: Int)
|
||||
}
|
||||
}
|
||||
@ -10,17 +10,17 @@ import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.ParentsVoiceLayoutBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.tools.containsContent
|
||||
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayDetailsActivity
|
||||
import com.offline.music.task.player.tools.util.containsContent
|
||||
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||
|
||||
//LOGO
|
||||
class ParentsVoiceAdapter(
|
||||
class MeLocalSongAdapter(
|
||||
private val context: Context,
|
||||
private val pdfList: List<Audio>,
|
||||
) :
|
||||
RecyclerView.Adapter<ParentsVoiceAdapter.ViewHolder>() {
|
||||
RecyclerView.Adapter<MeLocalSongAdapter.ViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
val binding = ParentsVoiceLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
||||
@ -31,8 +31,8 @@ class ParentsVoiceAdapter(
|
||||
val audio = pdfList[position]
|
||||
holder.bind(audio)
|
||||
holder.itemView.setOnClickListener {
|
||||
val intent = Intent(context, PlayDetailsActivity::class.java);
|
||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
||||
val intent = Intent(context, PlayerActivity::class.java);
|
||||
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||
context.startActivity(intent)
|
||||
}
|
||||
}
|
||||
@ -1,79 +0,0 @@
|
||||
package com.offline.music.task.player.ui.adapter
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.bumptech.glide.Glide
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.SoundsOfAppliancesLayoutBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayDetailsActivity
|
||||
|
||||
class SoundsOfAppliancesAdapter(
|
||||
private val context: Context,
|
||||
private val pdfList: List<Audio>,
|
||||
) :
|
||||
RecyclerView.Adapter<SoundsOfAppliancesAdapter.PDFViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
||||
val binding =
|
||||
SoundsOfAppliancesLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
||||
return PDFViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: PDFViewHolder, position: Int) {
|
||||
val audio = pdfList[position]
|
||||
holder.bind(audio)
|
||||
holder.itemView.setOnClickListener {
|
||||
val intent = Intent(context, PlayDetailsActivity::class.java);
|
||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
||||
context.startActivity(intent)
|
||||
// mediaPlayer.setDataSource(this, Uri.parse("file:///android_asset/${audio.file}"))
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = pdfList.size
|
||||
|
||||
inner class PDFViewHolder(private val binding: SoundsOfAppliancesLayoutBinding) :
|
||||
RecyclerView.ViewHolder(binding.root) {
|
||||
|
||||
fun bind(audio: Audio) {
|
||||
binding.apply {
|
||||
Glide.with(context)
|
||||
.load("file:///android_asset/${audio.image}")
|
||||
.into(image)
|
||||
name.text = audio.name
|
||||
val s = getAudioDurationFromAssets(context, audio.file)
|
||||
desc.text = convertMillisToMinutesAndSecondsString(s)
|
||||
|
||||
if (ProApp.currentPlayingAudio != null) {
|
||||
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
||||
playingLayout.visibility = View.VISIBLE
|
||||
name.setTextColor(context.getColor(R.color.blue))
|
||||
desc.setTextColor(context.getColor(R.color.blue))
|
||||
} else {
|
||||
playingLayout.visibility = View.GONE
|
||||
name.setTextColor(context.getColor(R.color.white))
|
||||
desc.setTextColor(context.getColor(R.color.white_60))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var itemClickListener: OnItemClickListener? = null
|
||||
|
||||
fun setOnItemClickListener(listener: OnItemClickListener) {
|
||||
itemClickListener = listener
|
||||
}
|
||||
|
||||
interface OnItemClickListener {
|
||||
fun onItemClick(position: Int)
|
||||
}
|
||||
}
|
||||
@ -1,80 +0,0 @@
|
||||
package com.offline.music.task.player.ui.adapter
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.bumptech.glide.Glide
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.SoundsOfNatureLayoutBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString
|
||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
||||
import com.offline.music.task.player.ui.activity.PlayDetailsActivity
|
||||
|
||||
|
||||
class SoundsOfNatureAdapter(
|
||||
private val context: Context,
|
||||
private val pdfList: List<Audio>,
|
||||
) :
|
||||
RecyclerView.Adapter<SoundsOfNatureAdapter.PDFViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
||||
val binding =
|
||||
SoundsOfNatureLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
||||
return PDFViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: PDFViewHolder, position: Int) {
|
||||
val audio = pdfList[position]
|
||||
holder.bind(audio)
|
||||
holder.itemView.setOnClickListener {
|
||||
val intent = Intent(context, PlayDetailsActivity::class.java);
|
||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
||||
context.startActivity(intent)
|
||||
// mediaPlayer.setDataSource(this, Uri.parse("file:///android_asset/${audio.file}"))
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = pdfList.size
|
||||
|
||||
inner class PDFViewHolder(private val binding: SoundsOfNatureLayoutBinding) :
|
||||
RecyclerView.ViewHolder(binding.root) {
|
||||
|
||||
fun bind(audio: Audio) {
|
||||
binding.apply {
|
||||
Glide.with(context)
|
||||
.load("file:///android_asset/${audio.image}")
|
||||
.into(image)
|
||||
name.text = audio.name
|
||||
val s = getAudioDurationFromAssets(context, audio.file)
|
||||
desc.text = convertMillisToMinutesAndSecondsString(s)
|
||||
|
||||
if (ProApp.currentPlayingAudio != null) {
|
||||
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
||||
playingLayout.visibility = View.VISIBLE
|
||||
name.setTextColor(context.getColor(R.color.blue))
|
||||
desc.setTextColor(context.getColor(R.color.blue))
|
||||
} else {
|
||||
playingLayout.visibility = View.GONE
|
||||
name.setTextColor(context.getColor(R.color.white))
|
||||
desc.setTextColor(context.getColor(R.color.white_60))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var itemClickListener: OnItemClickListener? = null
|
||||
|
||||
fun setOnItemClickListener(listener: OnItemClickListener) {
|
||||
itemClickListener = listener
|
||||
}
|
||||
|
||||
interface OnItemClickListener {
|
||||
fun onItemClick(position: Int)
|
||||
}
|
||||
}
|
||||
@ -11,17 +11,17 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.gyf.immersionbar.ktx.immersionBar
|
||||
import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.databinding.FragmentHome2Binding
|
||||
import com.offline.music.task.player.tools.GridSpacingItemDecoration
|
||||
import com.offline.music.task.player.tools.HorizontalSpaceItemDecoration
|
||||
import com.offline.music.task.player.ui.adapter.RealHumanVoiceAdapter
|
||||
import com.offline.music.task.player.ui.adapter.SoundsOfAppliancesAdapter
|
||||
import com.offline.music.task.player.ui.adapter.SoundsOfNatureAdapter
|
||||
import com.offline.music.task.player.tools.util.GridSpacingItemDecoration
|
||||
import com.offline.music.task.player.tools.util.HorizontalSpaceItemDecoration
|
||||
import com.offline.music.task.player.ui.adapter.HomeRecommendAdapter
|
||||
import com.offline.music.task.player.ui.adapter.HomeWhiteNoiseAdapter
|
||||
import com.offline.music.task.player.ui.adapter.HomeVoiceOfNatureAdapter
|
||||
|
||||
class HomeFragment : Fragment() {
|
||||
private lateinit var binding: FragmentHome2Binding
|
||||
private var realHumanVoiceAdapter: RealHumanVoiceAdapter? = null
|
||||
private var soundsOfAppliancesAdapter: SoundsOfAppliancesAdapter? = null
|
||||
private var soundsOfNatureAdapter: SoundsOfNatureAdapter? = null
|
||||
private var homeRecommendAdapter: HomeRecommendAdapter? = null
|
||||
private var homeWhiteNoiseAdapter: HomeWhiteNoiseAdapter? = null
|
||||
private var homeVoiceOfNatureAdapter: HomeVoiceOfNatureAdapter? = null
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
@ -53,27 +53,27 @@ class HomeFragment : Fragment() {
|
||||
|
||||
private fun initData(){
|
||||
if (ProApp.realHumanVoiceList.isNotEmpty()) {
|
||||
realHumanVoiceAdapter = RealHumanVoiceAdapter(requireActivity(), ProApp.realHumanVoiceList)
|
||||
homeRecommendAdapter = HomeRecommendAdapter(requireActivity(), ProApp.realHumanVoiceList)
|
||||
binding.realRv.layoutManager =
|
||||
LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false)
|
||||
binding.realRv.addItemDecoration(HorizontalSpaceItemDecoration(requireActivity()))
|
||||
binding.realRv.adapter = realHumanVoiceAdapter
|
||||
binding.realRv.adapter = homeRecommendAdapter
|
||||
}
|
||||
if (ProApp.soundsOfAppliancesList.isNotEmpty()) {
|
||||
soundsOfAppliancesAdapter =
|
||||
SoundsOfAppliancesAdapter(requireActivity(), ProApp.soundsOfAppliancesList)
|
||||
homeWhiteNoiseAdapter =
|
||||
HomeWhiteNoiseAdapter(requireActivity(), ProApp.soundsOfAppliancesList)
|
||||
binding.soundsRv.layoutManager =
|
||||
LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false)
|
||||
binding.soundsRv.addItemDecoration(HorizontalSpaceItemDecoration(requireActivity()))
|
||||
binding.soundsRv.adapter = soundsOfAppliancesAdapter
|
||||
binding.soundsRv.adapter = homeWhiteNoiseAdapter
|
||||
}
|
||||
if (ProApp.soundsOfNatureList.isNotEmpty()) {
|
||||
soundsOfNatureAdapter =
|
||||
SoundsOfNatureAdapter(requireActivity(), ProApp.soundsOfNatureList)
|
||||
homeVoiceOfNatureAdapter =
|
||||
HomeVoiceOfNatureAdapter(requireActivity(), ProApp.soundsOfNatureList)
|
||||
binding.natureRv.layoutManager =
|
||||
GridLayoutManager(requireActivity(), 3, GridLayoutManager.HORIZONTAL, false)
|
||||
binding.natureRv.addItemDecoration(GridSpacingItemDecoration(requireActivity(), 10, 3))
|
||||
binding.natureRv.adapter = soundsOfNatureAdapter
|
||||
binding.natureRv.adapter = homeVoiceOfNatureAdapter
|
||||
}
|
||||
}
|
||||
|
||||
@ -118,9 +118,9 @@ class HomeFragment : Fragment() {
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
private fun notifyDataSetChanged(){
|
||||
soundsOfAppliancesAdapter?.notifyDataSetChanged()
|
||||
realHumanVoiceAdapter?.notifyDataSetChanged()
|
||||
soundsOfNatureAdapter?.notifyDataSetChanged()
|
||||
homeWhiteNoiseAdapter?.notifyDataSetChanged()
|
||||
homeRecommendAdapter?.notifyDataSetChanged()
|
||||
homeVoiceOfNatureAdapter?.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
}
|
||||
@ -24,7 +24,7 @@ import com.offline.music.task.player.ProApp
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.FragmentMeBinding
|
||||
import com.offline.music.task.player.db.bean.Audio
|
||||
import com.offline.music.task.player.ui.adapter.ParentsVoiceAdapter
|
||||
import com.offline.music.task.player.ui.adapter.MeLocalSongAdapter
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
@ -32,7 +32,7 @@ import kotlinx.coroutines.withContext
|
||||
|
||||
class MeFragment : Fragment() {
|
||||
private lateinit var binding: FragmentMeBinding
|
||||
private var parentsVoiceAdapter: ParentsVoiceAdapter? = null
|
||||
private var meLocalSongAdapter: MeLocalSongAdapter? = null
|
||||
private var importAdapterList: MutableList<Audio> = mutableListOf()
|
||||
|
||||
override fun onCreateView(
|
||||
@ -57,10 +57,10 @@ class MeFragment : Fragment() {
|
||||
}
|
||||
importAdapterList.clear()
|
||||
importAdapterList.addAll(ProApp.importList)
|
||||
parentsVoiceAdapter = ParentsVoiceAdapter(requireActivity(), importAdapterList)
|
||||
meLocalSongAdapter = MeLocalSongAdapter(requireActivity(), importAdapterList)
|
||||
binding.importRv.layoutManager =
|
||||
LinearLayoutManager(requireActivity(), LinearLayoutManager.VERTICAL, false)
|
||||
binding.importRv.adapter = parentsVoiceAdapter
|
||||
binding.importRv.adapter = meLocalSongAdapter
|
||||
}
|
||||
|
||||
private var requestPermissionLauncher =
|
||||
@ -108,7 +108,7 @@ class MeFragment : Fragment() {
|
||||
importAdapterList.addAll(ProApp.importList)
|
||||
for ((index, audio) in importAdapterList.withIndex()) {
|
||||
if (audio.file == ProApp.currentPlayingAudio?.file) {
|
||||
parentsVoiceAdapter?.notifyDataSetChanged()
|
||||
meLocalSongAdapter?.notifyDataSetChanged()
|
||||
break
|
||||
}
|
||||
}
|
||||
@ -195,7 +195,7 @@ class MeFragment : Fragment() {
|
||||
ProApp.initImportAudio {
|
||||
importAdapterList.clear()
|
||||
importAdapterList.addAll(ProApp.importList)
|
||||
parentsVoiceAdapter?.notifyDataSetChanged()
|
||||
meLocalSongAdapter?.notifyDataSetChanged()
|
||||
if (importAdapterList.isNotEmpty()) {
|
||||
binding.noContentLayout.visibility = View.GONE
|
||||
} else {
|
||||
|
||||
@ -9,13 +9,13 @@ import androidx.fragment.app.Fragment
|
||||
import com.gyf.immersionbar.ktx.immersionBar
|
||||
import com.offline.music.task.player.R
|
||||
import com.offline.music.task.player.databinding.FragmentSettingBinding
|
||||
import com.offline.music.task.player.tools.EMAIL
|
||||
import com.offline.music.task.player.tools.PRIVACY_POLICY_URL
|
||||
import com.offline.music.task.player.tools.TERMS_OF_SERVICE_URL
|
||||
import com.offline.music.task.player.tools.openPrivacyPolicy
|
||||
import com.offline.music.task.player.tools.openTermsOfService
|
||||
import com.offline.music.task.player.tools.sendFeedback
|
||||
import com.offline.music.task.player.tools.shareApp
|
||||
import com.offline.music.task.player.tools.util.EMAIL
|
||||
import com.offline.music.task.player.tools.util.PRIVACY_POLICY_URL
|
||||
import com.offline.music.task.player.tools.util.TERMS_OF_SERVICE_URL
|
||||
import com.offline.music.task.player.tools.util.openPrivacyPolicy
|
||||
import com.offline.music.task.player.tools.util.openTermsOfService
|
||||
import com.offline.music.task.player.tools.util.sendFeedback
|
||||
import com.offline.music.task.player.tools.util.shareApp
|
||||
import com.offline.music.task.player.ui.activity.AboutActivity
|
||||
|
||||
class SettingsFragment : Fragment() {
|
||||
|
||||
@ -6,7 +6,7 @@ import android.renderscript.*
|
||||
import android.util.AttributeSet
|
||||
import android.widget.FrameLayout
|
||||
|
||||
class BlurLayout : FrameLayout {
|
||||
class BlurLayoutView : FrameLayout {
|
||||
private var blurRadius = 25f // 默认模糊半径
|
||||
private val cornerRadius = dpToPx(18) // 圆角半径
|
||||
constructor(context: Context) : super(context)
|
||||
@ -1,62 +0,0 @@
|
||||
package com.offline.music.task.player.ui.view
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Color
|
||||
import android.graphics.LinearGradient
|
||||
import android.graphics.Paint
|
||||
import android.graphics.RectF
|
||||
import android.graphics.Shader
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
|
||||
class CustomProgressBar(context: Context, attrs: AttributeSet?) : View(context, attrs) {
|
||||
private var progress = 0 // 当前进度
|
||||
private val maxProgress = 100 // 最大进度
|
||||
private val progressBarHeight = 20f // 进度条高度
|
||||
private val cornerRadius = 10f // 圆角半径
|
||||
private val backgroundColor = Color.parseColor("#26FFFFFF")
|
||||
private val startColor = Color.parseColor("#FF1CC8EE") // 起始颜色
|
||||
private val middleColor = Color.parseColor("#FF69FE73") // 中间颜色
|
||||
private val endColor = Color.parseColor("#FFCBD64B") // 结束颜色
|
||||
private val paint = Paint()
|
||||
private val paintTow = Paint()
|
||||
|
||||
init {
|
||||
paint.style = Paint.Style.FILL
|
||||
paint.isAntiAlias = true
|
||||
paintTow.style = Paint.Style.FILL
|
||||
paintTow.isAntiAlias = true
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
super.onDraw(canvas)
|
||||
// 绘制底色矩形
|
||||
paint.shader = null // 重置着色器
|
||||
paint.color = backgroundColor
|
||||
val backgroundRect = RectF(0f, (height / 2 - progressBarHeight / 2), width.toFloat(), (height / 2 + progressBarHeight / 2))
|
||||
canvas.drawRoundRect(backgroundRect, cornerRadius, cornerRadius, paint)
|
||||
|
||||
|
||||
// 计算进度条的宽度
|
||||
val progressBarWidth = (width * progress.toFloat() / maxProgress).toInt()
|
||||
|
||||
// 创建颜色渐变对象
|
||||
val gradient = LinearGradient(0f, 0f, width.toFloat(), 0f, intArrayOf(startColor, middleColor, endColor), null, Shader.TileMode.CLAMP)
|
||||
paintTow.shader = gradient
|
||||
|
||||
// 绘制带圆角的进度条矩形
|
||||
val rect = RectF(0f, (height / 2 - progressBarHeight / 2), progressBarWidth.toFloat(), (height / 2 + progressBarHeight / 2))
|
||||
canvas.drawRoundRect(rect, cornerRadius, cornerRadius, paintTow)
|
||||
}
|
||||
|
||||
fun getProgress():Int{
|
||||
return progress
|
||||
}
|
||||
|
||||
// 设置进度
|
||||
fun setProgress(progress: Int) {
|
||||
this.progress = progress
|
||||
invalidate() // 请求重绘
|
||||
}
|
||||
}
|
||||
@ -1,52 +0,0 @@
|
||||
package com.offline.music.task.player.ui.view
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Color
|
||||
import android.graphics.Paint
|
||||
import android.graphics.PorterDuff
|
||||
import android.graphics.PorterDuffXfermode
|
||||
import android.graphics.Rect
|
||||
import android.graphics.RectF
|
||||
import android.util.AttributeSet
|
||||
import android.widget.RelativeLayout
|
||||
|
||||
class RadiusLayout : RelativeLayout {
|
||||
private val cornerRadius = dpToPx(18) // 圆角半径
|
||||
constructor(context: Context) : super(context)
|
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
|
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(
|
||||
context,
|
||||
attrs,
|
||||
defStyleAttr
|
||||
)
|
||||
|
||||
override fun dispatchDraw(canvas: Canvas) {
|
||||
// 创建一个 Bitmap 用于绘制原始内容
|
||||
val originalBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
||||
val originalCanvas = Canvas(originalBitmap)
|
||||
// 调用父类的 dispatchDraw() 方法,把所有的子 View 绘制到这个 Bitmap 上
|
||||
super.dispatchDraw(originalCanvas)
|
||||
// 绘制原始内容
|
||||
canvas.drawBitmap(originalBitmap, 0f, 0f, null)
|
||||
// 创建一个画笔
|
||||
val paint = Paint()
|
||||
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)
|
||||
|
||||
// 定义整个布局的矩形区域
|
||||
val layoutRect = Rect(0, 0, width, height)
|
||||
val rectF = RectF(layoutRect)
|
||||
// 绘制具有圆角的矩形作为背景
|
||||
paint.color = Color.parseColor("#CCffffff") // 半透明黑色
|
||||
paint.isAntiAlias = true
|
||||
canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paint)
|
||||
}
|
||||
|
||||
private fun dpToPx(dp: Int): Float {
|
||||
val density = resources.displayMetrics.density
|
||||
return (dp * density)
|
||||
}
|
||||
}
|
||||
@ -5,7 +5,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/white"
|
||||
tools:context=".ui.activity.LaunchActivity">
|
||||
tools:context=".ui.activity.SplashActivity">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
android:layout_width="166dp"
|
||||
android:layout_height="140dp">
|
||||
|
||||
<com.offline.music.task.player.ui.view.BlurLayout
|
||||
<com.offline.music.task.player.ui.view.BlurLayoutView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="centerCrop" />
|
||||
|
||||
</com.offline.music.task.player.ui.view.BlurLayout>
|
||||
</com.offline.music.task.player.ui.view.BlurLayoutView>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user