Support quick search - part 1

pull/123/head
FongMi 3 years ago
parent 7a3d38224d
commit 943ec03e16
  1. 49
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 64
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SuggestPresenter.java
  3. 17
      app/src/leanback/res/layout/activity_detail.xml
  4. 42
      app/src/leanback/res/layout/adapter_suggest.xml

@ -45,6 +45,7 @@ import com.fongmi.android.tv.ui.presenter.EpisodePresenter;
import com.fongmi.android.tv.ui.presenter.FlagPresenter;
import com.fongmi.android.tv.ui.presenter.ParsePresenter;
import com.fongmi.android.tv.ui.presenter.PartPresenter;
import com.fongmi.android.tv.ui.presenter.SuggestPresenter;
import com.fongmi.android.tv.utils.Clock;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.Prefers;
@ -60,7 +61,10 @@ import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import okhttp3.Call;
import okhttp3.Response;
@ -75,9 +79,11 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
private ArrayObjectAdapter mEpisodeAdapter;
private ArrayObjectAdapter mParseAdapter;
private ArrayObjectAdapter mPartAdapter;
private ArrayObjectAdapter mSuggestAdapter;
private EpisodePresenter mEpisodePresenter;
private PartPresenter mPartPresenter;
private CustomKeyDownVod mKeyDown;
private ExecutorService mExecutor;
private SiteViewModel mViewModel;
private boolean mFullscreen;
private History mHistory;
@ -211,7 +217,15 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
mBinding.array.setAdapter(new ItemBridgeAdapter(mArrayAdapter = new ArrayObjectAdapter(new ArrayPresenter(this))));
mBinding.part.setHorizontalSpacing(ResUtil.dp2px(8));
mBinding.part.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mBinding.part.setAdapter(new ItemBridgeAdapter(mPartAdapter = new ArrayObjectAdapter(mPartPresenter = new PartPresenter(item -> CollectActivity.start(this, item)))));
mBinding.part.setAdapter(new ItemBridgeAdapter(mPartAdapter = new ArrayObjectAdapter(mPartPresenter = new PartPresenter(this::initSearch))));
mBinding.suggest.setHorizontalSpacing(ResUtil.dp2px(8));
mBinding.suggest.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mBinding.suggest.setAdapter(new ItemBridgeAdapter(mSuggestAdapter = new ArrayObjectAdapter(new SuggestPresenter(new SuggestPresenter.OnClickListener() {
@Override
public void onItemClick(Vod item) {
}
}))));
mBinding.control.parse.setHorizontalSpacing(ResUtil.dp2px(8));
mBinding.control.parse.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mBinding.control.parse.setAdapter(new ItemBridgeAdapter(mParseAdapter = new ArrayObjectAdapter(new ParsePresenter(this::setParseActivated))));
@ -251,7 +265,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
resetFocus(useParse);
});
mViewModel.result.observe(this, result -> {
if (result.getList().isEmpty()) mBinding.progressLayout.showEmpty();
if (mExecutor != null) setSuggest(result.getList());
else if (result.getList().isEmpty()) mBinding.progressLayout.showEmpty();
else setDetail(result.getList().get(0));
});
}
@ -368,6 +383,36 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
mArrayAdapter.setItems(items, null);
}
private void stopSearch() {
if (mExecutor != null) mExecutor.shutdownNow();
}
private void initSearch(String keyword) {
stopSearch();
startSearch(keyword);
mBinding.part.setTag(keyword);
}
private void startSearch(String keyword) {
mExecutor = Executors.newFixedThreadPool(5);
for (Site site : ApiConfig.get().getSites()) if (site.isSearchable() && !site.getKey().equals(getKey())) mExecutor.execute(() -> search(site, keyword));
}
private void search(Site site, String keyword) {
try {
mViewModel.searchContent(site, keyword);
} catch (Throwable ignored) {
}
}
private void setSuggest(List<Vod> items) {
String keyword = mBinding.part.getTag().toString();
Iterator<Vod> iterator = items.iterator();
while (iterator.hasNext()) if (!iterator.next().getVodName().equals(keyword)) iterator.remove();
mSuggestAdapter.addAll(mSuggestAdapter.size(), items);
mBinding.suggest.setVisibility(View.VISIBLE);
}
@Override
public void onRevSort() {
mHistory.setRevSort(!mHistory.isRevSort());

@ -0,0 +1,64 @@
package com.fongmi.android.tv.ui.presenter;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.leanback.widget.Presenter;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.databinding.AdapterSuggestBinding;
import com.fongmi.android.tv.utils.ResUtil;
public class SuggestPresenter extends Presenter {
private final OnClickListener mListener;
private int width;
public SuggestPresenter(OnClickListener listener) {
this.mListener = listener;
setLayoutSize();
}
private void setLayoutSize() {
int space = ResUtil.dp2px(24) + ResUtil.dp2px(8 * 5);
int base = ResUtil.getScreenWidthPx() - space;
width = base / 5;
}
public interface OnClickListener {
void onItemClick(Vod item);
}
@Override
public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
ViewHolder holder = new ViewHolder(AdapterSuggestBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
holder.binding.getRoot().getLayoutParams().width = width;
return holder;
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) {
Vod item = (Vod) object;
ViewHolder holder = (ViewHolder) viewHolder;
holder.binding.name.setText(item.getVodName());
holder.binding.site.setText(item.getSiteName());
holder.binding.remark.setText(item.getVodRemarks());
setOnClickListener(holder, view -> mListener.onItemClick(item));
}
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
}
public static class ViewHolder extends Presenter.ViewHolder {
private final AdapterSuggestBinding binding;
public ViewHolder(@NonNull AdapterSuggestBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
}

@ -218,7 +218,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/video"
android:layout_marginTop="12dp">
android:layout_marginTop="12dp"
android:overScrollMode="never">
<LinearLayout
android:layout_width="match_parent"
@ -264,7 +265,6 @@
android:id="@+id/part"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingStart="24dp"
@ -272,6 +272,19 @@
android:paddingEnd="24dp"
android:paddingBottom="8dp" />
<androidx.leanback.widget.HorizontalGridView
android:id="@+id/suggest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingStart="24dp"
android:paddingTop="8dp"
android:paddingEnd="24dp"
android:paddingBottom="8dp"
android:visibility="gone" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</com.fongmi.android.tv.ui.custom.ProgressLayout>

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:background="@drawable/selector_item"
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusUp="@id/part"
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="蜘蛛人" />
<TextView
android:id="@+id/site"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:singleLine="true"
android:textColor="@color/green_a_400"
android:textSize="14sp"
tools:text="泥巴"
tools:visibility="visible" />
<TextView
android:id="@+id/remark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:singleLine="true"
android:textColor="@color/yellow_500"
android:textSize="14sp"
tools:text="1080p" />
</LinearLayout>
Loading…
Cancel
Save