diff --git a/app/build.gradle b/app/build.gradle index 5a684d6..1ac0c93 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,31 +17,28 @@ android { vectorDrawables.useSupportLibrary = true } -// signingConfigs { -// debug { -// storeFile file('viontv.jks') -// storePassword "android123456" -// keyAlias 'key0' -// keyPassword "android123456" -// v1SigningEnabled true -// v2SigningEnabled true -// } -// release { -// storeFile file('viontv.jks') -// storePassword "android123456" -// keyAlias 'key0' -// keyPassword "android123456" -// v1SigningEnabled true -// v2SigningEnabled true -// } -// } + signingConfigs { + signs { + storeFile file('zyreotv.jks') + storePassword "20250416" + keyAlias 'key0' + keyPassword "20250416" + v1SigningEnabled true + v2SigningEnabled true + } + } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + // signingConfig signingConfigs.release + } + debug { + signingConfig signingConfigs.signs + minifyEnabled false } } diff --git a/app/src/main/java/com/viontv/app/VTApplication.java b/app/src/main/java/com/viontv/app/VTApplication.java index 93da632..fa14736 100644 --- a/app/src/main/java/com/viontv/app/VTApplication.java +++ b/app/src/main/java/com/viontv/app/VTApplication.java @@ -19,7 +19,7 @@ public class VTApplication extends Application { public static VTApplication AppContext; - public static boolean isCurrentPage = true; + public static boolean isCurrentPage = false; public static VTApplication getAppContext() { return AppContext; diff --git a/app/src/main/java/com/viontv/app/api/VTApi.java b/app/src/main/java/com/viontv/app/api/VTApi.java index f8a1c99..254f909 100644 --- a/app/src/main/java/com/viontv/app/api/VTApi.java +++ b/app/src/main/java/com/viontv/app/api/VTApi.java @@ -51,8 +51,9 @@ public class VTApi extends VTBaseApi { //错误重连 builder.retryOnConnectionFailure(true); builder.addInterceptor(new VTHeaderInterceptor()); + builder.addInterceptor(new VTBodyloadInterceptor()); -// if(Config.IS_DEBUG) { + // if(Config.IS_DEBUG) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> { try { String text = URLDecoder.decode(message, "utf-8"); @@ -64,7 +65,7 @@ public class VTApi extends VTBaseApi { }); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); builder.addInterceptor(interceptor); -// } + // } return builder.build(); } 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 3c63961..d6c552b 100644 --- a/app/src/main/java/com/viontv/app/api/VTApiService.java +++ b/app/src/main/java/com/viontv/app/api/VTApiService.java @@ -24,7 +24,7 @@ public interface VTApiService { /** * 正式测试服 */ - boolean isProduce = false; + boolean isProduce = true; String URL = isProduce ? "https://api-zyreotv.zyreotv.com/7834f11d/" : "https://test1-api.guyantv.com"; public static final String rankTop10Type = "most_trending"; @@ -34,37 +34,37 @@ public interface VTApiService { /** - * 注册 + * * * @return */ - @POST("/customer/register") + @POST("customer/register") Observable> register(); /** - * 首页顶部 + * * * @return */ - @POST("/homeTop") + @POST("homeTop") Observable> homeTop(); /** - * 首页9宫格和banner + * * * @return */ - @POST("/homeBannerAndNineSquare") + @POST("homeBannerAndNineSquare") Observable> bannersquare(); /** - * 首页底部列表 + * * * @return */ @FormUrlEncoded - @POST("/newShortPlay") + @POST("newShortPlay") Observable> newShortPlay(@Field("current_page") int currentpage, @Field("page_size") int pagesize); @@ -74,44 +74,44 @@ public interface VTApiService { * @return */ @FormUrlEncoded - @POST("/homeRanking") + @POST("homeRanking") Observable> homeTop10(@Field("type") String type); /** - * 获取视频详情 + * * * @return */ - @GET("/getVideoDetails") + @GET("getVideoDetails") Observable> getVideoDetails(@Query("short_play_id") int short_play_id, @Query("video_id") int video_id); /** - * 首页TabItem Banner + * * * @return */ @FormUrlEncoded - @POST("/revenge") + @POST("revenge") Observable> getTabItemBanner(@Field("category_id") int category_id); /** - * 首页TabItem List + * * * @return */ - @GET("/videoList") + @GET("videoList") 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") + @POST("createHistory") Observable createVideoHistory(@Field("short_play_id") int shorplayId, @Field("video_id") int videoId); @@ -120,7 +120,7 @@ public interface VTApiService { * * @return */ - @GET("/search/hots") + @GET("search/hots") Observable> getSearchHotList(); /** @@ -128,62 +128,70 @@ public interface VTApiService { * * @return */ - @GET("/search") + @GET("search") Observable> getSearchContentList(@Query("search") String search); /** - * 搜索点击上报 + * * * @return */ @FormUrlEncoded - @POST("/search/click") + @POST("search/click") Observable searchClick(@Field("short_play_id") int shorplayId); /** - * 首页推荐列表 + * * * @return */ - @GET("/getRecommands") + @GET("getRecommands") Observable> getExploreList(@Query("current_page") int current, @Query("page_size") int pageSize); /** - * 收藏 + * * * @return */ @FormUrlEncoded - @POST("/collect") + @POST("collect") Observable collect(@Field("short_play_id") int shorplayId, @Field("video_id") int videoId); /** - * 取消收藏 + * * * @return */ @FormUrlEncoded - @POST("/cancelCollect") + @POST("cancelCollect") Observable cancelCollect(@Field("short_play_id") int shorplayId); /** - * 获取用户信息 + * * * @return */ - @GET("/customer/info") + @GET("customer/info") Observable> getUserInfo(); /** + * + * + * @return + */ + @GET("myHistorys") + Observable> getVideoHistoryList(@Query("current_page") int currentpage, @Query("page_size") int pageSize); + + /** * 获取观看历史列表 * * @return */ - @GET("/myHistorys") - Observable> getVideoHistoryList(@Query("current_page") int currentpage, @Query("page_size") int pageSize); + @GET("myCollections") + Observable> getFollowList(@Query("current_page") int currentpage, @Query("page_size") int pageSize); } diff --git a/app/src/main/java/com/viontv/app/api/VTBaseObserver.java b/app/src/main/java/com/viontv/app/api/VTBaseObserver.java index 55e117e..92b6fa0 100644 --- a/app/src/main/java/com/viontv/app/api/VTBaseObserver.java +++ b/app/src/main/java/com/viontv/app/api/VTBaseObserver.java @@ -10,7 +10,9 @@ import java.net.UnknownHostException; import java.text.ParseException; import io.reactivex.observers.DisposableObserver; +import okhttp3.Interceptor; import retrofit2.HttpException; +import retrofit2.Response; public abstract class VTBaseObserver extends DisposableObserver { /** diff --git a/app/src/main/java/com/viontv/app/api/VTBaseObserver1.java b/app/src/main/java/com/viontv/app/api/VTBaseObserver1.java deleted file mode 100644 index d03c6ac..0000000 --- a/app/src/main/java/com/viontv/app/api/VTBaseObserver1.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.viontv.app.api; - -import com.google.gson.JsonParseException; - -import org.json.JSONException; - -import java.io.InterruptedIOException; -import java.net.ConnectException; -import java.net.UnknownHostException; -import java.text.ParseException; - -import io.reactivex.observers.DisposableObserver; -import retrofit2.HttpException; - -public abstract class VTBaseObserver1 extends DisposableObserver { - /** - * 解析数据失败 - */ - public static final int PARSE_ERROR = 1001; - /** - * 网络问题 - */ - public static final int BAD_NETWORK = 1002; - /** - * 连接错误 - */ - public static final int CONNECT_ERROR = 1003; - /** - * 连接超时 - */ - public static final int CONNECT_TIMEOUT = 1004; - - @Override - public void onNext(T o) { - VTResult1 model = (VTResult1) o; - if (model.code == 0) { - onSuccess(o); - } else { - onError(model.code, model.msg); - } - } - - @Override - public void onError(Throwable e) { - if (e instanceof HttpException) { - // HTTP错误 - onException(BAD_NETWORK); - } else if (e instanceof ConnectException - || e instanceof UnknownHostException) { - // 连接错误 - onException(CONNECT_ERROR); - } else if (e instanceof InterruptedIOException) { - // 连接超时 - onException(CONNECT_TIMEOUT); - } else if (e instanceof JsonParseException - || e instanceof JSONException - || e instanceof ParseException) { - // 解析错误 - - onException(PARSE_ERROR); - } else { - if (e != null) { - onError(409, e.toString()); - } else { - onError(407, "未知错误"); - } - } - - } - - private void onException(int unknownError) { - switch (unknownError) { - case CONNECT_ERROR: - onError(CONNECT_ERROR, "连接错误"); - break; - case CONNECT_TIMEOUT: - onError(CONNECT_TIMEOUT, "连接超时"); - break; - case BAD_NETWORK: - onError(BAD_NETWORK, "网络问题"); - break; - case PARSE_ERROR: - onError(PARSE_ERROR, "宇宙也是有尽头的"); - break; - default: - break; - } - } - - @Override - public void onComplete() { - - } - - public abstract void onSuccess(T o); - - public abstract void onError(int code, String msg); - -} diff --git a/app/src/main/java/com/viontv/app/api/VTBaseObserverPrize.java b/app/src/main/java/com/viontv/app/api/VTBaseObserverPrize.java deleted file mode 100644 index 50a54fd..0000000 --- a/app/src/main/java/com/viontv/app/api/VTBaseObserverPrize.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.viontv.app.api; - -import com.google.gson.JsonParseException; - -import org.json.JSONException; - -import java.io.InterruptedIOException; -import java.net.ConnectException; -import java.net.UnknownHostException; -import java.text.ParseException; - -import io.reactivex.observers.DisposableObserver; -import retrofit2.HttpException; - -public abstract class VTBaseObserverPrize extends DisposableObserver { - /** - * 解析数据失败 - */ - public static final int PARSE_ERROR = 1001; - /** - * 网络问题 - */ - public static final int BAD_NETWORK = 1002; - /** - * 连接错误 - */ - public static final int CONNECT_ERROR = 1003; - /** - * 连接超时 - */ - public static final int CONNECT_TIMEOUT = 1004; - - @Override - public void onNext(T o) { - VTResultPrize model = (VTResultPrize) o; - if (model.code == 0) { - onSuccess(o); - } else { - onError(model.code, model.msg); - } - - - } - - @Override - public void onError(Throwable e) { - if (e instanceof HttpException) { - // HTTP错误 - onException(BAD_NETWORK); - } else if (e instanceof ConnectException - || e instanceof UnknownHostException) { - // 连接错误 - onException(CONNECT_ERROR); - } else if (e instanceof InterruptedIOException) { - // 连接超时 - onException(CONNECT_TIMEOUT); - } else if (e instanceof JsonParseException - || e instanceof JSONException - || e instanceof ParseException) { - // 解析错误 - - onException(PARSE_ERROR); - } else { - if (e != null) { - onError(409, e.toString()); - } else { - onError(407, "未知错误"); - } - } - - } - - private void onException(int unknownError) { - switch (unknownError) { - case CONNECT_ERROR: - onError(CONNECT_ERROR, "连接错误"); - break; - case CONNECT_TIMEOUT: - onError(CONNECT_TIMEOUT, "连接超时"); - break; - case BAD_NETWORK: - onError(BAD_NETWORK, "网络问题"); - break; - case PARSE_ERROR: - onError(PARSE_ERROR, "宇宙也是有尽头的"); - break; - default: - break; - } - } - - @Override - public void onComplete() { - - } - - public abstract void onSuccess(T o); - - public abstract void onError(int code, String msg); - -} diff --git a/app/src/main/java/com/viontv/app/api/VTBodyloadInterceptor.java b/app/src/main/java/com/viontv/app/api/VTBodyloadInterceptor.java new file mode 100644 index 0000000..90678e1 --- /dev/null +++ b/app/src/main/java/com/viontv/app/api/VTBodyloadInterceptor.java @@ -0,0 +1,40 @@ +package com.viontv.app.api; + + +import android.util.Log; + + +import com.viontv.app.utils.VTDecyrptUtils; + +import okhttp3.Interceptor; +import okhttp3.Response; +import okhttp3.ResponseBody; +import java.io.IOException; + +public class VTBodyloadInterceptor implements Interceptor { + + @Override + public Response intercept(Chain chain) throws IOException { + Response k_center = chain.proceed(chain.request()); + if (k_center.body() != null && k_center.body().contentType() != null) { + String activity = k_center.body().contentType().toString(); + String circle = k_center.body().string(); + String str =circle; + Log.i("okhttp",circle+" "); + try{ + str = VTDecyrptUtils.decrypt(circle); + }catch (Exception e){ + + } + Log.i("okhttp str",str+" "); + ResponseBody current = ResponseBody.create(k_center.body().contentType(), str); + return k_center.newBuilder().body(current).build(); + } else { + return k_center; + } + } + + + +} + diff --git a/app/src/main/java/com/viontv/app/api/VTHeaderInterceptor.java b/app/src/main/java/com/viontv/app/api/VTHeaderInterceptor.java index c3e5b31..e447ec0 100644 --- a/app/src/main/java/com/viontv/app/api/VTHeaderInterceptor.java +++ b/app/src/main/java/com/viontv/app/api/VTHeaderInterceptor.java @@ -22,12 +22,11 @@ public class VTHeaderInterceptor implements Interceptor { Request request = chain.request().newBuilder() .addHeader("Content-Type", "application/json") .addHeader("authorization", SharePreferenceUtils.getString(SharePreferenceUtils.auth,"")) - .addHeader("security","false") + // .addHeader("security","true") .addHeader("lang-key","en") .addHeader("device-id",GetAndroidUniqueMark.getUniqueId(VTApplication.getAppContext())) .addHeader("system-type","android") .addHeader("time_zone", TimeUtils.getCurrentTimeZone()) - .build(); return chain.proceed(request); diff --git a/app/src/main/java/com/viontv/app/api/VTResult1.java b/app/src/main/java/com/viontv/app/api/VTResult1.java deleted file mode 100644 index 65587d0..0000000 --- a/app/src/main/java/com/viontv/app/api/VTResult1.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.viontv.app.api; - -import java.io.Serializable; - -/** - * created by wmm on 2020/9/8 - */ -public class VTResult1 implements Serializable { - - public String msg; - public int code; - - public boolean isSuccessful() { - return code == 0; - } - - @Override - public String toString() { - return "Result{" + - "message='" + msg + '\'' + - ", code=" + code + - '}'; - } -} diff --git a/app/src/main/java/com/viontv/app/api/VTResultPrize.java b/app/src/main/java/com/viontv/app/api/VTResultPrize.java deleted file mode 100644 index 9f094a4..0000000 --- a/app/src/main/java/com/viontv/app/api/VTResultPrize.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.viontv.app.api; - - - -import com.viontv.app.utils.VTGsonUtils; - -import java.io.Serializable; -import java.util.List; - -/** - * created by wmm on 2020/9/8 - */ -public class VTResultPrize implements Serializable { - - public String msg; - public int code; - public T data; - public List debug; - - - public boolean isSuccessful() { - return code == 0; - } - - @Override - public String toString() { - return "Result{" + - "message='" + msg + '\'' + - ", code=" + code + - ", data=" + VTGsonUtils.beanToJSONString(data) + - ", debug=" + VTGsonUtils.beanToJSONString(debug) + - '}'; - } -} 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 62cc66b..346c06e 100644 --- a/app/src/main/java/com/viontv/app/model/ItemBean.java +++ b/app/src/main/java/com/viontv/app/model/ItemBean.java @@ -12,6 +12,9 @@ public class ItemBean { private int short_play_id; + + + private String name; private String description; @@ -34,15 +37,38 @@ public class ItemBean { private int episode_total; + private int current_episode; + private int search_click_total; + private String updated_at; + + private int short_play_video_id; + + private int is_collect; + + public String getUpdated_at() { + return updated_at; + } + + public void setUpdated_at(String updated_at) { + this.updated_at = updated_at; + } + private List category; private List categoryList; //搜索结果 + private boolean isDeleteSelector = false; + public boolean isDeleteSelector() { + return isDeleteSelector; + } + public void setDeleteSelector(boolean deleteSelector) { + isDeleteSelector = deleteSelector; + } public int getId() { return id; @@ -152,6 +178,14 @@ public class ItemBean { return episode_total; } + public int getCurrent_episode() { + return current_episode; + } + + public void setCurrent_episode(int current_episode) { + this.current_episode = current_episode; + } + public void setEpisode_total(int episode_total) { this.episode_total = episode_total; } @@ -180,4 +214,20 @@ public class ItemBean { public void setCategoryList(List categoryList) { this.categoryList = categoryList; } + + 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 int getIs_collect() { + return is_collect; + } + + public void setIs_collect(int is_collect) { + this.is_collect = is_collect; + } } 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 06051cd..329cfb3 100644 --- a/app/src/main/java/com/viontv/app/model/VTVideoDetailsBean.java +++ b/app/src/main/java/com/viontv/app/model/VTVideoDetailsBean.java @@ -260,7 +260,10 @@ public class VTVideoDetailsBean { this.short_play_id = short_play_id; } - protected ShortPlayInfo(Parcel in) { + public ShortPlayInfo(){ + + } + public ShortPlayInfo(Parcel in) { all_coins = in.readInt(); buy_type = in.readInt(); collect_total = in.readInt(); 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 b160244..3b8dc80 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 @@ -55,10 +55,11 @@ public class VTMainActivity extends VTCommonActivity impl fragments.add(VTMeFragment); fragmentAdapter = new VTFragmentAdapter(this); fragmentAdapter.setFragmentList(fragments); - binding.container.setUserInputEnabled(false); + binding.container.setUserInputEnabled(false); //disaple scroll binding.container.setAdapter(fragmentAdapter); binding.container.setCurrentItem(START_INDEX, false); - binding.container.setOffscreenPageLimit(fragments.size()); + binding.container.setOffscreenPageLimit(1); + binding.tvVtMainHome.setOnClickListener(this); binding.tvVtMainExplore.setOnClickListener(this); 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 6bcc56c..c414262 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 @@ -23,15 +23,15 @@ public abstract class VTCommonActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // 调用 HibitStatusBarTools 类的 pageDarkMode 方法,设置页面为深色模式 + // 深色模式 VTStatusBarUtils.pageDarkMode(this, false); - // 设置窗口标志,防止屏幕内容被截屏或录制 - getWindow().setFlags( - WindowManager.LayoutParams.FLAG_SECURE, - WindowManager.LayoutParams.FLAG_SECURE - ); - // 设置活动的屏幕方向为竖屏 - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + // Disable screenshots and screen recording +// getWindow().setFlags( +// WindowManager.LayoutParams.FLAG_SECURE, +// WindowManager.LayoutParams.FLAG_SECURE +// ); +// + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); // 调用抽象方法 init、initView 和 logic init(); initView(); 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 5c89958..f05d5ec 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 @@ -21,6 +21,7 @@ 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.ItemBean; import com.viontv.app.model.VTVideoDetailsBean; import com.viontv.app.model.VTVideoExploreBean; import com.viontv.app.model.VTVideoExploreListBean; @@ -182,6 +183,7 @@ public class VTExploreFragment extends Fragment implements VTGooglePlayerExplore } else { mViewModel.collection(bean.getVideo_info().getShort_play_id(), bean.getVideo_info().getShort_play_video_id()); } + EventBus.getDefault().post(VTAppConstants.Constants_Video_Collection); }); } @@ -220,6 +222,8 @@ public class VTExploreFragment extends Fragment implements VTGooglePlayerExplore } } + + // @Subscribe(threadMode = ThreadMode.MAIN) // public void onEventFa(BaseEventBus event) { // if (HibitAppConstants.Constants_Episodes_Series_DataFavorites.equals(event.getCode())) { @@ -249,12 +253,15 @@ public class VTExploreFragment extends Fragment implements VTGooglePlayerExplore VTApplication.isCurrentPage = false; if (getHomePlayerView() != null) getHomePlayerView().suspend(); } + } + @Override public void onResume() { super.onResume(); VTApplication.isCurrentPage = true; + if (getHomePlayerView() != null) getHomePlayerView().start(); } @Override 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 aa43aaf..4a1807d 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 @@ -24,6 +24,7 @@ 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.ui.adapter.VTTabCommonAdapter; import com.viontv.app.utils.IntentUtils; import java.util.ArrayList; @@ -113,38 +114,15 @@ public class VTHomeFragment extends Fragment { titles.add(itemBean.getCategory_name()); listFragment.add(VTTabItemFragment.newInstance(itemBean.getCategory_id())); } - CommunityAdapter adapter = new CommunityAdapter(getActivity(), titles, listFragment); + VTTabCommonAdapter adapter = new VTTabCommonAdapter(getActivity(), titles, listFragment); binding.viewpager.setAdapter(adapter); //把TabLayout(选项卡布局)和ViewPager2绑定在一起。特别说明一下,下面这行代码是官方给的,特别好使。 new TabLayoutMediator(binding.tablayout, binding.viewpager, (tab, position) -> tab.setText(titles.get(position))).attach(); } - public class CommunityAdapter extends FragmentStateAdapter { - private ArrayList listTitle; - private List listFragment; - public CommunityAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { - super(fragmentActivity); - this.listTitle = listTitle; - this.listFragment = listFragment; - } - - - @NonNull - @Override - public Fragment createFragment(int position) { - return listFragment.get(position); - } - - @Override - public int getItemCount() { - return listFragment.size(); - } - - } - MyCountDownTimer myCountDownTimer; 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 7fd0f84..46b0557 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 @@ -186,6 +186,7 @@ public class VTTabItemFragment extends Fragment { binding.banner.setAdapter(new VTBannerHomeAdapter(itemBeans)). setCurrentItem(0, true) .addBannerLifecycleObserver(this) + .setOnBannerListener((data, position) -> IntentUtils.startPlayerDetails(getActivity(), itemBeans.get(position).getShort_play_id(), 0)) .isAutoLoop(true); binding.banner.start(); 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 index 853a051..ee56853 100644 --- 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 @@ -23,6 +23,7 @@ public class VTUserViewModel extends ViewModel { private final MutableLiveData> userInfoLiveData = new MutableLiveData<>(); private final MutableLiveData> userVideoHistoryLiveData = new MutableLiveData<>(); + private final MutableLiveData> userFollowListLiveData = new MutableLiveData<>(); public MutableLiveData> getGetUserInfoLiveData() { @@ -33,6 +34,10 @@ public class VTUserViewModel extends ViewModel { return userVideoHistoryLiveData; } + public MutableLiveData> getUserFollowListLiveData() { + return userFollowListLiveData; + } + public void getUserInfo() { VTApi.getInstance().getUserInfo() .subscribeOn(Schedulers.io()) @@ -71,5 +76,23 @@ public class VTUserViewModel extends ViewModel { }); } + public void getFollowList(int currentPage,int pageSize){ + VTApi.getInstance().getFollowList(currentPage, pageSize) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new VTBaseObserver>() { + @Override + public void onSuccess(VTResult feedbackResp) { + userFollowListLiveData.setValue(feedbackResp); + } + + @Override + public void onError(int code, String msg) { + Log.i("tag===", msg + ""); + userFollowListLiveData.setValue(null); + } + }); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/viontv/app/ui/activity/mylist/VTFollowListFragment.java b/app/src/main/java/com/viontv/app/ui/activity/mylist/VTFollowListFragment.java new file mode 100644 index 0000000..dd4c4f9 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/activity/mylist/VTFollowListFragment.java @@ -0,0 +1,221 @@ +package com.viontv.app.ui.activity.mylist; + +import static android.view.View.GONE; +import static android.view.View.VISIBLE; + +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +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.GridLayoutManager; + +import com.google.android.material.tabs.TabLayoutMediator; +import com.viontv.app.R; +import com.viontv.app.api.VTResult; +import com.viontv.app.databinding.FragmentMylistBinding; +import com.viontv.app.databinding.FragmentMylistFollowlistBinding; +import com.viontv.app.databinding.ItemHotSquareVtBinding; +import com.viontv.app.databinding.ItemMylistFollowlistVtBinding; +import com.viontv.app.model.VTVideoDetailsBean; +import com.viontv.app.ui.activity.basic.VTBaseEventBus; +import com.viontv.app.ui.activity.me.VTUserViewModel; +import com.viontv.app.ui.activity.play.VTVideoViewModel; +import com.viontv.app.ui.adapter.VTMyListFollowAdapter; +import com.viontv.app.ui.adapter.VTNineSquareAdapter; +import com.viontv.app.ui.adapter.VTTabCommonAdapter; +import com.viontv.app.utils.IntentUtils; +import com.viontv.app.utils.TimeUtils; +import com.viontv.app.utils.VTAppConstants; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.List; + + +public class VTFollowListFragment extends Fragment { + + + VTUserViewModel mViewModel; + VTVideoViewModel vtVideoViewModel; + + private FragmentMylistFollowlistBinding binding; + + private int currentPage = 1; + + private VTMyListFollowAdapter adapter; + + private int deletePosition = -1; + + //private ArrayList listDelete = new ArrayList(); + + + + public static VTFollowListFragment newInstance() { + return new VTFollowListFragment(); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mViewModel = new ViewModelProvider(this).get(VTUserViewModel.class); + vtVideoViewModel = new ViewModelProvider(this).get(VTVideoViewModel.class); + // TODO: Use the ViewModel + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + EventBus.getDefault().register(this); + binding = FragmentMylistFollowlistBinding.inflate(inflater); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initRequestData(); + initAdapter(); + initRefreshLayout(); +// binding.layoutMylistfollowEmpty.setOnClickListener(v ->{ +// currentPage=1; +// mViewModel.getFollowList(currentPage,10); +// }); + logic(); + } + + + public void setDelete(boolean isdelete){ + adapter.setDelete(isdelete); + binding.layoutFollowDelete.setVisibility(isdelete?VISIBLE:GONE); +// if(!isdelete){ +// listDelete.clear(); +// } + binding.tvMylistFollowlistDeletetxt.setText(String.format(getString(R.string.delete_tv),0)); + deletePosition =-1; + + } + + + private void initRequestData(){ + currentPage = 1; + mViewModel.getFollowList(currentPage,10); + } + private void initAdapter(){ + binding.recyclerviewMylistFollow.setLayoutManager(new GridLayoutManager(getActivity(), 3)); + adapter = new VTMyListFollowAdapter(getActivity(), ItemMylistFollowlistVtBinding.class); + adapter.setItemClickListener((data, holder) -> { + IntentUtils.startPlayerDetails(getActivity(), data.getShort_play_id(), 0); + }); + adapter.setListener(position -> { + + // listDelete.add(position); + deletePosition = position; + binding.tvMylistFollowlistDeletetxt.setText(String.format(getString(R.string.delete_tv),1)); + }); + binding.recyclerviewMylistFollow.setAdapter(adapter); + binding.layoutFollowDelete.setOnClickListener(v -> { + if(deletePosition>=0){ + //cancel + vtVideoViewModel.cancelcollection(adapter.getItemData(deletePosition).getShort_play_id()); + VTVideoDetailsBean.ShortPlayInfo shortPlayInfo = new VTVideoDetailsBean.ShortPlayInfo(); + shortPlayInfo.setShort_play_id(adapter.getItemData(deletePosition).getShort_play_id()); + shortPlayInfo.setCollect_total(adapter.getItemData(deletePosition).getCollect_total()); + EventBus.getDefault().post(new VTBaseEventBus<>(VTAppConstants.Constants_Episodes_Series_DataExample, shortPlayInfo)); + List fragments = getParentFragmentManager().getFragments(); + Log.i(" ","fragments=="+fragments.size()); + for (Fragment fragment:fragments){ + if(fragment instanceof VTMyListFragment){ + ((VTMyListFragment)fragment).setCancelView(); + setDelete(false); + } + } + + + } + }); + binding.ivFollowEmpty.setOnClickListener(v -> initRequestData()); + } + + private void initRefreshLayout() { + binding.materialHeader.setColorSchemeColors(0xffF564B6,0xffF564B6,0xffF564B6,0xffF564B6,0xffF564B6); + binding.smartrefreshlayoutMylistFollow.setEnableRefresh(true); + binding.smartrefreshlayoutMylistFollow.setEnableLoadMore(true); + binding.smartrefreshlayoutMylistFollow.setOnRefreshListener(refreshlayout -> { + currentPage = 1; + mViewModel.getFollowList(currentPage,10); + }); + binding.smartrefreshlayoutMylistFollow.setOnLoadMoreListener(refreshLayout -> { + currentPage++; + mViewModel.getFollowList(currentPage,10); + + }); + } + + + private void logic() { + mViewModel.getUserFollowListLiveData().observe(getViewLifecycleOwner(), vtResult -> { + + binding.smartrefreshlayoutMylistFollow.finishLoadMore(); + binding.smartrefreshlayoutMylistFollow.finishRefresh(); + // binding.layoutMylistfollowEmpty.setVisibility(View.GONE); + binding.recyclerviewMylistFollow.setVisibility(VISIBLE); + binding.ivFollowEmpty.setVisibility(GONE); + if(vtResult!=null&&vtResult.data!=null&& !vtResult.data.getList().isEmpty()){ + adapter.addDataList(vtResult.data.getList(), currentPage == 1); + }else{ + // binding.layoutMylistfollowEmpty.setVisibility(View.VISIBLE); + binding.recyclerviewMylistFollow.setVisibility(GONE); + binding.ivFollowEmpty.setVisibility(VISIBLE); + } + Log.i("tag count","count=="+adapter.getItemCount()); + List fragments = getParentFragmentManager().getFragments(); + for (Fragment fragment:fragments){ + if(fragment instanceof VTMyListFragment){ + ((VTMyListFragment)fragment).setDeleteView(binding.ivFollowEmpty.getVisibility()==GONE); + setDelete(false); + } + } + }); + + vtVideoViewModel.getCollectioncancelLiveData().observe(getViewLifecycleOwner(),vtResult -> { + initRequestData(); + }); + + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEvent(VTBaseEventBus event) { + if (VTAppConstants.Constants_Episodes_Series_DataExample.equals(event.getCode())) { + initRequestData(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEvent(String event) { + if (VTAppConstants.Constants_Video_Collection.equals(event)) { + initRequestData(); + } + + + + } + + @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/mylist/VTMyListFragment.java b/app/src/main/java/com/viontv/app/ui/activity/mylist/VTMyListFragment.java index 4157125..6e04be9 100644 --- a/app/src/main/java/com/viontv/app/ui/activity/mylist/VTMyListFragment.java +++ b/app/src/main/java/com/viontv/app/ui/activity/mylist/VTMyListFragment.java @@ -1,5 +1,8 @@ package com.viontv.app.ui.activity.mylist; +import static android.view.View.GONE; +import static android.view.View.VISIBLE; + import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -10,14 +13,30 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; +import com.viontv.app.R; import com.viontv.app.databinding.FragmentMainVtBinding; +import com.viontv.app.databinding.FragmentMylistBinding; +import com.viontv.app.model.CateGoryItemBean; import com.viontv.app.ui.activity.home.MainViewModel; +import com.viontv.app.ui.activity.home.VTHomeFragment; +import com.viontv.app.ui.activity.home.VTHotFragment; +import com.viontv.app.ui.activity.home.VTTabItemFragment; +import com.viontv.app.ui.activity.home.VTTopFragment; +import com.viontv.app.ui.activity.me.VTUserViewModel; +import com.viontv.app.ui.adapter.VTTabCommonAdapter; + +import java.util.ArrayList; +import java.util.List; public class VTMyListFragment extends Fragment { - private MainViewModel mViewModel; - private FragmentMainVtBinding binding; + + private FragmentMylistBinding binding; + + private List listFragment; public static VTMyListFragment newInstance() { return new VTMyListFragment(); @@ -26,7 +45,6 @@ public class VTMyListFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mViewModel = new ViewModelProvider(this).get(MainViewModel.class); // TODO: Use the ViewModel } @@ -34,8 +52,67 @@ public class VTMyListFragment extends Fragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - binding = FragmentMainVtBinding.inflate(inflater); + binding = FragmentMylistBinding.inflate(inflater); return binding.getRoot(); } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initTab(); + } + + public void initTab(){ + ArrayList titles = new ArrayList<>(); + titles.add(getString(R.string.tab_mylist_followlist)); + titles.add(getString(R.string.tab_mylist_playlist)); + listFragment = new ArrayList<>(); + listFragment.add(VTFollowListFragment.newInstance()); + listFragment.add(VTPlayListFragment.newInstance()); + VTTabCommonAdapter adapter = new VTTabCommonAdapter(getActivity(), titles, listFragment); + binding.viewpager.setAdapter(adapter); +//把TabLayout(选项卡布局)和ViewPager2绑定在一起。特别说明一下,下面这行代码是官方给的,特别好使。 + new TabLayoutMediator(binding.tablayoutMylist, binding.viewpager, (tab, position) -> tab.setText(titles.get(position))).attach(); + binding.tablayoutMylist.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + + binding.ivMylistDelete.setVisibility(tab.getPosition()==0?VISIBLE:GONE); + + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + + } + }); + + binding.ivMylistDelete.setOnClickListener(v -> { + binding.tvMylistCancel.setVisibility(VISIBLE); + binding.ivMylistDelete.setVisibility(GONE); + ((VTFollowListFragment)(listFragment.get(0))).setDelete(true); + }); + + binding.tvMylistCancel.setOnClickListener(v -> { + binding.tvMylistCancel.setVisibility(GONE); + binding.ivMylistDelete.setVisibility(VISIBLE); + ((VTFollowListFragment)(listFragment.get(0))).setDelete(false); + }); + } + + public void setCancelView(){ + binding.tvMylistCancel.setVisibility(GONE); + binding.ivMylistDelete.setVisibility(VISIBLE); + } + + public void setDeleteView(boolean isVisible){ + binding.tvMylistCancel.setVisibility(GONE); + binding.ivMylistDelete.setVisibility(isVisible?VISIBLE:GONE); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/viontv/app/ui/activity/mylist/VTPlayListFragment.java b/app/src/main/java/com/viontv/app/ui/activity/mylist/VTPlayListFragment.java new file mode 100644 index 0000000..6d77eac --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/activity/mylist/VTPlayListFragment.java @@ -0,0 +1,160 @@ +package com.viontv.app.ui.activity.mylist; + +import static android.view.View.GONE; +import static android.view.View.VISIBLE; + +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +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.GridLayoutManager; + +import com.google.android.material.tabs.TabLayoutMediator; +import com.viontv.app.R; +import com.viontv.app.api.VTResult; +import com.viontv.app.databinding.FragmentMylistBinding; +import com.viontv.app.databinding.FragmentMylistFollowlistBinding; +import com.viontv.app.databinding.FragmentMylistPlaylistBinding; +import com.viontv.app.databinding.ItemHotSquareVtBinding; +import com.viontv.app.databinding.ItemMylistFollowlistVtBinding; +import com.viontv.app.databinding.ItemMylistPlaylistVtBinding; +import com.viontv.app.model.VTVideoDetailsBean; +import com.viontv.app.ui.activity.basic.VTBaseEventBus; +import com.viontv.app.ui.activity.me.VTUserViewModel; +import com.viontv.app.ui.adapter.VTMyListFollowAdapter; +import com.viontv.app.ui.adapter.VTMyListPlayAdapter; +import com.viontv.app.ui.adapter.VTNineSquareAdapter; +import com.viontv.app.ui.adapter.VTTabCommonAdapter; +import com.viontv.app.utils.IntentUtils; +import com.viontv.app.utils.TimeUtils; +import com.viontv.app.utils.VTAppConstants; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.List; + + +public class VTPlayListFragment extends Fragment { + + + VTUserViewModel mViewModel; + + private FragmentMylistPlaylistBinding binding; + + private int currentPage = 1; + + private VTMyListPlayAdapter adapter; + + + + public static VTPlayListFragment newInstance() { + return new VTPlayListFragment(); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mViewModel = new ViewModelProvider(this).get(VTUserViewModel.class); + // TODO: Use the ViewModel + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + EventBus.getDefault().register(this); + binding = FragmentMylistPlaylistBinding.inflate(inflater); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initRequestData(); + initAdapter(); + initRefreshLayout(); +// binding.layoutMylistfollowEmpty.setOnClickListener(v ->{ +// currentPage=1; +// mViewModel.getFollowList(currentPage,10); +// }); + logic(); + } + + + private void initRequestData(){ + currentPage = 1; + mViewModel.getHistory(currentPage,10); + } + private void initAdapter(){ + binding.recyclerviewMylistPlay.setLayoutManager(new GridLayoutManager(getActivity(), 3)); + adapter = new VTMyListPlayAdapter(getActivity(), ItemMylistPlaylistVtBinding.class); + adapter.setItemClickListener((data, holder) -> { + IntentUtils.startPlayerDetails(getActivity(), data.getShort_play_id(), 0); + }); + binding.recyclerviewMylistPlay.setAdapter(adapter); + binding.ivPlaylistEmpty.setOnClickListener(v -> initRequestData()); + } + + private void initRefreshLayout() { + binding.materialHeaderPlaylist.setColorSchemeColors(0xffF564B6,0xffF564B6,0xffF564B6,0xffF564B6,0xffF564B6); + binding.smartrefreshlayoutMylistPlay.setEnableRefresh(true); + binding.smartrefreshlayoutMylistPlay.setEnableLoadMore(true); + binding.smartrefreshlayoutMylistPlay.setOnRefreshListener(refreshlayout -> { + currentPage = 1; + mViewModel.getHistory(currentPage,10); + }); + binding.smartrefreshlayoutMylistPlay.setOnLoadMoreListener(refreshLayout -> { + currentPage++; + mViewModel.getHistory(currentPage,10); + + }); + } + + + private void logic() { + mViewModel.getUserVideoHistoryLiveData().observe(getViewLifecycleOwner(), vtResult -> { + + binding.smartrefreshlayoutMylistPlay.finishLoadMore(); + binding.smartrefreshlayoutMylistPlay.finishRefresh(); + // binding.layoutMylistfollowEmpty.setVisibility(View.GONE); + binding.recyclerviewMylistPlay.setVisibility(View.VISIBLE); + binding.ivPlaylistEmpty.setVisibility(GONE); + Log.i("tag","result==="+vtResult.data); + if(vtResult!=null&&vtResult.data!=null&& !vtResult.data.getList().isEmpty()){ + adapter.addDataList(vtResult.data.getList(), currentPage == 1); + }else{ + binding.recyclerviewMylistPlay.setVisibility(GONE); + binding.ivPlaylistEmpty.setVisibility(VISIBLE); + } + }); + + } + + @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/play/VTVideoPlayerActivity.java b/app/src/main/java/com/viontv/app/ui/activity/play/VTVideoPlayerActivity.java index c2dd76c..5ce52a3 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 @@ -399,7 +399,7 @@ public class VTVideoPlayerActivity extends VTCommonActivity }); binding.rvVtSearchHot.setAdapter(adapter); vtSearchViewModel.getHotList(); - binding.ivBackSearch.setOnClickListener(v -> finish()); + binding.ivBackSearch.setOnClickListener(v -> { + if(binding.layoutSearchData.getVisibility()==VISIBLE){ + getHistoryData(); + searchDataAdapter.addDataList(null, true); + binding.layoutSearchHot.setVisibility(VISIBLE); + binding.layoutSearchHistory.setVisibility(VISIBLE); + binding.layoutSearchData.setVisibility(GONE); + }else { + finish(); + } + }); StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL); binding.rvVtSearchHistory.setLayoutManager(staggeredGridLayoutManager); diff --git a/app/src/main/java/com/viontv/app/ui/adapter/VTBannerHomeAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTBannerHomeAdapter.java index 00db15f..48a4be3 100644 --- a/app/src/main/java/com/viontv/app/ui/adapter/VTBannerHomeAdapter.java +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTBannerHomeAdapter.java @@ -29,7 +29,7 @@ public class VTBannerHomeAdapter extends BannerAdapter { + + public ItemClickDeleteListener listener; + + + public void setListener(ItemClickDeleteListener listener) { + this.listener = listener; + } + + public interface ItemClickDeleteListener{ + void itemDelete(int position); + } + private Context mcontext; + + private boolean isDelete = false; + + + public boolean isDelete() { + return isDelete; + } + + public int deletePostion = -1; + + public void setDelete(boolean delete) { + isDelete = delete; + deletePostion =-1; + notifyDataSetChanged(); + } + + public VTMyListFollowAdapter( + Context context, Class viewBinding) { + super(context, viewBinding); + this.mcontext = context; + } + + @Override + public void onBindViewHolder( + ItemMylistFollowlistVtBinding binding, + int position, + ItemBean data, + int bingingAdapterPosition) { + + if (data != null) { + Glide.with(mcontext) + .load(data.getImage_url()) + .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE)) + .into(binding.ivMylistFollowlistItem); + binding.tvMylistFollowlistName.setText(data.getName()); + binding.ivMylistSelector.setVisibility(GONE); + if(isDelete){ + binding.ivMylistSelector.setVisibility(VISIBLE); + binding.ivMylistSelector.setImageResource(R.mipmap.ic_unselect_circle); + if(deletePostion==bingingAdapterPosition){ + binding.ivMylistSelector.setImageResource(R.mipmap.ic_selected_circle); + } + binding.ivMylistSelector.setOnClickListener(v -> { + if(listener!=null){ + if(deletePostion!=-1){ + notifyItemChanged(deletePostion); + } + deletePostion = bingingAdapterPosition; + listener.itemDelete(bingingAdapterPosition); + notifyItemChanged(bingingAdapterPosition); + } + }); + } + } + } +} diff --git a/app/src/main/java/com/viontv/app/ui/adapter/VTMyListPlayAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTMyListPlayAdapter.java new file mode 100644 index 0000000..b980cd0 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTMyListPlayAdapter.java @@ -0,0 +1,57 @@ +// 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 static android.view.View.GONE; +import static android.view.View.VISIBLE; + +import android.content.Context; + +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.ItemMylistFollowlistVtBinding; +import com.viontv.app.databinding.ItemMylistPlaylistVtBinding; +import com.viontv.app.model.ItemBean; +import com.viontv.app.utils.TimeUtils; + +import java.text.DecimalFormat; + + +public class VTMyListPlayAdapter + extends VTCommonAdapter { + + private Context mcontext; + + + public VTMyListPlayAdapter( + Context context, Class viewBinding) { + super(context, viewBinding); + this.mcontext = context; + } + + @Override + public void onBindViewHolder( + ItemMylistPlaylistVtBinding binding, + int position, + ItemBean data, + int bingingAdapterPosition) { + + if (data != null) { + Glide.with(mcontext) + .load(data.getImage_url()) + .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE)) + .into(binding.ivMylistPlayItem); + binding.tvMylistPlaylistName.setText(data.getName()); + binding.tvMylistPlaylistEp.setText(String.format(mcontext.getString(R.string.mylist_playlist_process),data.getCurrent_episode(),data.getEpisode_total())); + binding.tvMylistPlayProgress.setText(TimeUtils.precess(data.getCurrent_episode(),data.getEpisode_total())+"%"); + + + } + } + + +} diff --git a/app/src/main/java/com/viontv/app/ui/adapter/VTTabCommonAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTTabCommonAdapter.java new file mode 100644 index 0000000..97429d6 --- /dev/null +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTTabCommonAdapter.java @@ -0,0 +1,34 @@ +package com.viontv.app.ui.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class VTTabCommonAdapter extends FragmentStateAdapter { + private ArrayList listTitle; + private List listFragment; + + + public VTTabCommonAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { + super(fragmentActivity); + this.listTitle = listTitle; + this.listFragment = listFragment; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + +} diff --git a/app/src/main/java/com/viontv/app/ui/adapter/VTTabItemListAdapter.java b/app/src/main/java/com/viontv/app/ui/adapter/VTTabItemListAdapter.java index a0a80a4..a1898ff 100644 --- a/app/src/main/java/com/viontv/app/ui/adapter/VTTabItemListAdapter.java +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTTabItemListAdapter.java @@ -6,6 +6,8 @@ package com.viontv.app.ui.adapter; import android.content.Context; +import androidx.constraintlayout.widget.ConstraintLayout; + import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; 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 index f57e4aa..81bc3eb 100644 --- a/app/src/main/java/com/viontv/app/ui/adapter/VTUserVideoHistoryAdapter.java +++ b/app/src/main/java/com/viontv/app/ui/adapter/VTUserVideoHistoryAdapter.java @@ -45,7 +45,7 @@ public class VTUserVideoHistoryAdapter .load(data.getImage_url()) .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)) .into(binding.ivHistoryItem); - + binding.tvHistoryProgress.setText(TimeUtils.precess(data.getCurrent_episode(),data.getEpisode_total())+"%"); } } 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 index ab36673..36ed651 100644 --- a/app/src/main/java/com/viontv/app/ui/view/VTHomeGoogleExoPlayerView.java +++ b/app/src/main/java/com/viontv/app/ui/view/VTHomeGoogleExoPlayerView.java @@ -212,7 +212,7 @@ public class VTHomeGoogleExoPlayerView extends FrameLayout { } public void setMedia(VTVideoExploreBean bean) { - VTAppConstants.isCanPlay = true; + tv_title_player.setText(bean.getName()); // if (TranslatesUtils.translates() != null) { diff --git a/app/src/main/java/com/viontv/app/utils/TimeUtils.java b/app/src/main/java/com/viontv/app/utils/TimeUtils.java index d1a0744..35432c6 100644 --- a/app/src/main/java/com/viontv/app/utils/TimeUtils.java +++ b/app/src/main/java/com/viontv/app/utils/TimeUtils.java @@ -63,4 +63,13 @@ public class TimeUtils { DecimalFormat df = new DecimalFormat(pattern.toString()); return df.format(value); } + + public static String precess(int current_episode,int episode_total){ + DecimalFormat df = new DecimalFormat("###.00"); + double current = Double.parseDouble(df.format(current_episode)); + double total = Double.parseDouble(df.format(episode_total)); + double result = Double.parseDouble(df.format(current/total))*100; + DecimalFormat df2 = new DecimalFormat("###"); + return df2.format(result); + } } 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 fc21ec5..c705aa0 100644 --- a/app/src/main/java/com/viontv/app/utils/VTAppConstants.java +++ b/app/src/main/java/com/viontv/app/utils/VTAppConstants.java @@ -32,6 +32,8 @@ public class VTAppConstants { public static final String Constants_Google_PLAYER_STATUS_FINISH_DETAIL = "constants_google_player_status_finish_detail"; public static final String Constants_Episodes_Series_DataExample = "Constants_Episodes_Series_DataExample"; + public static final String Constants_Video_Collection = "Constants_Video_Collection"; + public static final String Constants_Video_CancelCollection = "Constants_Video_CancelCollection"; public static boolean isCanPlay = true; public static boolean isLock = false; diff --git a/app/src/main/java/com/viontv/app/utils/VTDecyrptUtils.java b/app/src/main/java/com/viontv/app/utils/VTDecyrptUtils.java new file mode 100644 index 0000000..a3f59c9 --- /dev/null +++ b/app/src/main/java/com/viontv/app/utils/VTDecyrptUtils.java @@ -0,0 +1,70 @@ +package com.viontv.app.utils; + +public class VTDecyrptUtils { + + public static final char EN_STR_TAG = '$'; + + /** + * decyrpt data + * @param data + * @return + */ + public static String decrypt(String data) { + return new String(deStrBytes(data), java.nio.charset.StandardCharsets.UTF_8); + } + + public static byte[] deStrBytes(String data) { + if (data == null || data.isEmpty() || data.charAt(0) != EN_STR_TAG) { + throw new IllegalArgumentException("Invalid encoded string"); + } + String hexData = data.substring(1); + int len = hexData.length(); + byte[] result = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + result[i / 2] = (byte) Integer.parseInt(hexData.substring(i, i + 2), 16); + } + return deDat(result); + } + + + public static byte[] deDat(byte[] data) { + if (data.length == 0) { + return data; + } + int saltLen = data[0]; + byte[] salt = new byte[saltLen]; + System.arraycopy(data, 1, salt, 0, saltLen); + byte[] encrypted = new byte[data.length - saltLen - 1]; + System.arraycopy(data, 1 + saltLen, encrypted, 0, encrypted.length); + return deWithSalt(encrypted, salt); + } + + public static byte[] deWithSalt(byte[] data, byte[] salt) { + byte[] decryptedData = cxEd(data); + return removeSalt(decryptedData, salt); + } + + public static byte[] cxEd(byte[] data) { + byte[] result = new byte[data.length]; + for (int i = 0; i < data.length; i++) { + result[i] = (byte) (data[i] ^ 0xFF); + } + return result; + } + + public static byte[] removeSalt(byte[] data, byte[] salt) { + if (salt.length == 0) return data; + byte[] result = new byte[data.length]; + for (int i = 0; i < data.length; i++) { + byte s = salt[i % salt.length]; + result[i] = calRemoveSalt(data[i], s); + } + return result; + } + + public static byte calRemoveSalt(byte v, byte s) { + return (v >= s) ? (byte) (v - s) : (byte) (0xFF - (s - v) + 1); + } + + +} diff --git a/app/src/main/res/drawable/bg_videohistory_progress_7dp.xml b/app/src/main/res/drawable/bg_videohistory_progress_7dp.xml new file mode 100644 index 0000000..dc8b624 --- /dev/null +++ b/app/src/main/res/drawable/bg_videohistory_progress_7dp.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/cornor_ffffff_3dp.xml b/app/src/main/res/drawable/cornor_ffffff_3dp.xml new file mode 100644 index 0000000..aa45dd6 --- /dev/null +++ b/app/src/main/res/drawable/cornor_ffffff_3dp.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/cornor_stroke_9d9d9d_30dp.xml b/app/src/main/res/drawable/cornor_stroke_9d9d9d_30dp.xml new file mode 100644 index 0000000..0bbb27e --- /dev/null +++ b/app/src/main/res/drawable/cornor_stroke_9d9d9d_30dp.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/selector_mylist_followlist.xml b/app/src/main/res/drawable/selector_mylist_followlist.xml new file mode 100644 index 0000000..8f5f96d --- /dev/null +++ b/app/src/main/res/drawable/selector_mylist_followlist.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tabindicator_item_mylist.xml b/app/src/main/res/drawable/tabindicator_item_mylist.xml new file mode 100644 index 0000000..b116995 --- /dev/null +++ b/app/src/main/res/drawable/tabindicator_item_mylist.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_vt.xml b/app/src/main/res/layout/activity_search_vt.xml index a457e37..74976c2 100644 --- a/app/src/main/res/layout/activity_search_vt.xml +++ b/app/src/main/res/layout/activity_search_vt.xml @@ -71,7 +71,8 @@ android:layout_alignTop="@+id/tv_search_history_txt" android:layout_alignBottom="@+id/tv_search_history_txt" android:layout_alignParentEnd="true" - android:src="@mipmap/ic_history_delete" /> + android:src="@mipmap/ic_delete" + app:tint="@android:color/white"/> diff --git a/app/src/main/res/layout/fragment_mylist.xml b/app/src/main/res/layout/fragment_mylist.xml new file mode 100644 index 0000000..8ed79a3 --- /dev/null +++ b/app/src/main/res/layout/fragment_mylist.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mylist_followlist.xml b/app/src/main/res/layout/fragment_mylist_followlist.xml new file mode 100644 index 0000000..ffacecd --- /dev/null +++ b/app/src/main/res/layout/fragment_mylist_followlist.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mylist_playlist.xml b/app/src/main/res/layout/fragment_mylist_playlist.xml new file mode 100644 index 0000000..0115ad8 --- /dev/null +++ b/app/src/main/res/layout/fragment_mylist_playlist.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + 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 6e7ef9f..f120b1b 100644 --- a/app/src/main/res/layout/item_home_explore_vt.xml +++ b/app/src/main/res/layout/item_home_explore_vt.xml @@ -24,8 +24,8 @@ android:id="@+id/iv_hot_explore_item" android:layout_width="match_parent" android:layout_height="wrap_content" - android:scaleType="fitXY" - android:minHeight="@dimen/dp_100" + android:scaleType="centerCrop" + android:minHeight="@dimen/dp_110" app:layout_constraintDimensionRatio="82:110" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/item_home_tablist_vt.xml b/app/src/main/res/layout/item_home_tablist_vt.xml index 7c96a7b..d3fbdfd 100644 --- a/app/src/main/res/layout/item_home_tablist_vt.xml +++ b/app/src/main/res/layout/item_home_tablist_vt.xml @@ -18,9 +18,9 @@ android:id="@+id/iv_hometab_item" android:layout_width="match_parent" android:layout_height="wrap_content" - android:scaleType="fitXY" + android:scaleType="centerCrop" android:minHeight="@dimen/dp_89" - app:layout_constraintDimensionRatio="169:89" + app:layout_constraintDimensionRatio="h:1:1.9" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/item_hot_square_vt.xml b/app/src/main/res/layout/item_hot_square_vt.xml index a9b484f..4c2360c 100644 --- a/app/src/main/res/layout/item_hot_square_vt.xml +++ b/app/src/main/res/layout/item_hot_square_vt.xml @@ -24,7 +24,7 @@ android:id="@+id/iv_hot_square_item" android:layout_width="match_parent" android:layout_height="match_parent" - android:scaleType="fitXY" /> + android:scaleType="centerCrop" /> + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_mylist_playlist_vt.xml b/app/src/main/res/layout/item_mylist_playlist_vt.xml new file mode 100644 index 0000000..41d8557 --- /dev/null +++ b/app/src/main/res/layout/item_mylist_playlist_vt.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_video_history.xml b/app/src/main/res/layout/item_video_history.xml index d7a1924..c7947eb 100644 --- a/app/src/main/res/layout/item_video_history.xml +++ b/app/src/main/res/layout/item_video_history.xml @@ -6,10 +6,30 @@ android:layout_marginStart="@dimen/dp_10" app:cardCornerRadius="@dimen/dp_7"> - + android:layout_height="match_parent"> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_player_home_controller_vt.xml b/app/src/main/res/layout/layout_player_home_controller_vt.xml index 1a1e337..81666c3 100644 --- a/app/src/main/res/layout/layout_player_home_controller_vt.xml +++ b/app/src/main/res/layout/layout_player_home_controller_vt.xml @@ -167,7 +167,9 @@ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_empty_data.png b/app/src/main/res/mipmap-xxhdpi/ic_empty_data.png new file mode 100644 index 0000000..9d06409 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_empty_data.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_history_delete.png b/app/src/main/res/mipmap-xxhdpi/ic_history_delete.png deleted file mode 100644 index 61d62ed..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_history_delete.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_selected_circle.png b/app/src/main/res/mipmap-xxhdpi/ic_selected_circle.png new file mode 100644 index 0000000..73e01d1 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_selected_circle.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_unselect_circle.png b/app/src/main/res/mipmap-xxhdpi/ic_unselect_circle.png new file mode 100644 index 0000000..0b0d897 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_unselect_circle.png differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a5407f5..9618636 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,6 +23,12 @@ Privacy Policy User Agreement About Us + Follow List + Play List + EP.%d/EP.%d + Cancel + Delete(%d) + Network error please check the network diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 25edf1d..2039cea 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -10,8 +10,11 @@ + \ No newline at end of file diff --git a/app/viontv.jks b/app/viontv.jks deleted file mode 100644 index 3f5bf44..0000000 Binary files a/app/viontv.jks and /dev/null differ