Support search history

pull/102/head
FongMi 4 years ago
parent 0d8d3ca81c
commit 17763b21cd
  1. 31
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java
  2. 99
      app/src/leanback/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java
  3. 67
      app/src/leanback/java/com/fongmi/android/tv/ui/adapter/WordAdapter.java
  4. 48
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/WordPresenter.java
  5. 2
      app/src/leanback/res/layout/activity_search.xml
  6. 3
      app/src/leanback/res/layout/adapter_word.xml
  7. 5
      app/src/main/java/com/fongmi/android/tv/player/ParseTask.java
  8. 8
      app/src/main/java/com/fongmi/android/tv/utils/Prefers.java

@ -18,8 +18,6 @@ import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.leanback.widget.ArrayObjectAdapter;
import androidx.leanback.widget.ItemBridgeAdapter;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.R;
@ -28,28 +26,28 @@ import com.fongmi.android.tv.bean.Suggest;
import com.fongmi.android.tv.databinding.ActivitySearchBinding;
import com.fongmi.android.tv.net.Callback;
import com.fongmi.android.tv.net.OKHttp;
import com.fongmi.android.tv.ui.adapter.HistoryAdapter;
import com.fongmi.android.tv.ui.adapter.WordAdapter;
import com.fongmi.android.tv.ui.custom.CustomKeyboard;
import com.fongmi.android.tv.ui.custom.CustomListener;
import com.fongmi.android.tv.ui.custom.SpaceItemDecoration;
import com.fongmi.android.tv.ui.presenter.WordPresenter;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.Utils;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import okhttp3.Call;
import okhttp3.Response;
public class SearchActivity extends BaseActivity implements WordPresenter.OnClickListener, CustomKeyboard.Callback {
public class SearchActivity extends BaseActivity implements WordAdapter.OnClickListener, HistoryAdapter.OnClickListener, CustomKeyboard.Callback {
private final ActivityResultLauncher<String> launcherString = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> onVoice());
private ActivitySearchBinding mBinding;
private ArrayObjectAdapter mHistoryAdapter;
private ArrayObjectAdapter mWordAdapter;
private SpeechRecognizer mRecognizer;
private HistoryAdapter mHistoryAdapter;
private WordAdapter mWordAdapter;
private Animation mFlicker;
private Handler mHandler;
@ -98,12 +96,11 @@ public class SearchActivity extends BaseActivity implements WordPresenter.OnClic
private void setRecyclerView() {
mBinding.word.setHasFixedSize(true);
mBinding.history.setHasFixedSize(true);
mBinding.word.addItemDecoration(new SpaceItemDecoration(1, 16));
mBinding.word.setAdapter(mWordAdapter = new WordAdapter(this));
mBinding.history.setHasFixedSize(true);
mBinding.history.addItemDecoration(new SpaceItemDecoration(1, 16));
mBinding.word.setAdapter(new ItemBridgeAdapter(mWordAdapter = new ArrayObjectAdapter(new WordPresenter(this))));
mBinding.history.setAdapter(new ItemBridgeAdapter(mHistoryAdapter = new ArrayObjectAdapter(new WordPresenter(this))));
mHistoryAdapter.setItems(Arrays.asList("測試1測試1", "測試2測試2", "測試3"), null);
mBinding.history.setAdapter(mHistoryAdapter = new HistoryAdapter(this));
}
private void getHot() {
@ -112,7 +109,7 @@ public class SearchActivity extends BaseActivity implements WordPresenter.OnClic
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
List<String> items = Hot.get(response.body().string());
mHandler.post(() -> mWordAdapter.setItems(items, null));
mHandler.post(() -> mWordAdapter.addAll(items));
}
});
}
@ -123,7 +120,7 @@ public class SearchActivity extends BaseActivity implements WordPresenter.OnClic
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
List<String> items = Suggest.get(response.body().string());
mHandler.post(() -> mWordAdapter.setItems(items, null));
mHandler.post(() -> mWordAdapter.addAll(items));
}
});
}
@ -134,6 +131,13 @@ public class SearchActivity extends BaseActivity implements WordPresenter.OnClic
onSearch();
}
@Override
public void onDataChanged(int size) {
int visible = size == 0 ? View.GONE : View.VISIBLE;
if (mBinding.historyLayout.getVisibility() == visible) return;
mBinding.historyLayout.setVisibility(visible);
}
@Override
public void onSearch() {
String keyword = mBinding.keyword.getText().toString().trim();
@ -141,6 +145,7 @@ public class SearchActivity extends BaseActivity implements WordPresenter.OnClic
Utils.hideKeyboard(mBinding.keyword);
if (TextUtils.isEmpty(keyword)) return;
CollectActivity.start(this, keyword);
mHandler.postDelayed(() -> mHistoryAdapter.add(keyword), 250);
}
@Override

@ -0,0 +1,99 @@
package com.fongmi.android.tv.ui.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.databinding.AdapterWordBinding;
import com.fongmi.android.tv.utils.Prefers;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
public class HistoryAdapter extends RecyclerView.Adapter<HistoryAdapter.ViewHolder> {
private final OnClickListener mListener;
private final List<String> mItems;
private final Gson mGson;
public HistoryAdapter(OnClickListener listener) {
this.mListener = listener;
this.mGson = new Gson();
this.mItems = getItems();
this.mListener.onDataChanged(mItems.size());
}
public interface OnClickListener {
void onItemClick(String item);
void onDataChanged(int size);
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
private final AdapterWordBinding binding;
public ViewHolder(@NonNull AdapterWordBinding binding) {
super(binding.getRoot());
this.binding = binding;
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
@Override
public void onClick(View view) {
mListener.onItemClick(mItems.get(getLayoutPosition()));
}
@Override
public boolean onLongClick(View v) {
mItems.remove(getLayoutPosition());
notifyItemRemoved(getLayoutPosition());
Prefers.putKeyword(mGson.toJson(mItems));
mListener.onDataChanged(getItemCount());
return true;
}
}
private List<String> getItems() {
if (Prefers.getKeyword().isEmpty()) return new ArrayList<>();
return mGson.fromJson(Prefers.getKeyword(), new TypeToken<List<String>>() {}.getType());
}
private void check(String item) {
int index = mItems.indexOf(item);
if (index == -1) return;
mItems.remove(index);
notifyItemRemoved(index);
}
public void add(String item) {
check(item);
mItems.add(0, item);
notifyItemInserted(0);
Prefers.putKeyword(mGson.toJson(mItems));
mListener.onDataChanged(getItemCount());
}
@Override
public int getItemCount() {
return mItems.size();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(AdapterWordBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.binding.text.setText(mItems.get(position));
}
}

@ -0,0 +1,67 @@
package com.fongmi.android.tv.ui.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.databinding.AdapterWordBinding;
import java.util.ArrayList;
import java.util.List;
public class WordAdapter extends RecyclerView.Adapter<WordAdapter.ViewHolder> {
private final OnClickListener mListener;
private final List<String> mItems;
public WordAdapter(OnClickListener listener) {
this.mItems = new ArrayList<>();
this.mListener = listener;
}
public interface OnClickListener {
void onItemClick(String item);
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private final AdapterWordBinding binding;
public ViewHolder(@NonNull AdapterWordBinding binding) {
super(binding.getRoot());
this.binding = binding;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
mListener.onItemClick(mItems.get(getLayoutPosition()));
}
}
public void addAll(List<String> items) {
mItems.clear();
mItems.addAll(items);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return mItems.size();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(AdapterWordBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.binding.text.setText(mItems.get(position));
}
}

@ -1,48 +0,0 @@
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.databinding.AdapterWordBinding;
public class WordPresenter extends Presenter {
private final OnClickListener mListener;
public WordPresenter(OnClickListener listener) {
this.mListener = listener;
}
public interface OnClickListener {
void onItemClick(String text);
}
@Override
public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
return new ViewHolder(AdapterWordBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) {
ViewHolder holder = (ViewHolder) viewHolder;
holder.binding.text.setText(object.toString());
setOnClickListener(holder, view -> mListener.onItemClick(object.toString()));
}
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
}
public static class ViewHolder extends Presenter.ViewHolder {
private final AdapterWordBinding binding;
public ViewHolder(@NonNull AdapterWordBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
}

@ -56,8 +56,10 @@
</LinearLayout>
<LinearLayout
android:id="@+id/historyLayout"
android:layout_width="150dp"
android:layout_height="match_parent"
android:layout_marginEnd="24dp"
android:orientation="vertical">
<TextView

@ -5,8 +5,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/selector_item_round"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="16sp"

@ -47,11 +47,14 @@ public class ParseTask {
if (useParse) parse = ApiConfig.get().getParse();
else if (url.startsWith("json:")) parse = Parse.get(1, url.substring(5));
else if (url.startsWith("parse:")) parse = ApiConfig.get().getParse(url.substring(6));
else if (url.startsWith("magnet:")) parse = Parse.get(99, url);
if (parse == null) parse = Parse.get(0, url);
}
private void doInBackground(String webUrl, String flag) {
if (webUrl.startsWith("magnet:")) {
onParseError();
return;
}
switch (parse.getType()) {
case 0: //嗅探
handler.post(() -> Players.get().web().start(parse.getUrl() + webUrl, callback));

@ -67,6 +67,14 @@ public class Prefers {
Prefers.put("parse", parse);
}
public static String getKeyword() {
return Prefers.getString("keyword");
}
public static void putKeyword(String keyword) {
Prefers.put("keyword", keyword);
}
public static int getScale() {
return Prefers.getInt("scale");
}

Loading…
Cancel
Save