123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922 |
- package com.github.tvbox.osc.ui.activity;
- import android.annotation.SuppressLint;
- import android.content.DialogInterface;
- import android.content.Intent;
- import android.graphics.Rect;
- import android.os.Bundle;
- import android.text.Html;
- import android.text.TextUtils;
- import android.view.KeyEvent;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.FrameLayout;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- import android.widget.Toast;
- import android.content.ClipboardManager;
- import android.content.ClipData;
- import androidx.fragment.app.FragmentContainerView;
- import androidx.lifecycle.Observer;
- import androidx.lifecycle.ViewModelProvider;
- import com.chad.library.adapter.base.BaseQuickAdapter;
- import com.github.tvbox.osc.R;
- import com.github.tvbox.osc.api.ApiConfig;
- import com.github.tvbox.osc.base.App;
- import com.github.tvbox.osc.base.BaseActivity;
- import com.github.tvbox.osc.bean.AbsXml;
- import com.github.tvbox.osc.bean.Movie;
- import com.github.tvbox.osc.bean.SourceBean;
- import com.github.tvbox.osc.bean.VodInfo;
- import com.github.tvbox.osc.cache.RoomDataManger;
- import com.github.tvbox.osc.event.RefreshEvent;
- import com.github.tvbox.osc.picasso.RoundTransformation;
- import com.github.tvbox.osc.ui.adapter.SeriesAdapter;
- import com.github.tvbox.osc.ui.adapter.SeriesFlagAdapter;
- import com.github.tvbox.osc.ui.dialog.QuickSearchDialog;
- import com.github.tvbox.osc.ui.fragment.PlayFragment;
- import com.github.tvbox.osc.util.DefaultConfig;
- import com.github.tvbox.osc.util.FastClickCheckUtil;
- import com.github.tvbox.osc.util.HawkConfig;
- import com.github.tvbox.osc.util.LOG;
- import com.github.tvbox.osc.util.MD5;
- import com.github.tvbox.osc.util.SearchHelper;
- import com.github.tvbox.osc.viewmodel.SourceViewModel;
- import com.google.gson.Gson;
- import com.google.gson.JsonArray;
- import com.google.gson.JsonElement;
- import com.lzy.okgo.OkGo;
- import com.lzy.okgo.callback.AbsCallback;
- import com.lzy.okgo.model.Response;
- import com.orhanobut.hawk.Hawk;
- import com.owen.tvrecyclerview.widget.TvRecyclerView;
- import com.owen.tvrecyclerview.widget.V7GridLayoutManager;
- import com.owen.tvrecyclerview.widget.V7LinearLayoutManager;
- import com.squareup.picasso.Picasso;
- import org.greenrobot.eventbus.EventBus;
- import org.greenrobot.eventbus.Subscribe;
- import org.greenrobot.eventbus.ThreadMode;
- import org.json.JSONObject;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.net.URLEncoder;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import me.jessyan.autosize.utils.AutoSizeUtils;
- import android.graphics.Paint;
- import android.text.TextPaint;
- import androidx.annotation.NonNull;
- import android.graphics.Typeface;
- import androidx.recyclerview.widget.RecyclerView;
- /**
- * @author pj567
- * @date :2020/12/22
- * @description:
- */
- public class DetailActivity extends BaseActivity {
- private LinearLayout llLayout;
- private FragmentContainerView llPlayerFragmentContainer;
- private View llPlayerFragmentContainerBlock;
- private View llPlayerPlace;
- private PlayFragment playFragment = null;
- private ImageView ivThumb;
- private TextView tvName;
- private TextView tvYear;
- private TextView tvSite;
- private TextView tvArea;
- private TextView tvLang;
- private TextView tvType;
- private TextView tvActor;
- private TextView tvDirector;
- private TextView tvPlayUrl;
- private TextView tvDes;
- private TextView tvPlay;
- private TextView tvSort;
- private TextView tvQuickSearch;
- private TextView tvCollect;
- private TvRecyclerView mGridViewFlag;
- private TvRecyclerView mGridView;
- private LinearLayout mEmptyPlayList;
- private SourceViewModel sourceViewModel;
- private Movie.Video mVideo;
- private VodInfo vodInfo;
- private SeriesFlagAdapter seriesFlagAdapter;
- private SeriesAdapter seriesAdapter;
- public String vodId;
- public String sourceKey;
- boolean seriesSelect = false;
- private View seriesFlagFocus = null;
- private boolean isReverse;
- private String preFlag="";
- private boolean firstReverse;
- private V7GridLayoutManager mGridViewLayoutMgr = null;
- private HashMap<String, String> mCheckSources = null;
- //画中画
- private BroadcastReceiver pipActionReceiver;
- private static final int PIP_BOARDCAST_ACTION_PREV = 0;
- private static final int PIP_BOARDCAST_ACTION_PLAYPAUSE = 1;
- private static final int PIP_BOARDCAST_ACTION_NEXT = 2;
- @Override
- public void onUserLeaveHint() {
- // takagen99 : Additional check for external player
- if (supportsPiPMode() && showPreview && !playFragment.extPlay && PIP) {
- List<RemoteAction> actions = new ArrayList<>();
- actions.add(generateRemoteAction(android.R.drawable.ic_media_previous, PIP_BOARDCAST_ACTION_PREV, "Prev", "Play Previous"));
- actions.add(generateRemoteAction(android.R.drawable.ic_media_play, PIP_BOARDCAST_ACTION_PLAYPAUSE, "Play", "Play/Pause"));
- actions.add(generateRemoteAction(android.R.drawable.ic_media_next, PIP_BOARDCAST_ACTION_NEXT, "Next", "Play Next"));
- PictureInPictureParams params = new PictureInPictureParams.Builder().setActions(actions).build();
- if (!fullWindows) {
- toggleFullPreview();
- }
- enterPictureInPictureMode(params);
- playFragment.getVodController().hideBottom();
- }
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent == null || !intent.getAction().equals("PIP_VOD_CONTROL") || playFragment.getVodController() == null) {
- return;
- }
- int currentStatus = intent.getIntExtra("action", 1);
- if (currentStatus == PIP_BOARDCAST_ACTION_PREV) {
- playFragment.playPrevious();
- } else if (currentStatus == PIP_BOARDCAST_ACTION_PLAYPAUSE) {
- playFragment.getVodController().togglePlay();
- } else if (currentStatus == PIP_BOARDCAST_ACTION_NEXT) {
- playFragment.playNext();
- }
- }
- };
- registerReceiver(pipActionReceiver, new IntentFilter("PIP_VOD_CONTROL"));
- } else {
- unregisterReceiver(pipActionReceiver);
- pipActionReceiver = null;
- }
- }
-
- @Override
- protected int getLayoutResID() {
- return R.layout.activity_detail;
- }
-
-
-
- @Override
- protected void init() {
- EventBus.getDefault().register(this);
- initView();
- initViewModel();
- initData();
- }
- private void initView() {
- llLayout = findViewById(R.id.llLayout);
- llPlayerPlace = findViewById(R.id.previewPlayerPlace);
- llPlayerFragmentContainer = findViewById(R.id.previewPlayer);
- llPlayerFragmentContainerBlock = findViewById(R.id.previewPlayerBlock);
- ivThumb = findViewById(R.id.ivThumb);
- llPlayerPlace.setVisibility(showPreview ? View.VISIBLE : View.GONE);
- ivThumb.setVisibility(!showPreview ? View.VISIBLE : View.GONE);
- tvName = findViewById(R.id.tvName);
- tvYear = findViewById(R.id.tvYear);
- tvSite = findViewById(R.id.tvSite);
- tvArea = findViewById(R.id.tvArea);
- tvLang = findViewById(R.id.tvLang);
- tvType = findViewById(R.id.tvType);
- tvActor = findViewById(R.id.tvActor);
- tvDirector = findViewById(R.id.tvDirector);
- tvPlayUrl = findViewById(R.id.tvPlayUrl);
- tvDes = findViewById(R.id.tvDes);
- tvPlay = findViewById(R.id.tvPlay);
- tvSort = findViewById(R.id.tvSort);
- tvCollect = findViewById(R.id.tvCollect);
- tvQuickSearch = findViewById(R.id.tvQuickSearch);
- mEmptyPlayList = findViewById(R.id.mEmptyPlaylist);
- mGridView = findViewById(R.id.mGridView);
- mGridView.setHasFixedSize(true);
- mGridView.setHasFixedSize(false);
- this.mGridViewLayoutMgr = new V7GridLayoutManager(this.mContext, isBaseOnWidth() ? 6 : 7);
- mGridView.setLayoutManager(this.mGridViewLayoutMgr);
- seriesAdapter = new SeriesAdapter();
- mGridView.setAdapter(seriesAdapter);
- mGridViewFlag = findViewById(R.id.mGridViewFlag);
- mGridViewFlag.setHasFixedSize(true);
- mGridViewFlag.setLayoutManager(new V7LinearLayoutManager(this.mContext, 0, false));
- seriesFlagAdapter = new SeriesFlagAdapter();
- mGridViewFlag.setAdapter(seriesFlagAdapter);
- isReverse = false;
- firstReverse = false;
- preFlag = "";
- if (showPreview) {
- playFragment = new PlayFragment();
- getSupportFragmentManager().beginTransaction().add(R.id.previewPlayer, playFragment).commit();
- getSupportFragmentManager().beginTransaction().show(playFragment).commitAllowingStateLoss();
- tvPlay.setText("全屏");
- }
- //禁用播放地址焦点
- tvPlayUrl.setFocusable(false);
- tvSort.setOnClickListener(new View.OnClickListener() {
- @SuppressLint("NotifyDataSetChanged")
- @Override
- public void onClick(View v) {
- if (vodInfo != null && vodInfo.seriesMap.size() > 0) {
- vodInfo.reverseSort = !vodInfo.reverseSort;
- isReverse = !isReverse;
- vodInfo.reverse();
- vodInfo.playIndex=(vodInfo.seriesMap.get(vodInfo.playFlag).size()-1)-vodInfo.playIndex;
- // insertVod(sourceKey, vodInfo);
- firstReverse = true;
- seriesAdapter.notifyDataSetChanged();
- }
- }
- });
- tvPlay.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- FastClickCheckUtil.check(v);
- if (showPreview) {
- toggleFullPreview();
- if(firstReverse){
- jumpToPlay();
- firstReverse=false;
- }
- } else {
- jumpToPlay();
- }
- }
- });
- tvQuickSearch.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- startQuickSearch();
- QuickSearchDialog quickSearchDialog = new QuickSearchDialog(DetailActivity.this);
- EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_QUICK_SEARCH, quickSearchData));
- EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_QUICK_SEARCH_WORD, quickSearchWord));
- quickSearchDialog.show();
- if (pauseRunnable != null && pauseRunnable.size() > 0) {
- searchExecutorService = Executors.newFixedThreadPool(5);
- for (Runnable runnable : pauseRunnable) {
- searchExecutorService.execute(runnable);
- }
- pauseRunnable.clear();
- pauseRunnable = null;
- }
- quickSearchDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- try {
- if (searchExecutorService != null) {
- pauseRunnable = searchExecutorService.shutdownNow();
- searchExecutorService = null;
- }
- } catch (Throwable th) {
- th.printStackTrace();
- }
- }
- });
- }
- });
- tvCollect.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- String text = tvCollect.getText().toString();
- if ("加入收藏".equals(text)) {
- RoomDataManger.insertVodCollect(sourceKey, vodInfo);
- Toast.makeText(DetailActivity.this, "已加入收藏夹", Toast.LENGTH_SHORT).show();
- tvCollect.setText("取消收藏");
- } else {
- RoomDataManger.deleteVodCollect(sourceKey, vodInfo);
- Toast.makeText(DetailActivity.this, "已移除收藏夹", Toast.LENGTH_SHORT).show();
- tvCollect.setText("加入收藏");
- }
- }
- });
- tvPlayUrl.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //获取剪切板管理器
- ClipboardManager cm = (ClipboardManager)getSystemService(mContext.CLIPBOARD_SERVICE);
- //设置内容到剪切板
- cm.setPrimaryClip(ClipData.newPlainText(null, tvPlayUrl.getText().toString().replace("播放地址:","")));
- Toast.makeText(DetailActivity.this, "已复制", Toast.LENGTH_SHORT).show();
- }
- });
- mGridView.setOnItemListener(new TvRecyclerView.OnItemListener() {
- @Override
- public void onItemPreSelected(TvRecyclerView parent, View itemView, int position) {
- seriesSelect = false;
- }
- @Override
- public void onItemSelected(TvRecyclerView parent, View itemView, int position) {
- seriesSelect = true;
- }
- @Override
- public void onItemClick(TvRecyclerView parent, View itemView, int position) {
- }
- });
- mGridViewFlag.setOnItemListener(new TvRecyclerView.OnItemListener() {
- private void refresh(View itemView, int position) {
- String newFlag = seriesFlagAdapter.getData().get(position).name;
- if (vodInfo != null && !vodInfo.playFlag.equals(newFlag)) {
- for (int i = 0; i < vodInfo.seriesFlags.size(); i++) {
- VodInfo.VodSeriesFlag flag = vodInfo.seriesFlags.get(i);
- if (flag.name.equals(vodInfo.playFlag)) {
- flag.selected = false;
- seriesFlagAdapter.notifyItemChanged(i);
- break;
- }
- }
- VodInfo.VodSeriesFlag flag = vodInfo.seriesFlags.get(position);
- flag.selected = true;
- // clean pre flag select status
- if (vodInfo.seriesMap.get(vodInfo.playFlag).size() > vodInfo.playIndex) {
- vodInfo.seriesMap.get(vodInfo.playFlag).get(vodInfo.playIndex).selected = false;
- }
- vodInfo.playFlag = newFlag;
- seriesFlagAdapter.notifyItemChanged(position);
- refreshList();
- }
- seriesFlagFocus = itemView;
- }
- @Override
- public void onItemPreSelected(TvRecyclerView parent, View itemView, int position) {
- // seriesSelect = false;
- }
- @Override
- public void onItemSelected(TvRecyclerView parent, View itemView, int position) {
- refresh(itemView, position);
- // if(isReverse)vodInfo.reverse();
- }
- @Override
- public void onItemClick(TvRecyclerView parent, View itemView, int position) {
- refresh(itemView, position);
- // if(isReverse)vodInfo.reverse();
- }
- });
- seriesAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
- @Override
- public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
- FastClickCheckUtil.check(view);
- if (vodInfo != null && vodInfo.seriesMap.get(vodInfo.playFlag).size() > 0) {
- boolean reload = false;
- for (int j = 0; j < vodInfo.seriesMap.get(vodInfo.playFlag).size(); j++) {
- seriesAdapter.getData().get(j).selected = false;
- seriesAdapter.notifyItemChanged(j);
- }
- //解决倒叙不刷新
- if (vodInfo.playIndex != position) {
- seriesAdapter.getData().get(position).selected = true;
- seriesAdapter.notifyItemChanged(position);
- vodInfo.playIndex = position;
- reload = true;
- }
- //解决当前集不刷新的BUG
- if (!preFlag.isEmpty() && !vodInfo.playFlag.equals(preFlag)) {
- reload = true;
- }
- seriesAdapter.getData().get(vodInfo.playIndex).selected = true;
- seriesAdapter.notifyItemChanged(vodInfo.playIndex);
- //选集全屏 想选集不全屏的注释下面一行
- if (showPreview && !fullWindows) toggleFullPreview();
- if (!showPreview || reload) {
- jumpToPlay();
- firstReverse=false;
- }
- }
- }
- });
- setLoadSir(llLayout);
- }
- private void initCheckedSourcesForSearch() {
- mCheckSources = SearchHelper.getSourcesForSearch();
- }
- private List<Runnable> pauseRunnable = null;
- private void jumpToPlay() {
- if (vodInfo != null && vodInfo.seriesMap.get(vodInfo.playFlag).size() > 0) {
- preFlag = vodInfo.playFlag;
- //更新播放地址
- setTextShow(tvPlayUrl, "播放地址:", vodInfo.seriesMap.get(vodInfo.playFlag).get(vodInfo.playIndex).url);
- Bundle bundle = new Bundle();
- //保存历史
- insertVod(sourceKey, vodInfo);
- bundle.putString("sourceKey", sourceKey);
- // bundle.putSerializable("VodInfo", vodInfo);
- App.getInstance().setVodInfo(vodInfo);
- if (showPreview) {
- if (previewVodInfo == null) {
- try {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(bos);
- oos.writeObject(vodInfo);
- oos.flush();
- oos.close();
- ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
- previewVodInfo = (VodInfo) ois.readObject();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- if (previewVodInfo != null) {
- previewVodInfo.playerCfg = vodInfo.playerCfg;
- previewVodInfo.playFlag = vodInfo.playFlag;
- previewVodInfo.playIndex = vodInfo.playIndex;
- previewVodInfo.seriesMap = vodInfo.seriesMap;
- // bundle.putSerializable("VodInfo", previewVodInfo);
- App.getInstance().setVodInfo(previewVodInfo);
- }
- playFragment.setData(bundle);
- } else {
- jumpActivity(PlayActivity.class, bundle);
- }
- }
- }
- void refreshList() {
- if (vodInfo.seriesMap.get(vodInfo.playFlag).size() <= vodInfo.playIndex) {
- vodInfo.playIndex = 0;
- }
- if (vodInfo.seriesMap.get(vodInfo.playFlag) != null) {
- boolean canSelect = true;
- for (int j = 0; j < vodInfo.seriesMap.get(vodInfo.playFlag).size(); j++) {
- if(vodInfo.seriesMap.get(vodInfo.playFlag).get(j).selected == true){
- canSelect = false;
- break;
- }
- }
- if(canSelect)vodInfo.seriesMap.get(vodInfo.playFlag).get(vodInfo.playIndex).selected = true;
- }
- Paint pFont = new Paint();
- // pFont.setTypeface(Typeface.DEFAULT );
- Rect rect = new Rect();
- List<VodInfo.VodSeries> list = vodInfo.seriesMap.get(vodInfo.playFlag);
- int w = 1;
- for(int i =0; i < list.size(); ++i){
- String name = list.get(i).name;
- pFont.getTextBounds(name, 0, name.length(), rect);
- if(w < rect.width()){
- w = rect.width();
- }
- }
- w += 32;
- int screenWidth = getWindowManager().getDefaultDisplay().getWidth()/3;
- int offset = screenWidth/w;
- if(offset <=1) offset =1;
- if(offset > 6) offset =6;
- this.mGridViewLayoutMgr.setSpanCount(offset);
- seriesAdapter.setNewData(vodInfo.seriesMap.get(vodInfo.playFlag));
- mGridView.postDelayed(new Runnable() {
- @Override
- public void run() {
- mGridView.scrollToPosition(vodInfo.playIndex);
- }
- }, 100);
- }
- private void setTextShow(TextView view, String tag, String info) {
- if (info == null || info.trim().isEmpty()) {
- view.setVisibility(View.GONE);
- return;
- }
- view.setVisibility(View.VISIBLE);
- view.setText(Html.fromHtml(getHtml(tag, info)));
- }
- private String removeHtmlTag(String info) {
- if (info == null)
- return "";
- return info.replaceAll("\\<.*?\\>", "").replaceAll("\\s", "");
- }
- private void initViewModel() {
- sourceViewModel = new ViewModelProvider(this).get(SourceViewModel.class);
- sourceViewModel.detailResult.observe(this, new Observer<AbsXml>() {
- @Override
- public void onChanged(AbsXml absXml) {
- if (absXml != null && absXml.movie != null && absXml.movie.videoList != null && absXml.movie.videoList.size() > 0) {
- showSuccess();
- mVideo = absXml.movie.videoList.get(0);
- vodInfo = new VodInfo();
- vodInfo.setVideo(mVideo);
- vodInfo.sourceKey = mVideo.sourceKey;
- tvName.setText(mVideo.name);
- setTextShow(tvSite, "来源:", ApiConfig.get().getSource(mVideo.sourceKey).getName());
- setTextShow(tvYear, "年份:", mVideo.year == 0 ? "" : String.valueOf(mVideo.year));
- setTextShow(tvArea, "地区:", mVideo.area);
- setTextShow(tvLang, "语言:", mVideo.lang);
- setTextShow(tvType, "类型:", mVideo.type);
- setTextShow(tvActor, "演员:", mVideo.actor);
- setTextShow(tvDirector, "导演:", mVideo.director);
- setTextShow(tvDes, "内容简介:", removeHtmlTag(mVideo.des));
- if (!TextUtils.isEmpty(mVideo.pic)) {
- Picasso.get()
- .load(DefaultConfig.checkReplaceProxy(mVideo.pic))
- .transform(new RoundTransformation(MD5.string2MD5(mVideo.pic + mVideo.name))
- .centerCorp(true)
- .override(AutoSizeUtils.mm2px(mContext, 300), AutoSizeUtils.mm2px(mContext, 400))
- .roundRadius(AutoSizeUtils.mm2px(mContext, 10), RoundTransformation.RoundType.ALL))
- .placeholder(R.drawable.img_loading_placeholder)
- .error(R.drawable.img_loading_placeholder)
- .into(ivThumb);
- } else {
- ivThumb.setImageResource(R.drawable.img_loading_placeholder);
- }
- if (vodInfo.seriesMap != null && vodInfo.seriesMap.size() > 0) {
- mGridViewFlag.setVisibility(View.VISIBLE);
- mGridView.setVisibility(View.VISIBLE);
- tvPlay.setVisibility(View.VISIBLE);
- mEmptyPlayList.setVisibility(View.GONE);
- VodInfo vodInfoRecord = RoomDataManger.getVodInfo(sourceKey, vodId);
- // 读取历史记录
- if (vodInfoRecord != null) {
- vodInfo.playIndex = Math.max(vodInfoRecord.playIndex, 0);
- vodInfo.playFlag = vodInfoRecord.playFlag;
- vodInfo.playerCfg = vodInfoRecord.playerCfg;
- vodInfo.reverseSort = vodInfoRecord.reverseSort;
- } else {
- vodInfo.playIndex = 0;
- vodInfo.playFlag = null;
- vodInfo.playerCfg = "";
- vodInfo.reverseSort = false;
- }
- if (vodInfo.reverseSort) {
- vodInfo.reverse();
- }
- if (vodInfo.playFlag == null || !vodInfo.seriesMap.containsKey(vodInfo.playFlag))
- vodInfo.playFlag = (String) vodInfo.seriesMap.keySet().toArray()[0];
- int flagScrollTo = 0;
- for (int j = 0; j < vodInfo.seriesFlags.size(); j++) {
- VodInfo.VodSeriesFlag flag = vodInfo.seriesFlags.get(j);
- if (flag.name.equals(vodInfo.playFlag)) {
- flagScrollTo = j;
- flag.selected = true;
- } else
- flag.selected = false;
- }
- //设置播放地址
- setTextShow(tvPlayUrl, "播放地址:", vodInfo.seriesMap.get(vodInfo.playFlag).get(0).url);
- seriesFlagAdapter.setNewData(vodInfo.seriesFlags);
- mGridViewFlag.scrollToPosition(flagScrollTo);
- refreshList();
- if (showPreview) {
- jumpToPlay();
- llPlayerFragmentContainer.setVisibility(View.VISIBLE);
- llPlayerFragmentContainerBlock.setVisibility(View.VISIBLE);
- }
- // startQuickSearch();
- } else {
- mGridViewFlag.setVisibility(View.GONE);
- mGridView.setVisibility(View.GONE);
- tvPlay.setVisibility(View.GONE);
- mEmptyPlayList.setVisibility(View.VISIBLE);
- }
- } else {
- showEmpty();
- llPlayerFragmentContainer.setVisibility(View.GONE);
- llPlayerFragmentContainerBlock.setVisibility(View.GONE);
- }
- }
- });
- }
-
- //画中画
- boolean PIP = Hawk.get(HawkConfig.PIC_IN_PIC, false);
- @Override
- public void onUserLeaveHint() {
- // takagen99 : Additional check for external player
- if (supportsPiPMode() && showPreview && !playFragment.extPlay && PIP) {
- List<RemoteAction> actions = new ArrayList<>();
- actions.add(generateRemoteAction(android.R.drawable.ic_media_previous, PIP_BOARDCAST_ACTION_PREV, "Prev", "Play Previous"));
- actions.add(generateRemoteAction(android.R.drawable.ic_media_play, PIP_BOARDCAST_ACTION_PLAYPAUSE, "Play", "Play/Pause"));
- actions.add(generateRemoteAction(android.R.drawable.ic_media_next, PIP_BOARDCAST_ACTION_NEXT, "Next", "Play Next"));
- PictureInPictureParams params = new PictureInPictureParams.Builder().setActions(actions).build();
- if (!fullWindows) {
- toggleFullPreview();
- }
- enterPictureInPictureMode(params);
- playFragment.getVodController().hideBottom();
- }
- }
-
-
-
- private String getHtml(String label, String content) {
- if (content == null) {
- content = "";
- }
- return label + "<font color=\"#FFFFFF\">" + content + "</font>";
- }
- private void initData() {
- Intent intent = getIntent();
- if (intent != null && intent.getExtras() != null) {
- Bundle bundle = intent.getExtras();
- loadDetail(bundle.getString("id", null), bundle.getString("sourceKey", ""));
- }
- }
- private void loadDetail(String vid, String key) {
- if (vid != null) {
- vodId = vid;
- sourceKey = key;
- showLoading();
- sourceViewModel.getDetail(sourceKey, vodId);
- boolean isVodCollect = RoomDataManger.isVodCollect(sourceKey, vodId);
- if (isVodCollect) {
- tvCollect.setText("取消收藏");
- } else {
- tvCollect.setText("加入收藏");
- }
- }
- }
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void refresh(RefreshEvent event) {
- if (event.type == RefreshEvent.TYPE_REFRESH) {
- if (event.obj != null) {
- if (event.obj instanceof Integer) {
- int index = (int) event.obj;
- for (int j = 0; j < vodInfo.seriesMap.get(vodInfo.playFlag).size(); j++) {
- seriesAdapter.getData().get(j).selected = false;
- seriesAdapter.notifyItemChanged(j);
- }
- seriesAdapter.getData().get(index).selected = true;
- seriesAdapter.notifyItemChanged(index);
- mGridView.setSelection(index);
- vodInfo.playIndex = index;
- //保存历史
- insertVod(sourceKey, vodInfo);
- } else if (event.obj instanceof JSONObject) {
- vodInfo.playerCfg = ((JSONObject) event.obj).toString();
- //保存历史
- insertVod(sourceKey, vodInfo);
- }
- }
- } else if (event.type == RefreshEvent.TYPE_QUICK_SEARCH_SELECT) {
- if (event.obj != null) {
- Movie.Video video = (Movie.Video) event.obj;
- loadDetail(video.id, video.sourceKey);
- }
- } else if (event.type == RefreshEvent.TYPE_QUICK_SEARCH_WORD_CHANGE) {
- if (event.obj != null) {
- String word = (String) event.obj;
- switchSearchWord(word);
- }
- } else if (event.type == RefreshEvent.TYPE_QUICK_SEARCH_RESULT) {
- try {
- searchData(event.obj == null ? null : (AbsXml) event.obj);
- } catch (Exception e) {
- searchData(null);
- }
- }
- }
- private String searchTitle = "";
- private boolean hadQuickStart = false;
- private final List<Movie.Video> quickSearchData = new ArrayList<>();
- private final List<String> quickSearchWord = new ArrayList<>();
- private ExecutorService searchExecutorService = null;
- private void switchSearchWord(String word) {
- OkGo.getInstance().cancelTag("quick_search");
- quickSearchData.clear();
- searchTitle = word;
- searchResult();
- }
- private void startQuickSearch() {
- initCheckedSourcesForSearch();
- if (hadQuickStart)
- return;
- hadQuickStart = true;
- OkGo.getInstance().cancelTag("quick_search");
- quickSearchWord.clear();
- searchTitle = mVideo.name;
- quickSearchData.clear();
- quickSearchWord.add(searchTitle);
- // 分词
- OkGo.<String>get("http://api.pullword.com/get.php?source=" + URLEncoder.encode(searchTitle) + "¶m1=0¶m2=0&json=1")
- .tag("fenci")
- .execute(new AbsCallback<String>() {
- @Override
- public String convertResponse(okhttp3.Response response) throws Throwable {
- if (response.body() != null) {
- return response.body().string();
- } else {
- throw new IllegalStateException("网络请求错误");
- }
- }
- @Override
- public void onSuccess(Response<String> response) {
- String json = response.body();
- quickSearchWord.clear();
- try {
- for (JsonElement je : new Gson().fromJson(json, JsonArray.class)) {
- quickSearchWord.add(je.getAsJsonObject().get("t").getAsString());
- }
- } catch (Throwable th) {
- th.printStackTrace();
- }
- quickSearchWord.add(searchTitle);
- EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_QUICK_SEARCH_WORD, quickSearchWord));
- }
- @Override
- public void onError(Response<String> response) {
- super.onError(response);
- }
- });
- searchResult();
- }
- private void searchResult() {
- try {
- if (searchExecutorService != null) {
- searchExecutorService.shutdownNow();
- searchExecutorService = null;
- }
- } catch (Throwable th) {
- th.printStackTrace();
- }
- searchExecutorService = Executors.newFixedThreadPool(5);
- List<SourceBean> searchRequestList = new ArrayList<>();
- searchRequestList.addAll(ApiConfig.get().getSourceBeanList());
- SourceBean home = ApiConfig.get().getHomeSourceBean();
- searchRequestList.remove(home);
- searchRequestList.add(0, home);
- ArrayList<String> siteKey = new ArrayList<>();
- for (SourceBean bean : searchRequestList) {
- if (!bean.isSearchable() || !bean.isQuickSearch()) {
- continue;
- }
- if (mCheckSources != null && !mCheckSources.containsKey(bean.getKey())) {
- continue;
- }
- siteKey.add(bean.getKey());
- }
- for (String key : siteKey) {
- searchExecutorService.execute(new Runnable() {
- @Override
- public void run() {
- sourceViewModel.getQuickSearch(key, searchTitle);
- }
- });
- }
- }
- private void searchData(AbsXml absXml) {
- if (absXml != null && absXml.movie != null && absXml.movie.videoList != null && absXml.movie.videoList.size() > 0) {
- List<Movie.Video> data = new ArrayList<>();
- for (Movie.Video video : absXml.movie.videoList) {
- // 去除当前相同的影片
- if (video.sourceKey.equals(sourceKey) && video.id.equals(vodId))
- continue;
- data.add(video);
- }
- quickSearchData.addAll(data);
- EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_QUICK_SEARCH, data));
- }
- }
- private void insertVod(String sourceKey, VodInfo vodInfo) {
- try {
- vodInfo.playNote = vodInfo.seriesMap.get(vodInfo.playFlag).get(vodInfo.playIndex).name;
- } catch (Throwable th) {
- vodInfo.playNote = "";
- }
- RoomDataManger.insertVodRecord(sourceKey, vodInfo);
- EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_HISTORY_REFRESH));
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- try {
- if (searchExecutorService != null) {
- searchExecutorService.shutdownNow();
- searchExecutorService = null;
- }
- } catch (Throwable th) {
- th.printStackTrace();
- }
- OkGo.getInstance().cancelTag("fenci");
- OkGo.getInstance().cancelTag("detail");
- OkGo.getInstance().cancelTag("quick_search");
- EventBus.getDefault().unregister(this);
- }
- @Override
- public void onBackPressed() {
- if (fullWindows) {
- if (playFragment.onBackPressed())
- return;
- toggleFullPreview();
- mGridView.requestFocus();
- return;
- }
- if (seriesSelect) {
- if (seriesFlagFocus != null && !seriesFlagFocus.isFocused()) {
- seriesFlagFocus.requestFocus();
- return;
- }
- }
- super.onBackPressed();
- }
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- if (event != null && playFragment != null && fullWindows) {
- if (playFragment.dispatchKeyEvent(event)) {
- return true;
- }
- }
- return super.dispatchKeyEvent(event);
- }
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- if (showPreview && !fullWindows) {
- Rect editTextRect = new Rect();
- llPlayerFragmentContainerBlock.getHitRect(editTextRect);
- if (editTextRect.contains((int) ev.getX(), (int) ev.getY())) {
- return true;
- }
- }
- return super.dispatchTouchEvent(ev);
- }
- // preview
- VodInfo previewVodInfo = null;
- boolean showPreview = Hawk.get(HawkConfig.SHOW_PREVIEW, true);; // true 开启 false 关闭
- boolean fullWindows = false;
- ViewGroup.LayoutParams windowsPreview = null;
- ViewGroup.LayoutParams windowsFull = null;
- void toggleFullPreview() {
- if (windowsPreview == null) {
- windowsPreview = llPlayerFragmentContainer.getLayoutParams();
- }
- if (windowsFull == null) {
- windowsFull = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
- }
- fullWindows = !fullWindows;
- llPlayerFragmentContainer.setLayoutParams(fullWindows ? windowsFull : windowsPreview);
- llPlayerFragmentContainerBlock.setVisibility(fullWindows ? View.GONE : View.VISIBLE);
- mGridView.setVisibility(fullWindows ? View.GONE : View.VISIBLE);
- mGridViewFlag.setVisibility(fullWindows ? View.GONE : View.VISIBLE);
- //全屏下禁用详情页几个按键的焦点 防止上键跑过来
- tvPlay.setFocusable(!fullWindows);
- tvSort.setFocusable(!fullWindows);
- tvCollect.setFocusable(!fullWindows);
- tvQuickSearch.setFocusable(!fullWindows);
- }
- }
|