From 1cb103d464507f52867ce600bd2e1a9650d4b719 Mon Sep 17 00:00:00 2001 From: litingting Date: Fri, 20 Sep 2024 10:10:04 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 4 + app/src/main/AndroidManifest.xml | 4 + .../com/hi/music/player/MusicApplication.java | 16 +- .../music/player/adapter/AdapterCategory.java | 72 +++++++ .../hi/music/player/adapter/AdapterHome.java | 79 ++++++++ .../music/player/adapter/AdapterSinger.java | 81 ++++++++ .../hi/music/player/adapter/BaseAdapter.java | 106 ++++++++++ .../music/player/api/ClickSingerListener.java | 6 + .../hi/music/player/helper/CommonUtils.java | 31 +++ .../com/hi/music/player/helper/MyValue.java | 7 + .../player/javabean/requestbody/BodyHome.java | 35 +--- .../player/javabean/requestbody/BodyPlay.java | 78 ++++++++ .../requestbody/child/ContextBody.java | 36 ++++ .../javabean/response/ResponseHome.java | 1 - .../javabean/response/ResponseSingle.java | 46 ++++- .../hi/music/player/network/JsonHelper.java | 62 +++++- .../com/hi/music/player/network/MusicApi.java | 16 +- .../music/player/network/RetrofitManager.java | 57 +++--- .../player/ui/activity/HomeActivity.java | 27 +-- .../player/ui/activity/MainActivity.java | 4 +- .../player/ui/activity/PlayActivity.java | 47 +++++ .../player/ui/activity/viewmodel/VMPlay.java | 57 ++++++ .../music/player/ui/fragmnt/HomeFragment.java | 90 ++++++++- .../player/ui/fragmnt/viewmodel/VMHome.java | 78 ++++++++ .../player/ui/paging/MyPagingSource.java | 61 ++++++ app/src/main/res/layout/activity_home.xml | 1 + app/src/main/res/layout/activity_play.xml | 17 ++ app/src/main/res/layout/fragment_home.xml | 185 +----------------- app/src/main/res/layout/item_category.xml | 41 ++++ .../main/res/layout/item_footer_loading.xml | 15 ++ app/src/main/res/layout/item_home.xml | 29 +++ app/src/main/res/layout/item_singer.xml | 63 ++++++ app/src/main/res/values/colors.xml | 2 + 33 files changed, 1162 insertions(+), 292 deletions(-) create mode 100644 app/src/main/java/com/hi/music/player/adapter/AdapterCategory.java create mode 100644 app/src/main/java/com/hi/music/player/adapter/AdapterHome.java create mode 100644 app/src/main/java/com/hi/music/player/adapter/AdapterSinger.java create mode 100644 app/src/main/java/com/hi/music/player/adapter/BaseAdapter.java create mode 100644 app/src/main/java/com/hi/music/player/api/ClickSingerListener.java create mode 100644 app/src/main/java/com/hi/music/player/helper/MyValue.java create mode 100644 app/src/main/java/com/hi/music/player/javabean/requestbody/BodyPlay.java create mode 100644 app/src/main/java/com/hi/music/player/javabean/requestbody/child/ContextBody.java create mode 100644 app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java create mode 100644 app/src/main/java/com/hi/music/player/ui/activity/viewmodel/VMPlay.java create mode 100644 app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/VMHome.java create mode 100644 app/src/main/java/com/hi/music/player/ui/paging/MyPagingSource.java create mode 100644 app/src/main/res/layout/activity_play.xml create mode 100644 app/src/main/res/layout/item_category.xml create mode 100644 app/src/main/res/layout/item_footer_loading.xml create mode 100644 app/src/main/res/layout/item_home.xml create mode 100644 app/src/main/res/layout/item_singer.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 831d7c7..1d78d73 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -52,4 +52,8 @@ dependencies { implementation("io.reactivex.rxjava2:rxjava:2.2.21") implementation("io.reactivex.rxjava2:rxandroid:2.1.1") implementation ("com.squareup.okhttp3:logging-interceptor:4.11.0") + + implementation ("androidx.paging:paging-runtime-ktx:3.3.2") + + implementation("com.github.bumptech.glide:glide:4.16.0") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 43b9ffd..a33dc8d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + 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 4a96f4b..9db4a93 100644 --- a/app/src/main/java/com/hi/music/player/MusicApplication.java +++ b/app/src/main/java/com/hi/music/player/MusicApplication.java @@ -1,13 +1,23 @@ package com.hi.music.player; import android.app.Application; +import android.content.Context; public class MusicApplication extends Application { - private final static MusicApplication sInstance = new MusicApplication(); +// private final static MusicApplication sInstance = new MusicApplication(); - public static MusicApplication getInstance() { - return sInstance; + public static Context myApplication; +// public static MusicApplication getInstance() { +// return sInstance; +// } + + + + @Override + public void onCreate() { + super.onCreate(); + myApplication = this; } } diff --git a/app/src/main/java/com/hi/music/player/adapter/AdapterCategory.java b/app/src/main/java/com/hi/music/player/adapter/AdapterCategory.java new file mode 100644 index 0000000..bb0d8e1 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/adapter/AdapterCategory.java @@ -0,0 +1,72 @@ +package com.hi.music.player.adapter; + +import android.graphics.drawable.Drawable; +import android.view.LayoutInflater; +import android.view.RoundedCorner; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.Target; +import com.hi.music.player.MusicApplication; +import com.hi.music.player.R; +import com.hi.music.player.databinding.ItemCategoryBinding; +import com.hi.music.player.databinding.ItemHomeBinding; +import com.hi.music.player.databinding.ItemSingerBinding; +import com.hi.music.player.helper.CommonUtils; +import com.hi.music.player.javabean.response.ResponseCategory; +import com.hi.music.player.javabean.response.ResponseSingle; + +public class AdapterCategory extends BaseAdapter{ + + @Override + protected ItemCategoryBinding getViewBinding(ViewGroup parent) { + return ItemCategoryBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + + int itemViewType = getItemViewType(position); + if (itemViewType == TYPE_ITEM) { + VHolder itemHolder = (VHolder) holder; + ItemCategoryBinding vb = itemHolder.getVb(); + ResponseCategory responseCategory = data.get(position); + + Glide.with(MusicApplication.myApplication) + .asDrawable() + .apply(RequestOptions.bitmapTransform(new RoundedCorners(CommonUtils.dpToPx(13)))) + .load(responseCategory.getCovert()) + .placeholder(R.mipmap.ic_launcher) + .listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target target, boolean isFirstResource) { + CommonUtils.LogMsg(e.getMessage()); + return false; + } + + @Override + public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target target, @NonNull DataSource dataSource, boolean isFirstResource) { + return false; + } + }) + .into(vb.header); + vb.tvTitle.setText(responseCategory.getTwoTitle()); + vb.tvSubtitle.setText(responseCategory.getTwoSubtitle()); + + } + + + + } + + +} diff --git a/app/src/main/java/com/hi/music/player/adapter/AdapterHome.java b/app/src/main/java/com/hi/music/player/adapter/AdapterHome.java new file mode 100644 index 0000000..ab1f56a --- /dev/null +++ b/app/src/main/java/com/hi/music/player/adapter/AdapterHome.java @@ -0,0 +1,79 @@ +package com.hi.music.player.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.hi.music.player.MusicApplication; +import com.hi.music.player.api.ClickSingerListener; +import com.hi.music.player.databinding.ItemFooterLoadingBinding; +import com.hi.music.player.databinding.ItemHomeBinding; +import com.hi.music.player.helper.CommonUtils; +import com.hi.music.player.javabean.response.ResponseCategory; +import com.hi.music.player.javabean.response.ResponseHomeChild; +import com.hi.music.player.javabean.response.ResponseSingle; + +import java.util.List; + +public class AdapterHome extends BaseAdapter { + + @Override + protected ItemHomeBinding getViewBinding(ViewGroup parent) { + + return ItemHomeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + int itemViewType = getItemViewType(position); + if (itemViewType == TYPE_ITEM) { + VHolder itemHolder = (VHolder) holder; + ItemHomeBinding vb = itemHolder.getVb(); + ResponseHomeChild responseHomeChild = data.get(position); + vb.headTitle.setText(responseHomeChild.getHeaderTitle()); + + List singleList = responseHomeChild.getSingleList(); + + if (singleList != null && singleList.size() > 0) { + vb.recyclerSinger.setVisibility(View.VISIBLE); + CommonUtils.LogMsg("-----------singleList-=" + singleList.size()); + AdapterSinger adapterSinger = new AdapterSinger(); + adapterSinger.setSingleClickSingerListener(singleClickSingerListener); + adapterSinger.addData(singleList); + vb.recyclerSinger.setLayoutManager(new GridLayoutManager(MusicApplication.myApplication, 4, RecyclerView.HORIZONTAL, false)); + vb.recyclerSinger.setAdapter(adapterSinger); + } else { + vb.recyclerSinger.setVisibility(View.GONE); + } + List categoryList = responseHomeChild.getCategoryList(); + if (categoryList != null && categoryList.size() > 0) { + vb.recyclerCategory.setVisibility(View.VISIBLE); + CommonUtils.LogMsg("-----------categoryList-=" + categoryList.size()); + AdapterCategory adapterCategory = new AdapterCategory(); + adapterCategory.addData(categoryList); + vb.recyclerCategory.setLayoutManager(new LinearLayoutManager(MusicApplication.myApplication, RecyclerView.HORIZONTAL, false)); + vb.recyclerCategory.setAdapter(adapterCategory); + } else { + vb.recyclerCategory.setVisibility(View.GONE); + } + } else { + VHolder footerHolder = (VHolder) holder; + FrameLayout root = footerHolder.getVb().getRoot(); + if (isLoadingAdded) { + root.setVisibility(View.VISIBLE); + } else { + root.setVisibility(View.GONE); + } + + } + + } + + +} diff --git a/app/src/main/java/com/hi/music/player/adapter/AdapterSinger.java b/app/src/main/java/com/hi/music/player/adapter/AdapterSinger.java new file mode 100644 index 0000000..3849b14 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/adapter/AdapterSinger.java @@ -0,0 +1,81 @@ +package com.hi.music.player.adapter; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.Target; +import com.hi.music.player.MusicApplication; +import com.hi.music.player.R; +import com.hi.music.player.databinding.ItemCategoryBinding; +import com.hi.music.player.databinding.ItemHomeBinding; +import com.hi.music.player.databinding.ItemSingerBinding; +import com.hi.music.player.helper.CommonUtils; +import com.hi.music.player.javabean.response.ResponseHomeChild; +import com.hi.music.player.javabean.response.ResponseSingle; + +public class AdapterSinger extends BaseAdapter { + + @Override + protected ItemSingerBinding getViewBinding(ViewGroup parent) { + return ItemSingerBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + int itemViewType = getItemViewType(position); + if (itemViewType == TYPE_ITEM) { + VHolder itemHolder = (VHolder) holder; + ItemSingerBinding vb = itemHolder.getVb(); + ResponseSingle responseSingle = data.get(position); + + Glide.with(MusicApplication.myApplication) + .asDrawable() + .load(responseSingle.getSingerHead()) + .apply(RequestOptions.bitmapTransform(new RoundedCorners(CommonUtils.dpToPx(4)))) + .placeholder(R.mipmap.ic_launcher) + .listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target target, boolean isFirstResource) { + CommonUtils.LogMsg(e.getMessage()); + return false; + } + + @Override + public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target target, @NonNull DataSource dataSource, boolean isFirstResource) { + return false; + } + }) + .into(vb.header); + vb.tvSingerName.setText(responseSingle.getSingerName()); + vb.tvSongName.setText(responseSingle.getSongTitle()); +// vb.tvDescribe.setText(responseSingle.getDescription()); + vb.getRoot().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (singleClickSingerListener != null) { + singleClickSingerListener.onClickSingerItem(responseSingle); + } + + } + }); + + } + + + } + + +} diff --git a/app/src/main/java/com/hi/music/player/adapter/BaseAdapter.java b/app/src/main/java/com/hi/music/player/adapter/BaseAdapter.java new file mode 100644 index 0000000..2d14a45 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/adapter/BaseAdapter.java @@ -0,0 +1,106 @@ +package com.hi.music.player.adapter; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewbinding.ViewBinding; + +import com.hi.music.player.api.ClickSingerListener; +import com.hi.music.player.databinding.ItemFooterLoadingBinding; +import com.hi.music.player.javabean.response.ResponseSingle; + +import java.util.ArrayList; +import java.util.List; + +abstract public class BaseAdapter extends RecyclerView.Adapter { + + protected List data = new ArrayList<>(); + + protected static final int TYPE_ITEM = 0; + protected static final int TYPE_FOOTER = 1; + protected boolean isLoadingAdded = false; + + + + protected ClickSingerListener singleClickSingerListener; + + public void setSingleClickSingerListener(ClickSingerListener singleClickSingerListener) { + this.singleClickSingerListener = singleClickSingerListener; + } + + public void addData(List data) { + this.data.addAll(data); + notifyDataSetChanged(); + } + + public void addLoadingFooter() { + isLoadingAdded = true; +// notifyItemInserted(data.size()); + } + + // Hide loading footer + public void removeLoadingFooter() { + isLoadingAdded = false; + int position = data.size(); + if (position > 0) + notifyItemRemoved(position); + } + + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if (viewType == TYPE_ITEM) { + T viewBinding = getViewBinding(parent); + return new VHolder<>(viewBinding); + } else { + // Inflate footer layout + ItemFooterLoadingBinding inflate = ItemFooterLoadingBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new VHolder<>(inflate); + } + } + + protected abstract T getViewBinding(ViewGroup parent); + + @Override + public int getItemViewType(int position) { + return (position == data.size() && isLoadingAdded) ? TYPE_FOOTER : TYPE_ITEM; + } + + @Override + public int getItemCount() { + return data.size() + (isLoadingAdded ? 1 : 0); + } + + public static class VHolder extends RecyclerView.ViewHolder { + + private V vb; + + public V getVb() { + return vb; + } + + public VHolder(@NonNull V itemView) { + super(itemView.getRoot()); + vb = itemView; + } + } + + + public static class FooterHolder extends RecyclerView.ViewHolder { + + private ItemFooterLoadingBinding vb; + + public ItemFooterLoadingBinding getVb() { + return vb; + } + + public FooterHolder(@NonNull ItemFooterLoadingBinding itemView) { + super(itemView.getRoot()); + vb = itemView; + } + } + +} diff --git a/app/src/main/java/com/hi/music/player/api/ClickSingerListener.java b/app/src/main/java/com/hi/music/player/api/ClickSingerListener.java new file mode 100644 index 0000000..def3e41 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/api/ClickSingerListener.java @@ -0,0 +1,6 @@ +package com.hi.music.player.api; + +public interface ClickSingerListener { + + void onClickSingerItem(T data) ; +} diff --git a/app/src/main/java/com/hi/music/player/helper/CommonUtils.java b/app/src/main/java/com/hi/music/player/helper/CommonUtils.java index 3bdb500..117e100 100644 --- a/app/src/main/java/com/hi/music/player/helper/CommonUtils.java +++ b/app/src/main/java/com/hi/music/player/helper/CommonUtils.java @@ -1,7 +1,11 @@ package com.hi.music.player.helper; +import android.content.Context; +import android.util.DisplayMetrics; import android.util.Log; +import com.hi.music.player.MusicApplication; + import org.json.JSONException; import org.json.JSONObject; @@ -27,4 +31,31 @@ public class CommonUtils { return null; } } + + + public static int dpToPx(int dp) { + return Math.round(dp * (MusicApplication.myApplication.getResources().getDisplayMetrics().xdpi / DisplayMetrics.DENSITY_DEFAULT)); + } + public static int pxToDp(int px) { + return Math.round(px / (MusicApplication.myApplication.getResources().getDisplayMetrics().xdpi / DisplayMetrics.DENSITY_DEFAULT)); + } + + // 获取导航栏高度的方法 + public int getNavigationBarHeight(Context context) { + int navigationBarHeight = 0; + int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android"); + if (resourceId > 0) { + navigationBarHeight = context.getResources().getDimensionPixelSize(resourceId); + } + return navigationBarHeight; + } + + public static int getStatusBarHeight(Context context) { + int statusBarHeight = 0; + int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + statusBarHeight = context.getResources().getDimensionPixelSize(resourceId); + } + return statusBarHeight; + } } 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 new file mode 100644 index 0000000..6e09f06 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/helper/MyValue.java @@ -0,0 +1,7 @@ +package com.hi.music.player.helper; + +public class MyValue { + //-----------------------------PlayActivity + public static String KEY_PLAY_ACTIVITY_SINGER = "click_singer"; + //-----------------------------PlayActivity +} diff --git a/app/src/main/java/com/hi/music/player/javabean/requestbody/BodyHome.java b/app/src/main/java/com/hi/music/player/javabean/requestbody/BodyHome.java index 81c678e..44ca69e 100644 --- a/app/src/main/java/com/hi/music/player/javabean/requestbody/BodyHome.java +++ b/app/src/main/java/com/hi/music/player/javabean/requestbody/BodyHome.java @@ -1,7 +1,8 @@ package com.hi.music.player.javabean.requestbody; +import com.hi.music.player.javabean.requestbody.child.ContextBody; + import java.io.Serializable; -import java.util.Locale; /** @@ -11,43 +12,17 @@ public class BodyHome implements Serializable { private String browseId = "FEmusic_home"; - private Context context = new Context(); + private ContextBody context = new ContextBody(); - public Context getContext() { + public ContextBody getContext() { return context; } - public void setContext(Context context) { + public void setContext(ContextBody context) { this.context = context; } - public class Context implements Serializable{ - private Client client = new Client(); - public Client getClient() { - return client; - } - public void setClient(Client client) { - this.client = client; - } - } - public class Client implements Serializable{ - private String clientName = "WEB_REMIX"; - private String clientVersion = "1.20220918"; - private String hl = Locale.getDefault().getLanguage(); - private String gl = "US"; - private String platform = "DESKTOP"; - - private String visitorData; - - public String getVisitorData() { - return visitorData; - } - - public void setVisitorData(String visitorData) { - this.visitorData = visitorData; - } - } } diff --git a/app/src/main/java/com/hi/music/player/javabean/requestbody/BodyPlay.java b/app/src/main/java/com/hi/music/player/javabean/requestbody/BodyPlay.java new file mode 100644 index 0000000..69881ed --- /dev/null +++ b/app/src/main/java/com/hi/music/player/javabean/requestbody/BodyPlay.java @@ -0,0 +1,78 @@ +package com.hi.music.player.javabean.requestbody; + +import com.hi.music.player.javabean.requestbody.child.ContextBody; + +import java.io.Serializable; + + +/** + * 播放页面接口请求体 + */ +public class BodyPlay implements Serializable { + + + private ContextBody context = new ContextBody(); + private String tunerSettingValue = "AUTOMIX_SETTING_NORMAL"; + private boolean isAudioOnly = true; + private Configs watchEndpointMusicSupportedConfigs = new Configs(); + private int index; + private String playlistId; + private String videoId; + private String params; + private String playlistSetVideoId; + + + + + public static class Configs { + private String musicVideoType = "MUSIC_VIDEO_TYPE_ATV"; + + + public String getMusicVideoType() { + return musicVideoType; + } + + public void setMusicVideoType(String musicVideoType) { + this.musicVideoType = musicVideoType; + } + } + + public ContextBody getContext() { + return context; + } + + public void setContext(ContextBody context) { + this.context = context; + } + + + public void setTunerSettingValue(String tunerSettingValue) { + this.tunerSettingValue = tunerSettingValue; + } + + public void setIndex(int index) { + this.index = index; + } + + public void setPlaylistId(String playlistId) { + this.playlistId = playlistId; + } + + public void setVideoId(String videoId) { + this.videoId = videoId; + } + + public void setParams(String params) { + this.params = params; + } + + public void setPlaylistSetVideoId(String playlistSetVideoId) { + this.playlistSetVideoId = playlistSetVideoId; + } + + public Configs getWatchEndpointMusicSupportedConfigs() { + return watchEndpointMusicSupportedConfigs; + } + + +} diff --git a/app/src/main/java/com/hi/music/player/javabean/requestbody/child/ContextBody.java b/app/src/main/java/com/hi/music/player/javabean/requestbody/child/ContextBody.java new file mode 100644 index 0000000..208a31e --- /dev/null +++ b/app/src/main/java/com/hi/music/player/javabean/requestbody/child/ContextBody.java @@ -0,0 +1,36 @@ +package com.hi.music.player.javabean.requestbody.child; + +import java.io.Serializable; +import java.util.Locale; + +public class ContextBody { + + private Client client = new Client(); + + public Client getClient() { + return client; + } + + public void setClient(Client client) { + this.client = client; + } + + + public class Client implements Serializable { + private String clientName = "WEB_REMIX"; + private String clientVersion = "1.20220918"; + private String hl = Locale.getDefault().getLanguage(); + private String gl = "US"; + private String platform = "DESKTOP"; + + private String visitorData; + + public String getVisitorData() { + return visitorData; + } + + public void setVisitorData(String visitorData) { + this.visitorData = visitorData; + } + } +} diff --git a/app/src/main/java/com/hi/music/player/javabean/response/ResponseHome.java b/app/src/main/java/com/hi/music/player/javabean/response/ResponseHome.java index 35c9983..00a4a57 100644 --- a/app/src/main/java/com/hi/music/player/javabean/response/ResponseHome.java +++ b/app/src/main/java/com/hi/music/player/javabean/response/ResponseHome.java @@ -13,7 +13,6 @@ public class ResponseHome { //用于更多数据请求的ctoken private String continuation; - @Nullable //用于更多数据请求的visitorData(只有第一个接口会返回该值) private String visitorData; diff --git a/app/src/main/java/com/hi/music/player/javabean/response/ResponseSingle.java b/app/src/main/java/com/hi/music/player/javabean/response/ResponseSingle.java index a601318..06d2858 100644 --- a/app/src/main/java/com/hi/music/player/javabean/response/ResponseSingle.java +++ b/app/src/main/java/com/hi/music/player/javabean/response/ResponseSingle.java @@ -1,6 +1,8 @@ package com.hi.music.player.javabean.response; -public class ResponseSingle { +import java.io.Serializable; + +public class ResponseSingle implements Serializable { //歌手头像 private String SingerHead; @@ -13,6 +15,14 @@ public class ResponseSingle { private String Description; + private String videoId; + private String playlistId; + private String params; + private String musicVideoType; + + + + public String getSingerHead() { return SingerHead; } @@ -44,4 +54,38 @@ public class ResponseSingle { public void setDescription(String description) { Description = description; } + + + public void setVideoId(String videoId) { + this.videoId = videoId; + } + + public void setPlaylistId(String playlistId) { + this.playlistId = playlistId; + } + + public void setParams(String params) { + this.params = params; + } + + public void setMusicVideoType(String musicVideoType) { + this.musicVideoType = musicVideoType; + } + + + public String getVideoId() { + return videoId; + } + + public String getPlaylistId() { + return playlistId; + } + + public String getParams() { + return params; + } + + public String getMusicVideoType() { + return musicVideoType; + } } diff --git a/app/src/main/java/com/hi/music/player/network/JsonHelper.java b/app/src/main/java/com/hi/music/player/network/JsonHelper.java index a46e818..ff09ab6 100644 --- a/app/src/main/java/com/hi/music/player/network/JsonHelper.java +++ b/app/src/main/java/com/hi/music/player/network/JsonHelper.java @@ -35,14 +35,13 @@ public class JsonHelper { .getJSONObject("responseContext"); JSONArray serviceTrackingParams = responseContext.getJSONArray("serviceTrackingParams"); String visitorData = responseContext.getString("visitorData"); - CommonUtils.LogMsg("----------visitorData=" + visitorData); + CommonUtils.LogMsg("---------参数-visitorData=" + visitorData); responseHome.setBackgroundUrl(bgUrl); responseHome.setVisitorData(visitorData); getCommonHome(sectionListRenderer, responseHome); - } catch (JSONException exception) { CommonUtils.LogMsg("----------exception="); exception.printStackTrace(); @@ -89,8 +88,8 @@ public class JsonHelper { String clickTrackingParams = nextContinuationData.getString("clickTrackingParams"); String continuation = nextContinuationData.getString("continuation"); - CommonUtils.LogMsg("----------clickTrackingParams=" + clickTrackingParams); - CommonUtils.LogMsg("----------continuation=" + continuation); + CommonUtils.LogMsg("---------参数---clickTrackingParams=" + clickTrackingParams); + CommonUtils.LogMsg("---------参数--continuation=" + continuation); responseHome.setClickTrackingParams(clickTrackingParams); responseHome.setContinuation(continuation); @@ -136,11 +135,31 @@ public class JsonHelper { String SingerName = ""; String Description = ""; for (int g = 0; g < flexColumns.length(); g++) { - String text = getJsonText(musicResponsiveListItemRenderer.getJSONArray("flexColumns") + JSONObject jsonObject = musicResponsiveListItemRenderer.getJSONArray("flexColumns") .getJSONObject(g) .getJSONObject("musicResponsiveListItemFlexColumnRenderer") - .getJSONObject("text")); - if (g == 0) SongTitle = text; + .getJSONObject("text"); + String text = getJsonText(jsonObject); + if (g == 0) { + SongTitle = text; + + JSONObject watchEndpoint = jsonObject.getJSONArray("runs") + .getJSONObject(0) + .getJSONObject("navigationEndpoint") + .getJSONObject("watchEndpoint"); + String videoId = watchEndpoint.getString("videoId"); + String playlistId = watchEndpoint.getString("playlistId"); + String params = watchEndpoint.getString("params"); + String musicVideoType = watchEndpoint.getJSONObject("watchEndpointMusicSupportedConfigs") + .getJSONObject("watchEndpointMusicConfig") + .getString("musicVideoType"); + + responseSingle.setVideoId(videoId); + responseSingle.setPlaylistId(playlistId); + responseSingle.setParams(params); + responseSingle.setMusicVideoType(musicVideoType); + + } if (g == 1) SingerName = text; if (g == 2) Description = text; } @@ -158,13 +177,20 @@ public class JsonHelper { String covert = getJsonUrl(musicTwoRowItemRenderer .getJSONObject("thumbnailRenderer")); - String twoTitle = getJsonText(musicTwoRowItemRenderer.getJSONObject("title")); - String twoSubtitle = getJsonText(musicTwoRowItemRenderer.getJSONObject("subtitle")); + JSONObject title1 = musicTwoRowItemRenderer.getJSONObject("title"); + String twoTitle = getJsonText(title1); + String twoSubtitle = getJsonTextNew(musicTwoRowItemRenderer.getJSONObject("subtitle")); +// String pageType = title1.getJSONObject("navigationEndpoint") +// .getJSONObject("browseEndpoint") +// .getJSONObject("browseEndpointContextSupportedConfigs") +// .getJSONObject("browseEndpointContextMusicConfig") +// .getString("pageType"); + responseCategory.setCovert(covert); responseCategory.setTwoTitle(twoTitle); responseCategory.setTwoSubtitle(twoSubtitle); categoryList.add(responseCategory); - CommonUtils.LogMsg(" ----------2222222222----twoTitle=" + twoTitle + "-twoSubtitle=" + twoSubtitle + "---封面=" + covert); + CommonUtils.LogMsg(" ----------2222222222----twoTitle=" + twoTitle + "-twoSubtitle=" + twoSubtitle ); } } @@ -207,4 +233,20 @@ public class JsonHelper { return ""; } } + + + private static String getJsonTextNew(JSONObject jsonObject) { + StringBuilder text= new StringBuilder(); + try { + JSONArray runs = jsonObject.getJSONArray("runs"); + for (int i =0;i getHomeData(@Body RequestBody requestBody); -// "youtubei/v1/browse?ctoken=${baseHomePage.cToken}&continuation=${baseHomePage.continuation}&type=next&itct=${baseHomePage.itct}&prettyPrint=false" + //首页更多数据 @POST("youtubei/v1/browse") @Headers("X-Goog-Api-Key:AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8") Observable getHomeMoreData(@Query("ctoken") String token, @@ -27,8 +30,11 @@ public interface MusicApi { @Query("prettyPrint") boolean prettyPrint,@Body RequestBody requestBody); -// @POST("youtubei/v1/browse") -// @Headers("X-Goog-Api-Key:AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8") -// @FormUrlEncoded -// Observable getHomeMoreData(@FieldMap Map map); + + // X-Goog-FieldMask: contents.singleColumnMusicWatchNextResultsRenderer.tabbedRenderer.watchNextTabbedResultsRenderer.tabs.tabRenderer.content.musicQueueRenderer.content.playlistPanelRenderer(continuations,contents(automixPreviewVideoRenderer,playlistPanelVideoRenderer(title,navigationEndpoint,longBylineText,shortBylineText,thumbnail,lengthText))) + @POST("youtubei/v1/next?prettyPrint=false") + @Headers("X-Goog-Api-Key:AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8") + Observable getMusicPlayPage(@Header("X-Goog-FieldMask") String customHeader, @Body RequestBody requestBody); + + } diff --git a/app/src/main/java/com/hi/music/player/network/RetrofitManager.java b/app/src/main/java/com/hi/music/player/network/RetrofitManager.java index 65b3357..d9514d4 100644 --- a/app/src/main/java/com/hi/music/player/network/RetrofitManager.java +++ b/app/src/main/java/com/hi/music/player/network/RetrofitManager.java @@ -4,6 +4,7 @@ import com.google.gson.Gson; import com.hi.music.player.api.RequestListener; import com.hi.music.player.helper.CommonUtils; import com.hi.music.player.javabean.requestbody.BodyHome; +import com.hi.music.player.javabean.requestbody.BodyPlay; import com.hi.music.player.javabean.response.ResponseHome; import org.json.JSONObject; @@ -31,6 +32,9 @@ public class RetrofitManager { public MediaType JSON = MediaType.get("application/json; charset=utf-8"); private MusicApi musicApi; + private String header1="playlistPanelVideoRenderer(title,navigationEndpoint,longBylineText,shortBylineText,thumbnail,lengthText)"; + private String header ="contents.singleColumnMusicWatchNextResultsRenderer.tabbedRenderer.watchNextTabbedResultsRenderer.tabs.tabRenderer.content.musicQueueRenderer.content.playlistPanelRenderer(continuations,contents(automixPreviewVideoRenderer,"+header1+"))"; + private RetrofitManager() { musicApi = getRetrofit().create(MusicApi.class); @@ -73,7 +77,7 @@ public class RetrofitManager { } - public void getHomeData() { + public void getHomeData(RequestListener requestListener) { BodyHome bodyHome = new BodyHome(); Gson gson = new Gson(); String s = gson.toJson(bodyHome); @@ -82,26 +86,10 @@ public class RetrofitManager { .subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new ObserverWrapper(new RequestListener() { - - @Override - public void onFail(String errorMsg) { - - } - - @Override - public void onSuccess(ResponseBody data) { - JSONObject jsonObject = CommonUtils.toJsonObject(data); - if (jsonObject != null) { - ResponseHome responseHome = JsonHelper.ResolveHomeJson(jsonObject); - CommonUtils.LogMsg(""); - } - - } - })); + .subscribe(new ObserverWrapper(requestListener)); } - public void getHomeMoreData(String continuation,String itct,String visitorData) { + public void getHomeMoreData(String continuation,String itct,String visitorData,RequestListener requestListener) { BodyHome bodyHome = new BodyHome(); bodyHome.getContext().getClient().setVisitorData(visitorData); Gson gson = new Gson(); @@ -118,22 +106,23 @@ public class RetrofitManager { .subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new ObserverWrapper(new RequestListener() { + .subscribe(new ObserverWrapper(requestListener)); + } - @Override - public void onFail(String errorMsg) { - } - - @Override - public void onSuccess(ResponseBody data) { - JSONObject jsonObject = CommonUtils.toJsonObject(data); - if (jsonObject != null) { - ResponseHome responseHome = JsonHelper.ResolveHomeMoreJson(jsonObject); - CommonUtils.LogMsg(""); - } - - } - })); + public void getNext(String params,String playlistId,String videoId,String musicVideoType,RequestListener requestListener) { + BodyPlay bodyPlay = new BodyPlay(); + bodyPlay.setParams(params); + bodyPlay.setPlaylistId(playlistId); + bodyPlay.setVideoId(videoId); + bodyPlay.getWatchEndpointMusicSupportedConfigs().setMusicVideoType(musicVideoType); + Gson gson = new Gson(); + String s = gson.toJson(bodyPlay); + RequestBody requestBody = RequestBody.Companion.create(s, JSON); + musicApi.getMusicPlayPage(header,requestBody) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new ObserverWrapper(requestListener)); } } diff --git a/app/src/main/java/com/hi/music/player/ui/activity/HomeActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/HomeActivity.java index d5015b2..9ef22f8 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/HomeActivity.java @@ -5,10 +5,12 @@ import android.view.View; import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; +import com.hi.music.player.MusicApplication; import com.hi.music.player.R; import com.hi.music.player.adapter.HomeViewPagerAdapter; import com.hi.music.player.databinding.ActivityHomeBinding; import com.hi.music.player.databinding.HomeTabCustomBinding; +import com.hi.music.player.helper.CommonUtils; public class HomeActivity extends BaseActivity { @@ -47,14 +49,13 @@ public class HomeActivity extends BaseActivity { public void initView() { - int statusBarHeight = getStatusBarHeight(); - int navigationBarHeight = getNavigationBarHeight(); - + int statusBarHeight = CommonUtils.getStatusBarHeight(MusicApplication.myApplication); View root = vb.getRoot(); root.setPadding(0,statusBarHeight,0,0); HomeViewPagerAdapter adapter = new HomeViewPagerAdapter(this); vb.homeViewPager.setAdapter(adapter); + vb.homeViewPager.setUserInputEnabled(false); // 设置TabLayout的图标 new TabLayoutMediator(vb.homeTabLayout, vb.homeViewPager, (tab, position) -> { @@ -95,24 +96,8 @@ public class HomeActivity extends BaseActivity { tabBinding.homeIcon.setImageResource(isSelected ? selectedIcons[position] : defaultIcons[position]); } - // 获取状态栏高度的方法 - public int getStatusBarHeight() { - int statusBarHeight = 0; - int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); - if (resourceId > 0) { - statusBarHeight = getResources().getDimensionPixelSize(resourceId); - } - return statusBarHeight; - } - // 获取导航栏高度的方法 - public int getNavigationBarHeight() { - int navigationBarHeight = 0; - int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); - if (resourceId > 0) { - navigationBarHeight = getResources().getDimensionPixelSize(resourceId); - } - return navigationBarHeight; - } + + } diff --git a/app/src/main/java/com/hi/music/player/ui/activity/MainActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/MainActivity.java index a367ef7..bb5ebfb 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/MainActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/MainActivity.java @@ -20,7 +20,7 @@ public class MainActivity extends BaseActivity { @Override public void onClick(View v) { - RetrofitManager.getInstance().getHomeData(); + } }); @@ -30,7 +30,7 @@ public class MainActivity extends BaseActivity { String continuation = "4qmFsgKrAhIMRkVtdXNpY19ob21lGpoCQ0FONnpBRkhVSGswZFMxUVIzazBaMFJYYjFWQ1EyOUpRa05wVWpWa1JqbDNXVmRrYkZnelRuVlpXRUo2WVVjNU1GZ3lNVEZqTW14cVdETkNhRm95Vm1aamJWWnVZVmM1ZFZsWGQxTklNV3Q1V2tSUmRHRldUa2RoTUZKS1ZteEdSR0ZXVG5GbFIzaERWVlZvTVZORlVYUlVXR3hLVVcxellVOVZNVEZqTW14cVVrZHNlbGt5T1RKYVdFbzFWVWRHYmxwV1RteGpibHB3V1RKVmRGSXlWakJUUnpsMFdsWkNhRm95VlVGQlVVSTJZVU14UkZSblFVSldWazFCUVZaV1ZFRkJSVUpCWDNGamVEY3dTa0ZuWjBVJTNE"; String clickTrackingParams = "CBAQybcCIhMIw4eu48bLiAMVvoDkBh2lGTJl"; String visitorData = "CgtFQThPOThGYzV0OCjDkqm3BjIKCgJVUxIEGgAgGg%3D%3D"; - RetrofitManager.getInstance().getHomeMoreData(continuation,clickTrackingParams,visitorData); +// RetrofitManager.getInstance().getHomeMoreData(continuation,clickTrackingParams,visitorData); } }); 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 new file mode 100644 index 0000000..236775d --- /dev/null +++ b/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java @@ -0,0 +1,47 @@ +package com.hi.music.player.ui.activity; + +import android.content.Intent; +import android.view.View; + +import com.hi.music.player.databinding.ActivityPlayBinding; +import com.hi.music.player.helper.MyValue; +import com.hi.music.player.javabean.response.ResponseSingle; +import com.hi.music.player.ui.activity.viewmodel.VMPlay; + +public class PlayActivity extends BaseActivity { + + + private ResponseSingle responseSingle; + private VMPlay vmPlay; + + @Override + protected ActivityPlayBinding getViewBinding() { + return ActivityPlayBinding.inflate(getLayoutInflater()); + } + + @Override + protected void onCreateInit() { + Intent intent = getIntent(); + responseSingle = (ResponseSingle) intent.getSerializableExtra(MyValue.KEY_PLAY_ACTIVITY_SINGER); + vmPlay = getActivityScopeViewModel(VMPlay.class); + + + vb.btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + vmPlay.getPlay(responseSingle); + } + }); + + } + + @Override + public boolean isFullScreen() { + return false; + } + + @Override + public boolean statusBarLight() { + return false; + } +} \ 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 new file mode 100644 index 0000000..b3a3d63 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/ui/activity/viewmodel/VMPlay.java @@ -0,0 +1,57 @@ +package com.hi.music.player.ui.activity.viewmodel; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.hi.music.player.api.RequestListener; +import com.hi.music.player.helper.CommonUtils; +import com.hi.music.player.javabean.response.ResponseHome; +import com.hi.music.player.javabean.response.ResponseSingle; +import com.hi.music.player.network.JsonHelper; +import com.hi.music.player.network.RetrofitManager; + +import org.json.JSONObject; + +import okhttp3.ResponseBody; + +public class VMPlay extends ViewModel { + + + private MutableLiveData _data = new MutableLiveData(); + public LiveData data = _data; + + private String continuation, clickTrackingParams, visitorData; + + public void getPlay(ResponseSingle responseSingle) { + String playlistId = responseSingle.getPlaylistId(); + String videoId = responseSingle.getVideoId(); + String params = responseSingle.getParams(); + String musicVideoType = responseSingle.getMusicVideoType(); + + RetrofitManager.getInstance().getNext(params,playlistId,videoId,musicVideoType,new RequestListener() { + + @Override + public void onFail(String errorMsg) { + _data.setValue(null); + } + + @Override + public void onSuccess(ResponseBody data) { + JSONObject jsonObject = CommonUtils.toJsonObject(data); + if (jsonObject != null) { + + +// _data.setValue(responseHome); + } else { + _data.setValue(null); + } + + } + }); + } + + + + +} diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/HomeFragment.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/HomeFragment.java index 37c4b4b..cabc50b 100644 --- a/app/src/main/java/com/hi/music/player/ui/fragmnt/HomeFragment.java +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/HomeFragment.java @@ -1,9 +1,40 @@ package com.hi.music.player.ui.fragmnt; -import com.hi.music.player.R; -import com.hi.music.player.databinding.FragmentHomeBinding; +import android.content.Intent; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.hi.music.player.R; +import com.hi.music.player.adapter.AdapterHome; +import com.hi.music.player.api.ClickSingerListener; +import com.hi.music.player.databinding.FragmentHomeBinding; +import com.hi.music.player.helper.CommonUtils; +import com.hi.music.player.helper.MyValue; +import com.hi.music.player.javabean.response.ResponseHome; +import com.hi.music.player.javabean.response.ResponseHomeChild; +import com.hi.music.player.javabean.response.ResponseSingle; +import com.hi.music.player.ui.activity.PlayActivity; +import com.hi.music.player.ui.fragmnt.viewmodel.VMHome; + +import java.util.ArrayList; +import java.util.List; + +public class HomeFragment extends BaseFragment implements ClickSingerListener { + + + private VMHome vmHome; + private AdapterHome adapterHome; + + private int requestCount = 1; + + private int totalPage = 2; + + private List childList = new ArrayList<>(); -public class HomeFragment extends BaseFragment { @Override protected FragmentHomeBinding getFragmentVb() { @@ -13,10 +44,57 @@ public class HomeFragment extends BaseFragment { @Override protected void initView() { - // 在这里进行视图的初始化操作 - //标题导航栏颜色设置 - Vb.toolbar.setTitleTextColor(getResources().getColor(R.color.white)); +// //标题导航栏颜色设置 +// Vb.toolbar.setTitleTextColor(getResources().getColor(R.color.white)); + AdapterHome adapterHome = new AdapterHome(); + adapterHome.setSingleClickSingerListener(this::onClickSingerItem); + + vmHome = getFragmentScopeViewModel(VMHome.class); + adapterHome.addLoadingFooter(); + vmHome.getHome(); + + + vmHome.data.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(ResponseHome responseHome) { + List childList1 = responseHome.getChildList(); + childList.addAll(childList1); + adapterHome.removeLoadingFooter(); + adapterHome.addData(childList1); + + + } + }); + Vb.recyclerSongOfTheDay.setLayoutManager(new LinearLayoutManager(requireContext())); + Vb.recyclerSongOfTheDay.setAdapter(adapterHome); + Vb.recyclerSongOfTheDay.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); + if (layoutManager != null && layoutManager.findLastVisibleItemPosition() == childList.size() - 1) { + if (requestCount < totalPage) { + CommonUtils.LogMsg("------loadmore--"); + adapterHome.addLoadingFooter(); + vmHome.getHomeMore(); + } + requestCount++; + } + } + }); + + } + + @Override + public void onClickSingerItem(ResponseSingle data) { + FragmentActivity activity = getActivity(); + if(activity!= null){ + Intent intent = new Intent(activity, PlayActivity.class); + intent.putExtra(MyValue.KEY_PLAY_ACTIVITY_SINGER, data); + startActivity(intent); + } + } } diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/VMHome.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/VMHome.java new file mode 100644 index 0000000..459bcd3 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/VMHome.java @@ -0,0 +1,78 @@ +package com.hi.music.player.ui.fragmnt.viewmodel; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.hi.music.player.api.RequestListener; +import com.hi.music.player.helper.CommonUtils; +import com.hi.music.player.javabean.response.ResponseHome; +import com.hi.music.player.network.JsonHelper; +import com.hi.music.player.network.RetrofitManager; + +import org.json.JSONObject; + +import okhttp3.ResponseBody; + +public class VMHome extends ViewModel { + + + private MutableLiveData _data = new MutableLiveData(); + public LiveData data = _data; + + private String continuation, clickTrackingParams, visitorData; + + public void getHome() { + RetrofitManager.getInstance().getHomeData(new RequestListener() { + + @Override + public void onFail(String errorMsg) { + _data.setValue(null); + } + + @Override + public void onSuccess(ResponseBody data) { + JSONObject jsonObject = CommonUtils.toJsonObject(data); + if (jsonObject != null) { + ResponseHome responseHome = JsonHelper.ResolveHomeJson(jsonObject); + + continuation = responseHome.getContinuation(); + clickTrackingParams = responseHome.getClickTrackingParams(); + visitorData = responseHome.getVisitorData(); + _data.setValue(responseHome); + } else { + _data.setValue(null); + } + + } + }); + } + + + public void getHomeMore() { + RetrofitManager.getInstance().getHomeMoreData(continuation, clickTrackingParams, visitorData, new RequestListener() { + + @Override + public void onFail(String errorMsg) { + _data.setValue(null); + } + + @Override + public void onSuccess(ResponseBody data) { + JSONObject jsonObject = CommonUtils.toJsonObject(data); + if (jsonObject != null) { + ResponseHome responseHome = JsonHelper.ResolveHomeMoreJson(jsonObject); + + continuation = responseHome.getContinuation(); + clickTrackingParams = responseHome.getClickTrackingParams(); + + _data.setValue(responseHome); + } else { + _data.setValue(null); + } + + } + }); + } + +} diff --git a/app/src/main/java/com/hi/music/player/ui/paging/MyPagingSource.java b/app/src/main/java/com/hi/music/player/ui/paging/MyPagingSource.java new file mode 100644 index 0000000..a3138a3 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/ui/paging/MyPagingSource.java @@ -0,0 +1,61 @@ +package com.hi.music.player.ui.paging; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.paging.PagingSource; +import androidx.paging.PagingState; + +import com.hi.music.player.api.RequestListener; +import com.hi.music.player.helper.CommonUtils; +import com.hi.music.player.javabean.response.ResponseHome; +import com.hi.music.player.network.JsonHelper; +import com.hi.music.player.network.RetrofitManager; + +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import kotlin.coroutines.Continuation; +import okhttp3.ResponseBody; + +public class MyPagingSource extends PagingSource { + + + + @Nullable + @Override + public Integer getRefreshKey(@NonNull PagingState pagingState) { + return null; + } + + @Nullable + @Override + public Object load(@NonNull LoadParams loadParams, @NonNull Continuation> continuation) { + int nextPage = 1; + Integer key = loadParams.getKey(); + if (key != null) { + nextPage = key + 1; + } + +// try { +// // 使用 Single 来处理异步请求 +// +// List result = Single.>create(emitter -> { +// RetrofitManager.getInstance().getHomeData(); +// }) +// .blockingGet(); // 阻塞获取结果 +// +// return new LoadResult.Page<>( +// result, +// page == 1 ? null : page - 1, +// result.isEmpty() ? null : page + 1 +// ); +// } catch (Exception e) { +// return new LoadResult.Error<>(e); +// } +// + return null; + } +} diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 909108e..0465ce4 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -10,6 +10,7 @@ android:id="@+id/home_view_pager" android:layout_width="match_parent" android:layout_height="0dp" + app:layout_constraintBottom_toTopOf="@+id/home_tab_layout" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/activity_play.xml b/app/src/main/res/layout/activity_play.xml new file mode 100644 index 0000000..ff165a0 --- /dev/null +++ b/app/src/main/res/layout/activity_play.xml @@ -0,0 +1,17 @@ + + + + +