diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ddb7d8d5..64b29d05 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -51,6 +51,9 @@
+
diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/FastSearchActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/FastSearchActivity.java
new file mode 100644
index 00000000..3bb1619c
--- /dev/null
+++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/FastSearchActivity.java
@@ -0,0 +1,515 @@
+package com.github.tvbox.osc.ui.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.recyclerview.widget.RecyclerView;
+
+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.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.event.RefreshEvent;
+import com.github.tvbox.osc.event.ServerEvent;
+import com.github.tvbox.osc.server.ControlManager;
+import com.github.tvbox.osc.ui.adapter.FastListAdapter;
+import com.github.tvbox.osc.ui.adapter.FastSearchAdapter;
+//import com.github.tvbox.osc.ui.adapter.SearchAdapter;
+import com.github.tvbox.osc.ui.adapter.SearchWordAdapter;
+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.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+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;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+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 java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author pj567
+ * @date :2020/12/23
+ * @description:
+ */
+public class FastSearchActivity extends BaseActivity {
+ private LinearLayout llLayout;
+ private TextView mSearchTitle;
+ private TvRecyclerView mGridView;
+ private TvRecyclerView mGridViewFilter;
+ private TvRecyclerView mGridViewWord;
+ private TvRecyclerView mGridViewWordFenci;
+ SourceViewModel sourceViewModel;
+// private EditText etSearch;
+// private TextView tvSearch;
+// private TextView tvClear;
+// private SearchKeyboard keyboard;
+// private TextView tvAddress;
+// private ImageView ivQRCode;
+ private SearchWordAdapter searchWordAdapter;
+ private FastSearchAdapter searchAdapter;
+ private FastSearchAdapter searchAdapterFilter;
+ private FastListAdapter spListAdapter;
+ private String searchTitle = "";
+ private HashMap spNames;
+ private boolean isFilterMode = false;
+ private String searchFilterKey = ""; // 过滤的key
+ private HashMap > resultVods; // 搜索结果
+ private int finishedCount=0;
+ private List quickSearchWord = new ArrayList<>();
+
+ private View.OnFocusChangeListener focusChangeListener = new View.OnFocusChangeListener() {
+ @Override
+ public void onFocusChange(View itemView, boolean hasFocus) {
+ try {
+ if(!hasFocus){
+ spListAdapter.onLostFocus(itemView);
+ }else{
+ int ret = spListAdapter.onSetFocus(itemView);
+ if(ret < 0) return;
+ TextView v = (TextView) itemView;
+ String sb = v.getText().toString();
+ filterResult(sb);
+ }
+ }catch (Exception e){
+ Toast.makeText(FastSearchActivity.this,e.toString(), Toast.LENGTH_SHORT).show();
+ }
+
+ }
+ };
+
+ @Override
+ protected int getLayoutResID() {
+ return R.layout.activity_fast_search;
+ }
+
+ @Override
+ protected void init() {
+ spNames = new HashMap();
+ resultVods = new HashMap >();
+ initView();
+ initViewModel();
+ initData();
+ }
+
+ private List pauseRunnable = null;
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if (pauseRunnable != null && pauseRunnable.size() > 0) {
+ searchExecutorService = Executors.newFixedThreadPool(5);
+ allRunCount.set(pauseRunnable.size());
+ for (Runnable runnable : pauseRunnable) {
+ searchExecutorService.execute(runnable);
+ }
+ pauseRunnable.clear();
+ pauseRunnable = null;
+ }
+ }
+
+ private void initView() {
+ EventBus.getDefault().register(this);
+ llLayout = findViewById(R.id.llLayout);
+ mSearchTitle = findViewById(R.id.mSearchTitle);
+ mGridView = findViewById(R.id.mGridView);
+ mGridViewWord = findViewById(R.id.mGridViewWord);
+ mGridViewFilter = findViewById(R.id.mGridViewFilter);
+
+ mGridViewWord.setHasFixedSize(true);
+ mGridViewWord.setLayoutManager(new V7LinearLayoutManager(this.mContext, 1, false));
+ spListAdapter = new FastListAdapter();
+ mGridViewWord.setAdapter(spListAdapter);
+
+
+// mGridViewWord.setFocusable(true);
+// mGridViewWord.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+// @Override
+// public void onFocusChange(View itemView, boolean hasFocus) {}
+// });
+
+ mGridViewWord.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
+ @Override
+ public void onChildViewAttachedToWindow(@NonNull View child) {
+ child.setFocusable(true);
+ child.setOnFocusChangeListener(focusChangeListener);
+ TextView t = (TextView)child;
+ if(t.getText() == "全部显示"){
+ t.requestFocus();
+ }
+// if (child.isFocusable() && null == child.getOnFocusChangeListener()) {
+// child.setOnFocusChangeListener(focusChangeListener);
+// }
+ }
+
+ @Override
+ public void onChildViewDetachedFromWindow(@NonNull View view) {
+ view.setOnFocusChangeListener(null);
+ }
+ });
+
+ spListAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
+ @Override
+ public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
+ String spName = spListAdapter.getItem(position);
+ filterResult(spName);
+ }
+ });
+
+ mGridView.setHasFixedSize(true);
+ mGridView.setLayoutManager(new V7GridLayoutManager(this.mContext, 5));
+
+ searchAdapter = new FastSearchAdapter();
+ mGridView.setAdapter(searchAdapter);
+
+ searchAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
+ @Override
+ public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
+ FastClickCheckUtil.check(view);
+ Movie.Video video = searchAdapter.getData().get(position);
+ if (video != null) {
+ try {
+ if (searchExecutorService != null) {
+ pauseRunnable = searchExecutorService.shutdownNow();
+ searchExecutorService = null;
+ }
+ } catch (Throwable th) {
+ th.printStackTrace();
+ }
+ Bundle bundle = new Bundle();
+ bundle.putString("id", video.id);
+ bundle.putString("sourceKey", video.sourceKey);
+ jumpActivity(DetailActivity.class, bundle);
+ }
+ }
+ });
+
+
+ mGridViewFilter.setLayoutManager(new V7GridLayoutManager(this.mContext, 5));
+ searchAdapterFilter = new FastSearchAdapter();
+ mGridViewFilter.setAdapter(searchAdapterFilter);
+ searchAdapterFilter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
+ @Override
+ public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
+ FastClickCheckUtil.check(view);
+ Movie.Video video = searchAdapterFilter.getData().get(position);
+ if (video != null) {
+ try {
+ if (searchExecutorService != null) {
+ pauseRunnable = searchExecutorService.shutdownNow();
+ searchExecutorService = null;
+ }
+ } catch (Throwable th) {
+ th.printStackTrace();
+ }
+ Bundle bundle = new Bundle();
+ bundle.putString("id", video.id);
+ bundle.putString("sourceKey", video.sourceKey);
+ jumpActivity(DetailActivity.class, bundle);
+ }
+ }
+ });
+
+ setLoadSir(llLayout);
+
+ // 分词
+ searchWordAdapter = new SearchWordAdapter();
+ mGridViewWordFenci = findViewById(R.id.mGridViewWordFenci);
+ mGridViewWordFenci.setAdapter(searchWordAdapter);
+ mGridViewWordFenci.setLayoutManager(new V7LinearLayoutManager(this.mContext, 0, false));
+ searchWordAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
+ @Override
+ public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
+ String str = searchWordAdapter.getData().get(position);
+ search(str);
+ }
+ });
+ searchWordAdapter.setNewData(new ArrayList<>());
+ }
+
+ private void initViewModel() {
+ sourceViewModel = new ViewModelProvider(this).get(SourceViewModel.class);
+ }
+ private void filterResult(String spName){
+ if(spName == "全部显示"){
+ mGridView.setVisibility(View.VISIBLE);
+ mGridViewFilter.setVisibility(View.GONE);
+ return;
+ }
+ String key = spNames.get(spName);
+ if(key.isEmpty()) return;
+
+ if(searchFilterKey == key) return;
+ searchFilterKey = key;
+
+ List list = resultVods.get(key);
+ searchAdapterFilter.setNewData(list);
+ mGridView.setVisibility(View.GONE);
+ mGridViewFilter.setVisibility(View.VISIBLE);
+ }
+
+ private void fenci(){
+ if(!quickSearchWord.isEmpty()) return; // 如果经有分词了,不再进行二次分词
+ // 分词
+ OkGo.get("http://api.pullword.com/get.php?source=" + URLEncoder.encode(searchTitle) + "¶m1=0¶m2=0&json=1")
+ .tag("fenci")
+ .execute(new AbsCallback() {
+ @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 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 response) {
+ super.onError(response);
+ }
+ });
+ }
+ private void initData() {
+ Intent intent = getIntent();
+ if (intent != null && intent.hasExtra("title")) {
+ String title = intent.getStringExtra("title");
+ showLoading();
+ search(title);
+ }
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void server(ServerEvent event) {
+ if (event.type == ServerEvent.SERVER_SEARCH) {
+ String title = (String) event.obj;
+ showLoading();
+ search(title);
+ }
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void refresh(RefreshEvent event) {
+ if(mSearchTitle != null){
+ mSearchTitle.setText(String.format("搜索(%d/%d)", finishedCount, spNames.size()));
+ }
+ if (event.type == RefreshEvent.TYPE_SEARCH_RESULT) {
+ try {
+ searchData(event.obj == null ? null : (AbsXml) event.obj);
+ } catch (Exception e) {
+ searchData(null);
+ }
+ }
+ else if(event.type == RefreshEvent.TYPE_QUICK_SEARCH_WORD){
+ if (event.obj != null) {
+ List data = (List) event.obj;
+ searchWordAdapter.setNewData(data);
+ }
+ }
+ }
+
+ private void search(String title) {
+ cancel();
+ showLoading();
+ this.searchTitle = title;
+ fenci();
+ mGridView.setVisibility(View.INVISIBLE);
+ mGridViewFilter.setVisibility(View.GONE);
+ searchAdapter.setNewData(new ArrayList<>());
+ searchAdapterFilter.setNewData(new ArrayList<>());
+
+ spListAdapter.reset();
+ resultVods.clear();
+ searchFilterKey = "";
+ isFilterMode = false;
+ spNames.clear();
+ finishedCount=0;
+
+ searchResult();
+ }
+
+ private ExecutorService searchExecutorService = null;
+ private AtomicInteger allRunCount = new AtomicInteger(0);
+
+ private void searchResult() {
+ try {
+ if (searchExecutorService != null) {
+ searchExecutorService.shutdownNow();
+ searchExecutorService = null;
+ }
+ } catch (Throwable th) {
+ th.printStackTrace();
+ } finally {
+ searchAdapter.setNewData(new ArrayList<>());
+ searchAdapterFilter.setNewData(new ArrayList<>());
+ allRunCount.set(0);
+ }
+ searchExecutorService = Executors.newFixedThreadPool(5);
+ List searchRequestList = new ArrayList<>();
+ searchRequestList.addAll(ApiConfig.get().getSourceBeanList());
+ SourceBean home = ApiConfig.get().getHomeSourceBean();
+ searchRequestList.remove(home);
+ searchRequestList.add(0, home);
+
+
+ ArrayList siteKey = new ArrayList<>();
+ ArrayList hots = new ArrayList<>();
+
+ spListAdapter.setNewData(hots);
+ spListAdapter.addData("全部显示");
+ for (SourceBean bean : searchRequestList) {
+ if (!bean.isSearchable()) {
+ continue;
+ }
+ siteKey.add(bean.getKey());
+ this.spNames.put(bean.getName(), bean.getKey());
+ allRunCount.incrementAndGet();
+ }
+ updateSearchResultCount(0);
+
+ for (String key : siteKey) {
+ searchExecutorService.execute(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ sourceViewModel.getSearch(key, searchTitle);
+ }catch (Exception e){
+
+ }
+
+ updateSearchResultCount(1);
+ }
+ });
+ }
+ }
+ synchronized private void updateSearchResultCount(int n){
+ finishedCount +=n;
+ if(finishedCount > spNames.size()) finishedCount = spNames.size();
+
+ }
+ // 向过滤栏添加有结果的spname
+ private String addWordAdapterIfNeed(String key){
+ try {
+ String name = "";
+ for (String n : spNames.keySet() ){
+ if(spNames.get(n) == key){
+ name = n;
+ }
+ }
+ if(name == "") return key;
+
+ List names = spListAdapter.getData();
+ for (int i =0 ; i < names.size(); ++i){
+ if(name == names.get(i)){
+ return key;
+ }
+ }
+
+ spListAdapter.addData(name);
+ return key;
+ }catch (Exception e){
+ return key;
+ }
+ }
+ private void searchData(AbsXml absXml) {
+ String lastSourceKey = "";
+
+ if (absXml != null && absXml.movie != null && absXml.movie.videoList != null && absXml.movie.videoList.size() > 0) {
+ List data = new ArrayList<>();
+ for (Movie.Video video : absXml.movie.videoList) {
+ if (video.name.contains(searchTitle)) {
+ data.add(video);
+ if(!resultVods.containsKey(video.sourceKey)){
+ resultVods.put(video.sourceKey, new ArrayList());
+ }
+ resultVods.get(video.sourceKey).add(video);
+ if(video.sourceKey != lastSourceKey){
+ lastSourceKey = this.addWordAdapterIfNeed(video.sourceKey);
+ }
+ }
+ }
+
+ if (searchAdapter.getData().size() > 0) {
+ searchAdapter.addData(data);
+ } else {
+ showSuccess();
+ if(!isFilterMode)
+ mGridView.setVisibility(View.VISIBLE);
+ searchAdapter.setNewData(data);
+ }
+ }
+
+ int count = allRunCount.decrementAndGet();
+ if (count <= 0) {
+ if (searchAdapter.getData().size() <= 0) {
+ showEmpty();
+ }
+ cancel();
+ }
+ }
+
+ private void cancel() {
+ OkGo.getInstance().cancelTag("search");
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ cancel();
+ try {
+ if (searchExecutorService != null) {
+ searchExecutorService.shutdownNow();
+ searchExecutorService = null;
+ }
+ } catch (Throwable th) {
+ th.printStackTrace();
+ }
+ EventBus.getDefault().unregister(this);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/tvbox/osc/ui/adapter/FastListAdapter.java b/app/src/main/java/com/github/tvbox/osc/ui/adapter/FastListAdapter.java
new file mode 100644
index 00000000..91761127
--- /dev/null
+++ b/app/src/main/java/com/github/tvbox/osc/ui/adapter/FastListAdapter.java
@@ -0,0 +1,65 @@
+package com.github.tvbox.osc.ui.adapter;
+
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.github.tvbox.osc.R;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class FastListAdapter extends BaseQuickAdapter {
+ public FastListAdapter() {
+ super(R.layout.item_search_word_hot, new ArrayList<>());
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, String item) {
+ helper.setText(R.id.tvSearchWord, item);
+ }
+
+
+ // 记录失去焦点的控件
+ public void onLostFocus(View child) {
+ if(lostFocusTimestamp==0) {
+ lostFocusTimestamp = System.currentTimeMillis();
+ }
+ }
+
+ // 记录获得焦点的控件
+ public int onSetFocus(View child){
+ // 可以调整间隔还判断到底是不是整个view失去了焦点
+ if(System.currentTimeMillis() - lostFocusTimestamp > 200) {
+ setp = 0;
+ }
+ int index=((ViewGroup)child.getParent()).indexOfChild(child);
+ if(focusView != null){
+ int index2=((ViewGroup)focusView.getParent()).indexOfChild(focusView);
+ if(Math.abs(index-index2) > setp) { // 跳了控件,将焦点恢复到之前的控件上去
+ setp = 0;
+ int offset = (index > index2? -1 :1);
+ ViewGroup parent = ((ViewGroup)focusView.getParent());
+ parent.getChildAt(index+offset).requestFocus();
+ return -1;
+ }
+ }
+ lostFocusTimestamp =0;
+ focusView = child;
+ setp =1;
+ return 1;
+ }
+
+ public void reset(){
+ lostFocusTimestamp =0;
+ setp =0;
+ focusView = null;
+ }
+
+ public long lostFocusTimestamp=0; // 控件失去焦点的时间
+ public int setp =0; //步长
+ View focusView; // 当前获得焦点的控件
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/tvbox/osc/ui/adapter/FastSearchAdapter.java b/app/src/main/java/com/github/tvbox/osc/ui/adapter/FastSearchAdapter.java
new file mode 100644
index 00000000..8c4b35c1
--- /dev/null
+++ b/app/src/main/java/com/github/tvbox/osc/ui/adapter/FastSearchAdapter.java
@@ -0,0 +1,52 @@
+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;
+
+import me.jessyan.autosize.utils.AutoSizeUtils;
+
+public class FastSearchAdapter extends BaseQuickAdapter {
+ public FastSearchAdapter() {
+ super(R.layout.item_search, new ArrayList<>());
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, Movie.Video item) {
+
+ // 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);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/GridFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/GridFragment.java
index a86dd27b..6f252381 100644
--- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/GridFragment.java
+++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/GridFragment.java
@@ -9,10 +9,12 @@ 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.BaseLazyFragment;
import com.github.tvbox.osc.bean.AbsXml;
import com.github.tvbox.osc.bean.Movie;
import com.github.tvbox.osc.bean.MovieSort;
+import com.github.tvbox.osc.bean.SourceBean;
import com.github.tvbox.osc.ui.activity.DetailActivity;
import com.github.tvbox.osc.ui.adapter.GridAdapter;
import com.github.tvbox.osc.ui.dialog.GridFilterDialog;
@@ -21,6 +23,9 @@ import com.github.tvbox.osc.util.FastClickCheckUtil;
import com.github.tvbox.osc.viewmodel.SourceViewModel;
import com.owen.tvrecyclerview.widget.TvRecyclerView;
import com.owen.tvrecyclerview.widget.V7GridLayoutManager;
+import com.orhanobut.hawk.Hawk;
+import com.github.tvbox.osc.util.HawkConfig;
+import com.github.tvbox.osc.ui.activity.FastSearchActivity;
/**
* @author pj567
@@ -105,7 +110,13 @@ public class GridFragment extends BaseLazyFragment {
Bundle bundle = new Bundle();
bundle.putString("id", video.id);
bundle.putString("sourceKey", video.sourceKey);
- jumpActivity(DetailActivity.class, bundle);
+ bundle.putString("title", video.name);
+ SourceBean homeSourceBean = ApiConfig.get().getHomeSourceBean();
+ if(homeSourceBean.isQuickSearch() && Hawk.get(HawkConfig.FAST_SEARCH_MODE, false)){
+ jumpActivity(FastSearchActivity.class, bundle);
+ }else{
+ jumpActivity(DetailActivity.class, bundle);
+ }
}
}
});
diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java
index f3f23908..68435928 100644
--- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java
+++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java
@@ -61,6 +61,7 @@ public class ModelSettingFragment extends BaseLazyFragment {
private TextView tvHistoryNum;
private TextView tvSearchView;
private TextView tvShowPreviewText;
+ private TextView tvFastSearchText;
public static ModelSettingFragment newInstance() {
return new ModelSettingFragment().setArguments();
@@ -77,6 +78,8 @@ public class ModelSettingFragment extends BaseLazyFragment {
@Override
protected void init() {
+ tvFastSearchText = findViewById(R.id.showFastSearchText);
+ tvFastSearchText.setText(Hawk.get(HawkConfig.FAST_SEARCH_MODE, false) ? "已开启" : "已关闭");
tvShowPreviewText = findViewById(R.id.showPreviewText);
tvShowPreviewText.setText(Hawk.get(HawkConfig.SHOW_PREVIEW, false) ? "开启" : "关闭");
tvDebugOpen = findViewById(R.id.tvDebugOpen);
@@ -550,6 +553,14 @@ public class ModelSettingFragment extends BaseLazyFragment {
dialog.show();
}
});
+ findViewById(R.id.showFastSearch).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ FastClickCheckUtil.check(v);
+ Hawk.put(HawkConfig.FAST_SEARCH_MODE, !Hawk.get(HawkConfig.FAST_SEARCH_MODE, false));
+ tvFastSearchText.setText(Hawk.get(HawkConfig.FAST_SEARCH_MODE, false) ? "已开启" : "已关闭");
+ }
+ });
}
@Override
diff --git a/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java b/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java
index bebba602..876665ef 100644
--- a/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java
+++ b/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java
@@ -28,4 +28,5 @@ public class HawkConfig {
public static final String LIVE_CONNECT_TIMEOUT = "live_connect_timeout";
public static final String LIVE_SHOW_NET_SPEED = "live_show_net_speed";
public static final String LIVE_SHOW_TIME = "live_show_time";
+ public static final String FAST_SEARCH_MODE = "fast_search_mode";
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_fast_search.xml b/app/src/main/res/layout/activity_fast_search.xml
new file mode 100644
index 00000000..5b106eb5
--- /dev/null
+++ b/app/src/main/res/layout/activity_fast_search.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_model.xml b/app/src/main/res/layout/fragment_model.xml
index 1c834d86..ae2340bb 100644
--- a/app/src/main/res/layout/fragment_model.xml
+++ b/app/src/main/res/layout/fragment_model.xml
@@ -203,11 +203,20 @@
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+