This commit is contained in:
ocean 2024-06-05 10:49:20 +08:00
parent 3f389e24e9
commit e11a767758
28 changed files with 204 additions and 446 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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() // 请求重绘
}
}

View File

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

View File

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

View File

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