SourceHomeActivity.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. package com.github.tvbox.osc.ui.activity;
  2. import android.os.Bundle;
  3. import android.os.Handler;
  4. import android.view.KeyEvent;
  5. import android.view.View;
  6. import android.view.animation.AccelerateInterpolator;
  7. import android.view.animation.BounceInterpolator;
  8. import android.widget.LinearLayout;
  9. import android.widget.TextView;
  10. import androidx.lifecycle.Observer;
  11. import androidx.lifecycle.ViewModelProvider;
  12. import androidx.viewpager.widget.ViewPager;
  13. import com.github.tvbox.osc.R;
  14. import com.github.tvbox.osc.api.ApiConfig;
  15. import com.github.tvbox.osc.base.BaseActivity;
  16. import com.github.tvbox.osc.base.BaseLazyFragment;
  17. import com.github.tvbox.osc.bean.AbsSortXml;
  18. import com.github.tvbox.osc.bean.MovieSort;
  19. import com.github.tvbox.osc.bean.SourceBean;
  20. import com.github.tvbox.osc.ui.adapter.HomePageAdapter;
  21. import com.github.tvbox.osc.ui.adapter.SortAdapter;
  22. import com.github.tvbox.osc.ui.fragment.GridFragment;
  23. import com.github.tvbox.osc.ui.tv.widget.DefaultTransformer;
  24. import com.github.tvbox.osc.ui.tv.widget.FixedSpeedScroller;
  25. import com.github.tvbox.osc.ui.tv.widget.NoScrollViewPager;
  26. import com.github.tvbox.osc.util.DefaultConfig;
  27. import com.github.tvbox.osc.viewmodel.SourceViewModel;
  28. import com.orhanobut.hawk.Hawk;
  29. import com.owen.tvrecyclerview.widget.TvRecyclerView;
  30. import com.owen.tvrecyclerview.widget.V7LinearLayoutManager;
  31. import me.jessyan.autosize.utils.AutoSizeUtils;
  32. import java.lang.reflect.Field;
  33. import java.util.ArrayList;
  34. import java.util.Arrays;
  35. import java.util.List;
  36. /**
  37. * 根据参数 直接打开对应 源主页数据
  38. */
  39. public class SourceHomeActivity extends BaseActivity {
  40. private LinearLayout contentLayout;
  41. private TvRecyclerView mGridView;
  42. private NoScrollViewPager mViewPager;
  43. private SourceViewModel sourceViewModel;
  44. private SortAdapter sortAdapter;
  45. private HomePageAdapter pageAdapter;
  46. private List<BaseLazyFragment> fragments = new ArrayList<>();
  47. private boolean isDownOrUp = false;
  48. private boolean sortChange = false;
  49. private int currentSelected = 0;
  50. private int sortFocused = 0;
  51. public View sortFocusView = null;
  52. private Handler mHandler = new Handler();
  53. private String sourceKey = null;
  54. @Override
  55. protected int getLayoutResID() {
  56. return R.layout.activity_source_home;
  57. }
  58. @Override
  59. protected void init() {
  60. initView();
  61. Bundle bundle = getIntent().getExtras();
  62. String[] sourceList = bundle.getStringArray("sourceKey");
  63. if (!loadSourceKeyData(sourceList)) return;
  64. initViewModel();
  65. initData();
  66. }
  67. private void initView() {
  68. this.contentLayout = findViewById(R.id.ty_contentLayout);
  69. //this.zyGridView = findViewById(R.id.ty_zyGridView);
  70. this.mGridView = findViewById(R.id.ty_mGridView);
  71. this.mViewPager = findViewById(R.id.ty_mViewPager);
  72. this.sortAdapter = new SortAdapter();
  73. this.mGridView.setLayoutManager(new V7LinearLayoutManager(this.mContext, 0, false));
  74. this.mGridView.setSpacingWithMargins(0, AutoSizeUtils.dp2px(this.mContext, 10.0f));
  75. this.mGridView.setAdapter(this.sortAdapter);
  76. this.mGridView.setOnItemListener(new TvRecyclerView.OnItemListener() {
  77. public void onItemPreSelected(TvRecyclerView tvRecyclerView, View view, int position) {
  78. if (view != null && !SourceHomeActivity.this.isDownOrUp) {
  79. view.animate().scaleX(1.0f).scaleY(1.0f).setDuration(300).start();
  80. view.findViewById(R.id.tvFilter).setVisibility(View.GONE);
  81. }
  82. }
  83. public void onItemSelected(TvRecyclerView tvRecyclerView, View view, int position) {
  84. if (view != null) {
  85. SourceHomeActivity.this.isDownOrUp = false;
  86. SourceHomeActivity.this.sortChange = true;
  87. view.animate().scaleX(1.1f).scaleY(1.1f).setInterpolator(new BounceInterpolator()).setDuration(300).start();
  88. TextView textView = view.findViewById(R.id.tvTitle);
  89. textView.getPaint().setFakeBoldText(true);
  90. textView.setTextColor(SourceHomeActivity.this.getResources().getColor(R.color.color_FFFFFF));
  91. textView.invalidate();
  92. MovieSort.SortData item = sortAdapter.getItem(position);
  93. if (item != null && !item.filters.isEmpty())
  94. view.findViewById(R.id.tvFilter).setVisibility(View.VISIBLE);
  95. SourceHomeActivity.this.sortFocusView = view;
  96. SourceHomeActivity.this.sortFocused = position;
  97. mHandler.removeCallbacks(mDataRunnable);
  98. mHandler.postDelayed(mDataRunnable, 200);
  99. }
  100. }
  101. @Override
  102. public void onItemClick(TvRecyclerView parent, View itemView, int position) {
  103. if (itemView != null && currentSelected == position) {
  104. BaseLazyFragment baseLazyFragment = fragments.get(currentSelected);
  105. if ((baseLazyFragment instanceof GridFragment) && !sortAdapter.getItem(position).filters.isEmpty()) {// 弹出筛选
  106. ((GridFragment) baseLazyFragment).showFilter();
  107. }
  108. }
  109. }
  110. });
  111. this.mGridView.setOnInBorderKeyEventListener(new TvRecyclerView.OnInBorderKeyEventListener() {
  112. public final boolean onInBorderKeyEvent(int direction, View view) {
  113. if (direction != View.FOCUS_DOWN) {
  114. return false;
  115. }
  116. isDownOrUp = true;
  117. BaseLazyFragment baseLazyFragment = fragments.get(sortFocused);
  118. if (!(baseLazyFragment instanceof GridFragment)) {
  119. return false;
  120. }
  121. if (!((GridFragment) baseLazyFragment).isLoad()) {
  122. return true;
  123. }
  124. return false;
  125. }
  126. });
  127. setLoadSir(this.contentLayout);
  128. //mHandler.postDelayed(mFindFocus, 500);
  129. }
  130. private void initViewModel() {
  131. sourceViewModel = new ViewModelProvider(this).get(SourceViewModel.class);
  132. sourceViewModel.sortResult.observe(this, new Observer<AbsSortXml>() {
  133. @Override
  134. public void onChanged(AbsSortXml absXml) {
  135. showSuccess();
  136. if (absXml != null && absXml.classes != null && absXml.classes.sortList != null) {
  137. sortAdapter.setNewData(DefaultConfig.adjustSort(sourceKey, absXml.classes.sortList, false));
  138. } else {
  139. sortAdapter.setNewData(DefaultConfig.adjustSort(sourceKey, new ArrayList<>(), false));
  140. }
  141. initViewPager(absXml);
  142. }
  143. });
  144. }
  145. private void initData() {
  146. showLoading();
  147. sourceViewModel.getSort(sourceKey);
  148. }
  149. private List<SourceBean> sourceBeanList;
  150. private boolean loadSourceKeyData(String[] sourceArray) {
  151. if (sourceArray != null && sourceArray.length == 1) {
  152. sourceKey = sourceArray[0];
  153. sourceBeanList = null;
  154. return true;
  155. }
  156. boolean hasDfKey = false;
  157. List<SourceBean> sites = ApiConfig.get().getSourceBeanList();
  158. sourceBeanList = new ArrayList<>();
  159. List<String> sourceList = sourceArray == null ? null : Arrays.asList(sourceArray);
  160. for (SourceBean bean : sites) {
  161. if (sourceList != null && sourceList.contains(bean.getKey())) continue;
  162. sourceBeanList.add(bean);
  163. if (!hasDfKey && bean.getKey().equals(sourceKey)) hasDfKey = true;
  164. }
  165. if (sourceBeanList.size() == 0) return false;
  166. if (!hasDfKey) {
  167. sourceKey = sourceBeanList.get(0).getKey();
  168. }
  169. int size = sourceBeanList.size();
  170. return size > 0;
  171. }
  172. private void initViewPager(AbsSortXml absXml) {
  173. this.mGridView.setSelection(sortFocused);
  174. if (sortAdapter.getData().size() > 0) {
  175. for (MovieSort.SortData data : sortAdapter.getData()) {
  176. fragments.add(GridFragment.newInstance(data, sourceKey));
  177. }
  178. pageAdapter = new HomePageAdapter(getSupportFragmentManager(), fragments);
  179. try {
  180. Field field = ViewPager.class.getDeclaredField("mScroller");
  181. field.setAccessible(true);
  182. FixedSpeedScroller scroller = new FixedSpeedScroller(mContext, new AccelerateInterpolator());
  183. field.set(mViewPager, scroller);
  184. scroller.setmDuration(300);
  185. } catch (Exception e) {
  186. }
  187. mViewPager.setPageTransformer(true, new DefaultTransformer());
  188. mViewPager.setAdapter(pageAdapter);
  189. mViewPager.setCurrentItem(currentSelected, false);
  190. }
  191. }
  192. @Override
  193. public void onBackPressed() {
  194. int i;
  195. if (this.fragments.size() == 0 || this.sortFocused >= this.fragments.size() || (i = this.sortFocused) < 0) {
  196. super.onBackPressed();
  197. return;
  198. }
  199. BaseLazyFragment baseLazyFragment = this.fragments.get(i);
  200. if (baseLazyFragment instanceof GridFragment) {
  201. View view = this.sortFocusView;
  202. GridFragment grid = (GridFragment) baseLazyFragment;
  203. if (grid.restoreView()) {// 还原上次保存的UI内容
  204. return;
  205. }
  206. if (view != null && !view.isFocused()) {
  207. view.requestFocus();
  208. } else {
  209. super.onBackPressed();
  210. }
  211. //super.onBackPressed();
  212. } else {
  213. super.onBackPressed();
  214. }
  215. }
  216. @Override
  217. protected void onResume() {
  218. super.onResume();
  219. }
  220. @Override
  221. protected void onPause() {
  222. super.onPause();
  223. mHandler.removeCallbacksAndMessages(null);
  224. }
  225. private Runnable mDataRunnable = new Runnable() {
  226. @Override
  227. public void run() {
  228. if (sortChange) {
  229. sortChange = false;
  230. if (sortFocused != currentSelected) {
  231. currentSelected = sortFocused;
  232. mViewPager.setCurrentItem(sortFocused, false);
  233. }
  234. }
  235. }
  236. };
  237. @Override
  238. public boolean dispatchKeyEvent(KeyEvent event) {
  239. int keyCode = event.getKeyCode();
  240. int action = event.getAction();
  241. if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
  242. return super.dispatchKeyEvent(event);
  243. }
  244. if (keyCode == KeyEvent.KEYCODE_BACK && event.isLongPress()) {
  245. if (this.sortFocusView != null && !this.sortFocusView.isFocused()) {
  246. this.sortFocusView.requestFocus();
  247. } else {
  248. super.onBackPressed();
  249. }
  250. return false;
  251. }
  252. if (action == KeyEvent.ACTION_DOWN) {
  253. switch (keyCode) {
  254. case KeyEvent.KEYCODE_MENU://按下菜单键 选择首页 或者是筛选
  255. BaseLazyFragment baseLazyFragment = fragments.get(this.sortFocused);
  256. if ((baseLazyFragment instanceof GridFragment) && !sortAdapter.getItem(this.sortFocused).filters.isEmpty()) {// 弹出筛选
  257. ((GridFragment) baseLazyFragment).showFilter();
  258. }
  259. break;
  260. }
  261. }
  262. return super.dispatchKeyEvent(event);
  263. }
  264. }