From 956eba20eff39f93b1451bb2f3708222de5960cb Mon Sep 17 00:00:00 2001 From: guozhen Date: Tue, 15 Apr 2025 19:56:47 +0800 Subject: [PATCH] =?UTF-8?q?VionTv=20=E6=8E=A8=E8=8D=90=EF=BC=8C=E6=88=91?= =?UTF-8?q?=E7=9A=84=EF=BC=8C=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 + app/src/main/AndroidManifest.xml | 56 ++-- .../java/com/viontv/app/VTApplication.java | 2 + .../java/com/viontv/app/api/VTApiService.java | 104 ++++++- .../java/com/viontv/app/model/ItemBean.java | 12 + .../app/model/SearchCateGoryItemBean.java | 23 ++ .../com/viontv/app/model/VTUserInfoBean.java | 76 +++++ .../viontv/app/model/VTVideoDetailsBean.java | 143 ++-------- .../viontv/app/model/VTVideoExploreBean.java | 179 ++++++++++++ .../app/model/VTVideoExploreListBean.java | 18 ++ ...ttomListBean.java => VTVideoListBean.java} | 2 +- .../com/viontv/app/model/VideoInfoBean.java | 135 +++++++++ .../app/ui/activity/VTMainActivity.java | 8 +- .../app/ui/activity/WebViewActivity.java | 69 +++++ .../ui/activity/basic/VTCommonActivity.java | 2 +- .../activity/explore/VTExploreFragment.java | 242 +++++++++++++++- .../app/ui/activity/home/MainViewModel.java | 86 ++++++ .../app/ui/activity/home/VTHomeFragment.java | 65 ++++- .../app/ui/activity/home/VTHotFragment.java | 114 ++++---- .../ui/activity/home/VTTabItemFragment.java | 28 +- .../app/ui/activity/home/VTTopFragment.java | 12 +- .../app/ui/activity/me/VTMeFragment.java | 95 ++++++- .../app/ui/activity/me/VTUserViewModel.java | 75 +++++ .../play/VTEpisodesSelectDialogFragment.java | 22 +- .../activity/play/VTVideoPlayerActivity.java | 153 +++++----- .../ui/activity/play/VTVideoViewModel.java | 64 +++++ .../ui/activity/search/VTSearchActivity.java | 178 ++++++++++++ .../ui/activity/search/VTSearchViewModel.java | 90 ++++++ ...eAdapter.java => VTBannerHomeAdapter.java} | 15 +- ...ommonAdapter.java => VTCommonAdapter.java} | 6 +- .../ui/adapter/VTEpisodesSeriesAdapter.java | 2 +- ...entAdapter.java => VTFragmentAdapter.java} | 10 +- .../adapter/VTGooglePlayerExploreAdapter.java | 78 ++++++ ...apter.java => VTHotBottomListAdapter.java} | 7 +- ...eAdapter.java => VTNineSquareAdapter.java} | 8 +- .../app/ui/adapter/VTSearchDataAdapter.java | 78 ++++++ .../ui/adapter/VTSearchHistoryAdapter.java | 23 ++ .../ui/adapter/VTSearchHotListAdapter.java | 75 +++++ ...Adapter.java => VTTabItemListAdapter.java} | 15 +- ...stAdapter.java => VTTop10ListAdapter.java} | 9 +- .../ui/adapter/VTUserVideoHistoryAdapter.java | 54 ++++ .../app/ui/view/VTGoogleExoPlayerView.java | 5 +- .../ui/view/VTHomeGoogleExoPlayerView.java | 262 ++++++++++++++++++ .../com/viontv/app/utils/IntentUtils.java | 7 + .../com/viontv/app/utils/VTAppConstants.java | 39 +-- .../res/drawable/bg_circle_headdefault_vt.xml | 8 + .../res/drawable/bg_home_series_gradient.xml | 20 ++ .../res/drawable/bg_search_hot_gradient.xml | 19 ++ .../drawable/bg_search_hot_top1_gradient.xml | 20 ++ .../drawable/bg_search_hot_top2_gradient.xml | 20 ++ .../drawable/bg_search_hot_top3_gradient.xml | 20 ++ .../drawable/bg_search_hot_top4_gradient.xml | 20 ++ .../main/res/drawable/bg_vt_episodes_home.xml | 14 + .../res/drawable/cornor_1affffff_12dp.xml | 13 + .../main/res/layout/activity_search_vt.xml | 170 ++++++++++++ .../res/layout/activity_video_details_vt.xml | 2 +- app/src/main/res/layout/activity_webview.xml | 38 +++ .../main/res/layout/fragment_explore_vt.xml | 42 +++ app/src/main/res/layout/fragment_hot_vt.xml | 32 +-- app/src/main/res/layout/fragment_main_vt.xml | 4 +- app/src/main/res/layout/fragment_me.xml | 138 +++++++++ .../res/layout/item_google_home_player_vt.xml | 7 + .../main/res/layout/item_home_explore_vt.xml | 1 + .../layout/item_page_episodes_series_vt.xml | 1 + .../main/res/layout/item_search_data_vt.xml | 88 ++++++ .../res/layout/item_search_history_vt.xml | 13 + .../main/res/layout/item_search_hot_vt.xml | 103 +++++++ .../main/res/layout/item_video_history.xml | 15 + .../layout/layout_player_controller_vt.xml | 5 +- .../layout_player_home_controller_vt.xml | 193 +++++++++++++ .../res/layout/layout_videoplay_home_vt.xml | 13 + ...ode.webp => ic_arrowright_vt_episode.webp} | Bin .../res/mipmap-xxhdpi/ic_default_head.png | Bin 0 -> 8791 bytes app/src/main/res/mipmap-xxhdpi/ic_enter.png | Bin 0 -> 535 bytes .../res/mipmap-xxhdpi/ic_history_delete.png | Bin 0 -> 591 bytes .../main/res/mipmap-xxhdpi/ic_hot_search.png | Bin 0 -> 2391 bytes .../main/res/mipmap-xxhdpi/ic_me_about_us.png | Bin 0 -> 3390 bytes .../mipmap-xxhdpi/ic_me_private_policy.png | Bin 0 -> 3911 bytes .../mipmap-xxhdpi/ic_me_user_agreement.png | Bin 0 -> 2534 bytes ...e_left.png => ic_play_vt_episode_left.png} | Bin .../main/res/mipmap-xxhdpi/ic_playlist.png | Bin 0 -> 2437 bytes .../res/mipmap-xxhdpi/ic_search_empty.png | Bin 0 -> 78068 bytes .../res/mipmap-xxhdpi/ic_search_history.png | Bin 0 -> 1598 bytes .../main/res/mipmap-xxhdpi/ic_series_play.png | Bin 0 -> 408 bytes .../res/mipmap-xxhdpi/iv_vt_collect_h.png | Bin 2978 -> 3757 bytes .../res/mipmap-xxhdpi/iv_vt_collect_n.png | Bin 2375 -> 2485 bytes app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 14 +- app/src/main/res/values/themes.xml | 5 +- gradle/libs.versions.toml | 8 +- 90 files changed, 3360 insertions(+), 436 deletions(-) create mode 100644 app/src/main/java/com/viontv/app/model/SearchCateGoryItemBean.java create mode 100644 app/src/main/java/com/viontv/app/model/VTUserInfoBean.java create mode 100644 app/src/main/java/com/viontv/app/model/VTVideoExploreBean.java create mode 100644 app/src/main/java/com/viontv/app/model/VTVideoExploreListBean.java rename app/src/main/java/com/viontv/app/model/{HomeBottomListBean.java => VTVideoListBean.java} (93%) create mode 100644 app/src/main/java/com/viontv/app/model/VideoInfoBean.java create mode 100644 app/src/main/java/com/viontv/app/ui/activity/WebViewActivity.java create mode 100644 app/src/main/java/com/viontv/app/ui/activity/me/VTUserViewModel.java create mode 100644 app/src/main/java/com/viontv/app/ui/activity/search/VTSearchActivity.java create mode 100644 app/src/main/java/com/viontv/app/ui/activity/search/VTSearchViewModel.java rename app/src/main/java/com/viontv/app/ui/adapter/{BannerHomeAdapter.java => VTBannerHomeAdapter.java} (72%) rename app/src/main/java/com/viontv/app/ui/adapter/{CommonAdapter.java => VTCommonAdapter.java} (94%) rename app/src/main/java/com/viontv/app/ui/adapter/{FragmentAdapter.java => VTFragmentAdapter.java} (77%) create mode 100644 app/src/main/java/com/viontv/app/ui/adapter/VTGooglePlayerExploreAdapter.java rename app/src/main/java/com/viontv/app/ui/adapter/{HotBottomListAdapter.java => VTHotBottomListAdapter.java} (90%) rename app/src/main/java/com/viontv/app/ui/adapter/{NineSquareAdapter.java => VTNineSquareAdapter.java} (85%) create mode 100644 app/src/main/java/com/viontv/app/ui/adapter/VTSearchDataAdapter.java create mode 100644 app/src/main/java/com/viontv/app/ui/adapter/VTSearchHistoryAdapter.java create mode 100644 app/src/main/java/com/viontv/app/ui/adapter/VTSearchHotListAdapter.java rename app/src/main/java/com/viontv/app/ui/adapter/{TabItemListAdapter.java => VTTabItemListAdapter.java} (78%) rename app/src/main/java/com/viontv/app/ui/adapter/{Top10ListAdapter.java => VTTop10ListAdapter.java} (92%) create mode 100644 app/src/main/java/com/viontv/app/ui/adapter/VTUserVideoHistoryAdapter.java create mode 100644 app/src/main/java/com/viontv/app/ui/view/VTHomeGoogleExoPlayerView.java create mode 100644 app/src/main/res/drawable/bg_circle_headdefault_vt.xml create mode 100644 app/src/main/res/drawable/bg_home_series_gradient.xml create mode 100644 app/src/main/res/drawable/bg_search_hot_gradient.xml create mode 100644 app/src/main/res/drawable/bg_search_hot_top1_gradient.xml create mode 100644 app/src/main/res/drawable/bg_search_hot_top2_gradient.xml create mode 100644 app/src/main/res/drawable/bg_search_hot_top3_gradient.xml create mode 100644 app/src/main/res/drawable/bg_search_hot_top4_gradient.xml create mode 100644 app/src/main/res/drawable/bg_vt_episodes_home.xml create mode 100644 app/src/main/res/drawable/cornor_1affffff_12dp.xml create mode 100644 app/src/main/res/layout/activity_search_vt.xml create mode 100644 app/src/main/res/layout/activity_webview.xml create mode 100644 app/src/main/res/layout/fragment_explore_vt.xml create mode 100644 app/src/main/res/layout/fragment_me.xml create mode 100644 app/src/main/res/layout/item_google_home_player_vt.xml create mode 100644 app/src/main/res/layout/item_search_data_vt.xml create mode 100644 app/src/main/res/layout/item_search_history_vt.xml create mode 100644 app/src/main/res/layout/item_search_hot_vt.xml create mode 100644 app/src/main/res/layout/item_video_history.xml create mode 100644 app/src/main/res/layout/layout_player_home_controller_vt.xml create mode 100644 app/src/main/res/layout/layout_videoplay_home_vt.xml rename app/src/main/res/mipmap-xxhdpi/{iv_arrowright_vt_episode.webp => ic_arrowright_vt_episode.webp} (100%) create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_default_head.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_enter.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_history_delete.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_hot_search.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_me_about_us.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_me_private_policy.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_me_user_agreement.png rename app/src/main/res/mipmap-xxhdpi/{iv_play_vt_episode_left.png => ic_play_vt_episode_left.png} (100%) create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_playlist.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_search_empty.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_search_history.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_series_play.png diff --git a/app/build.gradle b/app/build.gradle index c338556..5a684d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,6 +14,7 @@ android { versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables.useSupportLibrary = true } // signingConfigs { @@ -39,6 +40,8 @@ android { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + + } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0609d79..606c8a5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,37 +1,37 @@ + xmlns:tools="http://schemas.android.com/tools"> - - - - - + + + + + - + - - - - - - - - + + + + + + + + + + diff --git a/app/src/main/java/com/viontv/app/VTApplication.java b/app/src/main/java/com/viontv/app/VTApplication.java index 2be85c0..93da632 100644 --- a/app/src/main/java/com/viontv/app/VTApplication.java +++ b/app/src/main/java/com/viontv/app/VTApplication.java @@ -19,6 +19,8 @@ public class VTApplication extends Application { public static VTApplication AppContext; + public static boolean isCurrentPage = true; + public static VTApplication getAppContext() { return AppContext; } diff --git a/app/src/main/java/com/viontv/app/api/VTApiService.java b/app/src/main/java/com/viontv/app/api/VTApiService.java index 6aef191..3c63961 100644 --- a/app/src/main/java/com/viontv/app/api/VTApiService.java +++ b/app/src/main/java/com/viontv/app/api/VTApiService.java @@ -1,23 +1,20 @@ package com.viontv.app.api; -import com.viontv.app.model.HomeBottomListBean; +import com.viontv.app.model.VTVideoListBean; import com.viontv.app.model.HomeTopBannerBean; import com.viontv.app.model.HomeTopBean; import com.viontv.app.model.RegisteredBean; import com.viontv.app.model.TabItemBean; +import com.viontv.app.model.VTUserInfoBean; import com.viontv.app.model.VTVideoDetailsBean; - -import java.util.List; -import java.util.Map; +import com.viontv.app.model.VTVideoExploreListBean; import io.reactivex.Observable; -import retrofit2.http.Body; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.POST; -import retrofit2.http.Path; import retrofit2.http.Query; @@ -28,10 +25,14 @@ public interface VTApiService { * 正式测试服 */ boolean isProduce = false; - String URL = isProduce ? "https://admin-viontv.guyantv.com" : "https://test1-api.guyantv.com"; + String URL = isProduce ? "https://api-zyreotv.zyreotv.com/7834f11d/" : "https://test1-api.guyantv.com"; + + public static final String rankTop10Type = "most_trending"; + public static final String ZyreoTV_Private = "https://www.zyreotv.com/private"; + public static final String ZyreoTV_USERAgreement = "https://www.zyreotv.com/user_policy"; + - public static final String rankTop10Type="most_trending"; /** * 注册 * @@ -64,7 +65,7 @@ public interface VTApiService { */ @FormUrlEncoded @POST("/newShortPlay") - Observable> newShortPlay(@Field("current_page") int currentpage,@Field("page_size") int pagesize); + Observable> newShortPlay(@Field("current_page") int currentpage, @Field("page_size") int pagesize); /** @@ -74,7 +75,7 @@ public interface VTApiService { */ @FormUrlEncoded @POST("/homeRanking") - Observable> homeTop10(@Field("type") String type); + Observable> homeTop10(@Field("type") String type); /** @@ -93,7 +94,7 @@ public interface VTApiService { */ @FormUrlEncoded @POST("/revenge") - Observable> getTabItemBanner(@Field("category_id") String category_id); + Observable> getTabItemBanner(@Field("category_id") int category_id); /** @@ -102,8 +103,87 @@ public interface VTApiService { * @return */ @GET("/videoList") - Observable> getVideoList(@Query("category_id") String category_id,@Query("current_page") int current,@Query("page_size") int pageSize,@Query("search") String search); + Observable> getVideoList(@Query("category_id") int category_id, @Query("current_page") int current, @Query("page_size") int pageSize, @Query("search") String search); + /** + * 播放上报历史 + * + * @return + */ + @FormUrlEncoded + @POST("/createHistory") + Observable createVideoHistory(@Field("short_play_id") int shorplayId, @Field("video_id") int videoId); + + + /** + * Search Hot List + * + * @return + */ + @GET("/search/hots") + Observable> getSearchHotList(); + + /** + * Search Content List + * + * @return + */ + @GET("/search") + Observable> getSearchContentList(@Query("search") String search); + + + /** + * 搜索点击上报 + * + * @return + */ + @FormUrlEncoded + @POST("/search/click") + Observable searchClick(@Field("short_play_id") int shorplayId); + + /** + * 首页推荐列表 + * + * @return + */ + @GET("/getRecommands") + Observable> getExploreList(@Query("current_page") int current, @Query("page_size") int pageSize); + + + /** + * 收藏 + * + * @return + */ + @FormUrlEncoded + @POST("/collect") + Observable collect(@Field("short_play_id") int shorplayId, @Field("video_id") int videoId); + + + /** + * 取消收藏 + * + * @return + */ + @FormUrlEncoded + @POST("/cancelCollect") + Observable cancelCollect(@Field("short_play_id") int shorplayId); + + /** + * 获取用户信息 + * + * @return + */ + @GET("/customer/info") + Observable> getUserInfo(); + + /** + * 获取观看历史列表 + * + * @return + */ + @GET("/myHistorys") + Observable> getVideoHistoryList(@Query("current_page") int currentpage, @Query("page_size") int pageSize); } diff --git a/app/src/main/java/com/viontv/app/model/ItemBean.java b/app/src/main/java/com/viontv/app/model/ItemBean.java index 01b9b85..62cc66b 100644 --- a/app/src/main/java/com/viontv/app/model/ItemBean.java +++ b/app/src/main/java/com/viontv/app/model/ItemBean.java @@ -38,6 +38,9 @@ public class ItemBean { private List category; + private List categoryList; //搜索结果 + + @@ -168,4 +171,13 @@ public class ItemBean { public void setCategory(List category) { this.category = category; } + + + public List getCategoryList() { + return categoryList; + } + + public void setCategoryList(List categoryList) { + this.categoryList = categoryList; + } } diff --git a/app/src/main/java/com/viontv/app/model/SearchCateGoryItemBean.java b/app/src/main/java/com/viontv/app/model/SearchCateGoryItemBean.java new file mode 100644 index 0000000..2aa8fac --- /dev/null +++ b/app/src/main/java/com/viontv/app/model/SearchCateGoryItemBean.java @@ -0,0 +1,23 @@ +package com.viontv.app.model; + +public class SearchCateGoryItemBean { + + private String name; + private int id; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } +} diff --git a/app/src/main/java/com/viontv/app/model/VTUserInfoBean.java b/app/src/main/java/com/viontv/app/model/VTUserInfoBean.java new file mode 100644 index 0000000..8687164 --- /dev/null +++ b/app/src/main/java/com/viontv/app/model/VTUserInfoBean.java @@ -0,0 +1,76 @@ +package com.viontv.app.model; + +public class VTUserInfoBean { + +// "id": "S72866 (t)", +// "customer_id": "S72866 (t)", +// "is_guide_vip": true, +// "is_tourist": true, +// "family_name": "訪客", +// "giving_name": "", +// "vip_end_time": 0, +// "third_access_id": "", +// "is_vip": false, +// "coin_left_total": 0, +// "vip_type": "", +// "email": "", +// "third_access_platform": "", +// "ip_address": "116.128.252.77", +// "country_code": "CN", +// "user_level": "normal", +// "send_coin_left_total": 0, +// "avator": "", +// "sign_in_status": 0, +// "registered_days": 1, +// "ln": "ed590219f82c44d5a40d19cdff3cb6de49ccb0b3bf61ccd8214764105d736dbe", +// "country": "9fc4508238942e7cf40354d962db0c18c5ceec7320e0a3b9f69a0a7836efa50c" + + public String family_name; + public boolean is_vip; + + public String avator; + + public String id; + + public String customer_id; + + public String getFamily_name() { + return family_name; + } + + public void setFamily_name(String family_name) { + this.family_name = family_name; + } + + public boolean isIs_vip() { + return is_vip; + } + + public void setIs_vip(boolean is_vip) { + this.is_vip = is_vip; + } + + public String getAvator() { + return avator; + } + + public void setAvator(String avator) { + this.avator = avator; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCustomer_id() { + return customer_id; + } + + public void setCustomer_id(String customer_id) { + this.customer_id = customer_id; + } +} diff --git a/app/src/main/java/com/viontv/app/model/VTVideoDetailsBean.java b/app/src/main/java/com/viontv/app/model/VTVideoDetailsBean.java index 4be06c8..06051cd 100644 --- a/app/src/main/java/com/viontv/app/model/VTVideoDetailsBean.java +++ b/app/src/main/java/com/viontv/app/model/VTVideoDetailsBean.java @@ -15,7 +15,8 @@ public class VTVideoDetailsBean { public ShortPlayInfo shortPlayInfo; - public VideoInfo video_info; + public VideoInfoBean video_info; + @@ -151,6 +152,10 @@ public class VTVideoDetailsBean { int short_id; int watch_total; + int short_play_id; + + + public int getAll_coins() { return all_coins; } @@ -247,6 +252,14 @@ public class VTVideoDetailsBean { this.watch_total = watch_total; } + public int getShort_play_id() { + return short_play_id; + } + + public void setShort_play_id(int short_play_id) { + this.short_play_id = short_play_id; + } + protected ShortPlayInfo(Parcel in) { all_coins = in.readInt(); buy_type = in.readInt(); @@ -260,6 +273,7 @@ public class VTVideoDetailsBean { process = in.readInt(); short_id = in.readInt(); watch_total = in.readInt(); + short_play_id = in.readInt(); } public static final Creator CREATOR = new Creator() { @@ -293,133 +307,8 @@ public class VTVideoDetailsBean { dest.writeInt(process); dest.writeInt(short_id); dest.writeInt(watch_total); - } - } - - public static class VideoInfo implements Parcelable{ - - int coins; - int episode; - int id; - int is_vip; - int short_id; - int short_play_id; - int short_play_video_id; - String video_url; - int vip_coins; - - public int getCoins() { - return coins; - } - - public void setCoins(int coins) { - this.coins = coins; - } - - public int getEpisode() { - return episode; - } - - public void setEpisode(int episode) { - this.episode = episode; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public int getIs_vip() { - return is_vip; - } - - public void setIs_vip(int is_vip) { - this.is_vip = is_vip; - } - - public int getShort_id() { - return short_id; - } - - public void setShort_id(int short_id) { - this.short_id = short_id; - } - - public int getShort_play_id() { - return short_play_id; - } - - public void setShort_play_id(int short_play_id) { - this.short_play_id = short_play_id; - } - - public int getShort_play_video_id() { - return short_play_video_id; - } - - public void setShort_play_video_id(int short_play_video_id) { - this.short_play_video_id = short_play_video_id; - } - - public String getVideo_url() { - return video_url; - } - - public void setVideo_url(String video_url) { - this.video_url = video_url; - } - - public int getVip_coins() { - return vip_coins; - } - - public void setVip_coins(int vip_coins) { - this.vip_coins = vip_coins; - } - - protected VideoInfo(Parcel in) { - coins = in.readInt(); - episode = in.readInt(); - id = in.readInt(); - is_vip = in.readInt(); - short_id = in.readInt(); - short_play_id = in.readInt(); - short_play_video_id = in.readInt(); - video_url = in.readString(); - vip_coins = in.readInt(); - } - - public static final Creator CREATOR = new Creator() { - @Override - public VideoInfo createFromParcel(Parcel in) { - return new VideoInfo(in); - } - - @Override - public VideoInfo[] newArray(int size) { - return new VideoInfo[size]; - } - }; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeInt(coins); - dest.writeInt(episode); - dest.writeInt(id); - dest.writeInt(is_vip); - dest.writeInt(short_id); dest.writeInt(short_play_id); - dest.writeInt(short_play_video_id); - dest.writeString(video_url); - dest.writeInt(vip_coins); } } + } diff --git a/app/src/main/java/com/viontv/app/model/VTVideoExploreBean.java b/app/src/main/java/com/viontv/app/model/VTVideoExploreBean.java new file mode 100644 index 0000000..f030126 --- /dev/null +++ b/app/src/main/java/com/viontv/app/model/VTVideoExploreBean.java @@ -0,0 +1,179 @@ +package com.viontv.app.model; + +import java.util.List; + +public class VTVideoExploreBean { + + + private int id; + + private int short_id; + + private int short_play_id; + + private String name; + + private String description; + + private int process; + + private String image_url; + + private String horizontally_img; + + private int buy_type; + + private String tag_type; + + private int all_coins; + + private int collect_total; + + private int watch_total; + + private int episode_total; + + private int search_click_total; + + private boolean is_collect; + + + public VideoInfoBean video_info; + + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getShort_id() { + return short_id; + } + + public void setShort_id(int short_id) { + this.short_id = short_id; + } + + public int getShort_play_id() { + return short_play_id; + } + + public void setShort_play_id(int short_play_id) { + this.short_play_id = short_play_id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public int getProcess() { + return process; + } + + public void setProcess(int process) { + this.process = process; + } + + public String getImage_url() { + return image_url; + } + + public void setImage_url(String image_url) { + this.image_url = image_url; + } + + public String getHorizontally_img() { + return horizontally_img; + } + + public void setHorizontally_img(String horizontally_img) { + this.horizontally_img = horizontally_img; + } + + public int getBuy_type() { + return buy_type; + } + + public void setBuy_type(int buy_type) { + this.buy_type = buy_type; + } + + public String getTag_type() { + return tag_type; + } + + public void setTag_type(String tag_type) { + this.tag_type = tag_type; + } + + public int getAll_coins() { + return all_coins; + } + + public void setAll_coins(int all_coins) { + this.all_coins = all_coins; + } + + public int getCollect_total() { + return collect_total; + } + + public void setCollect_total(int collect_total) { + this.collect_total = collect_total; + } + + public int getWatch_total() { + return watch_total; + } + + public void setWatch_total(int watch_total) { + this.watch_total = watch_total; + } + + public int getEpisode_total() { + return episode_total; + } + + public void setEpisode_total(int episode_total) { + this.episode_total = episode_total; + } + + public int getSearch_click_total() { + return search_click_total; + } + + public void setSearch_click_total(int search_click_total) { + this.search_click_total = search_click_total; + } + + public boolean isIs_collect() { + return is_collect; + } + + public void setIs_collect(boolean is_collect) { + this.is_collect = is_collect; + } + + public VideoInfoBean getVideo_info() { + return video_info; + } + + public void setVideo_info(VideoInfoBean video_info) { + this.video_info = video_info; + } +} diff --git a/app/src/main/java/com/viontv/app/model/VTVideoExploreListBean.java b/app/src/main/java/com/viontv/app/model/VTVideoExploreListBean.java new file mode 100644 index 0000000..326a932 --- /dev/null +++ b/app/src/main/java/com/viontv/app/model/VTVideoExploreListBean.java @@ -0,0 +1,18 @@ +package com.viontv.app.model; + +import java.util.List; + +public class VTVideoExploreListBean { + + + public List list; + + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } +} diff --git a/app/src/main/java/com/viontv/app/model/HomeBottomListBean.java b/app/src/main/java/com/viontv/app/model/VTVideoListBean.java similarity index 93% rename from app/src/main/java/com/viontv/app/model/HomeBottomListBean.java rename to app/src/main/java/com/viontv/app/model/VTVideoListBean.java index 3998290..0a0cea0 100644 --- a/app/src/main/java/com/viontv/app/model/HomeBottomListBean.java +++ b/app/src/main/java/com/viontv/app/model/VTVideoListBean.java @@ -2,7 +2,7 @@ package com.viontv.app.model; import java.util.List; -public class HomeBottomListBean { +public class VTVideoListBean { private List short_play_list; private List list; diff --git a/app/src/main/java/com/viontv/app/model/VideoInfoBean.java b/app/src/main/java/com/viontv/app/model/VideoInfoBean.java new file mode 100644 index 0000000..3ba3210 --- /dev/null +++ b/app/src/main/java/com/viontv/app/model/VideoInfoBean.java @@ -0,0 +1,135 @@ +package com.viontv.app.model; + +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + +public class VideoInfoBean implements Parcelable { + + + int coins; + int episode; + int id; + int is_vip; + int short_id; + int short_play_id; + int short_play_video_id; + String video_url; + int vip_coins; + + protected VideoInfoBean(Parcel in) { + coins = in.readInt(); + episode = in.readInt(); + id = in.readInt(); + is_vip = in.readInt(); + short_id = in.readInt(); + short_play_id = in.readInt(); + short_play_video_id = in.readInt(); + video_url = in.readString(); + vip_coins = in.readInt(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public VideoInfoBean createFromParcel(Parcel in) { + return new VideoInfoBean(in); + } + + @Override + public VideoInfoBean[] newArray(int size) { + return new VideoInfoBean[size]; + } + }; + + public int getCoins() { + return coins; + } + + public void setCoins(int coins) { + this.coins = coins; + } + + public int getEpisode() { + return episode; + } + + public void setEpisode(int episode) { + this.episode = episode; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getIs_vip() { + return is_vip; + } + + public void setIs_vip(int is_vip) { + this.is_vip = is_vip; + } + + public int getShort_id() { + return short_id; + } + + public void setShort_id(int short_id) { + this.short_id = short_id; + } + + public int getShort_play_id() { + return short_play_id; + } + + public void setShort_play_id(int short_play_id) { + this.short_play_id = short_play_id; + } + + public int getShort_play_video_id() { + return short_play_video_id; + } + + public void setShort_play_video_id(int short_play_video_id) { + this.short_play_video_id = short_play_video_id; + } + + public String getVideo_url() { + return video_url; + } + + public void setVideo_url(String video_url) { + this.video_url = video_url; + } + + public int getVip_coins() { + return vip_coins; + } + + public void setVip_coins(int vip_coins) { + this.vip_coins = vip_coins; + } + + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(coins); + dest.writeInt(episode); + dest.writeInt(id); + dest.writeInt(is_vip); + dest.writeInt(short_id); + dest.writeInt(short_play_id); + dest.writeInt(short_play_video_id); + dest.writeString(video_url); + dest.writeInt(vip_coins); + } +} diff --git a/app/src/main/java/com/viontv/app/ui/activity/VTMainActivity.java b/app/src/main/java/com/viontv/app/ui/activity/VTMainActivity.java index 2187c7c..b160244 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/VTMainActivity.java +++ b/app/src/main/java/com/viontv/app/ui/activity/VTMainActivity.java @@ -1,10 +1,8 @@ package com.viontv.app.ui.activity; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.AppCompatTextView; import androidx.fragment.app.Fragment; -import android.os.Bundle; import android.view.View; import com.viontv.app.R; @@ -14,7 +12,7 @@ import com.viontv.app.ui.activity.explore.VTExploreFragment; import com.viontv.app.ui.activity.home.VTHomeFragment; import com.viontv.app.ui.activity.me.VTMeFragment; import com.viontv.app.ui.activity.mylist.VTMyListFragment; -import com.viontv.app.ui.adapter.FragmentAdapter; +import com.viontv.app.ui.adapter.VTFragmentAdapter; import java.util.ArrayList; import java.util.List; @@ -31,7 +29,7 @@ public class VTMainActivity extends VTCommonActivity impl ActivityMainVtBinding binding; - private FragmentAdapter fragmentAdapter; + private VTFragmentAdapter fragmentAdapter; @@ -55,7 +53,7 @@ public class VTMainActivity extends VTCommonActivity impl fragments.add(VTExploreFragment); fragments.add(VTMyListFragment); fragments.add(VTMeFragment); - fragmentAdapter = new FragmentAdapter(this); + fragmentAdapter = new VTFragmentAdapter(this); fragmentAdapter.setFragmentList(fragments); binding.container.setUserInputEnabled(false); binding.container.setAdapter(fragmentAdapter); diff --git a/app/src/main/java/com/viontv/app/ui/activity/WebViewActivity.java b/app/src/main/java/com/viontv/app/ui/activity/WebViewActivity.java new file mode 100644 index 0000000..221b405 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/activity/WebViewActivity.java @@ -0,0 +1,69 @@ +package com.viontv.app.ui.activity; + +import android.annotation.SuppressLint; +import android.os.Build; +import android.webkit.CookieManager; +import android.webkit.WebSettings; + +import com.viontv.app.databinding.ActivityMainVtBinding; +import com.viontv.app.databinding.ActivityWebviewBinding; +import com.viontv.app.ui.activity.basic.VTCommonActivity; +import com.viontv.app.utils.VTAppConstants; + +public class WebViewActivity extends VTCommonActivity { + + public ActivityWebviewBinding binding; + + private String webUrl; + private String webTitle; + + @Override + public void init() { + getWindow().setNavigationBarColor(getResources().getColor(android.R.color.black)); + binding = ActivityWebviewBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + webUrl = getIntent().getStringExtra(VTAppConstants.Constants_Page_WebUrl); + webTitle = getIntent().getStringExtra(VTAppConstants.Constants_Page_WebTitle); + } + + + @Override + public void initView() { + + binding.ivWebviewBack.setOnClickListener(v -> finish()); + binding.tvWebviewTitle.setText(webTitle); + binding.webview.getSettings(); + WebSettings settings = binding.webview.getSettings(); + settings.setDomStorageEnabled(true); + CookieManager.getInstance().setAcceptThirdPartyCookies(binding.webview, true); + settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); + // settings.setAppCacheEnabled(true); + settings.setCacheMode(WebSettings.LOAD_DEFAULT); +// settings.setCacheMode(WebSettings.LOAD_NO_CACHE); + + settings.setJavaScriptEnabled(true); + settings.setLoadWithOverviewMode(true); +// settings.setAppCachePath(APP_CACHE_DIRNAME); + // 设置允许访问文件数据 + settings.setAllowFileAccess(true); + settings.setAllowContentAccess(true); + settings.setDatabaseEnabled(true); + settings.setSavePassword(false); + settings.setSaveFormData(false); + settings.setUseWideViewPort(true); + settings.setJavaScriptCanOpenWindowsAutomatically(true); + // 设置在WebView内部是否允许通过file url加载的 Js代码读取其他的本地文件 + // Android 4.1前默认允许,4.1后默认禁止 + settings.setAllowFileAccessFromFileURLs(true); + // 设置WebView内部是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源) + // Android 4.1前默认允许,4.1后默认禁止 + settings.setAllowUniversalAccessFromFileURLs(true); + binding.webview.loadUrl(webUrl); + + } + + @Override + public void logic() { + + } +} diff --git a/app/src/main/java/com/viontv/app/ui/activity/basic/VTCommonActivity.java b/app/src/main/java/com/viontv/app/ui/activity/basic/VTCommonActivity.java index fa4b0fe..6bcc56c 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/basic/VTCommonActivity.java +++ b/app/src/main/java/com/viontv/app/ui/activity/basic/VTCommonActivity.java @@ -24,7 +24,7 @@ public abstract class VTCommonActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 调用 HibitStatusBarTools 类的 pageDarkMode 方法,设置页面为深色模式 - VTStatusBarUtils.pageDarkMode(this, true); + VTStatusBarUtils.pageDarkMode(this, false); // 设置窗口标志,防止屏幕内容被截屏或录制 getWindow().setFlags( WindowManager.LayoutParams.FLAG_SECURE, diff --git a/app/src/main/java/com/viontv/app/ui/activity/explore/VTExploreFragment.java b/app/src/main/java/com/viontv/app/ui/activity/explore/VTExploreFragment.java index 9cf02b5..5c89958 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/explore/VTExploreFragment.java +++ b/app/src/main/java/com/viontv/app/ui/activity/explore/VTExploreFragment.java @@ -1,5 +1,6 @@ package com.viontv.app.ui.activity.explore; +import android.annotation.SuppressLint; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -7,17 +8,53 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.appcompat.widget.AppCompatTextView; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager2.widget.ViewPager2; +import com.viontv.app.R; +import com.viontv.app.VTApplication; +import com.viontv.app.api.VTResult; +import com.viontv.app.databinding.FragmentExploreVtBinding; import com.viontv.app.databinding.FragmentMainVtBinding; +import com.viontv.app.model.VTVideoDetailsBean; +import com.viontv.app.model.VTVideoExploreBean; +import com.viontv.app.model.VTVideoExploreListBean; +import com.viontv.app.ui.activity.basic.VTBaseEventBus; import com.viontv.app.ui.activity.home.MainViewModel; +import com.viontv.app.ui.activity.play.VTVideoPlayerActivity; +import com.viontv.app.ui.activity.play.VTVideoViewModel; +import com.viontv.app.ui.adapter.VTGooglePlayerAdapter; +import com.viontv.app.ui.adapter.VTGooglePlayerExploreAdapter; +import com.viontv.app.ui.view.VTHomeGoogleExoPlayerView; +import com.viontv.app.utils.IntentUtils; +import com.viontv.app.utils.SingleClickUtils; +import com.viontv.app.utils.TimeUtils; +import com.viontv.app.utils.ToastUtils; +import com.viontv.app.utils.TranslatesUtils; +import com.viontv.app.utils.VTAppConstants; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; -public class VTExploreFragment extends Fragment { +public class VTExploreFragment extends Fragment implements VTGooglePlayerExploreAdapter.PlayerDetailCollection { private MainViewModel mViewModel; - private FragmentMainVtBinding binding; + private FragmentExploreVtBinding viewBinding; + + private VTVideoExploreBean bean = null; + private VTGooglePlayerExploreAdapter vtGooglePlayerAdapter = null; + private int currentPosition = 0; + + private boolean first = true; + private int pageHome = 1; + public static VTExploreFragment newInstance() { return new VTExploreFragment(); @@ -27,6 +64,7 @@ public class VTExploreFragment extends Fragment { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mViewModel = new ViewModelProvider(this).get(MainViewModel.class); + // TODO: Use the ViewModel } @@ -34,8 +72,204 @@ public class VTExploreFragment extends Fragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - binding = FragmentMainVtBinding.inflate(inflater); - return binding.getRoot(); + EventBus.getDefault().register(this); + viewBinding = FragmentExploreVtBinding.inflate(inflater); + return viewBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + viewBinding.avi.smoothToShow(); + mViewModel.getExploreVideoList(pageHome, 10); + viewBinding.viewPagerExploreEpisode.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @SuppressLint("NotifyDataSetChanged") + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + currentPosition = position; + int previousPosition = vtGooglePlayerAdapter != null ? vtGooglePlayerAdapter.getCurrentEpisodePlayingPosition() : -1; + if (previousPosition != position) { + vtGooglePlayerAdapter.getRecyclerView().post(() -> vtGooglePlayerAdapter.notifyDataSetChanged()); + } + vtGooglePlayerAdapter.setCurrentEpisodePlayingPosition(position); + } + + @Override + public void onPageScrollStateChanged(int state) { + super.onPageScrollStateChanged(state); + if (state == ViewPager2.SCROLL_STATE_IDLE) { + if (viewBinding.viewPagerExploreEpisode.getCurrentItem() == viewBinding.viewPagerExploreEpisode.getAdapter().getItemCount() - 1) { + if (!first) { + pageHome++; + mViewModel.getExploreVideoList(pageHome, 10); + } else { + first = false; + } + } + } + } + }); + logic(); + } + + public void logic() { + + mViewModel.getExploreVideoLiveData().observe(getViewLifecycleOwner(), data -> { + if (data != null) { + if (pageHome == 1) { + if (data.data.getList().isEmpty()) { + viewBinding.layoutEmpty.setVisibility(View.VISIBLE); + } else { + vtGooglePlayerAdapter = new VTGooglePlayerExploreAdapter(); + viewBinding.viewPagerExploreEpisode.setAdapter(vtGooglePlayerAdapter); + vtGooglePlayerAdapter.setPlayerDetailCollection(this::collection); + vtGooglePlayerAdapter.submitList(data.data.getList()); + viewBinding.layoutEmpty.setVisibility(View.GONE); + + } + } else { + if (!data.data.getList().isEmpty()) { + vtGooglePlayerAdapter.addAll(data.data.getList()); + } else { + ToastUtils.revealToast(TranslatesUtils.translates() != null ? TranslatesUtils.translates().getNo_more_data() : "no more data.", 0); + } + } + } else { + viewBinding.layoutEmpty.setVisibility(View.VISIBLE); + ToastUtils.revealToast(TranslatesUtils.translates() != null ? TranslatesUtils.translates().getNetwork_error() : getString(R.string.vt_network_error_please_check_the_network), 0); + } + viewBinding.avi.smoothToHide(); +// viewBinding.refreshHome.finishRefresh(); + }); + + mViewModel.getCollectionLiveData().observe(getViewLifecycleOwner(), data -> { + if (data != null && data.isSuccessful()) { + AppCompatImageView imageView = getHomePlayerView().findViewById(R.id.iv_collection_controller); + AppCompatTextView textView = getHomePlayerView().findViewById(R.id.tv_collection_num_controller); + imageView.setImageResource(R.mipmap.iv_vt_collect_h); + bean.setCollect_total(bean.getCollect_total() + 1); + vtGooglePlayerAdapter.getItems().get(currentPosition).setCollect_total(bean.getCollect_total()); + vtGooglePlayerAdapter.getItems().get(currentPosition).setIs_collect(true); + textView.setText(TimeUtils.formatNumber(bean.getCollect_total())); + ToastUtils.revealToast(TranslatesUtils.translates() != null ? TranslatesUtils.translates().getSuccess() : "Success", 0); + } + }); + + mViewModel.getCollectioncancelLiveData().observe(getViewLifecycleOwner(), data -> { + if (data != null && data.isSuccessful()) { + AppCompatImageView imageView = getHomePlayerView().findViewById(R.id.iv_collection_controller); + AppCompatTextView textView = getHomePlayerView().findViewById(R.id.tv_collection_num_controller); + imageView.setImageResource(R.mipmap.iv_vt_collect_n); + bean.setCollect_total(bean.getCollect_total() - 1); + vtGooglePlayerAdapter.getItems().get(currentPosition).setCollect_total(bean.getCollect_total()); + vtGooglePlayerAdapter.getItems().get(currentPosition).setIs_collect(false); + textView.setText(TimeUtils.formatNumber(bean.getCollect_total())); + ToastUtils.revealToast(TranslatesUtils.translates() != null ? TranslatesUtils.translates().getSuccess() : "Success", 0); + } + }); + + + } + + + @Override + public void collection(VTVideoExploreBean videoExploreBean) { + SingleClickUtils.singleClick(() -> { + bean = videoExploreBean; + if (bean.isIs_collect()) { + mViewModel.cancelcollection(bean.getVideo_info().getShort_play_id()); + } else { + mViewModel.collection(bean.getVideo_info().getShort_play_id(), bean.getVideo_info().getShort_play_video_id()); + } + }); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEvent(String event) { + if (VTAppConstants.Constants_Google_PLAYER_STATUS_FINISH.equals(event)) { + if (viewBinding.viewPagerExploreEpisode.getCurrentItem() == viewBinding.viewPagerExploreEpisode.getAdapter().getItemCount() - 1) { + viewBinding.viewPagerExploreEpisode.setCurrentItem(0); + } else { + vtGooglePlayerAdapter.setCurrentEpisodePlayingPosition(vtGooglePlayerAdapter.getCurrentEpisodePlayingPosition() + 1); + viewBinding.viewPagerExploreEpisode.setCurrentItem(vtGooglePlayerAdapter.getCurrentEpisodePlayingPosition()); + } + } + if (VTAppConstants.Constants_PlayerView_DetialsEvent.equals(event)) { + int item = viewBinding.viewPagerExploreEpisode.getCurrentItem(); + IntentUtils.startPlayerDetails(getActivity(), vtGooglePlayerAdapter.getItem(item).getShort_play_id(), 0); + } + if (VTAppConstants.Constants_PlayerView_SearchEvent.equals(event)) { + IntentUtils.startSearch(getActivity()); + } + + + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEvent(VTBaseEventBus event) { + if (VTAppConstants.Constants_Episodes_Series_DataExample.equals(event.getCode())) { + if( event.getData().getShort_play_id() == vtGooglePlayerAdapter.getItems().get(currentPosition).getShort_play_id()){ + AppCompatImageView imageView = getHomePlayerView().findViewById(R.id.iv_collection_controller); + AppCompatTextView textView = getHomePlayerView().findViewById(R.id.tv_collection_num_controller); + imageView.setImageResource(event.getData().isIs_collect() ? R.mipmap.iv_vt_collect_h : R.mipmap.iv_vt_collect_n); + vtGooglePlayerAdapter.getItems().get(currentPosition).setCollect_total(event.getData().getCollect_total()); + vtGooglePlayerAdapter.getItems().get(currentPosition).setIs_collect(event.getData().isIs_collect()); + textView.setText(TimeUtils.formatNumber(event.getData().getCollect_total())); + } + } + } + +// @Subscribe(threadMode = ThreadMode.MAIN) +// public void onEventFa(BaseEventBus event) { +// if (HibitAppConstants.Constants_Episodes_Series_DataFavorites.equals(event.getCode())) { +// if (event.getData().getName().equals(hibitHomePlayerAdapter.getItems().get(currentPosition).getName())) { +// AppCompatImageView imageView = getHomePlayerView().findViewById(R.id.iv_collection_controller); +// AppCompatTextView textView = getHomePlayerView().findViewById(R.id.tv_collection_num_controller); +// imageView.setImageResource(R.drawable.iv_hibit_like_n); +// int collectTotal = hibitHomePlayerAdapter.getItems().get(currentPosition).getCollect_total() - 1; +// hibitHomePlayerAdapter.getItems().get(currentPosition).setIs_collect(false); +// textView.setText(String.valueOf(collectTotal)); +// } +// } +// } + + private VTHomeGoogleExoPlayerView getHomePlayerView() { + RecyclerView recyclerView = (RecyclerView) viewBinding.viewPagerExploreEpisode.getChildAt(0); + return (VTHomeGoogleExoPlayerView) recyclerView.getLayoutManager().findViewByPosition(currentPosition); + } + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + if (!hidden) { + if (getHomePlayerView() != null) getHomePlayerView().start(); + VTApplication.isCurrentPage = true; + } else { + VTApplication.isCurrentPage = false; + if (getHomePlayerView() != null) getHomePlayerView().suspend(); + } + } + + @Override + public void onResume() { + super.onResume(); + VTApplication.isCurrentPage = true; + } + + @Override + public void onPause() { + super.onPause(); + VTApplication.isCurrentPage = false; + if (getHomePlayerView() != null) getHomePlayerView().suspend(); + + } + + @Override + public void onDestroy() { + if (getHomePlayerView() != null) getHomePlayerView().release(); + super.onDestroy(); + EventBus.getDefault().unregister(this); } } \ No newline at end of file diff --git a/app/src/main/java/com/viontv/app/ui/activity/home/MainViewModel.java b/app/src/main/java/com/viontv/app/ui/activity/home/MainViewModel.java index 74e9774..84a81d4 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/home/MainViewModel.java +++ b/app/src/main/java/com/viontv/app/ui/activity/home/MainViewModel.java @@ -1,7 +1,93 @@ package com.viontv.app.ui.activity.home; +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; +import com.viontv.app.api.VTApi; +import com.viontv.app.api.VTBaseObserver; +import com.viontv.app.api.VTResult; +import com.viontv.app.model.VTVideoDetailsBean; +import com.viontv.app.model.VTVideoExploreListBean; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + public class MainViewModel extends ViewModel { // TODO: Implement the ViewModel + + + private final MutableLiveData> exploreVideoList = new MutableLiveData<>(); + private final MutableLiveData collectioncancelLiveData = new MutableLiveData<>(); + private final MutableLiveData collectionLiveData = new MutableLiveData<>(); + + public MutableLiveData> getExploreVideoLiveData() { + return exploreVideoList; + } + + public MutableLiveData getCollectionLiveData() { + return collectionLiveData; + } + + public MutableLiveData getCollectioncancelLiveData() { + return collectioncancelLiveData; + } + + + public void getExploreVideoList(int currentpage, int pagesize) { + VTApi.getInstance().getExploreList(currentpage, pagesize) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver>() { + @Override + public void onSuccess(VTResult feedbackResp) { + exploreVideoList.setValue(feedbackResp); + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + exploreVideoList.setValue(null); + } + }); + } + + public void collection(int shortplayId, int videoId) { + VTApi.getInstance().collect(shortplayId, videoId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver() { + @Override + public void onSuccess(VTResult feedbackResp) { + collectionLiveData.setValue(feedbackResp); + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + collectionLiveData.setValue(null); + } + }); + } + + public void cancelcollection(int shortplayId) { + VTApi.getInstance().cancelCollect(shortplayId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver() { + @Override + public void onSuccess(VTResult feedbackResp) { + collectioncancelLiveData.setValue(feedbackResp); + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + collectioncancelLiveData.setValue(null); + } + }); + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/viontv/app/ui/activity/home/VTHomeFragment.java b/app/src/main/java/com/viontv/app/ui/activity/home/VTHomeFragment.java index 586f206..aa43aaf 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/home/VTHomeFragment.java +++ b/app/src/main/java/com/viontv/app/ui/activity/home/VTHomeFragment.java @@ -10,6 +10,7 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.viewpager2.adapter.FragmentStateAdapter; +import android.os.CountDownTimer; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -22,6 +23,8 @@ import com.viontv.app.api.VTResult; import com.viontv.app.databinding.FragmentMainVtBinding; import com.viontv.app.model.CateGoryItemBean; import com.viontv.app.model.HomeTopBean; +import com.viontv.app.model.ItemBean; +import com.viontv.app.utils.IntentUtils; import java.util.ArrayList; import java.util.List; @@ -62,10 +65,14 @@ public class VTHomeFragment extends Fragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); getTopTitles(); - + myCountDownTimer = new MyCountDownTimer(365 * 24 * 60 * 60, 5000); } + int item = 0; + private List itemSearchList; + private void getTopTitles() { + binding.layoutSearch.setOnClickListener(v -> IntentUtils.startSearch(getActivity())); VTApi.getInstance().homeTop() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -73,9 +80,19 @@ public class VTHomeFragment extends Fragment { @Override public void onSuccess(VTResult feedbackResp) { - List itemBeans = feedbackResp.data.getCategory(); - tabShow(itemBeans); - binding.tvHomeSearch.setHint(feedbackResp.data.getHotData().get(0).getName()); + if (feedbackResp.data != null) { + List itemBeans = feedbackResp.data.getCategory(); + tabShow(itemBeans); + + itemSearchList = feedbackResp.data.getHotData(); + item = 0; + binding.tvHomeSearch.setHint(itemSearchList.get(item).getName()); + if (itemSearchList.size() > 1) { + myCountDownTimer.start(); + } + + } + } @Override @@ -92,7 +109,7 @@ public class VTHomeFragment extends Fragment { listFragment = new ArrayList<>(); listFragment.add(VTHotFragment.newInstance()); listFragment.add(VTTopFragment.newInstance()); - for (CateGoryItemBean itemBean:itemBeans){ + for (CateGoryItemBean itemBean : itemBeans) { titles.add(itemBean.getCategory_name()); listFragment.add(VTTabItemFragment.newInstance(itemBean.getCategory_id())); } @@ -128,4 +145,42 @@ public class VTHomeFragment extends Fragment { } + + MyCountDownTimer myCountDownTimer; + + + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + if (itemSearchList.size() - 1 > item) { + item++; + } else { + item = 0; + } + binding.tvHomeSearch.setHint(itemSearchList.get(item).getName()); + } + + @Override + public void onFinish() { + + + } + } + + + @Override + public void onDestroy() { + super.onDestroy(); + if (myCountDownTimer != null) { + myCountDownTimer.cancel(); + myCountDownTimer = null; + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/viontv/app/ui/activity/home/VTHotFragment.java b/app/src/main/java/com/viontv/app/ui/activity/home/VTHotFragment.java index a36aade..2a479e7 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/home/VTHotFragment.java +++ b/app/src/main/java/com/viontv/app/ui/activity/home/VTHotFragment.java @@ -1,6 +1,5 @@ package com.viontv.app.ui.activity.home; -import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -21,17 +20,16 @@ import com.viontv.app.api.VTResult; import com.viontv.app.databinding.FragmentHotVtBinding; import com.viontv.app.databinding.ItemHomeExploreVtBinding; import com.viontv.app.databinding.ItemHotSquareVtBinding; -import com.viontv.app.model.HomeBottomListBean; +import com.viontv.app.model.VTVideoListBean; import com.viontv.app.model.HomeNineSquareBean; import com.viontv.app.model.HomeTopBannerBean; import com.viontv.app.model.ItemBean; -import com.viontv.app.ui.adapter.BannerHomeAdapter; -import com.viontv.app.ui.adapter.CommonAdapter; -import com.viontv.app.ui.adapter.HotBottomListAdapter; -import com.viontv.app.ui.adapter.NineSquareAdapter; +import com.viontv.app.ui.adapter.VTBannerHomeAdapter; +import com.viontv.app.ui.adapter.VTHotBottomListAdapter; +import com.viontv.app.ui.adapter.VTNineSquareAdapter; import com.viontv.app.utils.IntentUtils; -import com.youth.banner.listener.OnBannerListener; +import java.util.ArrayList; import java.util.List; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -45,7 +43,7 @@ public class VTHotFragment extends Fragment { private int currentPage = 1; - HotBottomListAdapter adapter; + VTHotBottomListAdapter adapter; LinearLayoutManager layoutManager; public static VTHotFragment newInstance() { @@ -70,24 +68,39 @@ public class VTHotFragment extends Fragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + initRefreshLayout(); initShow(); } + private void initRefreshLayout() { + binding.smartrefreshlayoutHot.setEnableRefresh(true); + binding.smartrefreshlayoutHot.setEnableLoadMore(true); + binding.smartrefreshlayoutHot.setOnRefreshListener(refreshlayout -> { + currentPage = 1; + getBottomData(); + }); + binding.smartrefreshlayoutHot.setOnLoadMoreListener(refreshLayout -> { + currentPage++; + getBottomData(); + + }); + } + public void initShow() { binding.banner.addBannerLifecycleObserver(this); initBannerAndSquare(); initHomeBottom(); - binding.recyclerviewGenres.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - } - - @Override - public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - } - }); +// binding.recyclerviewGenres.addOnScrollListener(new RecyclerView.OnScrollListener() { +// @Override +// public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { +// super.onScrollStateChanged(recyclerView, newState); +// } +// +// @Override +// public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { +// super.onScrolled(recyclerView, dx, dy); +// } +// }); } public void initBannerAndSquare() { @@ -116,40 +129,40 @@ public class VTHotFragment extends Fragment { public void initHomeBottom() { layoutManager = new LinearLayoutManager(getActivity()); binding.recyclerviewGenres.setLayoutManager(layoutManager); - adapter = new HotBottomListAdapter(getActivity(), ItemHomeExploreVtBinding.class); + adapter = new VTHotBottomListAdapter(getActivity(), ItemHomeExploreVtBinding.class); adapter.setItemClickListener((data, holder) -> { IntentUtils.startPlayerDetails(getActivity(), data.getShort_play_id(), 0); }); binding.recyclerviewGenres.setAdapter(adapter); - binding.recyclerviewGenres.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - if (newState == RecyclerView.SCROLL_STATE_IDLE) { - int position = layoutManager.findLastCompletelyVisibleItemPosition(); - int position2 = layoutManager.findLastVisibleItemPosition(); - Log.i("Home+++++++++++++++", "position==" + position); - Log.i("Home+++++++++++++++", "position2==" + position2); - if (position == adapter.getItemCount() - 1) { - Log.i("Home+++++++++++++++", "page++++"); - currentPage++; - getBottomData(); - } -// if (adapter.getItemCount() < position + LOAD_MORE_DIFF -// && adapter.getItemCount() > 0) { +// binding.recyclerviewGenres.addOnScrollListener(new RecyclerView.OnScrollListener() { +// @Override +// public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { +// super.onScrollStateChanged(recyclerView, newState); +// if (newState == RecyclerView.SCROLL_STATE_IDLE) { +// int position = layoutManager.findLastCompletelyVisibleItemPosition(); +// int position2 = layoutManager.findLastVisibleItemPosition(); +// Log.i("Home+++++++++++++++", "position==" + position); +// Log.i("Home+++++++++++++++", "position2==" + position2); +// if (position == adapter.getItemCount() - 1) { // Log.i("Home+++++++++++++++", "page++++"); // currentPage++; // getBottomData(); // } - } - } - - @Override - public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - } - }); +//// if (adapter.getItemCount() < position + LOAD_MORE_DIFF +//// && adapter.getItemCount() > 0) { +//// Log.i("Home+++++++++++++++", "page++++"); +//// currentPage++; +//// getBottomData(); +//// } +// } +// } +// +// @Override +// public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { +// super.onScrolled(recyclerView, dx, dy); +// } +// }); currentPage = 1; getBottomData(); } @@ -158,10 +171,12 @@ public class VTHotFragment extends Fragment { VTApi.getInstance().newShortPlay(currentPage, 10) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new VTBaseObserver>() { + .subscribe(new VTBaseObserver>() { @Override - public void onSuccess(VTResult feedbackResp) { + public void onSuccess(VTResult feedbackResp) { + binding.smartrefreshlayoutHot.finishRefresh(); + binding.smartrefreshlayoutHot.finishLoadMore(); if (currentPage == 1) { adapter.addDataList(feedbackResp.data.getShort_play_list(), true); } else { @@ -173,7 +188,8 @@ public class VTHotFragment extends Fragment { @Override public void onError(int code, String msg) { - + binding.smartrefreshlayoutHot.finishRefresh(); + binding.smartrefreshlayoutHot.finishLoadMore(); } }); } @@ -181,7 +197,7 @@ public class VTHotFragment extends Fragment { public void initBanner(List itemBeans) { - binding.banner.setAdapter(new BannerHomeAdapter(itemBeans)). + binding.banner.setAdapter(new VTBannerHomeAdapter(itemBeans)). setCurrentItem(0, true) .addBannerLifecycleObserver(this) .setOnBannerListener((data, position) -> IntentUtils.startPlayerDetails(getActivity(), itemBeans.get(position).getShort_play_id(), 0)) @@ -199,7 +215,7 @@ public class VTHotFragment extends Fragment { binding.trendingTv.setText(homeNineSquareBean.getTitle()); binding.recyclerviewTrending.setLayoutManager(new GridLayoutManager(getActivity(), 3)); - NineSquareAdapter adapter = new NineSquareAdapter(getActivity(), ItemHotSquareVtBinding.class); + VTNineSquareAdapter adapter = new VTNineSquareAdapter(getActivity(), ItemHotSquareVtBinding.class); adapter.setItemClickListener((data, holder) -> { IntentUtils.startPlayerDetails(getActivity(), data.getShort_play_id(), 0); }); diff --git a/app/src/main/java/com/viontv/app/ui/activity/home/VTTabItemFragment.java b/app/src/main/java/com/viontv/app/ui/activity/home/VTTabItemFragment.java index 1f27d58..7fd0f84 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/home/VTTabItemFragment.java +++ b/app/src/main/java/com/viontv/app/ui/activity/home/VTTabItemFragment.java @@ -18,20 +18,12 @@ import com.viontv.app.api.VTApi; import com.viontv.app.api.VTBaseObserver; import com.viontv.app.api.VTResult; import com.viontv.app.databinding.FragmentCategoryItemBinding; -import com.viontv.app.databinding.FragmentHotVtBinding; -import com.viontv.app.databinding.FragmentTopVtBinding; -import com.viontv.app.databinding.ItemHomeExploreVtBinding; import com.viontv.app.databinding.ItemHomeTablistVtBinding; -import com.viontv.app.databinding.ItemHotSquareVtBinding; -import com.viontv.app.model.HomeBottomListBean; -import com.viontv.app.model.HomeNineSquareBean; -import com.viontv.app.model.HomeTopBannerBean; +import com.viontv.app.model.VTVideoListBean; import com.viontv.app.model.ItemBean; import com.viontv.app.model.TabItemBean; -import com.viontv.app.ui.adapter.BannerHomeAdapter; -import com.viontv.app.ui.adapter.HotBottomListAdapter; -import com.viontv.app.ui.adapter.NineSquareAdapter; -import com.viontv.app.ui.adapter.TabItemListAdapter; +import com.viontv.app.ui.adapter.VTBannerHomeAdapter; +import com.viontv.app.ui.adapter.VTTabItemListAdapter; import com.viontv.app.utils.IntentUtils; import java.util.List; @@ -47,7 +39,7 @@ public class VTTabItemFragment extends Fragment { private int currentPage = 1; - TabItemListAdapter adapter; + VTTabItemListAdapter adapter; LinearLayoutManager layoutManager; private int categoryId; @@ -101,7 +93,7 @@ public class VTTabItemFragment extends Fragment { } public void initBannerData() { - VTApi.getInstance().getTabItemBanner(String.valueOf(categoryId)) + VTApi.getInstance().getTabItemBanner(categoryId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new VTBaseObserver>() { @@ -126,7 +118,7 @@ public class VTTabItemFragment extends Fragment { public void initGridList() { layoutManager = new GridLayoutManager(getActivity(), 2); binding.recyclerviewGrid.setLayoutManager(layoutManager); - adapter = new TabItemListAdapter(getActivity(), ItemHomeTablistVtBinding.class); + adapter = new VTTabItemListAdapter(getActivity(), ItemHomeTablistVtBinding.class); adapter.setItemClickListener((data, holder) -> { IntentUtils.startPlayerDetails(getActivity(), data.getShort_play_id(), 0); }); @@ -165,13 +157,13 @@ public class VTTabItemFragment extends Fragment { } public void getBottomData() { - VTApi.getInstance().getVideoList(String.valueOf(categoryId), currentPage, 10, "") + VTApi.getInstance().getVideoList(categoryId, currentPage, 10, "") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new VTBaseObserver>() { + .subscribe(new VTBaseObserver>() { @Override - public void onSuccess(VTResult feedbackResp) { + public void onSuccess(VTResult feedbackResp) { if (currentPage == 1) { adapter.addDataList(feedbackResp.data.getList(), true); } else { @@ -191,7 +183,7 @@ public class VTTabItemFragment extends Fragment { public void initBanner(List itemBeans) { - binding.banner.setAdapter(new BannerHomeAdapter(itemBeans)). + binding.banner.setAdapter(new VTBannerHomeAdapter(itemBeans)). setCurrentItem(0, true) .addBannerLifecycleObserver(this) .setOnBannerListener((data, position) -> IntentUtils.startPlayerDetails(getActivity(), itemBeans.get(position).getShort_play_id(), 0)) diff --git a/app/src/main/java/com/viontv/app/ui/activity/home/VTTopFragment.java b/app/src/main/java/com/viontv/app/ui/activity/home/VTTopFragment.java index d3230a4..f13f664 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/home/VTTopFragment.java +++ b/app/src/main/java/com/viontv/app/ui/activity/home/VTTopFragment.java @@ -18,9 +18,9 @@ import com.viontv.app.api.VTResult; import com.viontv.app.databinding.FragmentTopVtBinding; import com.viontv.app.databinding.ItemHomeExploreVtBinding; -import com.viontv.app.model.HomeBottomListBean; +import com.viontv.app.model.VTVideoListBean; -import com.viontv.app.ui.adapter.Top10ListAdapter; +import com.viontv.app.ui.adapter.VTTop10ListAdapter; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -32,7 +32,7 @@ public class VTTopFragment extends Fragment { private FragmentTopVtBinding binding; - Top10ListAdapter adapter; + VTTop10ListAdapter adapter; LinearLayoutManager layoutManager; public static VTTopFragment newInstance() { @@ -65,7 +65,7 @@ public class VTTopFragment extends Fragment { binding.rvFragmentHometop.setLayoutManager(layoutManager); layoutManager = new LinearLayoutManager(getActivity()); binding.rvFragmentHometop.setLayoutManager(layoutManager); - adapter = new Top10ListAdapter(getActivity(), ItemHomeExploreVtBinding.class); + adapter = new VTTop10ListAdapter(getActivity(), ItemHomeExploreVtBinding.class); binding.rvFragmentHometop.setAdapter(adapter); getTop10Data(); } @@ -74,10 +74,10 @@ public class VTTopFragment extends Fragment { VTApi.getInstance().homeTop10(VTApiService.rankTop10Type) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new VTBaseObserver>() { + .subscribe(new VTBaseObserver>() { @Override - public void onSuccess(VTResult feedbackResp) { + public void onSuccess(VTResult feedbackResp) { adapter.addDataList(feedbackResp.data.getList(), true); } diff --git a/app/src/main/java/com/viontv/app/ui/activity/me/VTMeFragment.java b/app/src/main/java/com/viontv/app/ui/activity/me/VTMeFragment.java index 345fcb9..4aff09d 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/me/VTMeFragment.java +++ b/app/src/main/java/com/viontv/app/ui/activity/me/VTMeFragment.java @@ -1,5 +1,6 @@ package com.viontv.app.ui.activity.me; +import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -9,15 +10,42 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import com.bumptech.glide.Glide; +import com.viontv.app.R; +import com.viontv.app.api.VTApiService; import com.viontv.app.databinding.FragmentMainVtBinding; +import com.viontv.app.databinding.FragmentMeBinding; +import com.viontv.app.databinding.ItemHomeExploreVtBinding; +import com.viontv.app.databinding.ItemVideoHistoryBinding; +import com.viontv.app.model.ItemBean; +import com.viontv.app.ui.activity.WebViewActivity; import com.viontv.app.ui.activity.home.MainViewModel; +import com.viontv.app.ui.adapter.VTCommonAdapter; +import com.viontv.app.ui.adapter.VTGooglePlayerExploreAdapter; +import com.viontv.app.ui.adapter.VTTop10ListAdapter; +import com.viontv.app.ui.adapter.VTUserVideoHistoryAdapter; +import com.viontv.app.utils.IntentUtils; +import com.viontv.app.utils.ToastUtils; +import com.viontv.app.utils.TranslatesUtils; +import com.viontv.app.utils.VTAppConstants; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.Objects; public class VTMeFragment extends Fragment { - private MainViewModel mViewModel; - private FragmentMainVtBinding binding; + private VTUserViewModel mViewModel; + private FragmentMeBinding binding; + + private int currentPage = 1; + + private VTUserVideoHistoryAdapter adapter; public static VTMeFragment newInstance() { return new VTMeFragment(); @@ -26,7 +54,7 @@ public class VTMeFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mViewModel = new ViewModelProvider(this).get(MainViewModel.class); + mViewModel = new ViewModelProvider(this).get(VTUserViewModel.class); // TODO: Use the ViewModel } @@ -34,8 +62,67 @@ public class VTMeFragment extends Fragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - binding = FragmentMainVtBinding.inflate(inflater); + binding = FragmentMeBinding.inflate(inflater); + EventBus.getDefault().register(this); return binding.getRoot(); } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mViewModel.getUserInfo(); + mViewModel.getHistory(currentPage, 10); + + LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false); + binding.recyclerviewHistory.setLayoutManager(layoutManager); + + adapter = new VTUserVideoHistoryAdapter(getActivity(), ItemVideoHistoryBinding.class); + adapter.setItemClickListener((data, holder) -> { + IntentUtils.startPlayerDetails(getActivity(), data.getShort_play_id(), 0); + }); + binding.recyclerviewHistory.setAdapter(adapter); + binding.tvPrivatePolicy.setOnClickListener(v -> startWebActivity(VTApiService.ZyreoTV_Private, getResources().getString(R.string.tabme_private_policy))); + binding.tvUserAgreement.setOnClickListener(v -> startWebActivity(VTApiService.ZyreoTV_USERAgreement, getResources().getString(R.string.tabme_user_agreement))); + logic(); + } + + private void startWebActivity(String url, String title) { + startActivity(new Intent(getActivity(), WebViewActivity.class).putExtra(VTAppConstants.Constants_Page_WebUrl, url).putExtra(VTAppConstants.Constants_Page_WebTitle, title)); + } + + public void logic() { + mViewModel.getGetUserInfoLiveData().observe(getViewLifecycleOwner(), data -> { + if (data != null) { + binding.tvMeName.setText(data.data.getFamily_name()); + binding.tvMeId.setText("ID:" + data.data.getId()); + Glide.with(requireActivity()).load(data.data.getAvator()).error(R.mipmap.ic_default_head).into(binding.ivHead); + } + }); + + mViewModel.getUserVideoHistoryLiveData().observe(getViewLifecycleOwner(), vtVideoListBeanVTResult -> { + if (vtVideoListBeanVTResult != null && !vtVideoListBeanVTResult.data.getList().isEmpty()) { + if (currentPage == 1) { + adapter.addDataList(vtVideoListBeanVTResult.data.getList(), true); + } else { + adapter.addDataList(vtVideoListBeanVTResult.data.getList(), false); + } + } + }); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEvent(String event) { + if (VTAppConstants.Constants_PlayerView_CreateHistoryEvent.equals(event)) { + currentPage = 1; + mViewModel.getHistory(1, 10); + } + + + } + + @Override + public void onDestroy() { + super.onDestroy(); + EventBus.getDefault().unregister(this); + } } \ No newline at end of file diff --git a/app/src/main/java/com/viontv/app/ui/activity/me/VTUserViewModel.java b/app/src/main/java/com/viontv/app/ui/activity/me/VTUserViewModel.java new file mode 100644 index 0000000..853a051 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/activity/me/VTUserViewModel.java @@ -0,0 +1,75 @@ +package com.viontv.app.ui.activity.me; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.viontv.app.api.VTApi; +import com.viontv.app.api.VTBaseObserver; +import com.viontv.app.api.VTResult; +import com.viontv.app.model.VTUserInfoBean; +import com.viontv.app.model.VTVideoDetailsBean; +import com.viontv.app.model.VTVideoListBean; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 关于用户的接口 + */ +public class VTUserViewModel extends ViewModel { + + + private final MutableLiveData> userInfoLiveData = new MutableLiveData<>(); + private final MutableLiveData> userVideoHistoryLiveData = new MutableLiveData<>(); + + + public MutableLiveData> getGetUserInfoLiveData() { + return userInfoLiveData; + } + + public MutableLiveData> getUserVideoHistoryLiveData() { + return userVideoHistoryLiveData; + } + + public void getUserInfo() { + VTApi.getInstance().getUserInfo() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver>() { + @Override + public void onSuccess(VTResult feedbackResp) { + + userInfoLiveData.setValue(feedbackResp); + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + userInfoLiveData.setValue(null); + } + }); + } + + + public void getHistory(int currentPage, int pageSize) { + VTApi.getInstance().getVideoHistoryList(currentPage, pageSize) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver>() { + @Override + public void onSuccess(VTResult feedbackResp) { + userVideoHistoryLiveData.setValue(feedbackResp); + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + userVideoHistoryLiveData.setValue(null); + } + }); + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/viontv/app/ui/activity/play/VTEpisodesSelectDialogFragment.java b/app/src/main/java/com/viontv/app/ui/activity/play/VTEpisodesSelectDialogFragment.java index 9dbd360..54d413e 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/play/VTEpisodesSelectDialogFragment.java +++ b/app/src/main/java/com/viontv/app/ui/activity/play/VTEpisodesSelectDialogFragment.java @@ -55,17 +55,17 @@ public class VTEpisodesSelectDialogFragment extends DialogFragment { hibitEpisodesSeriesAdapter.setOnItemClickListener((adapter, view1, position) -> { VTVideoDetailsBean.Episode item = (VTVideoDetailsBean.Episode) adapter.getItem(position); - if (position > 0) { - VTVideoDetailsBean.Episode item1 = (VTVideoDetailsBean.Episode) adapter.getItem(position - 1); - if (item1.isIs_lock()) { - String errorMessage = TranslatesUtils.translates() != null ? - TranslatesUtils.translates().getJump_unlock_error() : - "The prequel to this series is not unlocked. Please unlock the prequel before unlocking this series"; - ToastUtils.revealToast(errorMessage, 0); - dismiss(); - return; - } - } +// if (position > 0) { +// VTVideoDetailsBean.Episode item1 = (VTVideoDetailsBean.Episode) adapter.getItem(position - 1); +// if (item1.isIs_lock()) { +// String errorMessage = TranslatesUtils.translates() != null ? +// TranslatesUtils.translates().getJump_unlock_error() : +// "The prequel to this series is not unlocked. Please unlock the prequel before unlocking this series"; +// ToastUtils.revealToast(errorMessage, 0); +// dismiss(); +// return; +// } +// } pageEpisodesSeriesCallBack.chooseEpisodesSeries(item); dismiss(); }); diff --git a/app/src/main/java/com/viontv/app/ui/activity/play/VTVideoPlayerActivity.java b/app/src/main/java/com/viontv/app/ui/activity/play/VTVideoPlayerActivity.java index d5ec0de..c2dd76c 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/play/VTVideoPlayerActivity.java +++ b/app/src/main/java/com/viontv/app/ui/activity/play/VTVideoPlayerActivity.java @@ -15,6 +15,7 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager2.widget.ViewPager2; import com.viontv.app.R; +import com.viontv.app.VTApplication; import com.viontv.app.api.VTResult; import com.viontv.app.databinding.ActivityVideoDetailsVtBinding; import com.viontv.app.model.VTVideoDetailsBean; @@ -50,6 +51,7 @@ public class VTVideoPlayerActivity extends VTCommonActivity 1) { - viewBinding.viewPagerHibitEpisode.setCurrentItem(it.data.video_info.getEpisode() - 1, false); + viewBinding.viewPagerVtEpisode.setCurrentItem(it.data.video_info.getEpisode() - 1, false); } } } else { @@ -260,63 +263,64 @@ public class VTVideoPlayerActivity extends VTCommonActivity { -// if (it != null) { -// AppCompatImageView imageView = pageGoogleExoPlayerView() != null ? pageGoogleExoPlayerView().findViewById(R.id.iv_collection_controller) : null; -// AppCompatTextView textview = pageGoogleExoPlayerView() != null ? pageGoogleExoPlayerView().findViewById(R.id.tv_collection_num_controller) : null; -// if (shortVideoInfo != null) { -// shortVideoInfo.setIs_collect(true); -// shortVideoInfo.setCollect_total(shortVideoInfo.getCollect_total()+1); -// } -// if (imageView != null) { -// imageView.setImageResource(R.mipmap.iv_vt_collect_h); -// } -// if (textview != null && shortVideoInfo != null) { -// textview.setText(TimeUtils.formatNumber(shortVideoInfo.getCollect_total())); -// } -// if (vtGooglePlayerAdapter != null) { -// vtGooglePlayerAdapter.setShortVideoInfo(shortVideoInfo); -// } -// EventBus.getDefault().post(new VTBaseEventBus<>(VTAppConstants.Constants_Episodes_Series_DataExample, shortVideoInfo)); -// if (TranslatesUtils.translates() != null) { -// ToastUtils.revealToast(TranslatesUtils.translates().getSuccess(),0); -// } -// } else { -// if (TranslatesUtils.translates() != null) { -// ToastUtils.revealToast(TranslatesUtils.translates().getNetwork_error(),0); -// } else { -// ToastUtils.revealToast(getString(R.string.vt_network_error_please_check_the_network),0); -// } -// } -// }); -// -// vtViewModel.getCancelCollectData().observe(this, it -> { -// if (it != null) { -// AppCompatImageView imageView = pageGoogleExoPlayerView() != null ? pageGoogleExoPlayerView().findViewById(R.id.iv_collection_controller) : null; -// AppCompatTextView textview = pageGoogleExoPlayerView() != null ? pageGoogleExoPlayerView().findViewById(R.id.tv_collection_num_controller) : null; -// if (shortVideoInfo != null) { -// shortVideoInfo.setIs_collect(false); -// shortVideoInfo.setCollect_total(shortVideoInfo.getCollect_total()-1); -// } -// if (imageView != null) { -// imageView.setImageResource(R.mipmap.iv_vt_collect_n); -// } -// if (textview != null && shortVideoInfo != null) { -// textview.setText(TimeUtils.formatNumber(shortVideoInfo.getCollect_total())); -// } -// } else { -// if (TranslatesUtils.translates() != null) { -// ToastUtils.revealToast(TranslatesUtils.translates().getNetwork_error(),0); -// } else { -// ToastUtils.revealToast(getString(R.string.vt_network_error_please_check_the_network),0); -// } -// } -// }); + vtViewModel.getCollectionLiveData().observe(this, it -> { + if (it != null) { + AppCompatImageView imageView = pageGoogleExoPlayerView() != null ? pageGoogleExoPlayerView().findViewById(R.id.iv_collection_controller) : null; + AppCompatTextView textview = pageGoogleExoPlayerView() != null ? pageGoogleExoPlayerView().findViewById(R.id.tv_collection_num_controller) : null; + if (shortVideoInfo != null) { + shortVideoInfo.setIs_collect(true); + shortVideoInfo.setCollect_total(shortVideoInfo.getCollect_total() + 1); + } + if (imageView != null) { + imageView.setImageResource(R.mipmap.iv_vt_collect_h); + } + if (textview != null && shortVideoInfo != null) { + textview.setText(TimeUtils.formatNumber(shortVideoInfo.getCollect_total())); + } + if (vtGooglePlayerAdapter != null) { + vtGooglePlayerAdapter.setShortVideoInfo(shortVideoInfo); + } + EventBus.getDefault().post(new VTBaseEventBus<>(VTAppConstants.Constants_Episodes_Series_DataExample, shortVideoInfo)); + if (TranslatesUtils.translates() != null) { + ToastUtils.revealToast(TranslatesUtils.translates().getSuccess(), 0); + } + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.revealToast(TranslatesUtils.translates().getNetwork_error(), 0); + } else { + ToastUtils.revealToast(getString(R.string.vt_network_error_please_check_the_network), 0); + } + } + }); + + vtViewModel.getCollectioncancelLiveData().observe(this, it -> { + if (it != null) { + AppCompatImageView imageView = pageGoogleExoPlayerView() != null ? pageGoogleExoPlayerView().findViewById(R.id.iv_collection_controller) : null; + AppCompatTextView textview = pageGoogleExoPlayerView() != null ? pageGoogleExoPlayerView().findViewById(R.id.tv_collection_num_controller) : null; + if (shortVideoInfo != null) { + shortVideoInfo.setIs_collect(false); + shortVideoInfo.setCollect_total(shortVideoInfo.getCollect_total() - 1); + } + if (imageView != null) { + imageView.setImageResource(R.mipmap.iv_vt_collect_n); + } + if (textview != null && shortVideoInfo != null) { + textview.setText(TimeUtils.formatNumber(shortVideoInfo.getCollect_total())); + } + EventBus.getDefault().post(new VTBaseEventBus<>(VTAppConstants.Constants_Episodes_Series_DataExample, shortVideoInfo)); + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.revealToast(TranslatesUtils.translates().getNetwork_error(), 0); + } else { + ToastUtils.revealToast(getString(R.string.vt_network_error_please_check_the_network), 0); + } + } + }); } // 假设 pageGoogleExoPlayerView 方法在父类或者其他地方有定义 private VTGoogleExoPlayerView pageGoogleExoPlayerView() { - RecyclerView recyclerView = (RecyclerView) viewBinding.viewPagerHibitEpisode.getChildAt(0); + RecyclerView recyclerView = (RecyclerView) viewBinding.viewPagerVtEpisode.getChildAt(0); VTGoogleExoPlayerView googleExoPlayerView = (VTGoogleExoPlayerView) recyclerView.getLayoutManager().findViewByPosition(currentPosition); return googleExoPlayerView; } @@ -328,7 +332,6 @@ public class VTVideoPlayerActivity extends VTCommonActivity=0 ) { + if (vtGooglePlayerAdapter != null && vtGooglePlayerAdapter.getCurrentEpisodePlayingPosition() >= 0) { int nextPosition = vtGooglePlayerAdapter.getCurrentEpisodePlayingPosition() + 1; vtGooglePlayerAdapter.getItems(); if (nextPosition < vtGooglePlayerAdapter.getItems().size()) { @@ -354,7 +357,7 @@ public class VTVideoPlayerActivity extends VTCommonActivity collectioncancelLiveData = new MutableLiveData<>(); + private final MutableLiveData collectionLiveData = new MutableLiveData<>(); + + public MutableLiveData getCollectionLiveData() { + return collectionLiveData; + } + + public MutableLiveData getCollectioncancelLiveData() { + return collectioncancelLiveData; + } + public void getVideoDetails(int short_play_id, int video_id) { VTApi.getInstance().getVideoDetails(short_play_id, video_id) .subscribeOn(Schedulers.io()) @@ -41,5 +52,58 @@ public class VTVideoViewModel extends ViewModel { }); } + public void createHistory(int short_play_id,int video_id){ + VTApi.getInstance().createVideoHistory(short_play_id, video_id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver<>() { + @Override + public void onSuccess(VTResult feedbackResp) { + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + public void collection(int shortplayId, int videoId) { + VTApi.getInstance().collect(shortplayId, videoId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver() { + @Override + public void onSuccess(VTResult feedbackResp) { + collectionLiveData.setValue(feedbackResp); + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + collectionLiveData.setValue(null); + } + }); + } + + public void cancelcollection(int shortplayId) { + VTApi.getInstance().cancelCollect(shortplayId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver() { + @Override + public void onSuccess(VTResult feedbackResp) { + collectioncancelLiveData.setValue(feedbackResp); + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + collectioncancelLiveData.setValue(null); + } + }); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/viontv/app/ui/activity/search/VTSearchActivity.java b/app/src/main/java/com/viontv/app/ui/activity/search/VTSearchActivity.java new file mode 100644 index 0000000..9f84a47 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/activity/search/VTSearchActivity.java @@ -0,0 +1,178 @@ +package com.viontv.app.ui.activity.search; + +import static android.view.View.GONE; +import static android.view.View.VISIBLE; + +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.inputmethod.EditorInfo; + +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +import com.google.gson.reflect.TypeToken; +import com.viontv.app.databinding.ActivitySearchVtBinding; +import com.viontv.app.databinding.ItemSearchDataVtBinding; +import com.viontv.app.databinding.ItemSearchHotVtBinding; +import com.viontv.app.ui.activity.basic.VTCommonActivity; +import com.viontv.app.ui.adapter.VTSearchDataAdapter; +import com.viontv.app.ui.adapter.VTSearchHistoryAdapter; +import com.viontv.app.ui.adapter.VTSearchHotListAdapter; +import com.viontv.app.utils.IntentUtils; +import com.viontv.app.utils.SharePreferenceUtils; +import com.viontv.app.utils.VTAppConstants; +import com.viontv.app.utils.VTGsonUtils; + +import java.util.ArrayList; + +public class VTSearchActivity extends VTCommonActivity { + + ActivitySearchVtBinding binding; + VTSearchViewModel vtSearchViewModel; + + VTSearchHotListAdapter adapter; + + VTSearchHistoryAdapter historyAdapter; + + VTSearchDataAdapter searchDataAdapter; + + @Override + public void init() { + vtSearchViewModel = new ViewModelProvider(this).get(VTSearchViewModel.class); + getWindow().setNavigationBarColor(getResources().getColor(android.R.color.black)); + binding = ActivitySearchVtBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + } + + @Override + public void initView() { + binding.rvVtSearchHot.setLayoutManager(new LinearLayoutManager(this)); + adapter = new VTSearchHotListAdapter(this, ItemSearchHotVtBinding.class); + adapter.setItemClickListener((data, holder) -> { + IntentUtils.startPlayerDetails(this, data.getShort_play_id(), 0); + }); + binding.rvVtSearchHot.setAdapter(adapter); + vtSearchViewModel.getHotList(); + binding.ivBackSearch.setOnClickListener(v -> finish()); + + StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL); + binding.rvVtSearchHistory.setLayoutManager(staggeredGridLayoutManager); + historyAdapter = new VTSearchHistoryAdapter(); + binding.rvVtSearchHistory.setAdapter(historyAdapter); + historyAdapter.setOnItemClickListener((baseQuickAdapter, view, i) -> { + String name = historyAdapter.getItem(i); + binding.editHomeSearch.setText(name); + vtSearchViewModel.getSearchList(historyAdapter.getItem(i)); + }); + getHistoryData(); + binding.ivSearchHistoryDelete.setOnClickListener(v -> { + binding.editHomeSearch.setText(""); + SharePreferenceUtils.saveString(VTAppConstants.SEARCH_HISTORY, VTGsonUtils.beanToJSONString(new ArrayList())); + getHistoryData(); + }); + + binding.rvVtSearchData.setLayoutManager(new LinearLayoutManager(this)); + searchDataAdapter = new VTSearchDataAdapter(this, ItemSearchDataVtBinding.class); + searchDataAdapter.setItemClickListener((data, holder) -> { + vtSearchViewModel.setSearchClick(data.getShort_play_id()); + IntentUtils.startPlayerDetails(VTSearchActivity.this, data.getShort_play_id(), 0); + }); + binding.rvVtSearchData.setAdapter(searchDataAdapter); + binding.editHomeSearch.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (TextUtils.isEmpty(s.toString())) { + getHistoryData(); + searchDataAdapter.addDataList(null, true); + binding.layoutSearchHot.setVisibility(VISIBLE); + binding.layoutSearchHistory.setVisibility(VISIBLE); + binding.layoutSearchData.setVisibility(GONE); + hideKeyBord(binding.editHomeSearch, VTSearchActivity.this); + } + } + }); + binding.editHomeSearch.setOnEditorActionListener((v, actionId, event) -> { + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + vtSearchViewModel.getSearchList(binding.editHomeSearch.getText().toString()); + hideKeyBord(binding.editHomeSearch, this); + saveSearchHistory(binding.editHomeSearch.getText().toString()); + } + return false; + }); + } + + @Override + public void logic() { + + vtSearchViewModel.getSearchHostList().observe(this, homeBottomListBeanVTResult -> { + if (homeBottomListBeanVTResult != null && homeBottomListBeanVTResult.data != null) { + adapter.addDataList(homeBottomListBeanVTResult.data.getList(), true); + binding.rvVtSearchHot.setVisibility(VISIBLE); + binding.rvVtSearchData.setVisibility(GONE); + } + }); + + vtSearchViewModel.searchDataList().observe(this, homeBottomListBeanVTResult -> { + binding.layoutSearchData.setVisibility(VISIBLE); + if (homeBottomListBeanVTResult != null && !homeBottomListBeanVTResult.data.getList().isEmpty()) { + searchDataAdapter.addDataList(homeBottomListBeanVTResult.data.getList(), true); + binding.rvVtSearchData.setVisibility(VISIBLE); + binding.layoutSearchEmpty.setVisibility(GONE); + } else { + binding.rvVtSearchData.setVisibility(GONE); + binding.layoutSearchEmpty.setVisibility(VISIBLE); + } + + binding.layoutSearchHot.setVisibility(GONE); + binding.layoutSearchHistory.setVisibility(GONE); + + }); + + + } + + + public void getHistoryData() { + String historyList = SharePreferenceUtils.getString(VTAppConstants.SEARCH_HISTORY, ""); + ArrayList arrayListHistory = VTGsonUtils.getListFromJSON(historyList, new TypeToken>() { + }.getType()); + if (arrayListHistory != null && !arrayListHistory.isEmpty()) { + binding.layoutSearchHistory.setVisibility(VISIBLE); + historyAdapter.submitList(arrayListHistory); + historyAdapter.notifyDataSetChanged(); + } else { + binding.layoutSearchHistory.setVisibility(GONE); + } + } + + public void saveSearchHistory(String content) { + String historyList = SharePreferenceUtils.getString(VTAppConstants.SEARCH_HISTORY, ""); + ArrayList arrayListHistory = VTGsonUtils.getListFromJSON(historyList, new TypeToken>() { + }.getType()); + if (arrayListHistory != null && !arrayListHistory.isEmpty()) { + for (String history : arrayListHistory) { + if (content.trim().equals(history)) { + break; + } + arrayListHistory.add(content); + } + } else { + arrayListHistory = new ArrayList<>(); + arrayListHistory.add(content); + } + + SharePreferenceUtils.saveString(VTAppConstants.SEARCH_HISTORY, VTGsonUtils.beanToJSONString(arrayListHistory)); + } +} diff --git a/app/src/main/java/com/viontv/app/ui/activity/search/VTSearchViewModel.java b/app/src/main/java/com/viontv/app/ui/activity/search/VTSearchViewModel.java new file mode 100644 index 0000000..e697782 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/activity/search/VTSearchViewModel.java @@ -0,0 +1,90 @@ +package com.viontv.app.ui.activity.search; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.viontv.app.api.VTApi; +import com.viontv.app.api.VTBaseObserver; +import com.viontv.app.api.VTResult; +import com.viontv.app.model.VTVideoListBean; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class VTSearchViewModel extends ViewModel { + + + private final MutableLiveData> searchHotListLiveData = new MutableLiveData<>(); + private final MutableLiveData> searchDataListLiveData = new MutableLiveData<>(); + + public MutableLiveData> getSearchHostList() { + return searchHotListLiveData; + } + + + public MutableLiveData> searchDataList() { + return searchDataListLiveData; + } + + + public void getHotList() { + VTApi.getInstance().getSearchHotList() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver>() { + @Override + public void onSuccess(VTResult feedbackResp) { + searchHotListLiveData.setValue(feedbackResp); + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + searchHotListLiveData.setValue(null); + } + + }); + } + + + public void getSearchList(String content) { + VTApi.getInstance().getSearchContentList(content) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver>() { + @Override + public void onSuccess(VTResult feedbackResp) { + searchDataListLiveData.setValue(feedbackResp); + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + searchDataListLiveData.setValue(null); + } + }); + } + + + public void setSearchClick(int shorplayId) { + VTApi.getInstance().searchClick(shorplayId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver() { + @Override + public void onSuccess(VTResult feedbackResp) { + + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + } + }); + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/viontv/app/ui/adapter/BannerHomeAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTBannerHomeAdapter.java similarity index 72% rename from app/src/main/java/com/viontv/app/ui/adapter/BannerHomeAdapter.java rename to app/src/main/java/com/viontv/app/ui/adapter/VTBannerHomeAdapter.java index b62fd4d..00db15f 100644 --- a/app/src/main/java/com/viontv/app/ui/adapter/BannerHomeAdapter.java +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTBannerHomeAdapter.java @@ -1,28 +1,23 @@ package com.viontv.app.ui.adapter; -import android.media.Image; -import android.view.LayoutInflater; import android.view.ViewGroup; import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import androidx.viewbinding.ViewBinding; import com.bumptech.glide.Glide; -import com.bumptech.glide.RequestBuilder; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.request.RequestOptions; -import com.viontv.app.databinding.ItemBannerVtBinding; import com.viontv.app.model.ItemBean; import com.youth.banner.adapter.BannerAdapter; import java.util.List; -public class BannerHomeAdapter extends BannerAdapter { +public class VTBannerHomeAdapter extends BannerAdapter { - public BannerHomeAdapter(List mData) { + public VTBannerHomeAdapter(List mData) { super(mData); } @@ -40,7 +35,11 @@ public class BannerHomeAdapter extends BannerAdapter - extends RecyclerView.Adapter> { +public class VTCommonAdapter + extends RecyclerView.Adapter> { private static final String TAG = "QChatCommonAdapter"; private static final String NAME_METHOD_INFLATE = "inflate"; protected final List dataSource = new ArrayList<>(); @@ -29,7 +29,7 @@ public class CommonAdapter protected OnClickListener clickListener; protected Method inflateMethod; - public CommonAdapter(Context context, Class viewBinding) { + public VTCommonAdapter(Context context, Class viewBinding) { this.context = context; try { inflateMethod = diff --git a/app/src/main/java/com/viontv/app/ui/adapter/VTEpisodesSeriesAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTEpisodesSeriesAdapter.java index 2f2fd20..c6717b3 100644 --- a/app/src/main/java/com/viontv/app/ui/adapter/VTEpisodesSeriesAdapter.java +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTEpisodesSeriesAdapter.java @@ -31,7 +31,7 @@ public class VTEpisodesSeriesAdapter extends BaseQuickAdapter fragmentList; - public FragmentAdapter(@NonNull FragmentActivity fragmentActivity) { + public VTFragmentAdapter(@NonNull FragmentActivity fragmentActivity) { super(fragmentActivity); } - public FragmentAdapter(@NonNull Fragment fragment) { + public VTFragmentAdapter(@NonNull Fragment fragment) { super(fragment); } - public FragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) { + public VTFragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) { super(fragmentManager, lifecycle); } diff --git a/app/src/main/java/com/viontv/app/ui/adapter/VTGooglePlayerExploreAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTGooglePlayerExploreAdapter.java new file mode 100644 index 0000000..f9a88d2 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTGooglePlayerExploreAdapter.java @@ -0,0 +1,78 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.viontv.app.ui.adapter; + +import android.content.Context; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.media3.ui.PlayerView; + +import com.chad.library.adapter4.BaseQuickAdapter; +import com.chad.library.adapter4.viewholder.QuickViewHolder; +import com.viontv.app.R; +import com.viontv.app.model.VTVideoDetailsBean; +import com.viontv.app.model.VTVideoExploreBean; +import com.viontv.app.model.VTVideoExploreListBean; +import com.viontv.app.ui.view.VTGoogleExoPlayerView; +import com.viontv.app.ui.view.VTHomeGoogleExoPlayerView; + + +public class VTGooglePlayerExploreAdapter + extends BaseQuickAdapter { + + + public interface PlayerDetailCollection { + void collection(VTVideoExploreBean videoExploreBean); + } + + public PlayerDetailCollection playerDetailCollection; + + + public void setPlayerDetailCollection(PlayerDetailCollection playerDetailCollection) { + this.playerDetailCollection = playerDetailCollection; + } + + public int currentEpisodePlayingPosition = 0; + + + + public int getCurrentEpisodePlayingPosition() { + return currentEpisodePlayingPosition; + } + + public void setCurrentEpisodePlayingPosition(int currentEpisodePlayingPosition) { + this.currentEpisodePlayingPosition = currentEpisodePlayingPosition; + } + + + @NonNull + @Override + protected QuickViewHolder onCreateViewHolder(@NonNull Context context, @NonNull ViewGroup viewGroup, int i) { + + return new QuickViewHolder(R.layout.item_google_home_player_vt,viewGroup); + } + + @Override + protected void onBindViewHolder(@NonNull QuickViewHolder holder, int position, @Nullable VTVideoExploreBean bean) { + VTHomeGoogleExoPlayerView exampleDetailPlayerView = (VTHomeGoogleExoPlayerView) holder.getView(R.id.page_google_home_player); + PlayerView playerView = exampleDetailPlayerView.findViewById(R.id.player_view); + AppCompatImageView imageView = playerView.findViewById(R.id.iv_collection_controller); + imageView.setOnClickListener(v -> { + if (playerDetailCollection != null) { + playerDetailCollection.collection(bean); + } + }); + if (position == currentEpisodePlayingPosition) { + exampleDetailPlayerView.setMedia(bean); + } else { + exampleDetailPlayerView.stop(); + } + } + + +} diff --git a/app/src/main/java/com/viontv/app/ui/adapter/HotBottomListAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTHotBottomListAdapter.java similarity index 90% rename from app/src/main/java/com/viontv/app/ui/adapter/HotBottomListAdapter.java rename to app/src/main/java/com/viontv/app/ui/adapter/VTHotBottomListAdapter.java index 2b6a95b..d6be84c 100644 --- a/app/src/main/java/com/viontv/app/ui/adapter/HotBottomListAdapter.java +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTHotBottomListAdapter.java @@ -11,16 +11,15 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; import com.viontv.app.databinding.ItemHomeExploreVtBinding; -import com.viontv.app.databinding.ItemHotSquareVtBinding; import com.viontv.app.model.ItemBean; -public class HotBottomListAdapter - extends CommonAdapter { +public class VTHotBottomListAdapter + extends VTCommonAdapter { private Context mcontext; - public HotBottomListAdapter( + public VTHotBottomListAdapter( Context context, Class viewBinding) { super(context, viewBinding); this.mcontext = context; diff --git a/app/src/main/java/com/viontv/app/ui/adapter/NineSquareAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTNineSquareAdapter.java similarity index 85% rename from app/src/main/java/com/viontv/app/ui/adapter/NineSquareAdapter.java rename to app/src/main/java/com/viontv/app/ui/adapter/VTNineSquareAdapter.java index b3acd2e..08c565d 100644 --- a/app/src/main/java/com/viontv/app/ui/adapter/NineSquareAdapter.java +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTNineSquareAdapter.java @@ -5,22 +5,20 @@ package com.viontv.app.ui.adapter; import android.content.Context; -import android.text.TextUtils; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; import com.viontv.app.databinding.ItemHotSquareVtBinding; import com.viontv.app.model.ItemBean; -import com.viontv.app.utils.IntentUtils; -public class NineSquareAdapter - extends CommonAdapter { +public class VTNineSquareAdapter + extends VTCommonAdapter { private Context mcontext; - public NineSquareAdapter( + public VTNineSquareAdapter( Context context, Class viewBinding) { super(context, viewBinding); this.mcontext = context; diff --git a/app/src/main/java/com/viontv/app/ui/adapter/VTSearchDataAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTSearchDataAdapter.java new file mode 100644 index 0000000..b1ebf02 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTSearchDataAdapter.java @@ -0,0 +1,78 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.viontv.app.ui.adapter; + +import android.content.Context; +import android.view.View; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.viontv.app.databinding.ItemSearchDataVtBinding; +import com.viontv.app.model.ItemBean; + + +public class VTSearchDataAdapter + extends VTCommonAdapter { + + private Context mcontext; + + private String msearchText; + + + + public String getMsearchText() { + return msearchText; + } + + public void setMsearchText(String msearchText) { + this.msearchText = msearchText; + } + + public VTSearchDataAdapter( + Context context, Class viewBinding) { + super(context, viewBinding); + this.mcontext = context; + } + + + + @Override + public void onBindViewHolder( + ItemSearchDataVtBinding binding, + int position, + ItemBean data, + int bingingAdapterPosition) { + + if (data != null) { +// ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) binding.ivHotExploreItem.getLayoutParams(); +// params.dimensionRatio ="71:100"; +// binding.ivHotExploreItem.setLayoutParams(params); +// binding.ivHotExploreItem.requestLayout(); +// + Glide.with(mcontext) + .load(data.getImage_url()) + .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)) + .into(binding.ivSearchDataItem); + binding.tvSearchDatatitleItem.setText(data.getName()); + binding.tvSearchDatadescItem.setText(data.getDescription()); + binding.tvSearchDatacategoryItem1.setVisibility(View.GONE); + binding.tvSearchDatacategoryItem1.setVisibility(View.GONE); + + if (data.getCategoryList() != null && !data.getCategoryList().isEmpty()) { + binding.tvSearchDatacategoryItem1.setVisibility(View.VISIBLE); + binding.tvSearchDatacategoryItem1.setText(data.getCategoryList().get(0).getName()); + if (data.getCategoryList().size() >= 2) { + binding.tvSearchDatacategoryItem2.setVisibility(View.VISIBLE); + binding.tvSearchDatacategoryItem2.setText(data.getCategoryList().get(1).getName()); + } + } + + + } + } + + +} diff --git a/app/src/main/java/com/viontv/app/ui/adapter/VTSearchHistoryAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTSearchHistoryAdapter.java new file mode 100644 index 0000000..8ebf7b7 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTSearchHistoryAdapter.java @@ -0,0 +1,23 @@ +package com.viontv.app.ui.adapter; + +import com.chad.library.adapter4.BaseQuickAdapter; + +import android.content.Context; +import android.view.ViewGroup; + +import com.chad.library.adapter4.viewholder.QuickViewHolder; +import com.viontv.app.R; + +public class VTSearchHistoryAdapter extends BaseQuickAdapter { + + @Override + protected void onBindViewHolder(QuickViewHolder holder, int position, String item) { + holder.setText(R.id.tv_item_vt_search_history, item); + } + + @Override + public QuickViewHolder onCreateViewHolder(Context context, ViewGroup parent, int viewType) { + return new QuickViewHolder(R.layout.item_search_history_vt, parent); + } +} + diff --git a/app/src/main/java/com/viontv/app/ui/adapter/VTSearchHotListAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTSearchHotListAdapter.java new file mode 100644 index 0000000..4d6c5b6 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTSearchHotListAdapter.java @@ -0,0 +1,75 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.viontv.app.ui.adapter; + +import android.content.Context; +import android.view.View; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.viontv.app.R; +import com.viontv.app.databinding.ItemSearchHotVtBinding; +import com.viontv.app.model.ItemBean; +import com.viontv.app.utils.TimeUtils; + + +public class VTSearchHotListAdapter + extends VTCommonAdapter { + + private Context mcontext; + + public VTSearchHotListAdapter( + Context context, Class viewBinding) { + super(context, viewBinding); + this.mcontext = context; + } + + + @Override + public void onBindViewHolder( + ItemSearchHotVtBinding binding, + int position, + ItemBean data, + int bingingAdapterPosition) { + + if (data != null) { +// ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) binding.ivHotExploreItem.getLayoutParams(); +// params.dimensionRatio ="71:100"; +// binding.ivHotExploreItem.setLayoutParams(params); +// binding.ivHotExploreItem.requestLayout(); +// + Glide.with(mcontext) + .load(data.getImage_url()) + .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)) + .into(binding.ivHotSearchItem); + binding.tvSearchHottitleItem.setText(data.getName()); + binding.tvSearchHottotalItem.setText(TimeUtils.formatNumber(data.getWatch_total())); + binding.tvHotTopnumber.setVisibility(View.GONE); + if (bingingAdapterPosition < 10) { + binding.tvHotTopnumber.setVisibility(View.VISIBLE); + binding.tvHotTopnumber.setText(String.valueOf(bingingAdapterPosition + 1)); + binding.tvHotTopnumber.setBackgroundResource(R.drawable.bg_search_hot_top4_gradient); + if(bingingAdapterPosition==0){ + binding.tvHotTopnumber.setBackgroundResource(R.drawable.bg_search_hot_top1_gradient); + } + if(bingingAdapterPosition==1){ + binding.tvHotTopnumber.setBackgroundResource(R.drawable.bg_search_hot_top2_gradient); + } + if(bingingAdapterPosition==2){ + binding.tvHotTopnumber.setBackgroundResource(R.drawable.bg_search_hot_top3_gradient); + } + } + if (data.getCategory() != null && !data.getCategory().isEmpty()) { + binding.tvSearchHottagItem.setVisibility(View.VISIBLE); + binding.tvSearchHottagItem.setText(data.getCategory().get(0)); + } + + + } + } + + +} diff --git a/app/src/main/java/com/viontv/app/ui/adapter/TabItemListAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTTabItemListAdapter.java similarity index 78% rename from app/src/main/java/com/viontv/app/ui/adapter/TabItemListAdapter.java rename to app/src/main/java/com/viontv/app/ui/adapter/VTTabItemListAdapter.java index 9a470e2..a0a80a4 100644 --- a/app/src/main/java/com/viontv/app/ui/adapter/TabItemListAdapter.java +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTTabItemListAdapter.java @@ -5,23 +5,20 @@ package com.viontv.app.ui.adapter; import android.content.Context; -import android.view.View; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; -import com.viontv.app.R; -import com.viontv.app.databinding.ItemHomeExploreVtBinding; import com.viontv.app.databinding.ItemHomeTablistVtBinding; import com.viontv.app.model.ItemBean; -public class TabItemListAdapter - extends CommonAdapter { +public class VTTabItemListAdapter + extends VTCommonAdapter { private Context mcontext; - public TabItemListAdapter( + public VTTabItemListAdapter( Context context, Class viewBinding) { super(context, viewBinding); this.mcontext = context; @@ -35,8 +32,12 @@ public class TabItemListAdapter int bingingAdapterPosition) { if (data != null) { + String imageUrl = data.getHorizontally_img(); + if (!imageUrl.endsWith(".jpg")) { + imageUrl = data.getImage_url(); + } Glide.with(mcontext) - .load(data.getHorizontally_img()) + .load(imageUrl) .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)) .into(binding.ivHometabItem); binding.tvHometabTitleItem.setText(data.getName()); diff --git a/app/src/main/java/com/viontv/app/ui/adapter/Top10ListAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTTop10ListAdapter.java similarity index 92% rename from app/src/main/java/com/viontv/app/ui/adapter/Top10ListAdapter.java rename to app/src/main/java/com/viontv/app/ui/adapter/VTTop10ListAdapter.java index f2ba069..9bcebda 100644 --- a/app/src/main/java/com/viontv/app/ui/adapter/Top10ListAdapter.java +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTTop10ListAdapter.java @@ -4,12 +4,9 @@ package com.viontv.app.ui.adapter; -import android.annotation.SuppressLint; import android.content.Context; import android.view.View; -import androidx.constraintlayout.widget.ConstraintLayout; - import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; @@ -18,12 +15,12 @@ import com.viontv.app.model.ItemBean; import com.viontv.app.utils.TimeUtils; -public class Top10ListAdapter - extends CommonAdapter { +public class VTTop10ListAdapter + extends VTCommonAdapter { private Context mcontext; - public Top10ListAdapter( + public VTTop10ListAdapter( Context context, Class viewBinding) { super(context, viewBinding); this.mcontext = context; diff --git a/app/src/main/java/com/viontv/app/ui/adapter/VTUserVideoHistoryAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTUserVideoHistoryAdapter.java new file mode 100644 index 0000000..f57e4aa --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTUserVideoHistoryAdapter.java @@ -0,0 +1,54 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.viontv.app.ui.adapter; + +import android.content.Context; +import android.view.View; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.viontv.app.databinding.ItemHomeExploreVtBinding; +import com.viontv.app.databinding.ItemVideoHistoryBinding; +import com.viontv.app.model.ItemBean; +import com.viontv.app.utils.TimeUtils; + + +public class VTUserVideoHistoryAdapter + extends VTCommonAdapter { + + private Context mcontext; + + public VTUserVideoHistoryAdapter( + Context context, Class viewBinding) { + super(context, viewBinding); + this.mcontext = context; + } + + + @Override + public void onBindViewHolder( + ItemVideoHistoryBinding binding, + int position, + ItemBean data, + int bingingAdapterPosition) { + + if (data != null) { +// ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) binding.ivHotExploreItem.getLayoutParams(); +// params.dimensionRatio ="71:100"; +// binding.ivHotExploreItem.setLayoutParams(params); +// binding.ivHotExploreItem.requestLayout(); +// + Glide.with(mcontext) + .load(data.getImage_url()) + .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)) + .into(binding.ivHistoryItem); + + + } + } + + +} diff --git a/app/src/main/java/com/viontv/app/ui/view/VTGoogleExoPlayerView.java b/app/src/main/java/com/viontv/app/ui/view/VTGoogleExoPlayerView.java index 16ce72a..c3e1453 100644 --- a/app/src/main/java/com/viontv/app/ui/view/VTGoogleExoPlayerView.java +++ b/app/src/main/java/com/viontv/app/ui/view/VTGoogleExoPlayerView.java @@ -22,6 +22,7 @@ import com.bumptech.glide.Glide; import com.viontv.app.R; import com.viontv.app.databinding.LayoutVideoplayVtBinding; import com.viontv.app.model.VTVideoDetailsBean; +import com.viontv.app.utils.TimeUtils; import com.viontv.app.utils.ToastUtils; import com.viontv.app.utils.TranslatesUtils; import com.viontv.app.utils.VTAppConstants; @@ -224,8 +225,8 @@ public class VTGoogleExoPlayerView extends FrameLayout { tv_des_player.setText(shortVideoInfo.getDescription()); Glide.with(getContext()).load(shortVideoInfo.getImage_url()).into(ivCoverPlayerDetail); ivCoverPlayerDetail.setVisibility(View.VISIBLE); - // iv_collection_controller.setImageResource(shortVideoInfo.isIs_collect() ? R.drawable.iv_hibit_like_h : R.drawable.iv_hibit_like_n); - // tv_collection_num_controller.setText(Timestamp.formatNumber(shortVideoInfo.getCollect_total())); + iv_collection_controller.setImageResource(shortVideoInfo.isIs_collect() ? R.mipmap.iv_vt_collect_h : R.mipmap.iv_vt_collect_n); + tv_collection_num_controller.setText(TimeUtils.formatNumber(shortVideoInfo.getCollect_total())); rl_ep.setOnClickListener(v -> EventBus.getDefault().post(VTAppConstants.Constants_PlayerView_MoreItemEvent) ); diff --git a/app/src/main/java/com/viontv/app/ui/view/VTHomeGoogleExoPlayerView.java b/app/src/main/java/com/viontv/app/ui/view/VTHomeGoogleExoPlayerView.java new file mode 100644 index 0000000..ab36673 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/view/VTHomeGoogleExoPlayerView.java @@ -0,0 +1,262 @@ +package com.viontv.app.ui.view; + +import android.content.Context; +import android.net.Uri; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.SeekBar; + +import androidx.appcompat.widget.AppCompatImageView; +import androidx.appcompat.widget.AppCompatSeekBar; +import androidx.appcompat.widget.AppCompatTextView; +import androidx.cardview.widget.CardView; +import androidx.media3.common.C; +import androidx.media3.common.MediaItem; +import androidx.media3.common.PlaybackException; +import androidx.media3.common.Player; +import androidx.media3.exoplayer.ExoPlayer; + +import com.bumptech.glide.Glide; +import com.viontv.app.R; +import com.viontv.app.VTApplication; +import com.viontv.app.databinding.LayoutVideoplayHomeVtBinding; +import com.viontv.app.databinding.LayoutVideoplayVtBinding; +import com.viontv.app.model.VTVideoDetailsBean; +import com.viontv.app.model.VTVideoExploreBean; +import com.viontv.app.utils.TimeUtils; +import com.viontv.app.utils.ToastUtils; +import com.viontv.app.utils.TranslatesUtils; +import com.viontv.app.utils.VTAppConstants; + +import org.greenrobot.eventbus.EventBus; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public class VTHomeGoogleExoPlayerView extends FrameLayout { + private ExoPlayer player; + // private Job progressJob; //任务调度器 + private ScheduledFuture progressJob; + + private boolean isDragging = false; + private AppCompatSeekBar seekBar; + private AppCompatImageView ivCoverPlayerDetail; + private AppCompatImageView ivPagePlay; + private AppCompatImageView iv_collection_controller; + + private AppCompatTextView tv_des_player; + private AppCompatImageView ivPlayerSeries; + private AppCompatImageView ivSearch; + + private AppCompatTextView tv_title_player; + private AppCompatTextView tv_collection_num_controller; + private AppCompatTextView tv_title_hibit_episode; + private ProgressLineView load_line; + private LinearLayout ll_ep; + + private CardView cardPlayer; + private boolean isEpisodePlaying = false; + + public VTHomeGoogleExoPlayerView(Context context, AttributeSet attrs) { + super(context, attrs); + player = new ExoPlayer.Builder(context).build(); + LayoutInflater inflater = LayoutInflater.from(context); + View inflate = inflater.inflate(R.layout.layout_videoplay_home_vt, this, true); + LayoutVideoplayHomeVtBinding bind = LayoutVideoplayHomeVtBinding.bind(inflate); + bind.playerView.setPlayer(player); + seekBar = bind.playerView.findViewById(R.id.seekBar_player_detail); + ivCoverPlayerDetail = bind.playerView.findViewById(R.id.iv_cover_player_detail); + ivPagePlay = bind.playerView.findViewById(R.id.iv_play_status); + iv_collection_controller = bind.playerView.findViewById(R.id.iv_collection_controller); + tv_collection_num_controller = bind.playerView.findViewById(R.id.tv_collection_num_controller); + tv_des_player = bind.playerView.findViewById(R.id.tv_des_player); //描述 + //跳转选集 + ivPlayerSeries = bind.playerView.findViewById(R.id.iv_homeplayer_video); //选集图片 + tv_title_player = bind.playerView.findViewById(R.id.tv_name_episode); + load_line = bind.playerView.findViewById(R.id.load_line); + cardPlayer = bind.playerView.findViewById(R.id.cardview_homeplayer_video); + ll_ep = bind.playerView.findViewById(R.id.ll_ep); + ivSearch = bind.playerView.findViewById(R.id.iv_search_home_videoplay); + + + player.addListener(new Player.Listener() { + @Override + public void onPlaybackStateChanged(int playbackState) { + Player.Listener.super.onPlaybackStateChanged(playbackState); + switch (playbackState) { + case Player.STATE_BUFFERING: + load_line.setVisibility(VISIBLE); + load_line.startAnimation(); + break; + case Player.STATE_READY: + bind.playerView.setEnabled(true); + if (VTApplication.isCurrentPage) { + start(); + setProgress(); + } + ivCoverPlayerDetail.setVisibility(View.INVISIBLE); + load_line.endAnimation(); + load_line.setVisibility(INVISIBLE); + break; + case Player.STATE_ENDED: + EventBus.getDefault().post(VTAppConstants.Constants_Google_PLAYER_STATUS_FINISH); + break; + case Player.STATE_IDLE: + bind.playerView.setEnabled(false); + break; + } + } + + @Override + public void onPlayerError(PlaybackException error) { + Player.Listener.super.onPlayerError(error); + ivCoverPlayerDetail.setVisibility(View.INVISIBLE); + load_line.setVisibility(INVISIBLE); + if (TranslatesUtils.translates() != null) { + ToastUtils.revealToast(TranslatesUtils.translates().getNetwork_error(), 0); + } else { + ToastUtils.revealToast(context.getString(R.string.vt_network_error_please_check_the_network), 0); + } + } + }); + + bind.playerView.setOnClickListener(v -> { + if (!VTAppConstants.isLock) { + if (isEpisodePlaying) { + ivPagePlay.setImageResource(R.mipmap.iv_play_vt); + suspend(); + } else { + ivPagePlay.setImageResource(R.mipmap.iv_stop_vt); + start(); + } + } + }); + } + + private void setProgress() { + if (progressJob != null) { + progressJob.cancel(true); + } + ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + progressJob = executor.scheduleWithFixedDelay(() -> { + if (!isDragging) { + long duration = player.getDuration(); + long position = player.getCurrentPosition(); + int progress = (int) (position * 100 / (duration == C.TIME_UNSET ? 1 : duration)); + if (seekBar != null) { + seekBar.setMax(100); + seekBar.setProgress(progress + 1); + } + } + }, 0, 1, TimeUnit.SECONDS); +// if (progressJob != null) { +// progressJob.cancel(null); +// } +// progressJob = launchKt.launch(Dispatchers.getMain(), null, null, coroutineScope -> { +// while (isActive(coroutineScope)) { +// if (!isDragging.get()) { +// long duration = player.getDuration(); +// long position = player.getCurrentPosition(); +// int progress = (int) (position * 100 / (duration == C.TIME_UNSET ? 1 : duration)); +// seekBar.setMax(100); +// seekBar.setProgress(progress + 1); +// } +// delayKt.delay(1000); +// } +// return null; +// }); + + seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (fromUser) { + seekTo(progress); + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + isDragging = true; + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + isDragging = false; + } + }); + } + + public void start() { + player.play(); + ivPagePlay.setImageResource(R.mipmap.iv_stop_vt); + isEpisodePlaying = true; + isDragging = false; + } + + public void suspend() { + player.pause(); + ivPagePlay.setImageResource(R.mipmap.iv_play_vt); + isEpisodePlaying = false; + isDragging = true; + } + + public void seekTo(int progress) { + long duration = player.getDuration(); + player.seekTo(duration * progress / 100); + } + + public void setMedia(VTVideoExploreBean bean) { + VTAppConstants.isCanPlay = true; + tv_title_player.setText(bean.getName()); + +// if (TranslatesUtils.translates() != null) { +// tv_title_hibit_episode.setText(TranslatesUtils.replace( +// TranslatesUtils.translates().getEpisode_set(), +// String.valueOf(bean.getEpisode()) +// )); +// tv_episode_name.setText(TranslatesUtils.replace( +// TranslatesUtils.translates().getComplete_episode(), +// String.valueOf(shortVideoInfo.getEpisode_total()) +// )); +// } else { +// tv_title_hibit_episode.setText("Episode ".concat(String.valueOf(bean.getEpisode()))); +// tv_episode_name.setText("Complete set : ".concat(String.valueOf(shortVideoInfo.getEpisode_total()))); +// } + tv_des_player.setText(bean.getDescription()); + Glide.with(getContext()).load(bean.getImage_url()).into(ivCoverPlayerDetail); + Glide.with(getContext()).load(bean.getImage_url()).into(ivPlayerSeries); + ivCoverPlayerDetail.setVisibility(View.VISIBLE); + iv_collection_controller.setImageResource(bean.isIs_collect() ? R.mipmap.iv_vt_collect_h : R.mipmap.iv_vt_collect_n); + tv_collection_num_controller.setText(TimeUtils.formatNumber(bean.getCollect_total())); + ll_ep.setOnClickListener(v -> + EventBus.getDefault().post(VTAppConstants.Constants_PlayerView_DetialsEvent) + ); + cardPlayer.setOnClickListener(v -> { + EventBus.getDefault().post(VTAppConstants.Constants_PlayerView_DetialsEvent); + }); + ivSearch.setOnClickListener(v -> { + EventBus.getDefault().post(VTAppConstants.Constants_PlayerView_SearchEvent); + }); + + player.setMediaItem(MediaItem.fromUri(Uri.parse(bean.getVideo_info().getVideo_url()))); + player.prepare(); + } + + public void stop() { + player.stop(); + if (progressJob != null) { + progressJob.cancel(true); + progressJob = null; + } + } + + public void release() { + player.release(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/viontv/app/utils/IntentUtils.java b/app/src/main/java/com/viontv/app/utils/IntentUtils.java index d506959..089dea1 100644 --- a/app/src/main/java/com/viontv/app/utils/IntentUtils.java +++ b/app/src/main/java/com/viontv/app/utils/IntentUtils.java @@ -1,10 +1,12 @@ package com.viontv.app.utils; import android.app.Activity; +import android.content.Context; import android.content.Intent; import com.viontv.app.VTApplication; import com.viontv.app.ui.activity.play.VTVideoPlayerActivity; +import com.viontv.app.ui.activity.search.VTSearchActivity; public class IntentUtils { @@ -15,4 +17,9 @@ public class IntentUtils { intent.putExtra(VTAppConstants.Constants_Page_video_id,video_id); currentActivity.startActivity(intent); } + + public static void startSearch(Context context){ + Intent intent = new Intent(context, VTSearchActivity.class); + context.startActivity(intent); + } } diff --git a/app/src/main/java/com/viontv/app/utils/VTAppConstants.java b/app/src/main/java/com/viontv/app/utils/VTAppConstants.java index 50934cb..fc21ec5 100644 --- a/app/src/main/java/com/viontv/app/utils/VTAppConstants.java +++ b/app/src/main/java/com/viontv/app/utils/VTAppConstants.java @@ -11,10 +11,19 @@ public class VTAppConstants { public static final String Constants_HTTP_TOKEN = "Authorization"; public static final String Constants_Page_DetailId = "constants_page_detail_id"; public static final String Constants_Page_video_id = "Constants_Page_video_id"; + public static final String Constants_Page_WebUrl = "Constants_Page_WebUrl"; + public static final String Constants_Page_WebTitle = "Constants_Page_WebTitle"; public static final String Constants_Page_Episodes_Series_Data_VT = "constants_page_episodes_series_data"; public static final String Constants_Page_Episodes_Series_Data_List = "Constants_Page_Episodes_Series_Data_List"; public static final String Constants_PlayerView_MoreItemEvent = "Constants_PlayerView_MoreItem"; + public static final String Constants_PlayerView_DetialsEvent = + "Constants_PlayerView_Details"; + public static final String Constants_PlayerView_SearchEvent = + "Constants_PlayerView_SearchEvent"; + + public static final String Constants_PlayerView_CreateHistoryEvent = + "Constants_PlayerView_CreateHistoryEvent"; public static final String Constants_RecommendPlayerView_CLOSEExample = "Constants_RecommendPlayerView_CLOSEExample"; public static final String Constants_Page_Episodes_Series_Data_currentPosition = @@ -22,32 +31,12 @@ public class VTAppConstants { public static final String Constants_Google_PLAYER_STATUS_FINISH = "constants_google_player_status_finish"; public static final String Constants_Google_PLAYER_STATUS_FINISH_DETAIL = "constants_google_player_status_finish_detail"; - public static final String CONSTANTS_refresh_auth = "CONSTANTS_refresh_auth"; - public static final String CONSTANTS_out_login = "CONSTANTS_out_login"; - public static final String CONSTANTS_user_refresh = "CONSTANTS_user_refresh"; - public static final String LogEvent_af_app_recharge = "af_app_recharge"; - public static final String CONSTANTS_AppsFlyer = "axv4xFtouhau4js4GxqBX9"; public static final String Constants_Episodes_Series_DataExample = "Constants_Episodes_Series_DataExample"; - public static final String Constants_Episodes_Series_DataFavorites = "Constants_Episodes_Series_DataFavorites"; - public static final String CONSTANTS_GOOGLE_LOGIN = - "996139080527-njj3ehigooauk800e0o6hm785jofi2l5.apps.googleusercontent.com"; - public static final String CONSTANTS_device_id = "device-id"; - public static final String CONSTANTS_system_type = "system-type"; - public static final String CONSTANTS_model = "model"; - public static final String CONSTANTS_app_version = "app-version"; - public static final String CONSTANTS_app_name = "app-name"; - public static final String CONSTANTS_lang_key = "lang-key"; - public static final String CONSTANTS_time_zone = "time-zone"; - public static final String CONSTANTS_SEARCH_STRINGExample = "CONSTANTS_SEARCH_STRINGExample"; - public static final String CONSTANTS_User_STRING = "CONSTANTS_User_STRING"; - public static final int requestCodeByGoogleLogin = 666; + public static boolean isCanPlay = true; public static boolean isLock = false; - public static final String Constants_member_ship_agreement = - "https://www.hibitplay.com/member_ship_agreement_android.html"; - public static final String Constants_user_agreement = "https://www.hibitplay.com/user_policy_android.html"; - public static final String Constants_privacy_policy = "https://www.hibitplay.com/private_android.html"; - public static final String Constants_Web_Url = "Constants_Web_Url"; - public static final String CLIENT_KEY = "awp5nm8lwpyebwgv"; - public static final String REDIRECT_URL = "hibitapp://oauthresponse"; + + public static final String SEARCH_HISTORY = "searchhistory"; + + } diff --git a/app/src/main/res/drawable/bg_circle_headdefault_vt.xml b/app/src/main/res/drawable/bg_circle_headdefault_vt.xml new file mode 100644 index 0000000..5ab6b27 --- /dev/null +++ b/app/src/main/res/drawable/bg_circle_headdefault_vt.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_home_series_gradient.xml b/app/src/main/res/drawable/bg_home_series_gradient.xml new file mode 100644 index 0000000..01d24e5 --- /dev/null +++ b/app/src/main/res/drawable/bg_home_series_gradient.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_search_hot_gradient.xml b/app/src/main/res/drawable/bg_search_hot_gradient.xml new file mode 100644 index 0000000..a76522d --- /dev/null +++ b/app/src/main/res/drawable/bg_search_hot_gradient.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_search_hot_top1_gradient.xml b/app/src/main/res/drawable/bg_search_hot_top1_gradient.xml new file mode 100644 index 0000000..c3b1094 --- /dev/null +++ b/app/src/main/res/drawable/bg_search_hot_top1_gradient.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_search_hot_top2_gradient.xml b/app/src/main/res/drawable/bg_search_hot_top2_gradient.xml new file mode 100644 index 0000000..0d0589a --- /dev/null +++ b/app/src/main/res/drawable/bg_search_hot_top2_gradient.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_search_hot_top3_gradient.xml b/app/src/main/res/drawable/bg_search_hot_top3_gradient.xml new file mode 100644 index 0000000..4320650 --- /dev/null +++ b/app/src/main/res/drawable/bg_search_hot_top3_gradient.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_search_hot_top4_gradient.xml b/app/src/main/res/drawable/bg_search_hot_top4_gradient.xml new file mode 100644 index 0000000..5b4cde3 --- /dev/null +++ b/app/src/main/res/drawable/bg_search_hot_top4_gradient.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_vt_episodes_home.xml b/app/src/main/res/drawable/bg_vt_episodes_home.xml new file mode 100644 index 0000000..109a4e2 --- /dev/null +++ b/app/src/main/res/drawable/bg_vt_episodes_home.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/cornor_1affffff_12dp.xml b/app/src/main/res/drawable/cornor_1affffff_12dp.xml new file mode 100644 index 0000000..f2f82c5 --- /dev/null +++ b/app/src/main/res/drawable/cornor_1affffff_12dp.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_search_vt.xml b/app/src/main/res/layout/activity_search_vt.xml new file mode 100644 index 0000000..a457e37 --- /dev/null +++ b/app/src/main/res/layout/activity_search_vt.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_video_details_vt.xml b/app/src/main/res/layout/activity_video_details_vt.xml index 043e389..7e80c82 100644 --- a/app/src/main/res/layout/activity_video_details_vt.xml +++ b/app/src/main/res/layout/activity_video_details_vt.xml @@ -7,7 +7,7 @@ diff --git a/app/src/main/res/layout/activity_webview.xml b/app/src/main/res/layout/activity_webview.xml new file mode 100644 index 0000000..b3be0dd --- /dev/null +++ b/app/src/main/res/layout/activity_webview.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_explore_vt.xml b/app/src/main/res/layout/fragment_explore_vt.xml new file mode 100644 index 0000000..cdd623d --- /dev/null +++ b/app/src/main/res/layout/fragment_explore_vt.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_hot_vt.xml b/app/src/main/res/layout/fragment_hot_vt.xml index 2049782..a91412c 100644 --- a/app/src/main/res/layout/fragment_hot_vt.xml +++ b/app/src/main/res/layout/fragment_hot_vt.xml @@ -1,22 +1,14 @@ - + android:layout_height="match_parent"> - - - - - - - - - - + + - - \ No newline at end of file + + + + + diff --git a/app/src/main/res/layout/fragment_main_vt.xml b/app/src/main/res/layout/fragment_main_vt.xml index 49c69b3..b3bd0df 100644 --- a/app/src/main/res/layout/fragment_main_vt.xml +++ b/app/src/main/res/layout/fragment_main_vt.xml @@ -28,9 +28,9 @@ android:textColorHint="#38ffffff" android:gravity="center_vertical" android:drawablePadding="@dimen/dp_7" - android:drawableStart="@mipmap/iv_homefragment_search" android:textColor="#38ffffff" - android:textSize="@dimen/sp_12" /> + android:textSize="@dimen/sp_12" + app:drawableStartCompat="@mipmap/iv_homefragment_search" /> diff --git a/app/src/main/res/layout/fragment_me.xml b/app/src/main/res/layout/fragment_me.xml new file mode 100644 index 0000000..40982d3 --- /dev/null +++ b/app/src/main/res/layout/fragment_me.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_google_home_player_vt.xml b/app/src/main/res/layout/item_google_home_player_vt.xml new file mode 100644 index 0000000..d9aa8cc --- /dev/null +++ b/app/src/main/res/layout/item_google_home_player_vt.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_explore_vt.xml b/app/src/main/res/layout/item_home_explore_vt.xml index ce37ae0..6e7ef9f 100644 --- a/app/src/main/res/layout/item_home_explore_vt.xml +++ b/app/src/main/res/layout/item_home_explore_vt.xml @@ -25,6 +25,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="fitXY" + android:minHeight="@dimen/dp_100" app:layout_constraintDimensionRatio="82:110" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/item_page_episodes_series_vt.xml b/app/src/main/res/layout/item_page_episodes_series_vt.xml index f5b62d2..66783bd 100644 --- a/app/src/main/res/layout/item_page_episodes_series_vt.xml +++ b/app/src/main/res/layout/item_page_episodes_series_vt.xml @@ -33,6 +33,7 @@ android:layout_alignParentRight="true" android:layout_marginTop="5dp" android:layout_marginRight="5dp" + android:visibility="gone" android:src="@mipmap/iv_lock" /> diff --git a/app/src/main/res/layout/item_search_data_vt.xml b/app/src/main/res/layout/item_search_data_vt.xml new file mode 100644 index 0000000..8909fde --- /dev/null +++ b/app/src/main/res/layout/item_search_data_vt.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_search_history_vt.xml b/app/src/main/res/layout/item_search_history_vt.xml new file mode 100644 index 0000000..29a23c8 --- /dev/null +++ b/app/src/main/res/layout/item_search_history_vt.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_search_hot_vt.xml b/app/src/main/res/layout/item_search_hot_vt.xml new file mode 100644 index 0000000..3ae5041 --- /dev/null +++ b/app/src/main/res/layout/item_search_hot_vt.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_video_history.xml b/app/src/main/res/layout/item_video_history.xml new file mode 100644 index 0000000..d7a1924 --- /dev/null +++ b/app/src/main/res/layout/item_video_history.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_player_controller_vt.xml b/app/src/main/res/layout/layout_player_controller_vt.xml index 5271de9..43c166c 100644 --- a/app/src/main/res/layout/layout_player_controller_vt.xml +++ b/app/src/main/res/layout/layout_player_controller_vt.xml @@ -17,7 +17,7 @@ android:layout_height="24dp" android:layout_marginLeft="15dp" android:layout_marginTop="55dp" - android:src="@mipmap/iv_play_vt_episode_left" /> + android:src="@mipmap/ic_play_vt_episode_left" /> + android:src="@mipmap/ic_arrowright_vt_episode" /> @@ -123,7 +123,6 @@ android:layout_marginRight="16dp" android:layout_marginBottom="26dp" android:gravity="center" - android:visibility="gone" android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_videoplay_home_vt.xml b/app/src/main/res/layout/layout_videoplay_home_vt.xml new file mode 100644 index 0000000..03f1cdb --- /dev/null +++ b/app/src/main/res/layout/layout_videoplay_home_vt.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/iv_arrowright_vt_episode.webp b/app/src/main/res/mipmap-xxhdpi/ic_arrowright_vt_episode.webp similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/iv_arrowright_vt_episode.webp rename to app/src/main/res/mipmap-xxhdpi/ic_arrowright_vt_episode.webp diff --git a/app/src/main/res/mipmap-xxhdpi/ic_default_head.png b/app/src/main/res/mipmap-xxhdpi/ic_default_head.png new file mode 100644 index 0000000000000000000000000000000000000000..3c7d524834c5751c723c40ad7b325dd5843aa0a1 GIT binary patch literal 8791 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 Z_!lVduqDI``kMd%002ovPDHLkV1i9Y?>+zk literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_history_delete.png b/app/src/main/res/mipmap-xxhdpi/ic_history_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..61d62ed10d7bd71872ad2c607e6c10706e4d317d GIT binary patch literal 591 zcmV-V0Px%2}wjjRA@u(TJ3SdFbtJ8DU-BJ(lSY5lF~^^Cn=k#d1(U1=lD~^~_V%i@8# zTV_U-szx;!5kW){8O^b0=0mMQZ7`*20%yE9#vhq^*8|MExA9NRye%s=x< zF;j^xFvQ*b$n{dM`b-EmD{_d-fFl@XRw{9bhAbSg195O5)EWz{tz%4afVl@Ntqo=* z4uHW|+|U2DjcHl$nr2H{LgcnO-M-Iz=#!BUGk?{_zizTpUV6;^33C1s>gC+2Au+5U2PV;?E z0J%oy${84~gJ!PBbLA{D7MXwta?>YQ&eF`%%+l=71GZ z)RPZ|Qefa2(4+66Oy{bKB~v`va8-I!)`IHNO-?CEf|(UepzzgxPAOITA0WO<2qzni dl7V+s^9zJeWm1E9;PC(e002ovPDHLkV1nfY3#b49 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_hot_search.png b/app/src/main/res/mipmap-xxhdpi/ic_hot_search.png new file mode 100644 index 0000000000000000000000000000000000000000..668c83c2f73125fc37e91c8358509bd52c0282a7 GIT binary patch literal 2391 zcmV-d38?moP)Px;5lKWrRA@uRnhT6nK0Kx1j9%r6ILHXnFbf1rH`({TB>#4oY>&(V&z%hmx4o zZ~EJ31t@qhb+Mzsr3DnWuvLvTq&9sPfC2@h7R?`yQu}}lU6s|+l(b=6_eew2vq1w2 z7R$!a%^N+BugJ9&i+^L?B&S{s-H*zC&>pk1hiFEy6KOz9DOqhy4Hw225S_ zImB4xEAZX5va!_QU9e_L;>9Cgfcgza-F3$VOsg5F^b%I^ z_nO&If8>0)j!BJK4o06ujC*pAlOqZH142xZwaGKZWE2IXoKi8b$m)KTnl&rL=)u1M zS=whHT?Y>#G6nTX8w^My^7T&1Ik5IlS(lpDXD~S{*G6AKsH8nIRT>+u{L9p$>TAJ# zyC3e=b)9KKT8$x-&Qfl^2U5{narFxlsfP?P%KSgQkDX56Q+%U#N6Y$=B$B`Cxv`*SR4g`xN^}u8+M!6^$Ije{G9#GA zb_^NoDcFbpecK|(XbVk{#>Vsc=L>_Wt&S53C&+fj{7KrvV<}7Tz%V9z0?`kg&O*p= z=r!1-18S)xl572esf!&)Bf_&?^Ua#t+KgSF`gq6p{`U3sWPwl0_j2Q~?ufo6xw48-)hv3a4po2Jy7=JOw$O>Jdq#E_VmB==NJMjaOW=Z?W5T zZqNZ9HoIP1Tjcv1OrB-(rJl<;fZjjZ_ZTuwWbF%`=Iv%@6^}kk$XrrVU!qHyQ5QJO zwZ0j4w>a@IxEz*EhYA-k8kFACo`u!h;Z$qi0O=CwV{3$L+H|_(%FZ`e@z_xexwNEs z$yjjPRWNHjoIVH7Y={4~!^IcCk{h8sRM@84?=_HTc0g-;=`o~9Ad~)*)HfaI4Q9!m zs$>__?zQ4p7+&Ed$X&-A#=7QWxbqt4XT_HG{S#;5>8+od%QITKHiS&bW~NA@>8);H zR87@o3@ZOuNnkVue_;^ZJ=LLLz4ZSpQZQ=*d~HIJZYWP_9dldWg&n@S4(O8=3^xy$LhM!evAJfzk1!U31k|(8S<(X*WBc zzN8~@b`pT9oi~+8WJgJ0G_5Ya5k?R0Qd;MZf1ZXh!~Ck`?9-3%;(qx12mWihNElhu z*qhB%eE!vhja|OMXcn7%5iGs|+IqaEpHjXjRIO6RhM#QqjMOS|aXM`6P*@5(^um~4^SOw~pABE}@oJfkV`{#owXy+6RT>l`}eB+{}X z`KiOrY`IwKH@3K2CLVp9P-sQB(!Zy2+Qr6?fQ8q2zh0@pw9_B`7@m5)I2b1;U!yHt zrQ3LSFpK72foU8l>S{VCO#dQ$%m1+7Hzuv*!Bb8Z;bj@69+LXhBl&lCugw<6hG6k3 zaCK1yzIi3wG%mQn?+~VAruis5?-?^EF}b1V47zu7rn^k!q0a@3E`5@FVEf_1^sJ{d z+3aIdpL)=Z-MjrPH_?}}y$FL{0ckhWR?*f8dTG~s^yR{hn-eP^Ng_GiO|<(AARc`H z)BL4tzpuee80ipz&e}mOt>~F^@W{)B<0aRATQj7gNw@XAR^d@oUF^?<%qmwh(7vr3 zuMq=-g5o?(!&^>23y_|$%p3=ECerVDvmP}5=^wD~ zgnP#+{8ZK@S9-aD=XgZb%pOMBfYpS}1+Fevbrnn<(|17Hy)=XAxmtcBmt!rf6+_)8 z>r%h-0+K5V{A^P9&MD)g(04IIPv%ba{Dd)gBFr4`^z@}HJ^BAbGwjtC$vc?qAgu&e zW;yF$I#cX}SHYy|rH87ii7+7Z1WMI{R3e{#SZlZ7+Do8%k~6^Y`dp)rwYEXiKG=W4 z`JAD0{SdVLS6ie7CEF0S6VuoxYd7vJ1wg;Sbb?wus~j0wNj7^S*tep%A;*5h zD<(2`(!g9nn!on6oMP+2U7T#)N5+1Ski5aU_9KkqY!H8P@_(NiG-1sH-BADl002ov JPDHLkV1j|0tHA&O literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_me_about_us.png b/app/src/main/res/mipmap-xxhdpi/ic_me_about_us.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8691fe1d90d620fcd5ba881800f5882aeb0383 GIT binary patch literal 3390 zcmV-E4Z-q>P)Px>_(?=TRA@u(ntyCp)fK?cx%d6}{_3~1&;qrfqZCK$085=^z)Xh<8urU2WXwfp zrm!WO$;?c2xTsOb7UveTB^%DUNfuc!b6aLMpst-mrEV=h)OH915lV$ZzqH@q@5jAo zyYGEr$Y}e0-!J^(#!H&Ceea!jKKGn^?z!h&g#WV(|Ic{g67c`J#V=X-l7-6{0V0Y) z2BNMBjYu#TB`hQcQ3lXVN-jYkAY@2DFKO@(&4T?9g$yF5%lPcLuU-_FcJuB{M0_zI zECGP4H520R(?WW%0Q~*B2^*3`vv@DSwO%F9X5|A^?&4 zQG@{C{lhmccngI0$C>}D+lUCHUINMz;8BM7H9dseE);m#z(mCJBQOI@@mwg(7g;$f z0HVjI02G{*(gh$J0bO7KAPdk48W9{(Z3{xg$HP&!4iVi_iAx5i5vs~?cRLU?`>yMo#56Uq zEun(WJ$c98Qe7P$M#O9}3KCHymxF3>NbM8B-QRe{w_y!_Y`_@L!dx+#QO=^q6 zRd^`qcLD>SJZa6%piWEKhUtgbOPT@283 zWhPEos{!F@0El?O(TDDJRc3wV+fcJWe5uIX)#duEDmIx^6Ad(b&MJWTPhA+{o8ZJu?Ax^p&PK6x@Gg8-{JJ)^Gq zS>(7{MQ=klz;T`Ksnf!XCXzED@Zey2d1XAhC7I0m$sj>Okh`e9J{~w4ClXZ2nbXOT zwUC+=l6DHxKT%zcqZ285?)`y*+7Q>t+NVP3agVdZ1K}g>P2oWD+O3V4Gv@;&<*nu+qMchxZHnPeQZw2 zz()>^-i(_5Jdunrt{qNf?DJB^9tCpa-EFx7Bzs9pw}?Wl7W@nBZo5?##n?v zszfgh$UaqHAMP4U$8jxu_)zLm#@RYGPol9HWYgI-GcJ$*tQ_E6Hrt8FT9kGqsW)$1 z%NiQ01H1HT9o~I6b$2Wpdoq*B_*MpZZ05|U%FxbxjR`z7M6ql({UT%RI`Wfv*KzGx zvu95}QY!F)1Bpt`^-kuww6~n}y236Ccwit~FI@2s0BFdV+J(IwibPk|)}FtJFedQ9 zgXyUNaz7$g6q4mFrWyTQU0rb-f%6TD0w&^}oSk-Q*^4O30v;Tsh-IaIgUD7$Z_5cO z0BoE!D|Y;RI*bW?;6QRoJYKOqnM?sgrn0KE0 z$tO7H_XyX8cx4=t$<)$@hWIOifdBc=)S7TOydj&-D8*dH@UGdj)6kW7-1ObpaTRkbw5)=BnN00z1;_WWZVg)v_deHExs*+}}UihA6iZ zKwRS*xI*k~nmcJ>AmF~f#4fIB3)H?Bh>}9kih1)Ut5mM!OIbK)TYhS(GJb&GykRW6 zq0Bj~fC=PQWnoRz)Ru8)Q&Uwi;5Xhp`76^5-D+Dl08)|(y0Llwl(Jm9qbE_RXY-w) z5)TiUdR;5G?1mc}N=`h~=8q})3g*(g-x%HyGR-xXW%)H? zhPN!ZYI0dYtD_@P2|U}$3Q<}uOC<7T1MhxocsWXX0RSVWX@YH8PtBV*Iatuzwd=&1 zNHn$~m&>Xo-$j7CuD*IoS<6yK$ALjs4OqFx!do2s5l$CgF-rQ$|W6@_qq3Es3p{;yw4F8-!4i)*-#k9mvYD4!`t1+7g{1Sj*4DbB zYRqFrwm<%HIPQq#9qPW$-Cx{%b7P>*|G9E|dIlrNbT73m?6Fg(AsavPk*UE_%f7y$ zST>I@BI0#ww}gm}p|M%>=T9CeIZR)K7rXZi*KTaj zXeqVgp=5Nwemo6~MGITlG!pw%TU$+O1pp=RweI8lh@epw7IobO+qS;Fc+s?yN<4=T zr+yL+MZTh{jVkd7hr?jy^FOVh8U1R2aXa(qj=vpyfHUI}*H!7S*JjjcZLRds6{MrGY}Y{msqQ%|T^#cMmnX zQg-`AJc3xP5|ZiEijRM6YI#LGrO5VIj_u%@*5S;V5LS^mjk@(P{Sw0p8HlqtCVKo<(4*{eja#xNi5-CDY0;(<()}y575j zX>?GT*sETeAyvKnQu~tWfeP`PyM|(ugw+Men!FAMQ2z)|wy$b$4s@pDFWZmaVH)9Q zY{&AZ1_F|FVOD$l^b1pn-@JJhx zNu4_N>TS2p&jfkDtLy0JxuI>6Li$G|yjBZ6esbv5`&X@6HR0)i3G33QmFemtP2%7l z##mEfT~;5=GJ-D$g$@FE_OmZ_9sN8q_&EYb6s%Wz0@=@G-Te0U;!Xt=4Xi%=;`Vo| zOjmoGGghOZy#YpY1i)Q~_8og}?b?geF5R%9N1t`&^e<}2pAk}==@Cmw$Mc#qcjeN{ zi#`ny2v|XPbR3#XOe-|RRcn}m+LBpTZWCzcgEw9mJbI63@og_3X#|%&Y#7FB$D6b2 z3<+0!9eMDNG6587&&Lgow-pnl&efwNU~j3~K2nv+C0{|nrb6q}Yqsfzw;#=LhW85x ze=7t_eDagUZ8-k$hrtNvvKlyj77^C#x*l~LRez5$j;*uX_3`c~gIRIB>Ek=`s6qhmJ zR{=m1A}kAqqPk_NeYoE%*E9o!aMTX^`w?U2w~7r==kv0XEqq#-TC((tYi1b0H-)3I zwrn24RqYA5yg zBgHH|<4vcsfzKBHyFb0NoDusG0H}jzF@KFb``F>xM-9*ayRQ%eA*4Zy_auX_f99qS zl~r20U@kq@NdErCfp!A-dPG=EL@m*1WreCns2_Ftu1a3CRo<-*r*N)ACY?+ngPlb1 zDgwOp>6KTEx$7x4C|*ztpR0sQCCy|yDv&oK6HOp-;lIyyM3J#(Z*vILM}!#$)Jwqo zIf?yNJeFD2e*VpSsgM`l!WTlZizVZtTKHlqU5?yKz~zkI2jSgI7XBbusT>{u1-%Y5 Umz=Mo2mk;807*qoM6N<$f*v|>{Qv*} literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_me_private_policy.png b/app/src/main/res/mipmap-xxhdpi/ic_me_private_policy.png new file mode 100644 index 0000000000000000000000000000000000000000..74cee1a5ec413e1d63b3b2e2301d66939199f6de GIT binary patch literal 3911 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/iv_play_vt_episode_left.png b/app/src/main/res/mipmap-xxhdpi/ic_play_vt_episode_left.png similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/iv_play_vt_episode_left.png rename to app/src/main/res/mipmap-xxhdpi/ic_play_vt_episode_left.png diff --git a/app/src/main/res/mipmap-xxhdpi/ic_playlist.png b/app/src/main/res/mipmap-xxhdpi/ic_playlist.png new file mode 100644 index 0000000000000000000000000000000000000000..394b07e389ef30027301e0fc09af4eb6592e1937 GIT binary patch literal 2437 zcmV;033~R4P)Px;KS@MERA@upSzBxr*BSo*b7tnu&hDC<>=-ZvH!&CtK?;t8L=;Mpl0Xuu6bMlp zh2#YYQdIr9NCY?(g@U;R4A=qJ4vz6&W@hJd z+B37W7kh2*&8T7?RNaG=KZH3EeKjJ4y;pKm@)+ zM5_{j6@f96{AEP<1wh;(Gt|HZuu>d22gvArl6SGNtRMgZune9A;DeJ-x?=Yp0)QfLOqfFu0TIFF+yKt|fRe4MidRboRT3D^Inxu?UPYGo z+cpQ+bv+FrAaDVu3hx4dEE7ms*1k|!K7fd3v7m|ubMKzfB%$n$L=RK-#DvIozyW*3Pu?F$X&CG5b~Vs1_Ua{R|QK{_AMb4 zT-P}^cOKh1nNye)%a=ol z*F{id84|kHyl|mZ5-iU0APMj<$J9lzw%;Z5#x+8NSVf=`3u8u28(|4P2%?| zQ{PCXOpkHJ$SJ%o=rY0Wwe!^va{=XPrl*I?^XrqHgpfDA=w89YmMV=)A#g3Q)pBVjG-H@%$Ku7| zw}PGDx|L{G8QbH7DUW8J&H3s|O0wHnUmqO`x=EEiALT_Boi54Pjo!K4NW)h z(=64o_~9&=n>Sg7lMl*eVv38ZIo@R=b6Kr(+d|6h&vdp7P8f!B3Q=VpS-?q57 zkO-1_308Vq#%hCvZ1QoBW`^1E$Rk-W*RI9dRh8{A4WnZDVtY(suwbDmin2+F_jc`C zqE%IuGrF!9P;0J=i+dNEF-@c6(MM-xH1qY>qiLE6Z&sX~ETt#T*E9_h33E+TQ}}F< zX?b9-U%&SnrR+n2MYyKtQwR<}8>?mqvY>1qW7zHB8gqy=+=xD zmqrg0LSAtkH-~1qsea(W#+Lwv$2|v-GCNk}fVp^aq+L~oHw$Q1zI>q>Nupp`){zw} z=I+P?)7v}xCql>%ZO5tby!_9FW`xbOteBgjS#R%Xrz|VG%v8~p@RWO@lBjj;KesHO z`=dNC=P%qnED`AyFL$aar1{}6pxLTbSup3%kNm8rrskJpv9St5W;WasQMkGGkyS18 z@-_3-SEIWWCUpu5RHKSyiYns3!IdlL?hcOk$PrGLHIMw3QnE8hmnvDy^O%OQ`?1I7 z<=f1;^WVP4WHsx}DkK}FUjB4TPugv3*FN;0K-|^tt1Q_tr&H6SJCn({m&2C36jN2u z6UO$(AD@@+&CZ@3Zq>r!GrFG4$!Pt0YGUSE+&Cfu;O-S!R@b+*L^2Ht&N(@EZe)Kr z68UL79xGeEs%nrj6KhtluFa1#;&lFfA;yJqdS!l<8W#eP!`)LdvA3*VU7tw`f6h61 z@n3g;M-Xnyp+BnV10xFlW9T>Xs#Clc+GO_i#`{8ko9%$_?=!w6)Y_G}P16 zBLhBs43TUowd9ax87w<>^occfg>$phr-ycEk;r?AM7(-f(vs2*i7UuqeOp@=(C25q zZ3~CgQ-+=_Y0Ypr0?By%)wZ^}!ddgllY@0s!W)1Xs6d~!I#uf=&xRlQ$nMI1L&^JmjrV1;*9ts)Na~~4pJmj-IKMG_W%N6pL{-e5doG57cHW}lc-N3lP}Ki4%SGwk!7%N@t7m;C?^B z{ftbkznF$wU;&ptajwQ~1dlxBhty1O~!*uPg+ z}aNC@_k*=fHml34zfD5Y#At4dLE4@1RE@L^@ zUEt?AIInNr^t}mjWV*vBNi*YxeeltZ7igyWZr}hr6-C{Y&b_>JN4WHK zi~vey&mR1kl00000NkvXXu0mjf DGZmcP literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_search_empty.png b/app/src/main/res/mipmap-xxhdpi/ic_search_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..e48ea4203f275bf68fd30aeff51569ee2d3e3f24 GIT binary patch literal 78068 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

;0?0p=xK=s>cH-k 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_series_play.png b/app/src/main/res/mipmap-xxhdpi/ic_series_play.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7e9919f97ffd0c5ffbf580232483e28af31929 GIT binary patch literal 408 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 X8dgv<#&$o000000NkvXXu0mjflPx3K literal 2978 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 Y3kk{nhCGXc?EnA(07*qoM6N<$f^>4Y82|tP diff --git a/app/src/main/res/mipmap-xxhdpi/iv_vt_collect_n.png b/app/src/main/res/mipmap-xxhdpi/iv_vt_collect_n.png index f69a1df6cfdedb8288ed35cdd486d28c84aaa76f..cf88577bcc62bbe50c424345a31160dea25ebc12 100644 GIT binary patch literal 2485 zcmV;m2}<^fP)Px;Z%IT!RCr$PU1`jnMHPM?Kq{zpmuR$*x&|Xre<(;zS_MIIX`?pSR#PFijaIF( z7R9Q?1!}}90g0dlTC^@91gL^bjml<%Yw8-8)Z)U@f(v!4%VD0+bHCp2_WkaCmwA`_ zbtd`JH1~aH&OFb|nKNh3oR>(YRRq{->#1=h0$LsfiGV~v%LugGe3}7?fR+(xx%o5$ z4kiN3>_Gq??S0-ua&OE1pJ?999t_}7F3WC`e``vv=rh2~jsWlw08apL5`bp{I2ORs zz=YZRKkwWj01gFkJAj`8_yK_H0Q?caUXuTg34)Wa0U%kP58${yx&AvKmjU=KfS&>Q zVR-%<0DcGHK9c{8DOWTC%0gOUI5@ZJ~;kULasYQJvRf`4qzL}zf_T{_ikkZ%?GkY?CYu%1c zz!pP5*!}^)OGs*g&MeasU}mzvF9GnP7Ob6OUG47E!dGj-*(9~GJfI9C;8Xyg2hf;f zs=GK=l1!d~lS%H#O@NunnWh&s3%X!gR6?NTmqox%lE)Vz-~s@$`7@_Y%N-iW<~5Mt zN%GT!!XKc5%uH_M8`8oXo#(sdjUDu5WfAZO-&Kw@QKO4Evn!Mr_01%=^>=d$$bOje zso-^dVawb4nMj5FSh9$uiY7g@g9IEE%+6bbXHTx?RN^8atbY?+*DoVE=}Q|VKu3sI z>*y_R+o?83KxYVA2PWO=g9LmWz_NyX=?5b#M}|Y9w~^Fo+C&*7;6?yXanItx2vFU9 z)(qH6Qr_E40`BUNTeog7+NfWfvK=H(K7ar-(}B7|FFFyc(*`;Xv?-0VFQ}knvItNV z!LO6=r*;}mWvUff(XoiY_sIiZ=cW3+>m_@P|2z{pvgDdb zB_0Cz0yu5(4ngL@yP3ViuN^gU$st}ByIYgY&&}cXrEr~6hDFBx$^%T(VqA?_VXQ;= zxmnk%h7s^80G~|9lhx4o0Ed+%uga=v7y%R0Ms{loQ7KJ=To2z-l;L!j_(p}NKhZD7 z=`cB!;t2fR!%%)PY;!QQS~GiPNH6e-v@a-(zV=k_C3)$vH*Ab+-Q$fvR&0mai^9#Zh={&Mb8h5%VaBH_i!Je|Z@BVU&p*Az`> zQA82V0q~5ZjwW&*{RqG!l7+QGDFU1Xg|S@e>0k;soO_OT`$3&>$#MBQlBFWb zOB3KEDE-)HeI~S-r=bm+q;_}8}E`~}O zy($ynBq;xyA}VylW~Se))SgHqUTQ~q?kbfi1ULy#4GH?RFe^RSOq~hBOVQ&CN9BOX z%Sto?oCIC&Q!*z-|IS1bACv?C3_?EeVX=%8HL&QO3Dew9UqVFf+CF zQ2?*+@S32!K8j+{MynAEt}z09Cdi!AshUDvx~7hV#ZQ!uxrvcqyBRv&RP;3WTS8K( z=X!ekqO-P+=cOWbL-f@oby>Z!(&!B6^~y7^e=Tg*l-s}U>ret;>FDQGaVwW)tQ7)W z9m!v$)M&bu)0R3?{}r`-D#_oM1+mI|tr6fPC^4*3zw0cajRPH>jXFnQbSTlO}Vk9@|KbOR%^(6!<`_&Nzj*#6pgK! zP*)M~ax1STxwWoFiqzW~0-OYWlSVV4u7n}-?+AQlhU`S?6ah|x5(iGX$QB7HnVT2X z>DeqJXXglT63z@?#`sXg108|Ch2*+2Al3O!Ckb#8mU;-JOvNhu1cg#c-z#fvlU7zP z-a1Qwlkjx^XwV$*OZIDLhScd~Sv04G7|6ZDlN-PBR&i$0j9*rTk`EDJ~B zg8FiW{P~JjF8pn;CYkCy0X;C>iT5l8!3LM{DINsY?=qI2-{ql_a`q`NPu>~RB<54v z8XE!z5i&C+mg;36ltXXVsLvd>hVqbx$CiLDf>}nUL_itTBEFLdhzMqxsuBTZP>c9Z zA|N7|WvWU9ltC@xJBfgZV3w&W5l{xTi0|AFBH&hkc~_RX00000NkvXXu0mjfgZrAx literal 2375 zcmV-N3Apx&P)Px;0ZBwbRCr$PU1iK&MG!p)cPQ@eG*}3ahCuAQZ&IO z1lK~bAOQk2xJz*z?n$-;%9ATQ_uc!xJITxUBKcX)_N6wf6EJ53IJls7Mw2|OppH_S*8&(bn;pOx zkt{Mh$*&^ma#K?mVB~h$CXyA#kQ^3Cmz$c(17l`O19-ZHKP<0Nz5y_VZO@97j^#=t@e}fsxl(C-!+GTkqrGL;E(e-e~Ho4$OW4E{rzY|0>#t z{JIu9{%J%>)Me_HO z`)%7@)quGRz@|Mi&g~?(>QUeS>$a!B1ec30z;sr*1i_zKO}W1Ek)dbF*9v-wX<3& z{9P8ntiek>a}umKV<|H%-pTg>z6)N6uY>RI1pqJVFp zivGrSJQg>xkA{!J>UuK#RcMvG)^hb&Uf@y#V`kF`Gokalp93<5A^8s*J1|5)I+@KY!k(9I-I>Smjc zzyzO_VzCByQ`G!FlLcM^uyzs{qW4!zX$y>*DNN{A0Gnm%vUxbI1#U|Y)5Az=HKjkt zn3)2xZ%^Ax^IR?qv~>k_S}`#rQ*w=Z05rOSWXs6XPQd7Jwa5T4PA{kU9LZI){*)=% zM0eHr5OpWGnt*uu^rd^r5zE=R) zwK1WK1>{X1*)A=l+W}K<7#)V>ifJUC1>Od*BFUfHsqE^KF*Dtj$OW$4$3}`<;1xM} zN$Sq0t#k!OEzNA6gn2@@i)95!6rX-IHR!rvGm@Wl8(u140yqmKN}mTXXE&wI|65u> z4$M_ZevrmKseuXL=v|{|61n{wNpAtU{nsU_cS|bC1WW)&cQE%fcQC2!tA~^~x-m)J z&!m>jzyxq~OL=dNu7^__B=UoD>u*F-o2N{Y3zz_oC_}~o(3ZN9|64%u(8EdIna4P} zfeGL!YEt(KUa1m!=2V3?I-hJ#@}azgDFjRaM~S9a7s$WQJNBx!Q~1-)ByTD*z{0=; za1KnulFk7JJdd-o2M#59UJ+2#HVQBSoL$1oDLSS)x8ISZqB#poG++WahXXjRguIr* z6OXJwF=U666njS$i3&^rM|6mXMj2gwltiaOi4IHv=a?iGS^4<`L5?D+Ux}#V1&r=; z&PZZ@MJU?OqIAR~JgBx@fSHJdndM>Qs|%2>tbyLZ%$D5Ji37PGMH~Tc%o?u1g!he@ z_4e#DWG+akwGQx{QyIYQ5n=~C=TWxq?MdF~*=ZTTY#sb*p7SVMx7_&md3IU`Fe8#% z&sx&BcQCw2PZj0jCS?F~DS*A*X3!hOmn5X8`og(M8NfW7+<3N(&vl!Xzv8x`t+Bc; z0~qCh^jiknuOz351wt!5uE3a?0BM<+<2k94bWi2Uq~Q(BS_y&9V~7X1sZ3=T z@djojfb(5O-g~94MT5M7xiSgg*}eBRbQwY0Y_J%;c>^=9kHc!mkyODt7jXk75cnt@ zv|pn(KO#B53o0@1{3jitnJt)v@My(|m%krHUh|bme&{hd&lS_}(VAjnQk13W?W2n) zFybD&rjO&zqQsB2L(~%(Ma<}Wxu4}QlDb}wE-t`?7r#PzMAO^Pat=wCxCSp^gzg5%s&0K*fJqhA6sTgl!TL z+?ACYqH-t7K8{tU>mOTr0i%Ogs$9c@sEI94?=eNz{}FVlipF+HrHgZuaNTJO>QB>r z{)DJUseDnz3m7rOdKLo}v+E7rD)c3+wc0TaPwHo?RHK&+B^jMT#0wauW#}6lTXd*X zp`WYM))+Ihr2r@sL7r|8=Gy&8s&Hyl@dD;50J}vUDIn6Jqr`!nm8d#w-?eIVuG%s3 zxGpCdJ*L467*(@SUF4#oZK!rWib{!6UEIvXdaG}^;t*6zpr|}Ta^0dzCT;Hp%oBls zxyX1Gw{=n8kJoMU+=Ke3J1iqX%-s~HC-K$HMk_P*-Pb3q8B^$0!F{x%0*05 zhFA9)DtmZYuPcX}nO2QnA002ovPDHLkV1jYrSm^)& diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 817af1c..30acc37 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,4 +10,5 @@ #D2D2D2 #F564B6 #333333 + #FF4233 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9ea267d..a5407f5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - VionTV + ZyreoTV Home Explore @@ -12,6 +12,18 @@ Hot Picks Top 10 + Enter the content + Search History + Search Result + No Search + Hot List + Series + No Data + Play List + Privacy Policy + User Agreement + About Us + Network error please check the network \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index acb052b..87046dc 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -2,8 +2,9 @@ \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 667d239..8b4ef0c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,11 +16,11 @@ okhttp-logging= "4.12.0" constraintlayout = "2.1.4" lifecycleLivedataKtx = "2.6.1" lifecycleViewmodelKtx = "2.6.1" -refresh-layout = "2.1.0" -refresh-header = "2.1.0" -refresh-footer = "2.1.0" +refresh-layout = "3.0.0-alpha" +refresh-header = "3.0.0-alpha" +refresh-footer = "3.0.0-alpha" banner = "2.2.3" -recyclerview = "1.2.1" +recyclerview = "1.3.2" glide = "4.13.1" avloadingindicatorview="2.1.4" media3 ="1.4.0"