diff --git a/app/src/main/java/com/player/musicoo/activity/MainActivity.kt b/app/src/main/java/com/player/musicoo/activity/MainActivity.kt index edf5446..de6312f 100644 --- a/app/src/main/java/com/player/musicoo/activity/MainActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/MainActivity.kt @@ -119,9 +119,6 @@ class MainActivity : BaseActivity() { intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio) startActivity(intent) } - binding.alarmClockBtn.setOnClickListener { - - } binding.playBlackBtn.setOnClickListener { val currentPlayer = MediaControllerManager.getController() diff --git a/app/src/main/java/com/player/musicoo/activity/MoBaseActivity.kt b/app/src/main/java/com/player/musicoo/activity/MoBaseActivity.kt index 1b87e97..22e304b 100644 --- a/app/src/main/java/com/player/musicoo/activity/MoBaseActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/MoBaseActivity.kt @@ -6,20 +6,29 @@ import android.graphics.BitmapFactory import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.renderscript.Allocation import android.renderscript.Element import android.renderscript.RenderScript import android.renderscript.ScriptIntrinsicBlur import android.view.LayoutInflater +import android.view.View +import android.widget.LinearLayout import android.widget.RelativeLayout import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity +import androidx.media3.common.Player +import androidx.media3.session.MediaController import com.bumptech.glide.Glide import com.player.musicoo.R +import com.player.musicoo.innertube.Innertube +import com.player.musicoo.innertube.Innertube.TAG import com.player.musicoo.media.MediaControllerManager import com.player.musicoo.sp.AppStore import com.player.musicoo.util.LogTag +import com.player.musicoo.view.MusicPlayerView import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope @@ -31,11 +40,13 @@ import java.io.IOException import java.io.InputStream abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope() { + private var playerListener: Player.Listener? = null enum class Event { ActivityStart, ActivityStop, - ActivityOnResume + ActivityOnResume, + AutomaticallySwitchSongs, } protected val TAG = LogTag.VO_ACT_LOG @@ -45,6 +56,7 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope protected abstract suspend fun main() private var defer: suspend () -> Unit = {} private var deferRunning = false + private lateinit var musicPlayerView: MusicPlayerView fun defer(operation: suspend () -> Unit) { this.defer = operation @@ -52,6 +64,8 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + musicPlayerView = MusicPlayerView(this, meController) + initPlayerListener() launch { main() } @@ -90,21 +104,97 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope } } - suspend fun loadBitmapWithGlide(imageUrl: String): Bitmap? { - return withContext(Dispatchers.IO) { - try { - Glide.with(this@MoBaseActivity) - .asBitmap() - .load(imageUrl) - .submit() // 异步加载Bitmap - .get() // 阻塞等待获取Bitmap - } catch (e: Exception) { - e.printStackTrace() - null + fun addMusicPlayerViewToLayout(layoutId: LinearLayout) { + if (meController != null && meController.mediaItemCount > 0 && meController.duration > 0) { + if (layoutId.childCount <= 0) {//没有添加view才进行添加 + layoutId.addView(musicPlayerView) + } + musicPlayerView.updateInfoUi(meController.currentMediaItem) + musicPlayerView.updateSetProgress(meController) + musicPlayerView.updateProgressState(meController) + layoutId.visibility = View.VISIBLE + } else { + layoutId.visibility = View.GONE + } + } + + private fun initPlayerListener() { + if (this !is MoPlayDetailsActivity) { + if (playerListener == null) { + LogTag.LogD(TAG, "MoBaseActivity initPlayerListener") + meController?.addListener(getPlayerListener()) } } } + override fun onDestroy() { + super.onDestroy() + LogTag.LogD(TAG, "MoBaseActivity onDestroy") + if (meController != null && playerListener != null) { + meController.removeListener(playerListener!!) + } + } + + private fun getPlayerListener(): Player.Listener { + if (playerListener == null) { + playerListener = object : Player.Listener { + + override fun onPositionDiscontinuity( + oldPosition: Player.PositionInfo, + newPosition: Player.PositionInfo, + reason: Int + ) { + if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) { + LogTag.LogD( + Innertube.TAG, + "MoBaseActivity DISCONTINUITY_REASON_AUTO_TRANSITION" + ) + if (meController != null) { + musicPlayerView.updateInfoUi(meController.currentMediaItem) + musicPlayerView.updateSetProgress(meController) + musicPlayerView.updateProgressState(meController) + } + + events.trySend(Event.AutomaticallySwitchSongs) + } + } + + override fun onPlaybackStateChanged(playbackState: Int) { + LogTag.LogD(Innertube.TAG, "MoBaseActivity playbackState->$playbackState") + val meController = MediaControllerManager.getController() + if (meController != null) { + musicPlayerView.updateProgressState(meController) + + when (playbackState) { + Player.STATE_READY -> { + musicPlayerView.updateSetProgress(meController) + } + + else -> {} + } + } + } + + override fun onPlayWhenReadyChanged( + playWhenReady: Boolean, + reason: Int + ) { + LogTag.LogD( + Innertube.TAG, + "MoBaseActivity onPlayWhenReadyChanged->$playWhenReady" + ) + musicPlayerView.updatePlayState(playWhenReady) + val meController = MediaControllerManager.getController() + if (meController != null) { + musicPlayerView.updateProgressState(meController) + } + + } + } + } + return playerListener!! + } + fun applyGaussianBlur(inputBitmap: Bitmap, radius: Float, context: Context): Bitmap { val rsContext = RenderScript.create(context) val outputBitmap = @@ -120,16 +210,6 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope return outputBitmap } - fun loadBitmapFromAsset(id: Int): Bitmap { - return try { - val inputStream: InputStream = resources.openRawResource(id) - BitmapFactory.decodeStream(inputStream) - } catch (e: IOException) { - e.printStackTrace() - throw RuntimeException("Could not load bitmap from asset") - } - } - fun showSongDescriptionDialog(description: String) { val inflater = LayoutInflater.from(this) val dialogView = inflater.inflate(R.layout.dialog_description, null) 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 a483084..2458a62 100644 --- a/app/src/main/java/com/player/musicoo/activity/MoListDetailsActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/MoListDetailsActivity.kt @@ -1,12 +1,12 @@ package com.player.musicoo.activity +import android.annotation.SuppressLint import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import com.bumptech.glide.Glide import com.gyf.immersionbar.ktx.immersionBar import com.player.musicoo.adapter.DetailsListAdapter import com.player.musicoo.databinding.ActivityDetailsBinding -import com.player.musicoo.fragment.MoHomeFragment import com.player.musicoo.innertube.Innertube import com.player.musicoo.innertube.requests.moPlaylistPage import com.player.musicoo.util.LogTag.LogD @@ -28,6 +28,7 @@ class MoListDetailsActivity : MoBaseActivity() { private lateinit var binding: ActivityDetailsBinding private var browseId: String? = null + private var adapter: DetailsListAdapter? = null override suspend fun main() { binding = ActivityDetailsBinding.inflate(layoutInflater) setContentView(binding.root) @@ -50,6 +51,7 @@ class MoListDetailsActivity : MoBaseActivity() { } } + @SuppressLint("NotifyDataSetChanged") private suspend fun onReceive() { while (isActive) { select { @@ -60,10 +62,34 @@ class MoListDetailsActivity : MoBaseActivity() { } } } + events.onReceive { + when (it) { + Event.ActivityOnResume -> { + activityOnResume() + } + + Event.AutomaticallySwitchSongs -> { + if (adapter != null) { + adapter?.notifyDataSetChanged() + } + } + + else -> {} + } + } } } } + @SuppressLint("NotifyDataSetChanged") + private fun activityOnResume() { + addMusicPlayerViewToLayout(binding.playMusicLayout) + + if (adapter != null) { + adapter?.notifyDataSetChanged() + } + } + private fun initView() { binding.backBtn.setOnClickListener { finish() @@ -86,7 +112,7 @@ class MoListDetailsActivity : MoBaseActivity() { binding.subtitle.text = it.subtitle binding.secondSubtitle.text = it.secondSubtitle - val adapter = DetailsListAdapter(this, it.moPlaylistOrAlbumListBean) + adapter = DetailsListAdapter(this, it.moPlaylistOrAlbumListBean) binding.rv.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) binding.rv.adapter = adapter 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 e9454a5..b0b99c8 100644 --- a/app/src/main/java/com/player/musicoo/activity/MoPlayDetailsActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/MoPlayDetailsActivity.kt @@ -24,7 +24,9 @@ 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.sp.AppStore import com.player.musicoo.util.LogTag.LogD +import com.player.musicoo.util.PlayMode import com.player.musicoo.util.asMediaItem import com.player.musicoo.util.convertMillisToMinutesAndSecondsString import kotlinx.coroutines.Dispatchers @@ -65,7 +67,8 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { initImmersionBar() initClick() initPlayerListener() - + initPlayListAdapter() + updatePlayModeUi() val videoId = intent.getStringExtra(PLAY_DETAILS_VIDEO_ID) val playlistId = intent.getStringExtra(PLAY_DETAILS_PLAY_LIST_ID) val playlistSetVideoId = intent.getStringExtra(PLAY_DETAILS_PLAY_LIST_SET_VIDEO_ID) @@ -79,6 +82,7 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { if (meController != null && meController.currentMediaItem != null && videoId == meController.currentMediaItem?.mediaId) { //进入的id与当前的id一样就不重新去获取播放 updateCurrentMediaItemInfo() + updateInfoUi(meController.currentMediaItem) } else { binding.nameTv.text = intent.getStringExtra(PLAY_DETAILS_NAME) binding.descTv.text = intent.getStringExtra(PLAY_DETAILS_DESC) @@ -154,27 +158,42 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { binding.progressBar.progress = MediaControllerManager.getBufferedPosition().toInt() binding.progressBar.max = MediaControllerManager.getDuration().toInt() updateProgressBufferingState() + updatePlayListDataAndAdapter() + } + } + @SuppressLint("NotifyDataSetChanged") + private fun updatePlayListDataAndAdapter() { + if (meController != null && meController.currentMediaItem != null) { 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 + playList.clear() + playList.addAll(allMediaItems) + playListAdapter?.notifyDataSetChanged() } } + private var playList: MutableList = mutableListOf() + + private fun initPlayListAdapter() { + playListAdapter = PlayListAdapter( + this@MoPlayDetailsActivity, + playList + ) + binding.playListRv.layoutManager = + LinearLayoutManager( + this@MoPlayDetailsActivity, + LinearLayoutManager.VERTICAL, + false + ) + binding.playListRv.adapter = playListAdapter + } + + @SuppressLint("NotifyDataSetChanged") private fun initClick() { binding.backBtn.setOnClickListener { finish() @@ -189,6 +208,40 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { } } } + binding.playModeBtn.setOnClickListener { + if (meController != null) { + val playModeCounter = (appStore.playMusicMode + 1) % 3 + appStore.playMusicMode = when (playModeCounter) { + 0 -> PlayMode.LIST_LOOP.value + 1 -> PlayMode.SINGLE_LOOP.value + else -> PlayMode.RANDOM.value + } + when (AppStore(this).playMusicMode) { + PlayMode.LIST_LOOP.value -> { + meController.repeatMode = Player.REPEAT_MODE_ALL + meController.shuffleModeEnabled = false + } + + PlayMode.SINGLE_LOOP.value -> { + meController.repeatMode = Player.REPEAT_MODE_ONE + meController.shuffleModeEnabled = false + } + + PlayMode.RANDOM.value -> { + meController.repeatMode = Player.REPEAT_MODE_ALL +// val availableCommands = meController.availableCommands +// //控制器支持设置随机播放模式的命令 +// if (availableCommands.contains(Player.COMMAND_SET_SHUFFLE_MODE)) { +// meController.shuffleModeEnabled = true +// } + meController.shuffleModeEnabled = true + } + } + updatePlayModeUi() + LogD(TAG, "repeatMode->${meController.repeatMode}") + LogD(TAG, "shuffleModeEnabled->${meController.shuffleModeEnabled}") + } + } binding.playLayoutBtn.setOnClickListener { if (meController != null) { if (meController.isPlaying) { @@ -249,6 +302,30 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { } } + private fun updatePlayModeUi() { + binding.modePlayImg.setImageResource( + when (AppStore(this).playMusicMode) { + PlayMode.LIST_LOOP.value -> { + R.drawable.mode_cycle_play_icon + } + + PlayMode.SINGLE_LOOP.value -> { + R.drawable.mode_single_play_icon + } + + PlayMode.RANDOM.value -> { + R.drawable.mode_random_play_icon + } + + else -> { + R.drawable.mode_cycle_play_icon + } + } + + ) + } + + @SuppressLint("NotifyDataSetChanged") private fun initData( videoId: String, playlistId: String? = null, @@ -268,18 +345,6 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { 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) { @@ -322,6 +387,8 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener { .filter { filter -> filter.mediaId != videoId } it.addMediaItems(mediaItems) } + + updatePlayListDataAndAdapter() } else { binding.playbackErrorLayout.visibility = View.VISIBLE } diff --git a/app/src/main/java/com/player/musicoo/activity/MoSearchMoreActivity.kt b/app/src/main/java/com/player/musicoo/activity/MoSearchMoreActivity.kt index d3e1a60..b39c748 100644 --- a/app/src/main/java/com/player/musicoo/activity/MoSearchMoreActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/MoSearchMoreActivity.kt @@ -91,10 +91,24 @@ class MoSearchMoreActivity : MoBaseActivity() { } } } + events.onReceive { + when (it) { + Event.ActivityOnResume -> { + activityOnResume() + } + + else -> {} + } + } } } } + private fun activityOnResume() { + addMusicPlayerViewToLayout(binding.playMusicLayout) + } + + private fun initView() { binding.backBtn.setOnClickListener { finish() diff --git a/app/src/main/java/com/player/musicoo/activity/MoSingerDetailsActivity.kt b/app/src/main/java/com/player/musicoo/activity/MoSingerDetailsActivity.kt index d2f72c9..dabc0cc 100644 --- a/app/src/main/java/com/player/musicoo/activity/MoSingerDetailsActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/MoSingerDetailsActivity.kt @@ -59,10 +59,23 @@ class MoSingerDetailsActivity : MoBaseActivity() { } } } + events.onReceive { + when (it) { + Event.ActivityOnResume -> { + activityOnResume() + } + + else -> {} + } + } } } } + private fun activityOnResume() { + addMusicPlayerViewToLayout(binding.playMusicLayout) + } + private fun initView() { binding.backBtn.setOnClickListener { finish() diff --git a/app/src/main/java/com/player/musicoo/activity/MoSingerMoreSongActivity.kt b/app/src/main/java/com/player/musicoo/activity/MoSingerMoreSongActivity.kt index bb59c7b..f9d762a 100644 --- a/app/src/main/java/com/player/musicoo/activity/MoSingerMoreSongActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/MoSingerMoreSongActivity.kt @@ -74,16 +74,29 @@ class MoSingerMoreSongActivity : MoBaseActivity() { Request.MoreData -> { if (!currentContinuation.isNullOrEmpty()) { initDataMore(currentContinuation!!) - }else{ + } else { binding.refreshLayout.finishLoadMoreWithNoMoreData() } } } } + events.onReceive { + when (it) { + Event.ActivityOnResume -> { + activityOnResume() + } + + else -> {} + } + } } } } + private fun activityOnResume() { + addMusicPlayerViewToLayout(binding.playMusicLayout) + } + private fun initView() { binding.backBtn.setOnClickListener { finish() diff --git a/app/src/main/java/com/player/musicoo/activity/PrimaryActivity.kt b/app/src/main/java/com/player/musicoo/activity/PrimaryActivity.kt index 7f7b010..c35ee17 100644 --- a/app/src/main/java/com/player/musicoo/activity/PrimaryActivity.kt +++ b/app/src/main/java/com/player/musicoo/activity/PrimaryActivity.kt @@ -15,13 +15,14 @@ import com.player.musicoo.R import com.player.musicoo.databinding.ActivityPrimaryBinding import com.player.musicoo.fragment.ImportFragment import com.player.musicoo.fragment.MoHomeFragment +import com.player.musicoo.fragment.MoMeFragment import com.player.musicoo.fragment.SearchFragment import com.player.musicoo.media.MediaControllerManager import com.player.musicoo.util.LogTag.LogD import kotlinx.coroutines.isActive import kotlinx.coroutines.selects.select -class PrimaryActivity : MoBaseActivity() ,SearchFragment.SearchFragmentCancelClickListener{ +class PrimaryActivity : MoBaseActivity(), SearchFragment.SearchFragmentCancelClickListener { /** * musicResponsiveListItemRenderer * musicTwoRowItemRenderer @@ -36,8 +37,6 @@ class PrimaryActivity : MoBaseActivity() ,SearchFragment.SearchFragmentCancelCli binding = ActivityPrimaryBinding.inflate(layoutInflater) setContentView(binding.root) initView() - initPlayerListener() - onReceive() } @@ -55,32 +54,10 @@ class PrimaryActivity : MoBaseActivity() ,SearchFragment.SearchFragmentCancelCli updateBtnState(1) changeFragment(1) } - binding.importBtn.setOnClickListener { + binding.meBtn.setOnClickListener { updateBtnState(2) changeFragment(2) } - - binding.playBlackBtn.setOnClickListener { - if (meController != null) { - if (meController.isPlaying) { - meController.pause() - updatePlayState(false) - } else { - meController.play() - updatePlayState(true) - } - updateProgressState() - } - } - - binding.goDetailsBtn.setOnClickListener { - val intent = Intent(this, MoPlayDetailsActivity::class.java) - intent.putExtra( - MoPlayDetailsActivity.PLAY_DETAILS_COME_FROM, - PrimaryActivity::class.java - ) - startActivity(intent) - } } private fun initFragment() { @@ -89,7 +66,7 @@ class PrimaryActivity : MoBaseActivity() ,SearchFragment.SearchFragmentCancelCli val searchFragment = SearchFragment() searchFragment.setButtonClickListener(this) mFragments.add(searchFragment) - mFragments.add(ImportFragment()) + mFragments.add(MoMeFragment()) updateBtnState(0) changeFragment(0) } @@ -137,10 +114,10 @@ class PrimaryActivity : MoBaseActivity() ,SearchFragment.SearchFragmentCancelCli } } ) - importImg.setImageResource( + meImg.setImageResource( when (index) { - 2 -> R.drawable.import_select_icon - else -> R.drawable.import_unselect_icon + 2 -> R.drawable.me_select_icon + else -> R.drawable.me_unselect_icon } ) } @@ -164,60 +141,13 @@ class PrimaryActivity : MoBaseActivity() ,SearchFragment.SearchFragmentCancelCli } private fun activityOnResume() { - if (meController != null && meController.mediaItemCount > 0 && meController.duration > 0) { - binding.playingStatusLayout.visibility = View.VISIBLE - updateInfoUi(meController.currentMediaItem) - } else { - binding.playingStatusLayout.visibility = View.GONE - } + addMusicPlayerViewToLayout(binding.playMusicLayout) } - private fun initPlayerListener() { - meController?.addListener(playerListener) + override fun onFragmentClick() { + onBackPressed() } - private val playerListener = object : Player.Listener { - override fun onPositionDiscontinuity( - oldPosition: Player.PositionInfo, - newPosition: Player.PositionInfo, - reason: Int - ) { - if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) { - updateInfoUi(meController?.currentMediaItem) - } - } - - override fun onPlaybackStateChanged(playbackState: Int) { - LogD(TAG, "playbackState->$playbackState") - updateProgressState() - when (playbackState) { - Player.STATE_READY -> { - if (meController != null) { - LogD(TAG, "meController.duration->${meController.duration}") - binding.progressBar.setMaxProgress(MediaControllerManager.getDuration()) - val currentPosition = meController.currentPosition - binding.progressBar.setProgress(currentPosition) - } - } - - else -> {} - } - - } - - override fun onPlayWhenReadyChanged( - playWhenReady: Boolean, - reason: Int - ) { - updatePlayState(playWhenReady) - updateProgressState() - } - } - - override fun onDestroy() { - super.onDestroy() - meController?.removeListener(playerListener) - } private var backPressedTime: Long = 0 private val backToast: Toast by lazy { @@ -239,56 +169,4 @@ class PrimaryActivity : MoBaseActivity() ,SearchFragment.SearchFragmentCancelCli backPressedTime = System.currentTimeMillis() } } - - /** - * 更新播放进度 - */ - private fun updateProgressState() { - //判断是否ready与播放中,否则停止更新进度 - if (meController != null && meController.playbackState == Player.STATE_READY && meController.isPlaying) { - updatePlayState(meController.isPlaying) - progressHandler.removeCallbacksAndMessages(null) - progressHandler.sendEmptyMessage(1) - } else { - progressHandler.removeCallbacksAndMessages(null) - } - } - - /** - * 播放进度 - */ - private val progressHandler = object : Handler(Looper.myLooper()!!) { - override fun handleMessage(msg: Message) { - //判断是否ready与播放中,否则停止更新进度 - if (meController != null && meController.playbackState == Player.STATE_READY && meController.isPlaying) { - val currentPosition = meController.currentPosition - binding.progressBar.setProgress(currentPosition) - sendEmptyMessageDelayed(1, 50) - } - } - } - - private fun updatePlayState(b: Boolean) { - if (b) { - binding.playStatusImg.setImageResource(R.drawable.playing_black_icon) - } else { - binding.playStatusImg.setImageResource(R.drawable.play_black_icon) - } - } - - private fun updateInfoUi(mediaItem: MediaItem?) { - if (mediaItem == null) { - return - } - Glide.with(this@PrimaryActivity) - .load(mediaItem.mediaMetadata.artworkUri) - .into(binding.audioImg) - - binding.name.text = mediaItem.mediaMetadata.title - binding.desc.text = mediaItem.mediaMetadata.artist - } - - override fun onFragmentClick() { - onBackPressed() - } } \ 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 f9728e5..46ae459 100644 --- a/app/src/main/java/com/player/musicoo/adapter/DetailsListAdapter.kt +++ b/app/src/main/java/com/player/musicoo/adapter/DetailsListAdapter.kt @@ -19,6 +19,7 @@ import com.player.musicoo.databinding.SoundsOfAppliancesLayoutBinding import com.player.musicoo.databinding.SoundsOfNatureLayoutBinding import com.player.musicoo.innertube.Innertube import com.player.musicoo.innertube.models.MusicCarouselShelfRenderer +import com.player.musicoo.media.MediaControllerManager import com.player.musicoo.util.convertMillisToMinutesAndSecondsString import com.player.musicoo.util.getAudioDurationFromAssets @@ -28,10 +29,6 @@ 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) @@ -66,7 +63,6 @@ class DetailsListAdapter( @SuppressLint("SetTextI18n") fun bind(bean: Innertube.MoPlaylistOrAlbumPage.MoPlaylistOrAlbumListBean) { - binding.apply { if (!bean.thumbnailUrl.isNullOrEmpty()) { image.visibility = View.VISIBLE @@ -87,7 +83,16 @@ class DetailsListAdapter( name.visibility = View.VISIBLE name.text = bean.name } - + val meController = MediaControllerManager.getController() + if (meController != null && meController.currentMediaItem != null) { + if (meController.currentMediaItem?.mediaId == bean.videoId) { + binding.title.setTextColor(context.getColor(R.color.green)) + binding.name.setTextColor(context.getColor(R.color.green_60)) + } else { + binding.title.setTextColor(context.getColor(R.color.white)) + binding.name.setTextColor(context.getColor(R.color.white_60)) + } + } } } } diff --git a/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt b/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt index 9254dbb..de5e937 100644 --- a/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt +++ b/app/src/main/java/com/player/musicoo/adapter/PlayListAdapter.kt @@ -54,19 +54,6 @@ class PlayListAdapter( 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) @@ -77,7 +64,16 @@ class PlayListAdapter( name.visibility = View.VISIBLE name.text = bean.mediaMetadata.artist } - + val meController = MediaControllerManager.getController() + if (meController != null && meController.currentMediaItem != null) { + if (meController.currentMediaItem?.mediaId == bean.mediaId) { + binding.title.setTextColor(context.getColor(R.color.green)) + binding.name.setTextColor(context.getColor(R.color.green_60)) + } else { + binding.title.setTextColor(context.getColor(R.color.white)) + binding.name.setTextColor(context.getColor(R.color.white_60)) + } + } } } } 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 ff1663a..e228b7e 100644 --- a/app/src/main/java/com/player/musicoo/fragment/MoHomeFragment.kt +++ b/app/src/main/java/com/player/musicoo/fragment/MoHomeFragment.kt @@ -62,7 +62,7 @@ class MoHomeFragment : MoBaseFragment() { private suspend fun initData() { showLoadingUi() - Innertube.homePage()?.onSuccess { + Innertube.homePage(appStore.myVisitorData)?.onSuccess { showDataUi() if (it.homePage.isNotEmpty()) { for (home: Innertube.HomePage in it.homePage) { diff --git a/app/src/main/java/com/player/musicoo/fragment/MoMeFragment.kt b/app/src/main/java/com/player/musicoo/fragment/MoMeFragment.kt new file mode 100644 index 0000000..0d81ded --- /dev/null +++ b/app/src/main/java/com/player/musicoo/fragment/MoMeFragment.kt @@ -0,0 +1,60 @@ +package com.player.musicoo.fragment + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.gyf.immersionbar.ktx.immersionBar +import com.player.musicoo.databinding.FragmentMoHomeBinding +import com.player.musicoo.databinding.FragmentMoMeBinding +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.isActive +import kotlinx.coroutines.selects.select + +class MoMeFragment : MoBaseFragment() { + + private val requests: Channel = Channel(Channel.UNLIMITED) + + enum class Request { + + } + + override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentMoMeBinding + get() = FragmentMoMeBinding::inflate + + override suspend fun onViewCreated() { + initView() + onReceive() + } + + private fun initImmersionBar() { + immersionBar { + statusBarDarkFont(false) + statusBarView(binding.view) + } + } + + private suspend fun onReceive() { + while (isActive) { + select { + requests.onReceive { + + } + } + } + } + + private fun initView() { + } + + + override fun onResume() { + super.onResume() + initImmersionBar() + } + + override fun onHiddenChanged(hidden: Boolean) { + super.onHiddenChanged(hidden) + if (!hidden) { + initImmersionBar() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/player/musicoo/innertube/requests/HomePage.kt b/app/src/main/java/com/player/musicoo/innertube/requests/HomePage.kt index 6df766d..28e453f 100644 --- a/app/src/main/java/com/player/musicoo/innertube/requests/HomePage.kt +++ b/app/src/main/java/com/player/musicoo/innertube/requests/HomePage.kt @@ -1,21 +1,34 @@ package com.player.musicoo.innertube.requests +import com.player.musicoo.App import com.player.musicoo.innertube.Innertube import com.player.musicoo.innertube.models.BrowseResponse import com.player.musicoo.innertube.models.Context import com.player.musicoo.innertube.models.SectionListRenderer import com.player.musicoo.innertube.models.bodies.BrowseBody import com.player.musicoo.innertube.utils.runCatchingNonCancellable +import com.player.musicoo.sp.AppStore +import com.player.musicoo.util.LogTag import io.ktor.client.call.body import io.ktor.client.request.post import io.ktor.client.request.setBody // -suspend fun Innertube.homePage(): Result? = +suspend fun Innertube.homePage(visitorData: String? = null): Result? = runCatchingNonCancellable { + LogTag.LogD(TAG, "visitorData->${visitorData}") + val defaultWeb = Context( + client = Context.Client( + clientName = "WEB_REMIX", + clientVersion = "1.20220918", + platform = "DESKTOP", + visitorData = visitorData + ) + ) + val response = client.post(browse) { - setBody(BrowseBody(Context.DefaultWeb, "FEmusic_home")) + setBody(BrowseBody(defaultWeb, "FEmusic_home")) }.body() val sectionListRenderer = response @@ -29,7 +42,10 @@ suspend fun Innertube.homePage(): Result? = val contents = sectionListRenderer?.contents - val visitorData = response.responseContext?.visitorData + val visitorDataNew= response.responseContext?.visitorData +// if(!visitorDataNew.isNullOrEmpty()){ +// AppStore(App.app).myVisitorData = visitorDataNew +// } val continuations = sectionListRenderer?.continuations val nextContinuationData = continuations @@ -66,7 +82,7 @@ suspend fun Innertube.homePage(): Result? = } val baseHomePage = Innertube.BaseHomePage( - visitorData, + visitorDataNew, cToken, cToken.toString(), itct.toString(), diff --git a/app/src/main/java/com/player/musicoo/innertube/requests/HomePageMore.kt b/app/src/main/java/com/player/musicoo/innertube/requests/HomePageMore.kt index 1c302d5..98e5c26 100644 --- a/app/src/main/java/com/player/musicoo/innertube/requests/HomePageMore.kt +++ b/app/src/main/java/com/player/musicoo/innertube/requests/HomePageMore.kt @@ -1,11 +1,13 @@ package com.player.musicoo.innertube.requests +import com.player.musicoo.App import com.player.musicoo.innertube.Innertube import com.player.musicoo.innertube.models.BrowseResponse import com.player.musicoo.innertube.models.Context import com.player.musicoo.innertube.models.SectionListContinuation import com.player.musicoo.innertube.models.bodies.BrowseMoreBody import com.player.musicoo.innertube.utils.runCatchingNonCancellable +import com.player.musicoo.sp.AppStore import io.ktor.client.call.body import io.ktor.client.request.post import io.ktor.client.request.setBody 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 a25eb20..c1ab6cf 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 @@ -1,10 +1,13 @@ package com.player.musicoo.innertube.requests +import com.player.musicoo.App import com.player.musicoo.innertube.Innertube import com.player.musicoo.innertube.models.BrowseResponse import com.player.musicoo.innertube.models.MusicShelfRenderer import com.player.musicoo.innertube.models.bodies.BrowseBody import com.player.musicoo.innertube.utils.runCatchingNonCancellable +import com.player.musicoo.sp.AppStore +import com.player.musicoo.util.LogTag import io.ktor.client.call.body import io.ktor.client.request.post import io.ktor.client.request.setBody @@ -15,7 +18,6 @@ suspend fun Innertube.moPlaylistPage(browseId: String): Result() - val musicDetailHeaderRenderer = response .header ?.musicDetailHeaderRenderer diff --git a/app/src/main/java/com/player/musicoo/innertube/requests/MoSingerlistPage.kt b/app/src/main/java/com/player/musicoo/innertube/requests/MoSingerlistPage.kt index 8f7d4d2..f5319c6 100644 --- a/app/src/main/java/com/player/musicoo/innertube/requests/MoSingerlistPage.kt +++ b/app/src/main/java/com/player/musicoo/innertube/requests/MoSingerlistPage.kt @@ -1,5 +1,6 @@ package com.player.musicoo.innertube.requests +import com.player.musicoo.App import com.player.musicoo.innertube.Innertube import com.player.musicoo.innertube.models.BrowseResponse import com.player.musicoo.innertube.models.ContinuationResponse @@ -10,6 +11,7 @@ import com.player.musicoo.innertube.models.SectionListRenderer import com.player.musicoo.innertube.models.bodies.BrowseBody import com.player.musicoo.innertube.models.bodies.ContinuationBody import com.player.musicoo.innertube.utils.runCatchingNonCancellable +import com.player.musicoo.sp.AppStore import com.player.musicoo.util.LogTag import io.ktor.client.call.body import io.ktor.client.request.post 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 7f59d29..7fd7e03 100644 --- a/app/src/main/java/com/player/musicoo/service/PlaybackService.kt +++ b/app/src/main/java/com/player/musicoo/service/PlaybackService.kt @@ -39,9 +39,11 @@ import com.player.musicoo.R import com.player.musicoo.innertube.Innertube import com.player.musicoo.innertube.models.bodies.PlayerBody import com.player.musicoo.innertube.requests.player +import com.player.musicoo.sp.AppStore import com.player.musicoo.util.ExoPlayerDiskCacheMaxSize import com.player.musicoo.util.LogTag import com.player.musicoo.util.LogTag.LogD +import com.player.musicoo.util.PlayMode import com.player.musicoo.util.RingBuffer import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking @@ -90,6 +92,22 @@ class PlaybackService : MediaSessionService(), Player.Listener { ) .setUsePlatformDiagnostics(false) .build() + + when (AppStore(this).playMusicMode) { + PlayMode.LIST_LOOP.value -> { + player.repeatMode = Player.REPEAT_MODE_ALL + player.shuffleModeEnabled = false + } + PlayMode.SINGLE_LOOP.value -> { + player.repeatMode = Player.REPEAT_MODE_ONE + player.shuffleModeEnabled = false + } + PlayMode.RANDOM.value -> { + player.repeatMode = Player.REPEAT_MODE_ALL + player.shuffleModeEnabled = true + } + } + player.repeatMode = Player.REPEAT_MODE_ALL player.addListener(this) diff --git a/app/src/main/java/com/player/musicoo/sp/AppStore.kt b/app/src/main/java/com/player/musicoo/sp/AppStore.kt index 4615abe..65a5de2 100644 --- a/app/src/main/java/com/player/musicoo/sp/AppStore.kt +++ b/app/src/main/java/com/player/musicoo/sp/AppStore.kt @@ -3,6 +3,7 @@ package com.player.musicoo.sp import android.content.Context import com.player.musicoo.sp.store.Store import com.player.musicoo.sp.store.asStoreProvider +import com.player.musicoo.util.PlayMode class AppStore(context: Context) { private val store = Store( @@ -16,8 +17,20 @@ class AppStore(context: Context) { defaultValue = emptySet() ) + var myVisitorData: String by store.string( + key = MY_VISITOR_DATA, + defaultValue = "" + ) + + var playMusicMode: Int by store.int( + key = PLAY_MUSIC_MODE, + defaultValue = PlayMode.LIST_LOOP.value + ) + companion object { private const val FILE_NAME = "music_oo_app" const val SEARCH_HISTORY = "search_history" + const val MY_VISITOR_DATA = "my_visitor_data" + const val PLAY_MUSIC_MODE = "play_music_mode" } } \ No newline at end of file diff --git a/app/src/main/java/com/player/musicoo/util/PlayMode.kt b/app/src/main/java/com/player/musicoo/util/PlayMode.kt new file mode 100644 index 0000000..e211d1f --- /dev/null +++ b/app/src/main/java/com/player/musicoo/util/PlayMode.kt @@ -0,0 +1,11 @@ +package com.player.musicoo.util + +enum class PlayMode(val value: Int) { + LIST_LOOP(0), // 列表循环 + SINGLE_LOOP(1), // 单曲循环 + RANDOM(2); // 随机播放 + + companion object { + fun fromValue(value: Int) = entries.firstOrNull { it.value == value } ?: LIST_LOOP + } +} \ No newline at end of file diff --git a/app/src/main/java/com/player/musicoo/view/MusicPlayerView.kt b/app/src/main/java/com/player/musicoo/view/MusicPlayerView.kt new file mode 100644 index 0000000..ac64c75 --- /dev/null +++ b/app/src/main/java/com/player/musicoo/view/MusicPlayerView.kt @@ -0,0 +1,126 @@ +package com.player.musicoo.view + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Handler +import android.os.Looper +import android.os.Message +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.media3.common.MediaItem +import androidx.media3.common.Player +import androidx.media3.session.MediaController +import com.bumptech.glide.Glide +import com.player.musicoo.R +import com.player.musicoo.activity.MoPlayDetailsActivity +import com.player.musicoo.activity.PrimaryActivity +import com.player.musicoo.innertube.Innertube +import com.player.musicoo.media.MediaControllerManager +import com.player.musicoo.util.LogTag + +@SuppressLint("ViewConstructor") +class MusicPlayerView( + val context: Activity, + val meController: MediaController?, + attrs: AttributeSet? = null +) : + LinearLayout(context, attrs) { + + private var goDetailsBtn: LinearLayout + private var progressBar: CircularProgressBar + private var playStatusImg: ImageView + private var audioImg: ImageView + private var name: TextView + private var desc: TextView + private var playBlackBtn: LinearLayout + + init { + LayoutInflater.from(context).inflate(R.layout.music_player_layout, this, true) + goDetailsBtn = findViewById(R.id.goDetailsBtn) + progressBar = findViewById(R.id.progressBar) + playStatusImg = findViewById(R.id.play_status_img) + audioImg = findViewById(R.id.audio_img) + name = findViewById(R.id.name) + desc = findViewById(R.id.desc) + playBlackBtn = findViewById(R.id.play_black_btn) + initOnClickListener() + } + + private fun initOnClickListener() { + playBlackBtn.setOnClickListener { + if (meController != null) { + if (meController.isPlaying) { + meController.pause() + updatePlayState(false) + } else { + meController.play() + updatePlayState(true) + } + updateProgressState(meController) + } + } + goDetailsBtn.setOnClickListener { + val intent = Intent(context, MoPlayDetailsActivity::class.java) + intent.putExtra( + MoPlayDetailsActivity.PLAY_DETAILS_COME_FROM, + PrimaryActivity::class.java + ) + context.startActivity(intent) + } + } + + fun updateProgressState(meController: MediaController) { + //判断是否ready与播放中,否则停止更新进度 + if (meController.playbackState == Player.STATE_READY && meController.isPlaying) { + updatePlayState(meController.isPlaying) + progressHandler.removeCallbacksAndMessages(null) + progressHandler.sendEmptyMessage(1) + } else { + progressHandler.removeCallbacksAndMessages(null) + } + } + + /** + * 播放进度 + */ + private val progressHandler = object : Handler(Looper.myLooper()!!) { + override fun handleMessage(msg: Message) { + //判断是否ready与播放中,否则停止更新进度 + if (meController != null && meController.playbackState == Player.STATE_READY && meController.isPlaying) { + val currentPosition = meController.currentPosition + progressBar.setProgress(currentPosition) + sendEmptyMessageDelayed(1, 50) + } + } + } + + fun updatePlayState(b: Boolean) { + if (b) { + playStatusImg.setImageResource(R.drawable.playing_black_icon) + } else { + playStatusImg.setImageResource(R.drawable.play_black_icon) + } + } + + fun updateInfoUi(mediaItem: MediaItem?) { + if (mediaItem == null) { + return + } + Glide.with(context) + .load(mediaItem.mediaMetadata.artworkUri) + .into(audioImg) + name.text = mediaItem.mediaMetadata.title + desc.text = mediaItem.mediaMetadata.artist + } + + fun updateSetProgress(meController: MediaController) { + progressBar.setMaxProgress(MediaControllerManager.getDuration()) + val currentPosition = meController.currentPosition + progressBar.setProgress(currentPosition) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/alarm_clock_icon.xml b/app/src/main/res/drawable/alarm_clock_icon.xml deleted file mode 100644 index 324cc10..0000000 --- a/app/src/main/res/drawable/alarm_clock_icon.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/me_select_icon.xml b/app/src/main/res/drawable/me_select_icon.xml new file mode 100644 index 0000000..bb4bdb1 --- /dev/null +++ b/app/src/main/res/drawable/me_select_icon.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/me_unselect_icon.xml b/app/src/main/res/drawable/me_unselect_icon.xml new file mode 100644 index 0000000..a26fe1c --- /dev/null +++ b/app/src/main/res/drawable/me_unselect_icon.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/drawable/play_mode_icon.xml b/app/src/main/res/drawable/mode_cycle_play_icon.xml similarity index 100% rename from app/src/main/res/drawable/play_mode_icon.xml rename to app/src/main/res/drawable/mode_cycle_play_icon.xml diff --git a/app/src/main/res/drawable/mode_random_play_icon.xml b/app/src/main/res/drawable/mode_random_play_icon.xml new file mode 100644 index 0000000..c376105 --- /dev/null +++ b/app/src/main/res/drawable/mode_random_play_icon.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/app/src/main/res/drawable/mode_single_play_icon.xml b/app/src/main/res/drawable/mode_single_play_icon.xml new file mode 100644 index 0000000..0563c0a --- /dev/null +++ b/app/src/main/res/drawable/mode_single_play_icon.xml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/app/src/main/res/drawable/search_edit_icon.xml b/app/src/main/res/drawable/search_edit_icon.xml new file mode 100644 index 0000000..cde8483 --- /dev/null +++ b/app/src/main/res/drawable/search_edit_icon.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/search_unselect_icon.xml b/app/src/main/res/drawable/search_unselect_icon.xml index 250c13c..0ad70de 100644 --- a/app/src/main/res/drawable/search_unselect_icon.xml +++ b/app/src/main/res/drawable/search_unselect_icon.xml @@ -1,19 +1,21 @@ - - + android:width="36dp" + android:height="36dp" + android:viewportWidth="36" + android:viewportHeight="36"> - - + android:fillColor="#00000000" + android:pathData="M18,18m-17.5,0a17.5,17.5 0,1 1,35 0a17.5,17.5 0,1 1,-35 0" + android:strokeWidth="1" + android:strokeColor="#9C9D9D" /> + + + + + diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index 478b2f7..41935bd 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -100,90 +100,105 @@ android:textSize="16dp" /> - - + android:layout_height="match_parent"> - - - - - - + android:layout_height="match_parent" + android:layout_above="@+id/play_music_layout" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + android:layout_marginTop="4dp" + android:layout_marginEnd="16dp" + android:layout_marginBottom="16dp" + android:overScrollMode="never" + android:scrollbars="none" /> - - + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:orientation="vertical" /> + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6b54263..51edfb9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -104,20 +104,6 @@ - - - - - - @@ -149,9 +149,9 @@ android:layout_height="wrap_content" android:layout_marginTop="16dp" android:background="@drawable/drw_btn_bg" + android:fontFamily="@font/medium_font" android:paddingStart="24dp" android:paddingTop="8dp" - android:fontFamily="@font/medium_font" android:paddingEnd="24dp" android:paddingBottom="8dp" android:text="@string/try_again" @@ -294,15 +294,17 @@ android:orientation="horizontal"> + android:src="@drawable/mode_cycle_play_icon" /> + android:layout_margin="16dp" + android:overScrollMode="never" + android:scrollbars="none" /> diff --git a/app/src/main/res/layout/activity_primary.xml b/app/src/main/res/layout/activity_primary.xml index 3dc4f40..283d80b 100644 --- a/app/src/main/res/layout/activity_primary.xml +++ b/app/src/main/res/layout/activity_primary.xml @@ -38,126 +38,11 @@ android:layout_alignParentBottom="true" android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:orientation="vertical" /> + android:src="@drawable/me_unselect_icon" /> diff --git a/app/src/main/res/layout/activity_search_more.xml b/app/src/main/res/layout/activity_search_more.xml index 28a7897..113da18 100644 --- a/app/src/main/res/layout/activity_search_more.xml +++ b/app/src/main/res/layout/activity_search_more.xml @@ -106,25 +106,40 @@ android:textSize="16dp" /> - - + android:layout_above="@+id/play_music_layout"> - + + + + + - + android:layout_alignParentBottom="true" + android:orientation="vertical" /> + + + diff --git a/app/src/main/res/layout/activity_singer_details.xml b/app/src/main/res/layout/activity_singer_details.xml index f4242f0..ab93379 100644 --- a/app/src/main/res/layout/activity_singer_details.xml +++ b/app/src/main/res/layout/activity_singer_details.xml @@ -138,67 +138,81 @@ android:textSize="16dp" /> - - + android:layout_above="@+id/play_music_layout"> - + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:orientation="vertical"> - + - + + + + + + android:layout_marginStart="16dp" + android:layout_marginTop="16dp" + android:layout_marginEnd="16dp" + android:orientation="vertical" /> - - + - + + + diff --git a/app/src/main/res/layout/details_list_item.xml b/app/src/main/res/layout/details_list_item.xml index 6005cab..388db0c 100644 --- a/app/src/main/res/layout/details_list_item.xml +++ b/app/src/main/res/layout/details_list_item.xml @@ -45,6 +45,21 @@ android:text="1" android:textColor="@color/white" android:textSize="16dp" /> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 5e21da4..d2f2ada 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -40,10 +40,10 @@ android:orientation="horizontal"> + android:src="@drawable/search_edit_icon" /> @@ -78,7 +78,7 @@ android:id="@+id/cancelBtn" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_marginStart="8dp" + android:layout_marginStart="16dp" android:fontFamily="@font/regular_font" android:gravity="center" android:text="@string/cancel" diff --git a/app/src/main/res/layout/music_player_layout.xml b/app/src/main/res/layout/music_player_layout.xml new file mode 100644 index 0000000..593ba3b --- /dev/null +++ b/app/src/main/res/layout/music_player_layout.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/play_list_item.xml b/app/src/main/res/layout/play_list_item.xml index cc813e7..b368964 100644 --- a/app/src/main/res/layout/play_list_item.xml +++ b/app/src/main/res/layout/play_list_item.xml @@ -37,20 +37,6 @@ android:scaleType="centerCrop" android:src="@mipmap/musicoo_logo_img" /> - - - - -