diff --git a/app/src/main/java/com/player/musicoo/activity/MoListDetailsActivity.kt b/app/src/main/java/com/player/musicoo/activity/MoListDetailsActivity.kt index ff7931f..8e39410 100644 --- a/app/src/main/java/com/player/musicoo/activity/MoListDetailsActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/MoListDetailsActivity.kt @@ -1,5 +1,6 @@ package com.player.musicoo.activity +import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import com.bumptech.glide.Glide import com.gyf.immersionbar.ktx.immersionBar @@ -45,8 +46,10 @@ class MoListDetailsActivity : MoBaseActivity() { } private suspend fun initData(browseId: String) { + showLoadingUi() Innertube.moPlaylistPage(browseId) ?.onSuccess { + showDataUi() Glide.with(this) .load(it.thumbnail) .into(binding.imageView) @@ -61,7 +64,23 @@ class MoListDetailsActivity : MoBaseActivity() { binding.rv.adapter = adapter }?.onFailure { + showNoContentUi() LogD(TAG, "moPlaylistPage onFailure->${it}") } } + + private fun showDataUi() { + binding.loadingLayout.visibility = View.GONE + binding.noContentLayout.visibility = View.GONE + } + + private fun showLoadingUi() { + binding.loadingLayout.visibility = View.VISIBLE + binding.noContentLayout.visibility = View.GONE + } + + private fun showNoContentUi() { + binding.loadingLayout.visibility = View.GONE + binding.noContentLayout.visibility = View.VISIBLE + } } \ No newline at end of file diff --git a/app/src/main/java/com/player/musicoo/activity/MoPlayDetailsActivity.kt b/app/src/main/java/com/player/musicoo/activity/MoPlayDetailsActivity.kt index 7ba50b9..0571f30 100644 --- a/app/src/main/java/com/player/musicoo/activity/MoPlayDetailsActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/MoPlayDetailsActivity.kt @@ -1,28 +1,36 @@ package com.player.musicoo.activity +import android.annotation.SuppressLint +import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.os.Handler import android.os.Looper import android.os.Message import android.view.View +import android.view.animation.AnimationUtils import androidx.annotation.OptIn import androidx.media3.common.MediaItem import androidx.media3.common.PlaybackException import androidx.media3.common.Player import androidx.media3.common.util.UnstableApi +import androidx.recyclerview.widget.LinearLayoutManager import com.bumptech.glide.Glide +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.gyf.immersionbar.ktx.immersionBar import com.player.musicoo.R +import com.player.musicoo.adapter.PlayListAdapter import com.player.musicoo.databinding.ActivityMoPlayDetailsBinding import com.player.musicoo.innertube.Innertube import com.player.musicoo.media.MediaControllerManager import com.player.musicoo.media.SongRadio +import com.player.musicoo.util.LogTag.LogD import com.player.musicoo.util.asMediaItem import com.player.musicoo.util.convertMillisToMinutesAndSecondsString import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.selects.select -import com.player.musicoo.util.LogTag.LogD @OptIn(UnstableApi::class) class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { @@ -42,6 +50,7 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { private var currentVideoID = "" private var comeFrom: Class<*>? = null + private var playListAdapter: PlayListAdapter? = null private fun initImmersionBar() { immersionBar { @@ -120,9 +129,8 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { if (meController != null && meController.currentMediaItem != null) { binding.playbackErrorLayout.visibility = View.GONE binding.loadingView.visibility = View.GONE - - - val currentString = convertMillisToMinutesAndSecondsString(meController.currentPosition) + binding.disableClicksLayout.visibility = View.GONE + val currentString = convertMillisToMinutesAndSecondsString(MediaControllerManager.getCurrentPosition()) binding.progressDurationTv.text = currentString if (MediaControllerManager.getDuration() > 0) { binding.totalDurationTv.visibility = View.VISIBLE @@ -133,13 +141,31 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { binding.totalDurationTv.text = convertMillisToMinutesAndSecondsString(MediaControllerManager.getDuration()) - binding.sbProgress.value = meController.currentPosition.toFloat() + binding.sbProgress.value = MediaControllerManager.getCurrentPosition().toFloat() binding.sbProgress.valueTo = MediaControllerManager.getDuration().toFloat() updateProgressState() - binding.progressBar.progress = meController.bufferedPosition.toInt() + binding.progressBar.progress = MediaControllerManager.getBufferedPosition().toInt() binding.progressBar.max = MediaControllerManager.getDuration().toInt() updateProgressBufferingState() + + val mediaItemCount = meController.mediaItemCount + val allMediaItems: MutableList = mutableListOf() + for (index in 0 until mediaItemCount) { + val mediaItemAt = meController.getMediaItemAt(index) + allMediaItems.add(mediaItemAt) + } + playListAdapter = PlayListAdapter( + this@MoPlayDetailsActivity, + allMediaItems + ) + binding.playListRv.layoutManager = + LinearLayoutManager( + this@MoPlayDetailsActivity, + LinearLayoutManager.VERTICAL, + false + ) + binding.playListRv.adapter = playListAdapter } } @@ -147,6 +173,16 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { binding.backBtn.setOnClickListener { finish() } + binding.tryAgainBtn.setOnClickListener { + if (meController != null) { + updateInfoUi(meController.currentMediaItem) + updateProgressState() + if (!meController.isPlaying) { + meController.prepare() + meController.play() + } + } + } binding.playLayoutBtn.setOnClickListener { if (meController != null) { if (meController.isPlaying) { @@ -184,7 +220,13 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { } } binding.listLayoutBtn.setOnClickListener { - LogD(TAG, "meController?.mediaItemCount->${meController?.mediaItemCount}") + toggleBottomLayout() + } + binding.bottomCloseBtn.setOnClickListener { + toggleBottomLayout() + } + binding.bottomBlankLayout.setOnClickListener { + toggleBottomLayout() } binding.progressBar.progress = 0 binding.sbProgress.value = 0f @@ -218,7 +260,20 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { if (songRadioList.isEmpty()) {//集合为空则展示错误提示 binding.loadingView.visibility = View.GONE + binding.disableClicksLayout.visibility = View.GONE binding.playbackErrorLayout.visibility = View.VISIBLE + } else { + playListAdapter = PlayListAdapter( + this@MoPlayDetailsActivity, + songRadioList.map(Innertube.SongItem::asMediaItem) + ) + binding.playListRv.layoutManager = + LinearLayoutManager( + this@MoPlayDetailsActivity, + LinearLayoutManager.VERTICAL, + false + ) + binding.playListRv.adapter = playListAdapter } if (isFinishing) { @@ -269,6 +324,7 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { } private val playerListener = object : Player.Listener { + @SuppressLint("NotifyDataSetChanged") override fun onPositionDiscontinuity( oldPosition: Player.PositionInfo, newPosition: Player.PositionInfo, @@ -278,7 +334,11 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION || reason == Player.DISCONTINUITY_REASON_SEEK_ADJUSTMENT ) { + updateProgressUi() updateInfoUi(meController?.currentMediaItem) + if (playListAdapter != null) { + playListAdapter?.notifyDataSetChanged() + } } } @@ -301,11 +361,14 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { when (playbackState) { Player.STATE_BUFFERING -> { binding.loadingView.visibility = View.VISIBLE + binding.disableClicksLayout.visibility = View.VISIBLE + binding.playbackErrorLayout.visibility = View.GONE } Player.STATE_READY -> { binding.playbackErrorLayout.visibility = View.GONE binding.loadingView.visibility = View.GONE + binding.disableClicksLayout.visibility = View.GONE binding.totalDurationTv.visibility = View.VISIBLE binding.totalDurationTv.text = convertMillisToMinutesAndSecondsString( @@ -320,6 +383,7 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { else -> { binding.loadingView.visibility = View.GONE + binding.disableClicksLayout.visibility = View.GONE } } updateProgressState() @@ -343,9 +407,24 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { binding.playbackErrorLayout.visibility = View.VISIBLE return } - Glide.with(this@MoPlayDetailsActivity) + + Glide.with(this) + .asBitmap() .load(mediaItem.mediaMetadata.artworkUri) - .into(binding.thumbnail) + .placeholder(R.mipmap.musicoo_logo_img) + .into(object : CustomTarget() { + override fun onResourceReady(resource: Bitmap, transition: Transition?) { + binding.thumbnail.setImageBitmap(resource) + val blurredBitmap = applyGaussianBlur(resource, 25f, this@MoPlayDetailsActivity) + binding.imageView.setImageBitmap(blurredBitmap) + } + + override fun onLoadCleared(placeholder: Drawable?) { + if (placeholder != null) { + binding.thumbnail.setImageDrawable(placeholder) + } + } + }) binding.nameTv.text = mediaItem.mediaMetadata.title binding.descTv.text = mediaItem.mediaMetadata.artist @@ -372,11 +451,11 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { override fun handleMessage(msg: Message) { //判断是否ready与播放中,否则停止更新进度 if (meController != null && meController.playbackState == Player.STATE_READY && meController.isPlaying) { - val currentPosition = meController.currentPosition + val currentPosition = MediaControllerManager.getCurrentPosition() val currentString = convertMillisToMinutesAndSecondsString(currentPosition) binding.progressDurationTv.text = currentString - val currentBufferedPosition = meController.bufferedPosition + val currentBufferedPosition = MediaControllerManager.getBufferedPosition() binding.progressBar.progress = currentBufferedPosition.toInt() // 更新 SeekBar 的进度 @@ -405,7 +484,7 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { private val progressBufferingHandler = object : Handler(Looper.myLooper()!!) { override fun handleMessage(msg: Message) { if (meController != null && meController.isLoading) { - val currentBufferedPosition = meController.bufferedPosition + val currentBufferedPosition = MediaControllerManager.getBufferedPosition() binding.progressBar.progress = currentBufferedPosition.toInt() sendEmptyMessageDelayed(1, 50) } @@ -419,4 +498,25 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { binding.playImg.setImageResource(R.drawable.play_green_icon) } } + + + private fun toggleBottomLayout() { + if (binding.bottomLayout.visibility == View.VISIBLE) { + hideBottomLayout() + } else { + showBottomLayout() + } + } + + private fun showBottomLayout() { + val slideUpAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_up) + binding.bottomLayout.startAnimation(slideUpAnimation) + binding.bottomLayout.visibility = View.VISIBLE + } + + private fun hideBottomLayout() { + val slideDownAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_down) + binding.bottomLayout.startAnimation(slideDownAnimation) + binding.bottomLayout.visibility = View.GONE + } } \ No newline at end of file diff --git a/app/src/main/java/com/player/musicoo/adapter/DetailsListAdapter.kt b/app/src/main/java/com/player/musicoo/adapter/DetailsListAdapter.kt index d7b59db..f9728e5 100644 --- a/app/src/main/java/com/player/musicoo/adapter/DetailsListAdapter.kt +++ b/app/src/main/java/com/player/musicoo/adapter/DetailsListAdapter.kt @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.player.musicoo.App import com.player.musicoo.R +import com.player.musicoo.activity.MoPlayDetailsActivity import com.player.musicoo.activity.PlayDetailsActivity import com.player.musicoo.bean.Audio import com.player.musicoo.databinding.DetailsListItemBinding @@ -27,6 +28,10 @@ class DetailsListAdapter( ) : RecyclerView.Adapter() { + companion object { + const val FROM_TAG = "list_details_activity_to_adapter" + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val binding = DetailsListItemBinding.inflate(LayoutInflater.from(context), parent, false) return ViewHolder(binding) @@ -35,6 +40,23 @@ class DetailsListAdapter( override fun onBindViewHolder(holder: ViewHolder, position: Int) { val bean = list[position] holder.bind(bean) + + val videoId = bean.videoId + + holder.itemView.setOnClickListener { + val intent = Intent(context, MoPlayDetailsActivity::class.java) + intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_VIDEO_ID, videoId) + intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_PLAY_LIST_ID, bean.playlistId) + intent.putExtra( + MoPlayDetailsActivity.PLAY_DETAILS_PLAY_LIST_SET_VIDEO_ID, + bean.playlistSetVideoId + ) + intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_PLAY_PARAMS, bean.params) + + intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_NAME, bean.name) + intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_DESC, bean.title) + context.startActivity(intent) + } } override fun getItemCount(): Int = list.size diff --git a/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt b/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt new file mode 100644 index 0000000..9254dbb --- /dev/null +++ b/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt @@ -0,0 +1,94 @@ +package com.player.musicoo.adapter + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.media3.common.C +import androidx.media3.common.MediaItem +import androidx.media3.common.Player +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.player.musicoo.R +import com.player.musicoo.databinding.PlayListItemBinding +import com.player.musicoo.media.MediaControllerManager + +class PlayListAdapter( + private val context: Context, + private val list: List, +) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val binding = PlayListItemBinding.inflate(LayoutInflater.from(context), parent, false) + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val bean = list[position] + holder.bind(bean) + + holder.itemView.setOnClickListener { + val meController = MediaControllerManager.getController() + if (meController != null && meController.currentMediaItem != null) { + var index = holder.bindingAdapterPosition + if (index > meController.mediaItemCount) { + index = 1 + } + meController.seekTo(index, C.TIME_UNSET) + if (!meController.isPlaying) { + meController.prepare() + meController.play() + } + } + } + } + + override fun getItemCount(): Int = list.size + + inner class ViewHolder(private val binding: PlayListItemBinding) : + RecyclerView.ViewHolder(binding.root) { + + @SuppressLint("SetTextI18n") + fun bind(bean: MediaItem) { + + binding.apply { + val meController = MediaControllerManager.getController() + if (meController != null && meController.currentMediaItem != null) { + if (meController.currentMediaItem?.mediaId == bean.mediaId) { + binding.currentPlayingLayout.visibility = View.VISIBLE + binding.title.setTextColor(context.getColor(R.color.green)) + binding.name.setTextColor(context.getColor(R.color.green_60)) + } else { + binding.currentPlayingLayout.visibility = View.GONE + binding.title.setTextColor(context.getColor(R.color.white)) + binding.name.setTextColor(context.getColor(R.color.white_60)) + } + } + + Glide.with(context) + .load(bean.mediaMetadata.artworkUri) + .into(image) + title.text = bean.mediaMetadata.title + if (bean.mediaMetadata.artist.isNullOrEmpty()) { + name.visibility = View.GONE + } else { + name.visibility = View.VISIBLE + name.text = bean.mediaMetadata.artist + } + + } + } + } + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(listener: OnItemClickListener) { + itemClickListener = listener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/player/musicoo/adapter/TowRowListAdapter.kt b/app/src/main/java/com/player/musicoo/adapter/TowRowListAdapter.kt index 65b1251..982d00a 100644 --- a/app/src/main/java/com/player/musicoo/adapter/TowRowListAdapter.kt +++ b/app/src/main/java/com/player/musicoo/adapter/TowRowListAdapter.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.player.musicoo.activity.MoListDetailsActivity +import com.player.musicoo.activity.MoPlayDetailsActivity import com.player.musicoo.databinding.MusicTowRowItemBinding import com.player.musicoo.innertube.models.MusicCarouselShelfRenderer @@ -34,12 +35,56 @@ class TowRowListAdapter( val browseId = browseEndpoint?.browseId - holder.bind(bean) + val watchEndpoint = bean.musicTwoRowItemRenderer + ?.navigationEndpoint + ?.watchEndpoint + + val videoId = watchEndpoint?.videoId + val playlistId = watchEndpoint?.playlistId + val playlistSetVideoId = watchEndpoint?.playlistSetVideoId + val params = watchEndpoint?.params + + + val url = bean.musicTwoRowItemRenderer + ?.thumbnailRenderer + ?.musicThumbnailRenderer + ?.thumbnail + ?.thumbnails + ?.let { it.getOrNull(1) ?: it.getOrNull(0) } + ?.url ?: "" + val name = bean.musicTwoRowItemRenderer + ?.title + ?.runs + ?.firstOrNull() + ?.text ?: "" + val desc = bean.musicTwoRowItemRenderer + ?.subtitle + ?.runs + ?.map { it.text } + ?.joinToString("") ?: "" + + holder.bind(url = url, name = name, desc = desc) holder.itemView.setOnClickListener { - val intent = Intent(context, MoListDetailsActivity::class.java) - intent.putExtra(MoListDetailsActivity.PLAY_LIST_PAGE_BROWSE_ID, browseId) - context.startActivity(intent) + if (browseId.isNullOrEmpty()) { + val intent = Intent(context, MoPlayDetailsActivity::class.java) + intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_VIDEO_ID, videoId) + intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_PLAY_LIST_ID, playlistId) + if (playlistSetVideoId != null) { + intent.putExtra( + MoPlayDetailsActivity.PLAY_DETAILS_PLAY_LIST_SET_VIDEO_ID, + playlistSetVideoId + ) + } + intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_PLAY_PARAMS, params) + intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_NAME, name) + intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_DESC, desc) + context.startActivity(intent) + } else { + val intent = Intent(context, MoListDetailsActivity::class.java) + intent.putExtra(MoListDetailsActivity.PLAY_LIST_PAGE_BROWSE_ID, browseId) + context.startActivity(intent) + } } } @@ -48,24 +93,8 @@ class TowRowListAdapter( inner class ViewHolder(private val binding: MusicTowRowItemBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(content: MusicCarouselShelfRenderer.Content) { - val url = content.musicTwoRowItemRenderer - ?.thumbnailRenderer - ?.musicThumbnailRenderer - ?.thumbnail - ?.thumbnails - ?.let { it.getOrNull(1) ?: it.getOrNull(0) } - ?.url - val name = content.musicTwoRowItemRenderer - ?.title - ?.runs - ?.firstOrNull() - ?.text - val desc = content.musicTwoRowItemRenderer - ?.subtitle - ?.runs - ?.map { it.text } - ?.joinToString("") + fun bind(url: String, name: String, desc: String) { + binding.apply { Glide.with(context) .load(url) diff --git a/app/src/main/java/com/player/musicoo/fragment/MoHomeFragment.kt b/app/src/main/java/com/player/musicoo/fragment/MoHomeFragment.kt index a5ba814..ff1663a 100644 --- a/app/src/main/java/com/player/musicoo/fragment/MoHomeFragment.kt +++ b/app/src/main/java/com/player/musicoo/fragment/MoHomeFragment.kt @@ -90,6 +90,7 @@ class MoHomeFragment : MoBaseFragment() { initHomeDataMore(it) } else { LogD(TAG, "homePage size 0") + showNoContentUi() } }?.onFailure { showNoContentUi() @@ -141,16 +142,17 @@ class MoHomeFragment : MoBaseFragment() { } } - private fun showDataUi(){ + private fun showDataUi() { binding.loadingLayout.visibility = View.GONE binding.noContentLayout.visibility = View.GONE } - private fun showLoadingUi(){ + + private fun showLoadingUi() { binding.loadingLayout.visibility = View.VISIBLE binding.noContentLayout.visibility = View.GONE } - private fun showNoContentUi(){ + private fun showNoContentUi() { binding.loadingLayout.visibility = View.GONE binding.noContentLayout.visibility = View.VISIBLE } diff --git a/app/src/main/java/com/player/musicoo/innertube/Innertube.kt b/app/src/main/java/com/player/musicoo/innertube/Innertube.kt index 0570064..a81a353 100644 --- a/app/src/main/java/com/player/musicoo/innertube/Innertube.kt +++ b/app/src/main/java/com/player/musicoo/innertube/Innertube.kt @@ -193,7 +193,9 @@ object Innertube { val timeText: String?, val browseId: String, val videoId: String?, - val playlistId: String?, + val playlistId: String? = null, + val playlistSetVideoId: String? = null, + val params: String? = null, val musicVideoType: String?, val pageType: String?, val thumbnailUrl: String? diff --git a/app/src/main/java/com/player/musicoo/innertube/requests/MoPlaylistPage.kt b/app/src/main/java/com/player/musicoo/innertube/requests/MoPlaylistPage.kt index e6cb842..a25eb20 100644 --- a/app/src/main/java/com/player/musicoo/innertube/requests/MoPlaylistPage.kt +++ b/app/src/main/java/com/player/musicoo/innertube/requests/MoPlaylistPage.kt @@ -80,7 +80,11 @@ suspend fun Innertube.moPlaylistPage(browseId: String): Result 0 && it.currentPosition < it.duration) { + return it.currentPosition + } else { + return 0 + } + } + return 0 + } + + fun getBufferedPosition(): Long { + mediaController?.let { + if (it.bufferedPosition > 0) { + return it.bufferedPosition + } else { + return 0 + } + } + return 0 + } } diff --git a/app/src/main/java/com/player/musicoo/service/PlaybackService.kt b/app/src/main/java/com/player/musicoo/service/PlaybackService.kt index a2fa9ab..7f59d29 100644 --- a/app/src/main/java/com/player/musicoo/service/PlaybackService.kt +++ b/app/src/main/java/com/player/musicoo/service/PlaybackService.kt @@ -57,12 +57,10 @@ class PlaybackService : MediaSessionService(), Player.Listener { override fun onCreate() { super.onCreate() - val cacheEvictor = when (val size = ExoPlayerDiskCacheMaxSize.`2GB`){ + val cacheEvictor = when (val size = ExoPlayerDiskCacheMaxSize.`2GB`) { ExoPlayerDiskCacheMaxSize.Unlimited -> NoOpCacheEvictor() else -> LeastRecentlyUsedCacheEvictor(size.bytes) } - - // TODO: Remove in a future release val directory = cacheDir.resolve("exoplayer").also { directory -> if (directory.exists()) return@also @@ -80,7 +78,6 @@ class PlaybackService : MediaSessionService(), Player.Listener { } cache = SimpleCache(directory, cacheEvictor, StandaloneDatabaseProvider(this)) - player = ExoPlayer.Builder(this, createRendersFactory(), createMediaSourceFactory()) .setHandleAudioBecomingNoisy(true) .setWakeMode(C.WAKE_MODE_LOCAL) @@ -181,7 +178,7 @@ class PlaybackService : MediaSessionService(), Player.Listener { ) } } - LogD(TAG,"service urlResult->$urlResult") + LogD(TAG, "service urlResult->$urlResult") urlResult?.getOrThrow()?.let { url -> ringBuffer.append(videoId to url.toUri()) diff --git a/app/src/main/res/drawable/drw_bottom_close_btn_bg.xml b/app/src/main/res/drawable/drw_bottom_close_btn_bg.xml new file mode 100644 index 0000000..d0c0134 --- /dev/null +++ b/app/src/main/res/drawable/drw_bottom_close_btn_bg.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drw_bottom_layout_bg.xml b/app/src/main/res/drawable/drw_bottom_layout_bg.xml new file mode 100644 index 0000000..c1aa1b7 --- /dev/null +++ b/app/src/main/res/drawable/drw_bottom_layout_bg.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/playing_small_green_icon.xml b/app/src/main/res/drawable/playing_small_green_icon.xml new file mode 100644 index 0000000..0b536a0 --- /dev/null +++ b/app/src/main/res/drawable/playing_small_green_icon.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index d018cbe..cf9733e 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -16,107 +16,170 @@ android:layout_width="match_parent" android:layout_height="0dp" /> - - - - - - - - - - + - - - - - - + android:layout_centerInParent="true" + android:src="@drawable/back_icon" /> + - - - - - - - + android:layout_height="match_parent" + android:gravity="center" + android:visibility="gone"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_mo_play_details.xml b/app/src/main/res/layout/activity_mo_play_details.xml index f85b1de..a9b3129 100644 --- a/app/src/main/res/layout/activity_mo_play_details.xml +++ b/app/src/main/res/layout/activity_mo_play_details.xml @@ -23,7 +23,7 @@ android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="5" + android:layout_weight="8" android:scaleType="centerCrop" /> + android:visibility="visible" /> + android:background="@color/black" /> @@ -122,19 +122,42 @@ android:progressBackgroundTint="@color/green" android:progressTint="@color/green" /> - + android:background="@color/black_60" + android:orientation="vertical" + android:visibility="gone"> + + + + + @@ -346,4 +369,50 @@ android:orientation="horizontal" /> + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mo_home.xml b/app/src/main/res/layout/fragment_mo_home.xml index 7b66bfa..6e34a09 100644 --- a/app/src/main/res/layout/fragment_mo_home.xml +++ b/app/src/main/res/layout/fragment_mo_home.xml @@ -78,6 +78,7 @@ diff --git a/app/src/main/res/layout/play_list_item.xml b/app/src/main/res/layout/play_list_item.xml new file mode 100644 index 0000000..cc813e7 --- /dev/null +++ b/app/src/main/res/layout/play_list_item.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 1701611..8cb6ce6 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -8,4 +8,6 @@ #CCFFFFFF #151718 #FF80F988 + #9980F988 + #1A1A1A \ No newline at end of file