首页列表源设置 搜索视图设置 补齐配置接口中的分类配置 修复片尾跳过无法从头播放问题

pull/1/head
SDL 4 years ago
parent 6887cc2021
commit ebae981bc7
  1. 1
      app/src/main/java/com/github/tvbox/osc/base/App.java
  2. 1
      app/src/main/java/com/github/tvbox/osc/bean/VodInfo.java
  3. 4
      app/src/main/java/com/github/tvbox/osc/cache/RoomDataManger.java
  4. 4
      app/src/main/java/com/github/tvbox/osc/cache/VodRecordDao.java
  5. 8
      app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java
  6. 5
      app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java
  7. 2
      app/src/main/java/com/github/tvbox/osc/ui/activity/HistoryActivity.java
  8. 13
      app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java
  9. 10
      app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java
  10. 11
      app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java
  11. 1
      app/src/main/java/com/github/tvbox/osc/ui/adapter/HomeHotVodAdapter.java
  12. 63
      app/src/main/java/com/github/tvbox/osc/ui/adapter/SearchAdapter.java
  13. 95
      app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java
  14. 34
      app/src/main/java/com/github/tvbox/osc/ui/fragment/UserFragment.java
  15. 1
      app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java
  16. 3
      app/src/main/res/layout/item_user_hot_vod.xml

@ -52,7 +52,6 @@ public class App extends MultiDexApplication {
if (!Hawk.contains(HawkConfig.PLAY_TYPE)) {
Hawk.put(HawkConfig.PLAY_TYPE, 1);
}
Hawk.put(HawkConfig.HOME_REC, 2);
}
public static App getInstance() {

@ -47,6 +47,7 @@ public class VodInfo implements Serializable {
public String des;// <![CDATA[权来]
public String playFlag = null;
public int playIndex = 0;
public String playNote = "";
public String sourceKey;
public String playerCfg = "";
public boolean reverseSort = false;

@ -78,8 +78,8 @@ public class RoomDataManger {
}
}
public static List<VodInfo> getAllVodRecord() {
List<VodRecord> recordList = AppDataManager.get().getVodRecordDao().getAll();
public static List<VodInfo> getAllVodRecord(int limit) {
List<VodRecord> recordList = AppDataManager.get().getVodRecordDao().getAll(limit);
List<VodInfo> vodInfoList = new ArrayList<>();
if (recordList != null) {
for (VodRecord record : recordList) {

@ -18,8 +18,8 @@ public interface VodRecordDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
long insert(VodRecord record);
@Query("select * from vodRecord order by updateTime desc")
List<VodRecord> getAll();
@Query("select * from vodRecord order by updateTime desc limit :size")
List<VodRecord> getAll(int size);
@Query("select * from vodRecord where `sourceKey`=:sourceKey and `vodId`=:vodId")
VodRecord getVodRecord(String sourceKey, String vodId);

@ -181,7 +181,7 @@ public class VodController extends BaseController {
mNextBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
listener.playNext();
listener.playNext(false);
hideBottom();
}
});
@ -362,7 +362,7 @@ public class VodController extends BaseController {
}
public interface VodControlListener {
void playNext();
void playNext(boolean rmProgress);
void playPre();
@ -398,7 +398,7 @@ public class VodController extends BaseController {
}
if (et > 0 && position + (et * 1000) >= duration) {
skipEnd = false;
listener.playNext();
listener.playNext(true);
}
}
mCurrentTime.setText(PlayerUtils.stringForTime(position));
@ -485,7 +485,7 @@ public class VodController extends BaseController {
case VideoView.STATE_BUFFERING:
break;
case VideoView.STATE_PLAYBACK_COMPLETED:
listener.playNext();
listener.playNext(true);
break;
}
}

@ -568,6 +568,11 @@ public class DetailActivity extends BaseActivity {
}
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));
}

@ -142,7 +142,7 @@ public class HistoryActivity extends BaseActivity {
}
private void initData() {
List<VodInfo> allVodRecord = RoomDataManger.getAllVodRecord();
List<VodInfo> allVodRecord = RoomDataManger.getAllVodRecord(100);
List<VodInfo> vodInfoList = new ArrayList<>();
for (VodInfo vodInfo : allVodRecord) {
vodInfoList.add(vodInfo);

@ -347,19 +347,6 @@ public class HomeActivity extends BaseActivity {
if (data.id.equals("my0")) {
if (Hawk.get(HawkConfig.HOME_REC, 0) == 1 && absXml.videoList != null && absXml.videoList.size() > 0) {
fragments.add(UserFragment.newInstance(absXml.videoList));
} else if (Hawk.get(HawkConfig.HOME_REC, 0) == 2) {
List<VodInfo> allVodRecord = RoomDataManger.getAllVodRecord();
List<Movie.Video> vodList = new ArrayList<>();
for (VodInfo vodInfo : allVodRecord) {
Movie.Video vod = new Movie.Video();
vod.id = vodInfo.id;
vod.sourceKey = vodInfo.sourceKey;
vod.name = vodInfo.name;
vod.pic = vodInfo.pic;
/*vod.note = "最近看过" + vodInfo.playIndex;*/
vodList.add(vod);
}
fragments.add(UserFragment.newInstance(vodList));
} else {
fragments.add(UserFragment.newInstance(null));
}

@ -120,7 +120,7 @@ public class PlayActivity extends BaseActivity {
mController.setCanChangePosition(true);
mController.setEnableInNormal(true);
mController.setGestureEnabled(true);
mVideoView.setProgressManager(new ProgressManager() {
ProgressManager progressManager = new ProgressManager() {
@Override
public void saveProgress(String url, long progress) {
CacheManager.save(MD5.string2MD5(url), progress);
@ -143,11 +143,15 @@ public class PlayActivity extends BaseActivity {
return skip;
return rec;
}
});
};
mVideoView.setProgressManager(progressManager);
mController.setListener(new VodController.VodControlListener() {
@Override
public void playNext() {
public void playNext(boolean rmProgress) {
String preProgressKey = progressKey;
PlayActivity.this.playNext();
if (rmProgress && preProgressKey != null)
CacheManager.delete(MD5.string2MD5(preProgressKey), 0);
}
@Override

@ -28,6 +28,7 @@ import com.github.tvbox.osc.ui.dialog.RemoteDialog;
import com.github.tvbox.osc.ui.tv.QRCodeGen;
import com.github.tvbox.osc.ui.tv.widget.SearchKeyboard;
import com.github.tvbox.osc.util.FastClickCheckUtil;
import com.github.tvbox.osc.util.HawkConfig;
import com.github.tvbox.osc.viewmodel.SourceViewModel;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
@ -36,7 +37,9 @@ import com.google.gson.JsonParser;
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 org.greenrobot.eventbus.EventBus;
@ -120,9 +123,11 @@ public class SearchActivity extends BaseActivity {
});
mGridView.setHasFixedSize(true);
// lite
mGridView.setLayoutManager(new V7LinearLayoutManager(this.mContext, 1, false));
// with preview
// mGridView.setLayoutManager(new V7GridLayoutManager(this.mContext, 3));
if (Hawk.get(HawkConfig.SEARCH_VIEW, 0) == 0)
mGridView.setLayoutManager(new V7LinearLayoutManager(this.mContext, 1, false));
// with preview
else
mGridView.setLayoutManager(new V7GridLayoutManager(this.mContext, 3));
searchAdapter = new SearchAdapter();
mGridView.setAdapter(searchAdapter);
searchAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {

@ -31,6 +31,7 @@ public class HomeHotVodAdapter extends BaseQuickAdapter<Movie.Video, BaseViewHol
tvRate.setVisibility(View.GONE);
} else {
tvRate.setText(item.note);
tvRate.setVisibility(View.VISIBLE);
}
helper.setText(R.id.tvName, item.name);
ImageView ivThumb = helper.getView(R.id.ivThumb);

@ -1,49 +1,54 @@
package com.github.tvbox.osc.ui.adapter;
import android.text.TextUtils;
import android.widget.ImageView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.github.tvbox.osc.R;
import com.github.tvbox.osc.api.ApiConfig;
import com.github.tvbox.osc.bean.Movie;
import com.github.tvbox.osc.picasso.RoundTransformation;
import com.github.tvbox.osc.util.HawkConfig;
import com.github.tvbox.osc.util.MD5;
import com.orhanobut.hawk.Hawk;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
/**
* @author pj567
* @date :2020/12/23
* @description:
*/
import me.jessyan.autosize.utils.AutoSizeUtils;
public class SearchAdapter extends BaseQuickAdapter<Movie.Video, BaseViewHolder> {
public SearchAdapter() {
super(R.layout.item_search_lite, new ArrayList<>());
super(Hawk.get(HawkConfig.SEARCH_VIEW, 0) == 0 ? R.layout.item_search_lite : R.layout.item_search, new ArrayList<>());
}
@Override
protected void convert(BaseViewHolder helper, Movie.Video item) {
// lite
helper.setText(R.id.tvName, String.format("%s %s %s %s", ApiConfig.get().getSource(item.sourceKey).getName(), item.name, item.type == null ? "" : item.type, item.note == null ? "" : item.note));
// with preview
/*
helper.setText(R.id.tvName, item.name);
helper.setText(R.id.tvSite, ApiConfig.get().getSource(item.sourceKey).getName());
helper.setVisible(R.id.tvNote, item.note != null && !item.note.isEmpty());
if (item.note != null && !item.note.isEmpty()) {
helper.setText(R.id.tvNote, item.note);
}
ImageView ivThumb = helper.getView(R.id.ivThumb);
if (!TextUtils.isEmpty(item.pic)) {
Picasso.get()
.load(item.pic)
.transform(new RoundTransformation(MD5.string2MD5(item.pic + "position=" + helper.getLayoutPosition()))
.centerCorp(true)
.override(AutoSizeUtils.mm2px(mContext, 300), AutoSizeUtils.mm2px(mContext, 400))
.roundRadius(AutoSizeUtils.mm2px(mContext, 10), RoundTransformation.RoundType.ALL))
.placeholder(R.drawable.error_loading)
.error(R.drawable.error_loading)
.into(ivThumb);
} else {
ivThumb.setImageResource(R.drawable.error_loading);
if (Hawk.get(HawkConfig.SEARCH_VIEW, 0) == 0) {
helper.setText(R.id.tvName, String.format("%s %s %s %s", ApiConfig.get().getSource(item.sourceKey).getName(), item.name, item.type == null ? "" : item.type, item.note == null ? "" : item.note));
} else {// with preview
helper.setText(R.id.tvName, item.name);
helper.setText(R.id.tvSite, ApiConfig.get().getSource(item.sourceKey).getName());
helper.setVisible(R.id.tvNote, item.note != null && !item.note.isEmpty());
if (item.note != null && !item.note.isEmpty()) {
helper.setText(R.id.tvNote, item.note);
}
ImageView ivThumb = helper.getView(R.id.ivThumb);
if (!TextUtils.isEmpty(item.pic)) {
Picasso.get()
.load(item.pic)
.transform(new RoundTransformation(MD5.string2MD5(item.pic + "position=" + helper.getLayoutPosition()))
.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);
}
}
*/
}
}

@ -51,6 +51,8 @@ public class ModelSettingFragment extends BaseLazyFragment {
private TextView tvApi;
private TextView tvHomeApi;
private TextView tvDns;
private TextView tvHomeRec;
private TextView tvSearchView;
public static ModelSettingFragment newInstance() {
return new ModelSettingFragment().setArguments();
@ -76,11 +78,15 @@ public class ModelSettingFragment extends BaseLazyFragment {
tvApi = findViewById(R.id.tvApi);
tvHomeApi = findViewById(R.id.tvHomeApi);
tvDns = findViewById(R.id.tvDns);
tvHomeRec = findViewById(R.id.tvHomeRec);
tvSearchView = findViewById(R.id.tvSearchView);
tvMediaCodec.setText(Hawk.get(HawkConfig.IJK_CODEC, ""));
tvDebugOpen.setText(Hawk.get(HawkConfig.DEBUG_OPEN, false) ? "已打开" : "已关闭");
tvParseWebView.setText(Hawk.get(HawkConfig.PARSE_WEBVIEW, true) ? "系统自带" : "XWalkView");
tvApi.setText(Hawk.get(HawkConfig.API_URL, ""));
tvDns.setText(OkGoHelper.dnsHttpsList.get(Hawk.get(HawkConfig.DOH_URL, 0)));
tvHomeRec.setText(getHomeRecName(Hawk.get(HawkConfig.HOME_REC, 0)));
tvSearchView.setText(getSearchView(Hawk.get(HawkConfig.SEARCH_VIEW, 0)));
tvHomeApi.setText(ApiConfig.get().getHomeSourceBean().getName());
tvScale.setText(PlayerHelper.getScaleName(Hawk.get(HawkConfig.PLAY_SCALE, 0)));
tvPlay.setText(PlayerHelper.getPlayerName(Hawk.get(HawkConfig.PLAY_TYPE, 0)));
@ -377,6 +383,77 @@ public class ModelSettingFragment extends BaseLazyFragment {
dialog.show();
}
});
findViewById(R.id.llHomeRec).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FastClickCheckUtil.check(v);
int defaultPos = Hawk.get(HawkConfig.HOME_REC, 0);
ArrayList<Integer> types = new ArrayList<>();
types.add(0);
types.add(1);
types.add(2);
SelectDialog<Integer> dialog = new SelectDialog<>(mActivity);
dialog.setTip("请选择首页列表数据");
dialog.setAdapter(new SelectDialogAdapter.SelectDialogInterface<Integer>() {
@Override
public void click(Integer value, int pos) {
Hawk.put(HawkConfig.HOME_REC, value);
tvHomeRec.setText(getHomeRecName(value));
}
@Override
public String getDisplay(Integer val) {
return getHomeRecName(val);
}
}, new DiffUtil.ItemCallback<Integer>() {
@Override
public boolean areItemsTheSame(@NonNull @NotNull Integer oldItem, @NonNull @NotNull Integer newItem) {
return oldItem.intValue() == newItem.intValue();
}
@Override
public boolean areContentsTheSame(@NonNull @NotNull Integer oldItem, @NonNull @NotNull Integer newItem) {
return oldItem.intValue() == newItem.intValue();
}
}, types, defaultPos);
dialog.show();
}
});
findViewById(R.id.llSearchView).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FastClickCheckUtil.check(v);
int defaultPos = Hawk.get(HawkConfig.SEARCH_VIEW, 0);
ArrayList<Integer> types = new ArrayList<>();
types.add(0);
types.add(1);
SelectDialog<Integer> dialog = new SelectDialog<>(mActivity);
dialog.setTip("请选择搜索视图");
dialog.setAdapter(new SelectDialogAdapter.SelectDialogInterface<Integer>() {
@Override
public void click(Integer value, int pos) {
Hawk.put(HawkConfig.SEARCH_VIEW, value);
tvSearchView.setText(getSearchView(value));
}
@Override
public String getDisplay(Integer val) {
return getSearchView(val);
}
}, new DiffUtil.ItemCallback<Integer>() {
@Override
public boolean areItemsTheSame(@NonNull @NotNull Integer oldItem, @NonNull @NotNull Integer newItem) {
return oldItem.intValue() == newItem.intValue();
}
@Override
public boolean areContentsTheSame(@NonNull @NotNull Integer oldItem, @NonNull @NotNull Integer newItem) {
return oldItem.intValue() == newItem.intValue();
}
}, types, defaultPos);
dialog.show();
}
});
SettingActivity.callback = new SettingActivity.DevModeCallback() {
@Override
public void onChange() {
@ -390,4 +467,22 @@ public class ModelSettingFragment extends BaseLazyFragment {
super.onDestroyView();
SettingActivity.callback = null;
}
String getHomeRecName(int type) {
if (type == 1) {
return "站点推荐";
} else if (type == 2) {
return "观看历史";
} else {
return "豆瓣热播";
}
}
String getSearchView(int type) {
if (type == 0) {
return "文字列表";
} else {
return "缩略图";
}
}
}

@ -11,6 +11,8 @@ import com.github.tvbox.osc.R;
import com.github.tvbox.osc.api.ApiConfig;
import com.github.tvbox.osc.base.BaseLazyFragment;
import com.github.tvbox.osc.bean.Movie;
import com.github.tvbox.osc.bean.VodInfo;
import com.github.tvbox.osc.cache.RoomDataManger;
import com.github.tvbox.osc.event.ServerEvent;
import com.github.tvbox.osc.ui.activity.CollectActivity;
import com.github.tvbox.osc.ui.activity.DetailActivity;
@ -53,7 +55,7 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen
private LinearLayout tvCollect;
private LinearLayout tvPush;
private HomeHotVodAdapter homeHotVodAdapter;
private List<Movie.Video> recVod;
private List<Movie.Video> homeSourceRec;
public static UserFragment newInstance() {
return new UserFragment();
@ -64,10 +66,30 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen
}
public UserFragment setArguments(List<Movie.Video> recVod) {
this.recVod = recVod;
this.homeSourceRec = recVod;
return this;
}
@Override
protected void onFragmentResume() {
super.onFragmentResume();
if (Hawk.get(HawkConfig.HOME_REC, 0) == 2) {
List<VodInfo> allVodRecord = RoomDataManger.getAllVodRecord(10);
List<Movie.Video> vodList = new ArrayList<>();
for (VodInfo vodInfo : allVodRecord) {
Movie.Video vod = new Movie.Video();
vod.id = vodInfo.id;
vod.sourceKey = vodInfo.sourceKey;
vod.name = vodInfo.name;
vod.pic = vodInfo.pic;
if (vodInfo.playNote != null && !vodInfo.playNote.isEmpty())
vod.note = "上次看到" + vodInfo.playNote;
vodList.add(vod);
}
homeHotVodAdapter.setNewData(vodList);
}
}
@Override
protected int getLayoutResID() {
return R.layout.fragment_user;
@ -137,11 +159,13 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen
}
private void initHomeHotVod(HomeHotVodAdapter adapter) {
if (Hawk.get(HawkConfig.HOME_REC, 0) != 0) {
if (recVod != null) {
adapter.setNewData(recVod);
if (Hawk.get(HawkConfig.HOME_REC, 0) == 1) {
if (homeSourceRec != null) {
adapter.setNewData(homeSourceRec);
}
return;
} else if (Hawk.get(HawkConfig.HOME_REC, 0) == 2) {
return;
}
try {
Calendar cal = Calendar.getInstance();

@ -20,4 +20,5 @@ public class HawkConfig {
public static final String PLAY_TIME_STEP = "play_time_step"; //0 texture 2
public static final String DOH_URL = "doh_url";
public static final String HOME_REC = "home_rec"; // 0 豆瓣热播 1 数据源推荐 2 历史
public static final String SEARCH_VIEW = "search_view"; // 0 列表 1 缩略图
}

@ -32,8 +32,9 @@
android:layout_marginEnd="@dimen/vs_5"
android:layout_marginRight="@dimen/vs_5"
android:background="@drawable/shape_thumb_year"
android:ellipsize="end"
android:ellipsize="marquee"
android:gravity="center"
android:marqueeRepeatLimit="marquee_forever"
android:paddingLeft="@dimen/vs_5"
android:paddingRight="@dimen/vs_5"
android:singleLine="true"

Loading…
Cancel
Save