diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java index 2fba0f06e..b484dff0d 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java @@ -8,9 +8,9 @@ import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.View; -import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; +import androidx.annotation.NonNull; import androidx.leanback.widget.ArrayObjectAdapter; import androidx.leanback.widget.ItemBridgeAdapter; import androidx.leanback.widget.ListRow; @@ -18,26 +18,23 @@ import androidx.lifecycle.ViewModelProvider; import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.api.ApiConfig; -import com.fongmi.android.tv.bean.Filter; +import com.fongmi.android.tv.bean.Hot; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Site; +import com.fongmi.android.tv.bean.Suggest; import com.fongmi.android.tv.bean.Vod; import com.fongmi.android.tv.databinding.ActivitySearchBinding; import com.fongmi.android.tv.model.SiteViewModel; +import com.fongmi.android.tv.net.Callback; import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.ui.custom.CustomKeyboard; import com.fongmi.android.tv.ui.custom.CustomRowPresenter; import com.fongmi.android.tv.ui.custom.CustomSelector; -import com.fongmi.android.tv.ui.presenter.EpisodePresenter; -import com.fongmi.android.tv.ui.presenter.FilterPresenter; import com.fongmi.android.tv.ui.presenter.TitlePresenter; import com.fongmi.android.tv.ui.presenter.VodPresenter; +import com.fongmi.android.tv.ui.presenter.WordPresenter; import com.fongmi.android.tv.utils.ResUtil; import com.google.common.collect.Lists; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import java.io.IOException; import java.util.ArrayList; @@ -45,17 +42,18 @@ import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -public class SearchActivity extends BaseActivity implements VodPresenter.OnClickListener { +import okhttp3.Call; +import okhttp3.Response; + +public class SearchActivity extends BaseActivity implements VodPresenter.OnClickListener, WordPresenter.OnClickListener, TextWatcher { private ActivitySearchBinding mBinding; private SiteViewModel mSiteViewModel; + private ArrayObjectAdapter mWordAdapter; private ArrayObjectAdapter mAdapter; private ExecutorService mService; private List mSites; - private ArrayObjectAdapter recommendWordAdapter; - private String searchKeyword = ""; - FilterPresenter filterPresenter; - private Handler handler = new Handler(Looper.getMainLooper()); + private Handler mHandler; private String getKeyword() { return getIntent().getStringExtra("keyword"); @@ -86,48 +84,26 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick @Override protected void initView() { + mHandler = new Handler(Looper.getMainLooper()); CustomKeyboard.init(mBinding); mBinding.keyword.requestFocus(); setRecyclerView(); setViewModel(); checkKeyword(); setSite(); + getHot(); } @Override protected void initEvent() { - mBinding.search.setOnClickListener(view -> { - searchKeyword = mBinding.keyword.getText().toString().trim(); - onSearch(); - }); + mBinding.keyword.addTextChangedListener(this); + mBinding.search.setOnClickListener(view -> onSearch()); mBinding.clear.setOnClickListener(view -> mBinding.keyword.setText("")); mBinding.remote.setOnClickListener(view -> PushActivity.start(this)); - mBinding.keyword.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { - - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - - } - - @Override - public void afterTextChanged(Editable editable) { - loadRecommendKey(editable); - } - }); mBinding.keyword.setOnEditorActionListener((textView, actionId, event) -> { if (actionId == EditorInfo.IME_ACTION_DONE) mBinding.search.performClick(); return true; }); - filterPresenter.setOnClickListener(this::recommendWordClick); - } - - private void recommendWordClick(String s, Filter.Value value) { - searchKeyword = value.getV(); - onSearch(); } private void setRecyclerView() { @@ -136,10 +112,8 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick selector.addPresenter(ListRow.class, new CustomRowPresenter(16), VodPresenter.class); mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16)); mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector))); - mBinding.recommendWordGrid.setHorizontalSpacing(ResUtil.dp2px(8)); - mBinding.recommendWordGrid.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); - mBinding.recommendWordGrid.setAdapter(new ItemBridgeAdapter(recommendWordAdapter = - new ArrayObjectAdapter(filterPresenter = new FilterPresenter("recommend_word")))); + mBinding.word.setVerticalSpacing(ResUtil.dp2px(16)); + mBinding.word.setAdapter(new ItemBridgeAdapter(mWordAdapter = new ArrayObjectAdapter(new WordPresenter(this)))); } private void setViewModel() { @@ -149,23 +123,21 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick }); } - private void setSite() { - mSites = new ArrayList<>(); - for (Site site : ApiConfig.get().getSites()) if (site.isSearchable()) mSites.add(site); - if (!mSites.contains(ApiConfig.get().getHome())) return; - mSites.remove(ApiConfig.get().getHome()); - mSites.add(0, ApiConfig.get().getHome()); - } - private void checkKeyword() { - String externalKeyword = getKeyword(); - if (externalKeyword.isEmpty()) return; + if (getKeyword().isEmpty()) return; stopSearch(); mAdapter.clear(); - mBinding.keyword.setText(externalKeyword); - mBinding.keyword.setSelection(mBinding.keyword.length()); - searchKeyword = externalKeyword; - new Handler().postDelayed(this::onSearch, 250); + mBinding.keyword.setText(getKeyword()); + mHandler.postDelayed(this::onSearch, 250); + } + + private void setSite() { + mSites = new ArrayList<>(); + for (Site site : ApiConfig.get().getSites()) if (site.isSearchable()) mSites.add(site); + Site home = ApiConfig.get().getHome(); + if (!mSites.contains(home)) return; + mSites.remove(home); + mSites.add(0, home); } private void addVideo(Result result) { @@ -181,9 +153,11 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick } private void onSearch() { - if (TextUtils.isEmpty(searchKeyword)) return; + String keyword = mBinding.keyword.getText().toString().trim(); + mBinding.keyword.setSelection(mBinding.keyword.length()); + if (TextUtils.isEmpty(keyword)) return; mService = Executors.newFixedThreadPool(5); - for (Site site : mSites) mService.execute(() -> mSiteViewModel.searchContent(site.getKey(), searchKeyword)); + for (Site site : mSites) mService.execute(() -> mSiteViewModel.searchContent(site.getKey(), keyword)); showProgress(); } @@ -213,6 +187,46 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick DetailActivity.start(this, item.getSite().getKey(), item.getVodId()); } + @Override + public void onItemClick(String text) { + mBinding.keyword.setText(text); + onSearch(); + } + + private void getHot() { + OKHttp.newCall("https://node.video.qq.com/x/api/hot_mobilesearch?channdlId=0").enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { + List items = Hot.get(response.body().string()); + mHandler.post(() -> mWordAdapter.setItems(items, null)); + } + }); + } + + private void getSuggest(String text) { + OKHttp.newCall("https://suggest.video.iqiyi.com/?if=mobile&key=" + text).enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { + List items = Suggest.get(response.body().string()); + mHandler.post(() -> mWordAdapter.setItems(items, null)); + } + }); + } + + @Override + public void afterTextChanged(Editable s) { + if (s.toString().isEmpty()) getHot(); + else getSuggest(s.toString()); + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + @Override public void onBackPressed() { if (isProgressVisible()) { @@ -229,36 +243,4 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick super.onDestroy(); stopSearch(); } - - private void loadRecommendKey(CharSequence entered) { - mBinding.recommendWordGrid.setVisibility(View.GONE); - if(TextUtils.isEmpty(entered) || searchKeyword.equals(entered)) - return; - recommendWordAdapter.clear(); - new Thread(() -> { - try { - String result = OKHttp.newCall("https://suggest.video.iqiyi.com/?if=mobile&key=" + entered).execute().body().string(); - JsonObject json = JsonParser.parseString(result.substring(result.indexOf("{"), result.lastIndexOf("}") + 1)).getAsJsonObject(); - JsonArray itemList = json.get("data").getAsJsonArray(); - JsonObject filterMapped = (JsonObject) JsonParser.parseString("{\"key\":\"recommend_word\",\"name\":\"recommend_word\",value:[]}"); - for (JsonElement ele : itemList) { - JsonObject obj = (JsonObject) ele; - String word = obj.get("name").getAsString().trim(); - JsonObject converted = new JsonObject(); - converted.addProperty("n", word); - converted.addProperty("v", word); - filterMapped.getAsJsonArray("value").add(converted); - } - handler.post(new Runnable() { - @Override - public void run() { - recommendWordAdapter.addAll(0, Filter.objectFrom(filterMapped).getValue()); - mBinding.recommendWordGrid.setVisibility(View.VISIBLE); - } - }); - } catch (IOException e) { - e.printStackTrace(); - } - }).start(); - } } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeyboardAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeyboardAdapter.java new file mode 100644 index 000000000..14fe4a904 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeyboardAdapter.java @@ -0,0 +1,96 @@ +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.R; +import com.fongmi.android.tv.databinding.AdapterKeyboardIconBinding; +import com.fongmi.android.tv.databinding.AdapterKeyboardTextBinding; + +import java.util.Arrays; +import java.util.List; + +public class KeyboardAdapter extends RecyclerView.Adapter { + + private final OnClickListener mListener; + private final List mItems; + + public KeyboardAdapter(OnClickListener listener) { + this.mItems = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", R.drawable.ic_keyboard_left, R.drawable.ic_keyboard_right, R.drawable.ic_keyboard_back, R.drawable.ic_keyboard_enter); + this.mListener = listener; + } + + public interface OnClickListener { + + void onTextClick(String text); + + void onIconClick(int resId); + } + + class TextHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + + private final AdapterKeyboardTextBinding binding; + + TextHolder(@NonNull AdapterKeyboardTextBinding binding) { + super(binding.getRoot()); + this.binding = binding; + itemView.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + mListener.onTextClick(mItems.get(getLayoutPosition()).toString()); + } + } + + class IconHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + + private final AdapterKeyboardIconBinding binding; + + IconHolder(@NonNull AdapterKeyboardIconBinding binding) { + super(binding.getRoot()); + this.binding = binding; + itemView.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + mListener.onIconClick((int) mItems.get(getLayoutPosition())); + } + } + + @Override + public int getItemViewType(int position) { + return mItems.get(position) instanceof String ? 0 : 1; + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if (viewType == 0) return new TextHolder(AdapterKeyboardTextBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + else return new IconHolder(AdapterKeyboardIconBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + switch (getItemViewType(position)) { + case 0: + TextHolder text = (TextHolder) holder; + text.binding.text.setText(mItems.get(position).toString()); + break; + case 1: + IconHolder icon = (IconHolder) holder; + icon.binding.icon.setImageResource((int) mItems.get(position)); + break; + } + } +} diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyboard.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyboard.java index d7f385160..2674306f6 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyboard.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyboard.java @@ -2,21 +2,13 @@ package com.fongmi.android.tv.ui.custom; import android.annotation.SuppressLint; -import androidx.leanback.widget.ArrayObjectAdapter; -import androidx.leanback.widget.ItemBridgeAdapter; -import androidx.leanback.widget.ListRow; +import androidx.recyclerview.widget.GridLayoutManager; import com.fongmi.android.tv.R; import com.fongmi.android.tv.databinding.ActivitySearchBinding; -import com.fongmi.android.tv.ui.presenter.KeyboardPresenter; -import com.fongmi.android.tv.utils.ResUtil; -import com.google.common.collect.Lists; +import com.fongmi.android.tv.ui.adapter.KeyboardAdapter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class CustomKeyboard implements KeyboardPresenter.OnClickListener { +public class CustomKeyboard implements KeyboardAdapter.OnClickListener { private final ActivitySearchBinding binding; @@ -29,23 +21,10 @@ public class CustomKeyboard implements KeyboardPresenter.OnClickListener { } private void initView() { - CustomSelector selector = new CustomSelector(); - selector.addPresenter(ListRow.class, new CustomRowPresenter(12), KeyboardPresenter.class); - ArrayObjectAdapter adapter = new ArrayObjectAdapter(selector); - binding.keyboard.setVerticalSpacing(ResUtil.dp2px(12)); - binding.keyboard.setAdapter(new ItemBridgeAdapter(adapter)); - adapter.addAll(adapter.size(), getRows()); - } - - private List getRows() { - List keys = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", R.drawable.ic_keyboard_left, R.drawable.ic_keyboard_right, R.drawable.ic_keyboard_back, R.drawable.ic_keyboard_enter); - List rows = new ArrayList<>(); - for (List items : Lists.partition(keys, 10)) { - ArrayObjectAdapter adapter = new ArrayObjectAdapter(new KeyboardPresenter(this)); - adapter.addAll(0, items); - rows.add(new ListRow(adapter)); - } - return rows; + binding.keyboard.setHasFixedSize(true); + binding.keyboard.setLayoutManager(new GridLayoutManager(binding.getRoot().getContext(), 10)); + binding.keyboard.addItemDecoration(new SpaceItemDecoration(10, 8)); + binding.keyboard.setAdapter(new KeyboardAdapter(this)); } @Override diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomVerticalGridView.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomVerticalGridView.java index 429f91e87..baa4ad27b 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomVerticalGridView.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomVerticalGridView.java @@ -13,7 +13,7 @@ import androidx.recyclerview.widget.RecyclerView; public class CustomVerticalGridView extends VerticalGridView { - private View mTabView; + private View tabView; private boolean pressUp; private boolean pressDown; @@ -35,18 +35,18 @@ public class CustomVerticalGridView extends VerticalGridView { setOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() { @Override public void onChildViewHolderSelected(@NonNull RecyclerView parent, @Nullable ViewHolder child, int position, int subposition) { - if (mTabView == null) return; + if (tabView == null) return; if (pressUp && position == 0) { - mTabView.setVisibility(View.VISIBLE); + tabView.setVisibility(View.VISIBLE); } else if (pressDown && position == 1) { - mTabView.setVisibility(View.GONE); + tabView.setVisibility(View.GONE); } } }); } public void setTabView(View tabView) { - this.mTabView = tabView; + this.tabView = tabView; } @Override @@ -69,9 +69,9 @@ public class CustomVerticalGridView extends VerticalGridView { } public boolean moveToTop() { - if (mTabView == null) return false; - mTabView.setVisibility(View.VISIBLE); - mTabView.requestFocus(); + if (tabView == null) return false; + tabView.setVisibility(View.VISIBLE); + tabView.requestFocus(); scrollToPosition(0); return true; } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java new file mode 100644 index 000000000..a73ff3f28 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java @@ -0,0 +1,36 @@ +package com.fongmi.android.tv.ui.custom; + +import android.graphics.Rect; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.fongmi.android.tv.utils.ResUtil; + +public class SpaceItemDecoration extends RecyclerView.ItemDecoration { + + private final int spanCount; + private final int spacing; + + public SpaceItemDecoration(int spanCount, int spacing) { + this.spanCount = spanCount; + this.spacing = ResUtil.dp2px(spacing); + } + + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, RecyclerView parent, @NonNull RecyclerView.State state) { + int position = parent.getChildAdapterPosition(view); + if (position >= 0) { + int column = position % spanCount; + outRect.left = column * spacing / spanCount; + outRect.right = spacing - (column + 1) * spacing / spanCount; + if (position >= spanCount) outRect.top = spacing; + } else { + outRect.left = 0; + outRect.right = 0; + outRect.top = 0; + outRect.bottom = 0; + } + } +} \ No newline at end of file diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/KeyboardPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/KeyboardPresenter.java deleted file mode 100644 index 984f284a7..000000000 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/KeyboardPresenter.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.fongmi.android.tv.ui.presenter; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.leanback.widget.Presenter; - -import com.fongmi.android.tv.databinding.AdapterKeyboardBinding; - -public class KeyboardPresenter extends Presenter { - - private final OnClickListener mListener; - - public KeyboardPresenter(OnClickListener listener) { - this.mListener = listener; - } - - public interface OnClickListener { - - void onTextClick(String text); - - void onIconClick(int resId); - } - - @Override - public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { - return new ViewHolder(AdapterKeyboardBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); - } - - @Override - public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { - ViewHolder holder = (ViewHolder) viewHolder; - if (object instanceof String) { - String text = (String) object; - holder.binding.text.setText(text); - holder.binding.icon.setVisibility(View.GONE); - holder.binding.text.setVisibility(View.VISIBLE); - setOnClickListener(holder, view -> mListener.onTextClick(text)); - } else { - int resId = (int) object; - holder.binding.icon.setImageResource(resId); - holder.binding.text.setVisibility(View.GONE); - holder.binding.icon.setVisibility(View.VISIBLE); - setOnClickListener(holder, view -> mListener.onIconClick(resId)); - } - } - - @Override - public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { - } - - public static class ViewHolder extends Presenter.ViewHolder { - - private final AdapterKeyboardBinding binding; - - public ViewHolder(@NonNull AdapterKeyboardBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - } -} \ No newline at end of file diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/WordPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/WordPresenter.java new file mode 100644 index 000000000..77d78ed53 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/WordPresenter.java @@ -0,0 +1,52 @@ +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 OnClickListener mListener; + + public WordPresenter(OnClickListener listener) { + this.mListener = listener; + } + + public interface OnClickListener { + void onItemClick(String text); + } + + public void setOnClickListener(OnClickListener listener) { + this.mListener = listener; + } + + @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; + } + } +} \ No newline at end of file diff --git a/app/src/leanback/res/drawable/ic_mic.xml b/app/src/leanback/res/drawable/ic_mic.xml new file mode 100644 index 000000000..05ab75366 --- /dev/null +++ b/app/src/leanback/res/drawable/ic_mic.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/leanback/res/drawable/selector_filter.xml b/app/src/leanback/res/drawable/selector_filter.xml deleted file mode 100644 index 88e0bc5f2..000000000 --- a/app/src/leanback/res/drawable/selector_filter.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/leanback/res/drawable/selector_keyboard.xml b/app/src/leanback/res/drawable/selector_keyboard.xml new file mode 100644 index 000000000..f17cb388a --- /dev/null +++ b/app/src/leanback/res/drawable/selector_keyboard.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/drawable/selector_mic.xml b/app/src/leanback/res/drawable/selector_mic.xml new file mode 100644 index 000000000..1831bdc4c --- /dev/null +++ b/app/src/leanback/res/drawable/selector_mic.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/drawable/shape_keyboard_focused.xml b/app/src/leanback/res/drawable/shape_keyboard_focused.xml new file mode 100644 index 000000000..37652c5fb --- /dev/null +++ b/app/src/leanback/res/drawable/shape_keyboard_focused.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/drawable/shape_keyboard_normal.xml b/app/src/leanback/res/drawable/shape_keyboard_normal.xml new file mode 100644 index 000000000..967d62ab9 --- /dev/null +++ b/app/src/leanback/res/drawable/shape_keyboard_normal.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/drawable/shape_mic_focused.xml b/app/src/leanback/res/drawable/shape_mic_focused.xml new file mode 100644 index 000000000..d401aa080 --- /dev/null +++ b/app/src/leanback/res/drawable/shape_mic_focused.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/drawable/shape_mic_normal.xml b/app/src/leanback/res/drawable/shape_mic_normal.xml new file mode 100644 index 000000000..28c38c1da --- /dev/null +++ b/app/src/leanback/res/drawable/shape_mic_normal.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/activity_search.xml b/app/src/leanback/res/layout/activity_search.xml index bc3e1d65c..51e928972 100644 --- a/app/src/leanback/res/layout/activity_search.xml +++ b/app/src/leanback/res/layout/activity_search.xml @@ -1,59 +1,79 @@ - - + android:layout_height="match_parent"> - + + - - - + - + android:background="@drawable/selector_mic" + android:focusable="true" + android:focusableInTouchMode="true" + android:scaleType="center" + android:src="@drawable/ic_mic" /> + - + - - \ No newline at end of file + + + diff --git a/app/src/leanback/res/layout/adapter_episode.xml b/app/src/leanback/res/layout/adapter_episode.xml index 7f450bac6..cc451a4c5 100644 --- a/app/src/leanback/res/layout/adapter_episode.xml +++ b/app/src/leanback/res/layout/adapter_episode.xml @@ -10,8 +10,8 @@ android:focusableInTouchMode="true" android:gravity="center" android:maxEms="10" - android:nextFocusUp="@+id/flag" - android:nextFocusDown="@+id/group" + android:nextFocusUp="@id/flag" + android:nextFocusDown="@id/group" android:singleLine="true" android:textColor="@color/white" android:textSize="16sp" diff --git a/app/src/leanback/res/layout/adapter_filter.xml b/app/src/leanback/res/layout/adapter_filter.xml index 0eb801ab5..93f8b8cc5 100644 --- a/app/src/leanback/res/layout/adapter_filter.xml +++ b/app/src/leanback/res/layout/adapter_filter.xml @@ -4,7 +4,7 @@ android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/selector_filter" + android:background="@drawable/selector_type" android:focusable="true" android:focusableInTouchMode="true" android:textColor="@color/white" diff --git a/app/src/leanback/res/layout/adapter_flag.xml b/app/src/leanback/res/layout/adapter_flag.xml index dae8ac301..6612be65f 100644 --- a/app/src/leanback/res/layout/adapter_flag.xml +++ b/app/src/leanback/res/layout/adapter_flag.xml @@ -8,7 +8,7 @@ android:focusable="true" android:focusableInTouchMode="true" android:gravity="center" - android:nextFocusDown="@+id/episode" + android:nextFocusDown="@id/episode" android:textColor="@color/white" android:textSize="16sp" tools:text="泥巴" /> \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_group.xml b/app/src/leanback/res/layout/adapter_group.xml index 714f77b79..ff2c47715 100644 --- a/app/src/leanback/res/layout/adapter_group.xml +++ b/app/src/leanback/res/layout/adapter_group.xml @@ -8,7 +8,7 @@ android:focusable="true" android:focusableInTouchMode="true" android:gravity="center" - android:nextFocusUp="@+id/episode" + android:nextFocusUp="@id/episode" android:textColor="@color/white" android:textSize="16sp" tools:text="11" /> \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_keyboard.xml b/app/src/leanback/res/layout/adapter_keyboard.xml deleted file mode 100644 index bf01ca884..000000000 --- a/app/src/leanback/res/layout/adapter_keyboard.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_keyboard_icon.xml b/app/src/leanback/res/layout/adapter_keyboard_icon.xml new file mode 100644 index 000000000..b97edebab --- /dev/null +++ b/app/src/leanback/res/layout/adapter_keyboard_icon.xml @@ -0,0 +1,11 @@ + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_keyboard_text.xml b/app/src/leanback/res/layout/adapter_keyboard_text.xml new file mode 100644 index 000000000..43193b45a --- /dev/null +++ b/app/src/leanback/res/layout/adapter_keyboard_text.xml @@ -0,0 +1,14 @@ + + diff --git a/app/src/leanback/res/layout/adapter_site.xml b/app/src/leanback/res/layout/adapter_site.xml index 66fa920a7..53849d70c 100644 --- a/app/src/leanback/res/layout/adapter_site.xml +++ b/app/src/leanback/res/layout/adapter_site.xml @@ -11,4 +11,4 @@ android:singleLine="true" android:textColor="@color/white" android:textSize="18sp" - tools:text="泥巴影院" /> \ No newline at end of file + tools:text="泥巴" /> \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_word.xml b/app/src/leanback/res/layout/adapter_word.xml new file mode 100644 index 000000000..a529d656e --- /dev/null +++ b/app/src/leanback/res/layout/adapter_word.xml @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/view_controller_bottom.xml b/app/src/leanback/res/layout/view_controller_bottom.xml index 76d8c8457..26c6945e0 100644 --- a/app/src/leanback/res/layout/view_controller_bottom.xml +++ b/app/src/leanback/res/layout/view_controller_bottom.xml @@ -179,7 +179,7 @@ android:focusableInTouchMode="true" android:nextFocusLeft="@id/exo_progress" android:nextFocusRight="@id/exo_progress" - android:nextFocusUp="@+id/next" + android:nextFocusUp="@id/next" android:nextFocusDown="@id/exo_progress" app:buffered_color="@color/grey_700" app:played_color="@color/blue_700" diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Hot.java b/app/src/main/java/com/fongmi/android/tv/bean/Hot.java new file mode 100644 index 000000000..6554448a1 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/bean/Hot.java @@ -0,0 +1,47 @@ +package com.fongmi.android.tv.bean; + +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +import java.util.ArrayList; +import java.util.List; + +public class Hot { + + @SerializedName("data") + private Data data; + + private static Hot objectFrom(String str) { + return new Gson().fromJson(str, Hot.class); + } + + public static List get(String str) { + List items = new ArrayList<>(); + for (Data.Item item : objectFrom(str).getData().getItemList()) items.add(item.getTitle()); + return items; + } + + private Data getData() { + return data; + } + + static class Data { + + @SerializedName("itemList") + private List itemList; + + public List getItemList() { + return itemList; + } + + static class Item { + + @SerializedName("title") + private String title; + + public String getTitle() { + return title; + } + } + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Suggest.java b/app/src/main/java/com/fongmi/android/tv/bean/Suggest.java new file mode 100644 index 000000000..5df73b0a2 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/bean/Suggest.java @@ -0,0 +1,37 @@ +package com.fongmi.android.tv.bean; + +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +import java.util.ArrayList; +import java.util.List; + +public class Suggest { + + @SerializedName("data") + private List data; + + private static Suggest objectFrom(String str) { + return new Gson().fromJson(str, Suggest.class); + } + + public static List get(String str) { + List items = new ArrayList<>(); + for (Data item : objectFrom(str).getData()) items.add(item.getName()); + return items; + } + + private List getData() { + return data; + } + + static class Data { + + @SerializedName("name") + private String name; + + private String getName() { + return name; + } + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/net/Callback.java b/app/src/main/java/com/fongmi/android/tv/net/Callback.java index 1e0a3f52e..c967876ce 100644 --- a/app/src/main/java/com/fongmi/android/tv/net/Callback.java +++ b/app/src/main/java/com/fongmi/android/tv/net/Callback.java @@ -21,6 +21,6 @@ public abstract class Callback implements okhttp3.Callback { } @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { + public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { } }