diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 0d57596..53ee459 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -38,7 +38,7 @@ android {
dependencies {
implementation("androidx.appcompat:appcompat:1.7.0")
- implementation("com.google.android.material:material:1.12.0")
+ implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.activity:activity:1.9.1")
testImplementation("junit:junit:4.13.2")
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 18cd5f2..71beea1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,9 @@
+
+
+
@@ -28,12 +31,11 @@
android:exported="false" />
-
@@ -41,6 +43,11 @@
+
+
+
diff --git a/app/src/main/java/com/hi/music/player/MusicApplication.java b/app/src/main/java/com/hi/music/player/MusicApplication.java
index 9db4a93..5e351fe 100644
--- a/app/src/main/java/com/hi/music/player/MusicApplication.java
+++ b/app/src/main/java/com/hi/music/player/MusicApplication.java
@@ -3,6 +3,10 @@ package com.hi.music.player;
import android.app.Application;
import android.content.Context;
+import com.hi.music.player.api.MediaControllerStatusListener;
+import com.hi.music.player.helper.CommonUtils;
+import com.hi.music.player.media3.MyMediaControllerManager;
+
public class MusicApplication extends Application {
// private final static MusicApplication sInstance = new MusicApplication();
@@ -19,5 +23,11 @@ public class MusicApplication extends Application {
public void onCreate() {
super.onCreate();
myApplication = this;
+ MyMediaControllerManager.getInstance().init(new MediaControllerStatusListener() {
+ @Override
+ public void onMediaControllerComplete(boolean isOk) {
+ CommonUtils.LogMsg("=-----mediaController+" + isOk);
+ }
+ });
}
}
diff --git a/app/src/main/java/com/hi/music/player/api/MediaControllerListener.java b/app/src/main/java/com/hi/music/player/api/MediaControllerListener.java
index 0b7f511..57bf9bc 100644
--- a/app/src/main/java/com/hi/music/player/api/MediaControllerListener.java
+++ b/app/src/main/java/com/hi/music/player/api/MediaControllerListener.java
@@ -3,7 +3,6 @@ package com.hi.music.player.api;
public interface MediaControllerListener {
- void onMediaControllerComplete(boolean isOk);
void onPlayStatus(int playStatus);
}
diff --git a/app/src/main/java/com/hi/music/player/api/MediaControllerStatusListener.java b/app/src/main/java/com/hi/music/player/api/MediaControllerStatusListener.java
new file mode 100644
index 0000000..3202399
--- /dev/null
+++ b/app/src/main/java/com/hi/music/player/api/MediaControllerStatusListener.java
@@ -0,0 +1,9 @@
+package com.hi.music.player.api;
+
+public interface MediaControllerStatusListener {
+
+
+ void onMediaControllerComplete(boolean isOk);
+
+
+}
diff --git a/app/src/main/java/com/hi/music/player/helper/MyValue.java b/app/src/main/java/com/hi/music/player/helper/MyValue.java
index 6e09f06..7bbe8b8 100644
--- a/app/src/main/java/com/hi/music/player/helper/MyValue.java
+++ b/app/src/main/java/com/hi/music/player/helper/MyValue.java
@@ -3,5 +3,8 @@ package com.hi.music.player.helper;
public class MyValue {
//-----------------------------PlayActivity
public static String KEY_PLAY_ACTIVITY_SINGER = "click_singer";
+
+ //播放错误
+ public static int PLAY_STATUS_CODE = -1;
//-----------------------------PlayActivity
}
diff --git a/app/src/main/java/com/hi/music/player/javabean/response/ResponsePlayListInfo.java b/app/src/main/java/com/hi/music/player/javabean/response/ResponsePlayListInfo.java
index 91001ec..0ecf236 100644
--- a/app/src/main/java/com/hi/music/player/javabean/response/ResponsePlayListInfo.java
+++ b/app/src/main/java/com/hi/music/player/javabean/response/ResponsePlayListInfo.java
@@ -29,6 +29,20 @@ public class ResponsePlayListInfo {
private String params;
private String musicVideoType;
+
+
+ //------------自定义属性,由另外接口请求返回的数据流组装
+ private String audioUrlLow;
+
+ private String audioUrlMedium;
+
+
+
+
+
+
+
+
public long getDurationMs() {
return DurationMs;
}
@@ -116,4 +130,21 @@ public class ResponsePlayListInfo {
public void setMusicVideoType(String musicVideoType) {
this.musicVideoType = musicVideoType;
}
+
+
+ public String getAudioUrlLow() {
+ return audioUrlLow;
+ }
+
+ public void setAudioUrlLow(String audioUrlLow) {
+ this.audioUrlLow = audioUrlLow;
+ }
+
+ public String getAudioUrlMedium() {
+ return audioUrlMedium;
+ }
+
+ public void setAudioUrlMedium(String audioUrlMedium) {
+ this.audioUrlMedium = audioUrlMedium;
+ }
}
diff --git a/app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java b/app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java
index e4f0b15..b60d6e4 100644
--- a/app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java
+++ b/app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java
@@ -15,7 +15,9 @@ import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import com.hi.music.player.MusicApplication;
import com.hi.music.player.api.MediaControllerListener;
+import com.hi.music.player.api.MediaControllerStatusListener;
import com.hi.music.player.helper.CommonUtils;
+import com.hi.music.player.helper.MyValue;
import com.hi.music.player.javabean.response.ResponsePlayListInfo;
import com.hi.music.player.javabean.response.ResponsePlayUrl;
import com.hi.music.player.network.RetrofitManager;
@@ -29,6 +31,7 @@ public class MyMediaControllerManager {
private static volatile MyMediaControllerManager myMediaControllerManagerInstance;
private MediaController mediaController;
+
public static MyMediaControllerManager getInstance() {
if (myMediaControllerManagerInstance == null) {
synchronized (RetrofitManager.class) {
@@ -40,7 +43,7 @@ public class MyMediaControllerManager {
return myMediaControllerManagerInstance;
}
- public void init(MediaControllerListener mediaControllerListener){
+ public void init(MediaControllerStatusListener statusListener) {
SessionToken sessionToken =
new SessionToken(MusicApplication.myApplication, new ComponentName(MusicApplication.myApplication, PlaybackService.class));
ListenableFuture controllerFuture =
@@ -52,35 +55,52 @@ public class MyMediaControllerManager {
// playerView.setPlayer(controllerFuture.get());
try {
mediaController = controllerFuture.get();
- mediaController.addListener(new Player.Listener() {
- @Override
- public void onPlayerError(PlaybackException error) {
- CommonUtils.LogMsg("=-----PlaybackException+"+error.getMessage());
- }
- @Override
- public void onPlaybackStateChanged(int playbackState) {
- CommonUtils.LogMsg("=-----playbackState+"+playbackState);
- mediaControllerListener.onPlayStatus(playbackState);
-
- }
- @Override
- public void onPositionDiscontinuity(Player.PositionInfo oldPosition, Player.PositionInfo newPosition, int reason) {
- // 快进、快退等操作
- CommonUtils.LogMsg("=-----newPosition+"+newPosition.positionMs);
-// mediaControllerListener.onPlayStatus(playbackState);
- }
- });
- mediaControllerListener.onMediaControllerComplete(true);
- CommonUtils.LogMsg("=-----mediaController+"+mediaController);
+ statusListener.onMediaControllerComplete(true);
+ CommonUtils.LogMsg("=-----mediaController+" + mediaController);
} catch (ExecutionException | InterruptedException e) {
CommonUtils.LogErrorMsg(e.getMessage());
- mediaControllerListener.onMediaControllerComplete(false);
+ statusListener.onMediaControllerComplete(false);
}
}, MoreExecutors.directExecutor());
+ }
+ public void addListener(MediaControllerListener listener) {
+ mediaController.addListener(new Player.Listener() {
+ @Override
+ public void onPlayerError(PlaybackException error) {
+ CommonUtils.LogMsg("=-----PlaybackException+" + error.getMessage());
+ listener.onPlayStatus(MyValue.PLAY_STATUS_CODE);
+ }
+
+ @Override
+ public void onIsPlayingChanged(boolean isPlaying) {
+ CommonUtils.LogMsg("-----onIsPlayingChanged+" + isPlaying);
+ if (isPlaying) {
+ // 播放器开始播放
+ System.out.println("Playback started!");
+ } else {
+ // 播放器暂停或停止
+ System.out.println("Playback paused or stopped.");
+ }
+ }
+
+ @Override
+ public void onPlaybackStateChanged(int playbackState) {
+
+ listener.onPlayStatus(playbackState);
+
+ }
+
+ @Override
+ public void onPositionDiscontinuity(Player.PositionInfo oldPosition, Player.PositionInfo newPosition, int reason) {
+ // 快进、快退等操作
+ CommonUtils.LogMsg("=-----快进、快退+" + newPosition.positionMs);
+// mediaControllerListener.onPlayStatus(playbackState);
+ }
+ });
}
public MediaController getMediaController() {
@@ -89,37 +109,105 @@ public class MyMediaControllerManager {
public long getContentPos() {
+ if (mediaController == null) return 0;
return mediaController.getContentPosition();
}
+ public long getBufferPos() {
+ if (mediaController == null) return 0;
+ return mediaController.getBufferedPosition();
+ }
+
+
+ /**
+ * 更新播放列表中的音频url
+ *
+ * @param playUrl
+ */
@OptIn(markerClass = UnstableApi.class)
- public void addMusicPlay(ResponsePlayListInfo playInfo, ResponsePlayUrl responsePlay){
- List mediaItems = new ArrayList<>();
- MediaItem.Builder builder = new MediaItem.Builder();
- if(responsePlay.getAudioUrlMedium()!= null){
- builder.setUri(responsePlay.getAudioUrlMedium());
- }else {
- builder.setUri(responsePlay.getAudioUrlLow());
+ public void UpdateAudioUrl(ResponsePlayUrl playUrl) {
+ for (int i = 0; i < mediaController.getMediaItemCount(); i++) {
+ MediaItem mediaItemAt = mediaController.getMediaItemAt(i);
+ if (mediaItemAt.mediaId.equals(playUrl.getVideoId())) {
+ MediaItem.Builder builder = mediaItemAt.buildUpon();
+ if (playUrl.getAudioUrlMedium() != null) {
+ builder.setUri(playUrl.getAudioUrlMedium());
+ } else {
+ builder.setUri(playUrl.getAudioUrlLow());
+ }
+ mediaController.setMediaItem(builder.build(), i);
+ CharSequence title = mediaController.getMediaItemAt(i).mediaMetadata.title;
+ CommonUtils.LogMsg("-------------更新播放列表中的音频url= i=" + i + "---title=" + title);
+ break;
+ }
}
+ }
+// @OptIn(markerClass = UnstableApi.class)
+// public void addMusicPlay(ResponsePlayListInfo playInfo, ResponsePlayUrl responsePlay) {
+// List mediaItems = new ArrayList<>();
+// MediaItem.Builder builder = new MediaItem.Builder();
+// if (responsePlay.getAudioUrlMedium() != null) {
+// builder.setUri(responsePlay.getAudioUrlMedium());
+// } else {
+// builder.setUri(responsePlay.getAudioUrlLow());
+// }
+//
+// //唯一标识符
+// builder.setMediaId(responsePlay.getVideoId());
+//
+// MediaMetadata.Builder MediaMetadata_builder = new MediaMetadata.Builder();
+//
+// MediaMetadata_builder.setArtist(playInfo.getSingerName());
+// MediaMetadata_builder.setDurationMs(playInfo.getDurationMs());
+// MediaMetadata_builder.setAlbumArtist(playInfo.getCovert());
+// MediaMetadata_builder.setTitle(playInfo.getSongTitle());
+//// MediaMetadata_builder.setRecordingYear(Integer.parseInt(playInfo.getYear()));
+// builder.setMediaMetadata(MediaMetadata_builder.build());
+//
+// mediaItems.add(builder.build());
+// mediaController.addMediaItems(mediaItems);
+// mediaController.prepare();
+//
+// }
- builder.setMediaId(responsePlay.getVideoId());
- MediaMetadata.Builder MediaMetadata_builder = new MediaMetadata.Builder();
- MediaMetadata_builder.setArtist(playInfo.getSingerName());
-// MediaMetadata_builder.setDurationMs( );
- MediaMetadata_builder.setAlbumArtist(playInfo.getCovert());
- MediaMetadata_builder.setTitle(playInfo.getSongTitle());
+ /**
+ * 添加播放列表(不带音频url)
+ *
+ * @param listInfo
+ */
+ @OptIn(markerClass = UnstableApi.class)
+ public void addMusicPlayList(List listInfo) {
+ List mediaItems = new ArrayList<>();
+ for (int i = 0; i < listInfo.size(); i++) {
+ ResponsePlayListInfo playInfo = listInfo.get(i);
+
+ MediaItem.Builder builder = new MediaItem.Builder();
+
+ //唯一标识符
+ builder.setMediaId(playInfo.getVideoId());
+
+ MediaMetadata.Builder MediaMetadata_builder = new MediaMetadata.Builder();
+
+ MediaMetadata_builder.setArtist(playInfo.getSingerName());
+ MediaMetadata_builder.setDurationMs(playInfo.getDurationMs());
+ MediaMetadata_builder.setAlbumArtist(playInfo.getCovert());
+ MediaMetadata_builder.setTitle(playInfo.getSongTitle());
// MediaMetadata_builder.setRecordingYear(Integer.parseInt(playInfo.getYear()));
- builder.setMediaMetadata(MediaMetadata_builder.build());
-
- mediaItems.add(builder.build());
+ builder.setMediaMetadata(MediaMetadata_builder.build());
+ mediaItems.add(builder.build());
+ }
mediaController.addMediaItems(mediaItems);
+ }
+
+ public void play() {
mediaController.prepare();
+ if (!mediaController.isPlaying())
+ mediaController.play();
}
- public void play(){
- mediaController.play();
+ public void pause() {
+ if (mediaController.isPlaying())
+ mediaController.pause();
}
-
-
}
diff --git a/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java
index 20493b5..5f05f5b 100644
--- a/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java
+++ b/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java
@@ -3,7 +3,9 @@ package com.hi.music.player.ui.activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Handler;
+import android.util.Pair;
import android.view.View;
+import android.widget.SeekBar;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -12,7 +14,6 @@ import androidx.core.content.ContextCompat;
import androidx.lifecycle.Observer;
import androidx.media3.common.Player;
import androidx.media3.common.util.UnstableApi;
-import androidx.media3.session.MediaController;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
@@ -35,19 +36,31 @@ import com.hi.music.player.ui.activity.viewmodel.VMPlay;
import java.util.List;
-public class PlayActivity extends BaseActivity {
+public class PlayActivity extends BaseActivity implements SeekBar.OnSeekBarChangeListener {
private ResponseSingle responseSingle;
private VMPlay vmPlay;
+
+
+ //接口返回的播放列表(没有音频数据)
private List mPlayList;
+ //播放列对应的音频数据
+ private List mPlayUrls;
+
private ResponsePlayUrl mCurPlayInfo;
private ResponsePlayListInfo musicInfo;
private Handler mHandler;
private Runnable mRunnable;
private MyMediaControllerManager mediaControllerManager;
+
+ //请求播放列表是否成功
+ private boolean requestPlayList = false;
+ //请求第一首歌曲url是否成功
+ private boolean requestPlayUrl = false;
+
@Override
protected ActivityPlayBinding getViewBinding() {
return ActivityPlayBinding.inflate(getLayoutInflater());
@@ -58,35 +71,38 @@ public class PlayActivity extends BaseActivity {
Intent intent = getIntent();
responseSingle = (ResponseSingle) intent.getSerializableExtra(MyValue.KEY_PLAY_ACTIVITY_SINGER);
vmPlay = getActivityScopeViewModel(VMPlay.class);
- vmPlay.getPlayUrl(responseSingle);
vmPlay.getPlayMusicList(responseSingle);
initPlayerView();
initMediaController();
+ initProgressHandler();
- vmPlay.data.observe(this, new Observer>() {
+ vmPlay.playList.observe(this, new Observer>() {
@Override
public void onChanged(List playList) {
if (playList.size() > 0) {
+ requestPlayList = true;
mPlayList = playList;
musicInfo = playList.get(0);
loadCovert(musicInfo.getCovert());
loadInfo(musicInfo);
- startPlayMusic();
}
}
});
- vmPlay.playUrlLiveData.observe(this, new Observer() {
+ vmPlay.playUrlLiveData.observe(this, new Observer>() {
@Override
- public void onChanged(ResponsePlayUrl responsePlayUrl) {
- mCurPlayInfo = responsePlayUrl;
+ public void onChanged(Pair responsePlayUrlIntegerPair) {
+ requestPlayUrl = true;
+ mCurPlayInfo = responsePlayUrlIntegerPair.first;
+ Integer second = responsePlayUrlIntegerPair.second;
CommonUtils.LogMsg("---------mCurPlayInfo=" + mCurPlayInfo.getAudioUrlLow());
- startPlayMusic();
+ updateAudioUrl(responsePlayUrlIntegerPair.first);
+ if (second == 0) {
+ mediaControllerManager.play();
+ }
}
});
-
-
}
@@ -99,35 +115,32 @@ public class PlayActivity extends BaseActivity {
private void initMediaController() {
mediaControllerManager = MyMediaControllerManager.getInstance();
- mediaControllerManager.init(new MediaControllerListener() {
-
- @Override
- public void onMediaControllerComplete(boolean isOk) {
- MediaController mediaController1 = mediaControllerManager.getMediaController();
- vb.playerView.setPlayer(mediaController1);
-
- startPlayMusic();
- }
-
+ mediaControllerManager.addListener(new MediaControllerListener() {
@Override
public void onPlayStatus(int playStatus) {
+ CommonUtils.LogMsg("-------------playStatus=" + playStatus);
switch (playStatus) {
+ case Player.STATE_IDLE:
+
+ break;
+ case Player.STATE_BUFFERING:
+ //快进没有缓冲的时候触发
+ vb.progressBarLoading.setVisibility(View.VISIBLE);
+ CommonUtils.LogMsg("-------------duration STATE_BUFFERING=");
+ break;
case Player.STATE_READY:
mHandler.post(mRunnable);
- vb.progressBar.setVisibility(View.GONE);
+ vb.progressBarLoading.setVisibility(View.GONE);
+
break;
case Player.STATE_ENDED:
mHandler.removeCallbacks(mRunnable); // 停止更新
- break;
-
- case Player.STATE_BUFFERING:
+ updatePlayComplete();
break;
}
-
-
}
});
}
@@ -135,53 +148,65 @@ public class PlayActivity extends BaseActivity {
@Override
protected void onInitClick() {
vb.btnPlay.setOnClickListener(this::onClick);
+ vb.playProgress.setOnSeekBarChangeListener(this);
}
/**
- * 更新播放进度Ui
+ * 更新播放进度Ui、缓冲进度
*/
private void updatePlaybackProgress() {
// 获取当前播放位置
long contentPos = mediaControllerManager.getContentPos();
- long currentPosition = mediaControllerManager.getMediaController().getCurrentPosition();
- long duration = mediaControllerManager.getMediaController().getContentDuration();
+ long bufferPos = mediaControllerManager.getBufferPos();
- long durationMs = musicInfo.getDurationMs();
String s = CommonUtils.convertMillisToTime(contentPos);
-
- CommonUtils.LogMsg("---------播放进度-----contentPos=" + contentPos+"----currentPosition="+currentPosition+"------duration="+duration);
+ CommonUtils.LogMsg("---------播放进度-----contentPos=" + contentPos + "-----缓冲进度=" + bufferPos);
vb.tvCurrent.setText(s);
- vb.seekbar.setValue(contentPos);
+ vb.playProgress.setProgress((int) contentPos);
+ vb.progressBarBuffer.setProgress((int) bufferPos);
+ }
+
+
+ /**
+ * 播放完成 更新播放进度Ui
+ */
+ private void updatePlayComplete() {
+ vb.tvCurrent.setText(vb.tvDuration.getText().toString());
}
/**
* 初始化当前播放歌曲信息
+ *
* @param data
*/
private void loadInfo(ResponsePlayListInfo data) {
vb.tvSongName.setText(data.getSongTitle());
vb.tvSingerName.setText(data.getSingerName());
vb.tvDuration.setText(data.getDuration());
- vb.seekbar.setValueTo(data.getDurationMs());
+
+ long durationMs = data.getDurationMs();
+ vb.playProgress.setMax((int) durationMs);
+ vb.progressBarBuffer.setMax((int) data.getDurationMs());
+
+ CommonUtils.LogMsg("--------------data.getDurationMs() 22222222222=" + durationMs);
}
- private void startPlayMusic() {
- initProgressHandler();
- CommonUtils.LogMsg("00000");
- MediaController mediaController = mediaControllerManager.getMediaController();
- if (mCurPlayInfo != null && mediaController != null && mPlayList != null) {
- mediaControllerManager.addMusicPlay(mPlayList.get(0), mCurPlayInfo);
- mediaControllerManager.play();
- CommonUtils.LogMsg("111");
- }
+
+ /**
+ * 更新音频url到播放列表
+ */
+ private void updateAudioUrl(ResponsePlayUrl playUrl) {
+ mediaControllerManager.UpdateAudioUrl(playUrl);
}
+
+
private void loadCovert(String url) {
Glide.with(MusicApplication.myApplication)
.asDrawable()
@@ -213,8 +238,7 @@ public class PlayActivity extends BaseActivity {
@Override
public void run() {
updatePlaybackProgress();
- // 继续定时更新
- mHandler.postDelayed(this, 1000); // 每秒更新一次
+ mHandler.postDelayed(this, 1000);
}
};
}
@@ -233,6 +257,11 @@ public class PlayActivity extends BaseActivity {
public void onClick(View v) {
if (v.equals(vb.btnPlay)) {
vb.btnPlay.setSelected(!vb.btnPlay.isSelected());
+ if (vb.btnPlay.isSelected()) {
+ mediaControllerManager.play();
+ } else {
+ mediaControllerManager.pause();
+ }
}
}
@@ -243,4 +272,23 @@ public class PlayActivity extends BaseActivity {
if (mHandler != null && mRunnable != null)
mHandler.removeCallbacks(mRunnable);
}
+
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ if (fromUser) {
+ CommonUtils.LogMsg("---------onProgressChanged----progress=" + progress);
+ mediaControllerManager.getMediaController().seekTo(progress);
+ }
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/hi/music/player/ui/activity/viewmodel/VMPlay.java b/app/src/main/java/com/hi/music/player/ui/activity/viewmodel/VMPlay.java
index 6427c74..94d358e 100644
--- a/app/src/main/java/com/hi/music/player/ui/activity/viewmodel/VMPlay.java
+++ b/app/src/main/java/com/hi/music/player/ui/activity/viewmodel/VMPlay.java
@@ -1,5 +1,7 @@
package com.hi.music.player.ui.activity.viewmodel;
+import android.util.Pair;
+
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
@@ -9,6 +11,7 @@ import com.hi.music.player.helper.CommonUtils;
import com.hi.music.player.javabean.response.ResponsePlayListInfo;
import com.hi.music.player.javabean.response.ResponsePlayUrl;
import com.hi.music.player.javabean.response.child.ResponseSingle;
+import com.hi.music.player.media3.MyMediaControllerManager;
import com.hi.music.player.network.JsonHelper;
import com.hi.music.player.network.RetrofitManager;
@@ -21,12 +24,12 @@ import okhttp3.ResponseBody;
public class VMPlay extends ViewModel {
- private MutableLiveData> _data = new MutableLiveData>();
- public LiveData> data = _data;
+ private MutableLiveData> _playList = new MutableLiveData>();
+ public LiveData> playList = _playList;
- private MutableLiveData _playUrlMutableLiveData = new MutableLiveData();
- public LiveData playUrlLiveData = _playUrlMutableLiveData;
+ private MutableLiveData> _playUrlMutableLiveData = new MutableLiveData>();
+ public LiveData> playUrlLiveData = _playUrlMutableLiveData;
private String continuation, clickTrackingParams, visitorData;
@@ -40,7 +43,7 @@ public class VMPlay extends ViewModel {
@Override
public void onFail(String errorMsg) {
- _data.setValue(null);
+ _playList.setValue(null);
}
@Override
@@ -48,16 +51,18 @@ public class VMPlay extends ViewModel {
JSONObject jsonObject = CommonUtils.toJsonObject(data);
if (jsonObject != null) {
List responsePlayListInfos = JsonHelper.ResolvePlayListJson(jsonObject);
- _data.setValue(responsePlayListInfos);
+ MyMediaControllerManager.getInstance().addMusicPlayList(responsePlayListInfos);
+ _playList.setValue(responsePlayListInfos);
+ getPlayUrl(responseSingle,0);
} else {
- _data.setValue(null);
+ _playList.setValue(null);
}
}
});
}
- public void getPlayUrl(ResponseSingle responseSingle) {
+ public void getPlayUrl(ResponseSingle responseSingle, int playListIndex) {
String videoId = responseSingle.getVideoId();
RetrofitManager.getInstance().getPlayUrl(videoId, new RequestListener() {
@@ -71,7 +76,7 @@ public class VMPlay extends ViewModel {
JSONObject jsonObject = CommonUtils.toJsonObject(data);
if (jsonObject != null) {
ResponsePlayUrl responsePlayUrl = JsonHelper.ResolvePlayUrlJson(jsonObject);
- _playUrlMutableLiveData.setValue(responsePlayUrl);
+ _playUrlMutableLiveData.setValue(new Pair<>(responsePlayUrl, playListIndex));
} else {
_playUrlMutableLiveData.setValue(null);
}
diff --git a/app/src/main/res/drawable/horizontal_progressbar.xml b/app/src/main/res/drawable/horizontal_progressbar.xml
new file mode 100644
index 0000000..043d608
--- /dev/null
+++ b/app/src/main/res/drawable/horizontal_progressbar.xml
@@ -0,0 +1,24 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/seekbar_thumb.xml b/app/src/main/res/drawable/seekbar_thumb.xml
index 104bb46..35adf6e 100644
--- a/app/src/main/res/drawable/seekbar_thumb.xml
+++ b/app/src/main/res/drawable/seekbar_thumb.xml
@@ -4,7 +4,7 @@
+ android:width="9dp"
+ android:height="9dp" />
\ No newline at end of file
diff --git a/app/src/main/res/drawable/selector_icon_play.xml b/app/src/main/res/drawable/selector_icon_play.xml
index 496cccb..41801ce 100644
--- a/app/src/main/res/drawable/selector_icon_play.xml
+++ b/app/src/main/res/drawable/selector_icon_play.xml
@@ -1,6 +1,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_play.xml b/app/src/main/res/layout/activity_play.xml
index c9d6947..6141761 100644
--- a/app/src/main/res/layout/activity_play.xml
+++ b/app/src/main/res/layout/activity_play.xml
@@ -27,33 +27,32 @@
android:layout_marginTop="30dp"
android:layout_marginEnd="40dp"
android:scaleType="fitXY"
+ android:src="@mipmap/ic_launcher"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/im_back" />
-
+ app:show_buffering="when_playing"
+ app:show_shuffle_button="true" />
@@ -79,57 +78,81 @@
app:layout_constraintLeft_toLeftOf="@id/tv_song_name"
app:layout_constraintTop_toBottomOf="@id/tv_song_name" />
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+ android:layout_height="3dp"
+ android:paddingStart="5dp"
+ android:paddingEnd="5dp"
+ android:progress="100"
+ android:progressDrawable="@drawable/horizontal_progressbar"
+ app:layout_constraintBottom_toBottomOf="@id/play_progress"
+ app:layout_constraintLeft_toLeftOf="@id/play_progress"
+ app:layout_constraintRight_toRightOf="@id/play_progress"
+ app:layout_constraintTop_toTopOf="@id/play_progress" />
+ app:layout_constraintStart_toStartOf="@id/play_progress"
+ app:layout_constraintTop_toBottomOf="@id/play_progress" />
+ app:layout_constraintEnd_toEndOf="@id/play_progress"
+ app:layout_constraintTop_toBottomOf="@id/play_progress" />
-
-
\ 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 27d027b..7d5b758 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -8,4 +8,7 @@
#4DFFFFFF
#99FFFFFF
+ #59FFFFFF
+
+ #2D9C31
\ No newline at end of file
diff --git a/app/src/main/res/values/style.xml b/app/src/main/res/values/style.xml
new file mode 100644
index 0000000..6955eec
--- /dev/null
+++ b/app/src/main/res/values/style.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file