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"> tools:targetApi="31">
<activity <activity
android:name=".ui.activity.LaunchActivity" android:name=".ui.activity.SplashActivity"
android:exported="true" android:exported="true"
android:screenOrientation="portrait"> android:screenOrientation="portrait">
<intent-filter> <intent-filter>
@ -41,7 +41,7 @@
android:name=".ui.activity.MainActivity" android:name=".ui.activity.MainActivity"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity <activity
android:name=".ui.activity.PlayDetailsActivity" android:name=".ui.activity.PlayerActivity"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity <activity
android:name=".ui.activity.AboutActivity" 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.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
import com.offline.music.task.player.tools.parseResources import com.offline.music.task.player.tools.util.parseResources
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch 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.Audio
import com.offline.music.task.player.db.bean.CurrentPlayingAudio import com.offline.music.task.player.db.bean.CurrentPlayingAudio
import com.offline.music.task.player.service.LocalPlaybackService 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.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch 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.Context
import android.content.pm.PackageManager 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.content.Context
import android.graphics.Rect 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.content.Context
import android.graphics.Rect 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.ActivityNotFoundException
import android.content.Context 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.content.Context
import android.media.MediaMetadataRetriever import android.media.MediaMetadataRetriever

View File

@ -4,7 +4,7 @@ import android.os.Bundle
import com.gyf.immersionbar.ktx.immersionBar import com.gyf.immersionbar.ktx.immersionBar
import com.offline.music.task.player.databinding.ActivityAboutBinding 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() { 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.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.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.tools.media.MediaControllerManager
import com.offline.music.task.player.ui.fragment.HomeFragment import com.offline.music.task.player.ui.fragment.HomeFragment
import com.offline.music.task.player.ui.fragment.MeFragment import com.offline.music.task.player.ui.fragment.MeFragment
@ -110,8 +110,8 @@ class MainActivity : BaseActivity() {
duration, duration,
false false
) )
val intent = Intent(this, PlayDetailsActivity::class.java); val intent = Intent(this, PlayerActivity::class.java);
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio) intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
startActivity(intent) 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.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.Audio
import com.offline.music.task.player.tools.containsContent import com.offline.music.task.player.tools.util.containsContent
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
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.tools.media.MediaControllerManager
class PlayDetailsActivity : BaseActivity() { class PlayerActivity : BaseActivity() {
companion object { companion object {
const val KEY_DETAILS_AUDIO = "key_details_audio" 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.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class LaunchActivity : BaseActivity() { class SplashActivity : BaseActivity() {
private lateinit var binding: ActivityLaunchBinding private lateinit var binding: ActivityLaunchBinding
private val coroutineScope = CoroutineScope(Dispatchers.Main) private val coroutineScope = CoroutineScope(Dispatchers.Main)
private val countTime: Long = 3000 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.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.Audio
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
import com.offline.music.task.player.tools.getAudioDurationFromAssets import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
import com.offline.music.task.player.ui.activity.PlayDetailsActivity import com.offline.music.task.player.ui.activity.PlayerActivity
class RealHumanVoiceAdapter( class HomeRecommendAdapter(
private val context: Context, private val context: Context,
private val pdfList: List<Audio>, private val pdfList: List<Audio>,
) : ) :
RecyclerView.Adapter<RealHumanVoiceAdapter.PDFViewHolder>() { RecyclerView.Adapter<HomeRecommendAdapter.PDFViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
val binding = val binding =
@ -30,8 +30,8 @@ class RealHumanVoiceAdapter(
val audio = pdfList[position] val audio = pdfList[position]
holder.bind(audio) holder.bind(audio)
holder.itemView.setOnClickListener { holder.itemView.setOnClickListener {
val intent = Intent(context, PlayDetailsActivity::class.java); val intent = Intent(context, PlayerActivity::class.java);
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio) intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
context.startActivity(intent) 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.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.Audio
import com.offline.music.task.player.tools.containsContent import com.offline.music.task.player.tools.util.containsContent
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
import com.offline.music.task.player.tools.getAudioDurationFromAssets import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
import com.offline.music.task.player.ui.activity.PlayDetailsActivity import com.offline.music.task.player.ui.activity.PlayerActivity
//LOGO //LOGO
class ParentsVoiceAdapter( class MeLocalSongAdapter(
private val context: Context, private val context: Context,
private val pdfList: List<Audio>, private val pdfList: List<Audio>,
) : ) :
RecyclerView.Adapter<ParentsVoiceAdapter.ViewHolder>() { RecyclerView.Adapter<MeLocalSongAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ParentsVoiceLayoutBinding.inflate(LayoutInflater.from(context), parent, false) val binding = ParentsVoiceLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
@ -31,8 +31,8 @@ class ParentsVoiceAdapter(
val audio = pdfList[position] val audio = pdfList[position]
holder.bind(audio) holder.bind(audio)
holder.itemView.setOnClickListener { holder.itemView.setOnClickListener {
val intent = Intent(context, PlayDetailsActivity::class.java); val intent = Intent(context, PlayerActivity::class.java);
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio) intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
context.startActivity(intent) 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.gyf.immersionbar.ktx.immersionBar
import com.offline.music.task.player.ProApp import com.offline.music.task.player.ProApp
import com.offline.music.task.player.databinding.FragmentHome2Binding import com.offline.music.task.player.databinding.FragmentHome2Binding
import com.offline.music.task.player.tools.GridSpacingItemDecoration import com.offline.music.task.player.tools.util.GridSpacingItemDecoration
import com.offline.music.task.player.tools.HorizontalSpaceItemDecoration import com.offline.music.task.player.tools.util.HorizontalSpaceItemDecoration
import com.offline.music.task.player.ui.adapter.RealHumanVoiceAdapter import com.offline.music.task.player.ui.adapter.HomeRecommendAdapter
import com.offline.music.task.player.ui.adapter.SoundsOfAppliancesAdapter import com.offline.music.task.player.ui.adapter.HomeWhiteNoiseAdapter
import com.offline.music.task.player.ui.adapter.SoundsOfNatureAdapter import com.offline.music.task.player.ui.adapter.HomeVoiceOfNatureAdapter
class HomeFragment : Fragment() { class HomeFragment : Fragment() {
private lateinit var binding: FragmentHome2Binding private lateinit var binding: FragmentHome2Binding
private var realHumanVoiceAdapter: RealHumanVoiceAdapter? = null private var homeRecommendAdapter: HomeRecommendAdapter? = null
private var soundsOfAppliancesAdapter: SoundsOfAppliancesAdapter? = null private var homeWhiteNoiseAdapter: HomeWhiteNoiseAdapter? = null
private var soundsOfNatureAdapter: SoundsOfNatureAdapter? = null private var homeVoiceOfNatureAdapter: HomeVoiceOfNatureAdapter? = null
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@ -53,27 +53,27 @@ class HomeFragment : Fragment() {
private fun initData(){ private fun initData(){
if (ProApp.realHumanVoiceList.isNotEmpty()) { if (ProApp.realHumanVoiceList.isNotEmpty()) {
realHumanVoiceAdapter = RealHumanVoiceAdapter(requireActivity(), ProApp.realHumanVoiceList) homeRecommendAdapter = HomeRecommendAdapter(requireActivity(), ProApp.realHumanVoiceList)
binding.realRv.layoutManager = binding.realRv.layoutManager =
LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false) LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false)
binding.realRv.addItemDecoration(HorizontalSpaceItemDecoration(requireActivity())) binding.realRv.addItemDecoration(HorizontalSpaceItemDecoration(requireActivity()))
binding.realRv.adapter = realHumanVoiceAdapter binding.realRv.adapter = homeRecommendAdapter
} }
if (ProApp.soundsOfAppliancesList.isNotEmpty()) { if (ProApp.soundsOfAppliancesList.isNotEmpty()) {
soundsOfAppliancesAdapter = homeWhiteNoiseAdapter =
SoundsOfAppliancesAdapter(requireActivity(), ProApp.soundsOfAppliancesList) HomeWhiteNoiseAdapter(requireActivity(), ProApp.soundsOfAppliancesList)
binding.soundsRv.layoutManager = binding.soundsRv.layoutManager =
LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false) LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false)
binding.soundsRv.addItemDecoration(HorizontalSpaceItemDecoration(requireActivity())) binding.soundsRv.addItemDecoration(HorizontalSpaceItemDecoration(requireActivity()))
binding.soundsRv.adapter = soundsOfAppliancesAdapter binding.soundsRv.adapter = homeWhiteNoiseAdapter
} }
if (ProApp.soundsOfNatureList.isNotEmpty()) { if (ProApp.soundsOfNatureList.isNotEmpty()) {
soundsOfNatureAdapter = homeVoiceOfNatureAdapter =
SoundsOfNatureAdapter(requireActivity(), ProApp.soundsOfNatureList) HomeVoiceOfNatureAdapter(requireActivity(), ProApp.soundsOfNatureList)
binding.natureRv.layoutManager = binding.natureRv.layoutManager =
GridLayoutManager(requireActivity(), 3, GridLayoutManager.HORIZONTAL, false) GridLayoutManager(requireActivity(), 3, GridLayoutManager.HORIZONTAL, false)
binding.natureRv.addItemDecoration(GridSpacingItemDecoration(requireActivity(), 10, 3)) binding.natureRv.addItemDecoration(GridSpacingItemDecoration(requireActivity(), 10, 3))
binding.natureRv.adapter = soundsOfNatureAdapter binding.natureRv.adapter = homeVoiceOfNatureAdapter
} }
} }
@ -118,9 +118,9 @@ class HomeFragment : Fragment() {
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun notifyDataSetChanged(){ private fun notifyDataSetChanged(){
soundsOfAppliancesAdapter?.notifyDataSetChanged() homeWhiteNoiseAdapter?.notifyDataSetChanged()
realHumanVoiceAdapter?.notifyDataSetChanged() homeRecommendAdapter?.notifyDataSetChanged()
soundsOfNatureAdapter?.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.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.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.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -32,7 +32,7 @@ import kotlinx.coroutines.withContext
class MeFragment : Fragment() { class MeFragment : Fragment() {
private lateinit var binding: FragmentMeBinding private lateinit var binding: FragmentMeBinding
private var parentsVoiceAdapter: ParentsVoiceAdapter? = null private var meLocalSongAdapter: MeLocalSongAdapter? = null
private var importAdapterList: MutableList<Audio> = mutableListOf() private var importAdapterList: MutableList<Audio> = mutableListOf()
override fun onCreateView( override fun onCreateView(
@ -57,10 +57,10 @@ class MeFragment : Fragment() {
} }
importAdapterList.clear() importAdapterList.clear()
importAdapterList.addAll(ProApp.importList) importAdapterList.addAll(ProApp.importList)
parentsVoiceAdapter = ParentsVoiceAdapter(requireActivity(), importAdapterList) meLocalSongAdapter = MeLocalSongAdapter(requireActivity(), importAdapterList)
binding.importRv.layoutManager = binding.importRv.layoutManager =
LinearLayoutManager(requireActivity(), LinearLayoutManager.VERTICAL, false) LinearLayoutManager(requireActivity(), LinearLayoutManager.VERTICAL, false)
binding.importRv.adapter = parentsVoiceAdapter binding.importRv.adapter = meLocalSongAdapter
} }
private var requestPermissionLauncher = private var requestPermissionLauncher =
@ -108,7 +108,7 @@ class MeFragment : Fragment() {
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.currentPlayingAudio?.file) {
parentsVoiceAdapter?.notifyDataSetChanged() meLocalSongAdapter?.notifyDataSetChanged()
break break
} }
} }
@ -195,7 +195,7 @@ class MeFragment : Fragment() {
ProApp.initImportAudio { ProApp.initImportAudio {
importAdapterList.clear() importAdapterList.clear()
importAdapterList.addAll(ProApp.importList) importAdapterList.addAll(ProApp.importList)
parentsVoiceAdapter?.notifyDataSetChanged() meLocalSongAdapter?.notifyDataSetChanged()
if (importAdapterList.isNotEmpty()) { if (importAdapterList.isNotEmpty()) {
binding.noContentLayout.visibility = View.GONE binding.noContentLayout.visibility = View.GONE
} else { } else {

View File

@ -9,13 +9,13 @@ import androidx.fragment.app.Fragment
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.FragmentSettingBinding import com.offline.music.task.player.databinding.FragmentSettingBinding
import com.offline.music.task.player.tools.EMAIL import com.offline.music.task.player.tools.util.EMAIL
import com.offline.music.task.player.tools.PRIVACY_POLICY_URL import com.offline.music.task.player.tools.util.PRIVACY_POLICY_URL
import com.offline.music.task.player.tools.TERMS_OF_SERVICE_URL import com.offline.music.task.player.tools.util.TERMS_OF_SERVICE_URL
import com.offline.music.task.player.tools.openPrivacyPolicy import com.offline.music.task.player.tools.util.openPrivacyPolicy
import com.offline.music.task.player.tools.openTermsOfService import com.offline.music.task.player.tools.util.openTermsOfService
import com.offline.music.task.player.tools.sendFeedback import com.offline.music.task.player.tools.util.sendFeedback
import com.offline.music.task.player.tools.shareApp import com.offline.music.task.player.tools.util.shareApp
import com.offline.music.task.player.ui.activity.AboutActivity import com.offline.music.task.player.ui.activity.AboutActivity
class SettingsFragment : Fragment() { class SettingsFragment : Fragment() {

View File

@ -6,7 +6,7 @@ import android.renderscript.*
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.FrameLayout import android.widget.FrameLayout
class BlurLayout : FrameLayout { class BlurLayoutView : FrameLayout {
private var blurRadius = 25f // 默认模糊半径 private var blurRadius = 25f // 默认模糊半径
private val cornerRadius = dpToPx(18) // 圆角半径 private val cornerRadius = dpToPx(18) // 圆角半径
constructor(context: Context) : super(context) 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_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/white" android:background="@color/white"
tools:context=".ui.activity.LaunchActivity"> tools:context=".ui.activity.SplashActivity">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -8,7 +8,7 @@
android:layout_width="166dp" android:layout_width="166dp"
android:layout_height="140dp"> 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_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -18,7 +18,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="centerCrop" /> android:scaleType="centerCrop" />
</com.offline.music.task.player.ui.view.BlurLayout> </com.offline.music.task.player.ui.view.BlurLayoutView>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"