home buttons

okjack
okjack 2 years ago
parent 0fba955d4f
commit 553de537c9
  1. 122
      app/src/leanback/java/com/fongmi/android/tv/bean/Button.java
  2. 6
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java
  3. 101
      app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ButtonsAdapter.java
  4. 65
      app/src/leanback/java/com/fongmi/android/tv/ui/dialog/ButtonsDialog.java
  5. 24
      app/src/leanback/java/com/fongmi/android/tv/ui/fragment/HomeFragment.java
  6. 10
      app/src/leanback/res/drawable/ic_action_up.xml
  7. 21
      app/src/leanback/res/layout/activity_setting_custom.xml
  8. 53
      app/src/leanback/res/layout/adapter_buttons.xml
  9. 18
      app/src/leanback/res/layout/dialog_buttons.xml
  10. 1
      app/src/main/res/values-zh-rCN/strings.xml
  11. 1
      app/src/main/res/values-zh-rTW/strings.xml
  12. 1
      app/src/main/res/values/strings.xml

@ -0,0 +1,122 @@
package com.fongmi.android.tv.bean;
import android.text.TextUtils;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.ResUtil;
import com.github.catvod.utils.Prefers;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class Button {
public int id;
public int resId;
private static List<Button> buttons;
public static List<Button> all() {
if (buttons != null) return buttons;
buttons = new ArrayList<>();
buttons.add(new Button(0, R.string.home_vod));
buttons.add(new Button(1, R.string.home_live));
buttons.add(new Button(2, R.string.home_search));
buttons.add(new Button(3, R.string.home_keep));
buttons.add(new Button(4, R.string.home_push));
buttons.add(new Button(5, R.string.home_history_short));
buttons.add(new Button(6, R.string.home_setting));
return buttons;
}
public static List<Button> sortedAll() {
String buttons = Prefers.getString("home_buttons_sorted", "0,1,2,3,4,5,6");
if (TextUtils.isEmpty(buttons)) return all();
String[] buttonsArr = buttons.split(",");
List<Button> buttonList = new ArrayList<>();
Map<Integer, Button> allButtons = getMap(all());
for(int i=0; i<buttonsArr.length; i++) {
int id = Integer.parseInt(buttonsArr[i]);
if (allButtons.containsKey(id)) buttonList.add(allButtons.get(id));
}
return buttonList;
}
public static Map<Integer, Button> getMap(List<Button> buttons) {
Map<Integer, Button> map = new LinkedHashMap<>();
if (buttons.size() == 0) return map;
for(int i=0; i<buttons.size(); i++) {
Button one = buttons.get(i);
map.put(one.getId(), one);
}
return map;
}
public static List<Button> getButtons() {
String buttons = Prefers.getString("home_buttons", "0,1,2,3,4,5,6");
if (TextUtils.isEmpty(buttons)) return new ArrayList<>();
String[] buttonsArr = buttons.split(",");
List<Button> buttonList = new ArrayList<>();
Map<Integer, Button> allButtons = getMap(all());
for(int i=0; i<buttonsArr.length; i++) {
int id = Integer.parseInt(buttonsArr[i]);
if (allButtons.containsKey(id)) buttonList.add(allButtons.get(id));
}
return buttonList;
}
public static Map<Integer, Button> getButtonsMap() {
return getMap(getButtons());
}
public static void save(Map<Integer, Button> map) {
List<Integer> ids = new ArrayList<>();
if (map.size() > 0) {
for(Integer id : map.keySet()) {
ids.add(id);
}
}
String buttonsStr = TextUtils.join(",", ids);
Prefers.put("home_buttons", buttonsStr);
}
public static void saveSorted(Map<Integer, Button> map) {
List<Integer> ids = new ArrayList<>();
if (map.size() > 0) {
for(Integer id : map.keySet()) {
ids.add(id);
}
}
String buttonsStr = TextUtils.join(",", ids);
Prefers.put("home_buttons_sorted", buttonsStr);
}
public Button(int id, int resId) {
this.id = id;
this.resId = resId;
}
public String getName() {
return ResUtil.getString(resId);
}
public int getResId() {
return resId;
}
public int getId() {
return id;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Button)) return false;
Button it = (Button) obj;
return getId() == it.getId();
}
}

@ -11,6 +11,7 @@ import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.databinding.ActivitySettingCustomBinding;
import com.fongmi.android.tv.event.RefreshEvent;
import com.fongmi.android.tv.ui.base.BaseActivity;
import com.fongmi.android.tv.ui.dialog.ButtonsDialog;
import com.fongmi.android.tv.utils.ResUtil;
import java.util.Locale;
@ -77,6 +78,7 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.homeMenuKey.setOnClickListener(this::setHomeMenuKey);
mBinding.aggregatedSearch.setOnClickListener(this::setAggregatedSearch);
mBinding.homeUI.setOnClickListener(this::setHomeUI);
mBinding.homeButtons.setOnClickListener(this::setHomeButtons);
}
private void setQuality(View view) {
@ -176,4 +178,8 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.homeUIText.setText(homeUI[index]);
}
private void setHomeButtons(View view) {
ButtonsDialog.create(this).show();
}
}

@ -0,0 +1,101 @@
package com.fongmi.android.tv.ui.adapter;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.bean.Button;
import com.fongmi.android.tv.databinding.AdapterButtonsBinding;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class ButtonsAdapter extends RecyclerView.Adapter<ButtonsAdapter.ViewHolder> {
private List<Button> mItems;
public ButtonsAdapter() {
this.mItems = Button.sortedAll();
}
@Override
public int getItemCount() {
return mItems.size();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(AdapterButtonsBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Button item = mItems.get(position);
holder.binding.text.setText(item.getName());
holder.binding.check.setChecked(getChecked(item));
holder.binding.select.setOnLongClickListener(v -> onItemLongClick(item));
holder.binding.select.setOnClickListener(v -> onItemClick(item, position));
holder.binding.text.setGravity(Gravity.START);
holder.binding.up.setOnClickListener(v -> onUpClick(item, position));
}
private boolean getChecked(Button item) {
Map<Integer, Button> map = Button.getButtonsMap();
if (map.containsKey(item.getId())) return true;
return false;
}
private void onItemClick(Button item, int position) {
boolean checked = getChecked(item);
Map<Integer, Button> map = Button.getButtonsMap();
if (checked) map.remove(item.getId());
else map.put(item.getId(), item);
Button.save(map);
notifyItemRangeChanged(0, getItemCount());
}
private boolean onItemLongClick(Button item) {
boolean checked = getChecked(item);
Map<Integer, Button> map = new LinkedHashMap<>();
if (!checked) map = Button.getMap(mItems);
Button.save(map);
notifyItemRangeChanged(0, getItemCount());
return true;
}
private void onUpClick(Button item, int position) {
if (position == 0) return;
List<Button> buttonList = Button.sortedAll();
Button button = buttonList.get(position);
buttonList.remove(position);
buttonList.add(position - 1, button);
Map<Integer, Button> map = Button.getMap(buttonList);
Button.saveSorted(map);
mItems = Button.sortedAll();
List<Button> btns = new ArrayList<>();
Map<Integer, Button> btnsMap= Button.getButtonsMap();
for(int i=0; i<mItems.size(); i++) {
if (btnsMap.containsKey(mItems.get(i).getId())) btns.add(mItems.get(i));
}
Button.save(Button.getMap(btns));
notifyItemRangeChanged(0, getItemCount());
}
static class ViewHolder extends RecyclerView.ViewHolder {
private final AdapterButtonsBinding binding;
ViewHolder(@NonNull AdapterButtonsBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
}

@ -0,0 +1,65 @@
package com.fongmi.android.tv.ui.dialog;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.WindowManager;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.GridLayoutManager;
import com.fongmi.android.tv.databinding.DialogButtonsBinding;
import com.fongmi.android.tv.ui.adapter.ButtonsAdapter;
import com.fongmi.android.tv.ui.custom.SpaceItemDecoration;
import com.fongmi.android.tv.utils.ResUtil;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
public class ButtonsDialog {
private final DialogButtonsBinding binding;
private final ButtonsAdapter adapter;
private final AlertDialog dialog;
public static ButtonsDialog create(Activity activity) {
return new ButtonsDialog(activity);
}
public ButtonsDialog(Activity activity) {
this.adapter = new ButtonsAdapter();
this.binding = DialogButtonsBinding.inflate(LayoutInflater.from(activity));
this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create();
}
public void show() {
initView();
initEvent();
}
private void initView() {
setRecyclerView();
setDialog();
}
private void initEvent() {
}
private void setRecyclerView() {
binding.recycler.setAdapter(adapter);
binding.recycler.setHasFixedSize(true);
binding.recycler.setItemAnimator(null);
binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 16));
binding.recycler.setLayoutManager(new GridLayoutManager(dialog.getContext(), 1));
binding.recycler.post(() -> binding.recycler.scrollToPosition(0));
}
private void setDialog() {
if (adapter.getItemCount() == 0) return;
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.width = (int) (ResUtil.getScreenWidth() * 0.4f);
dialog.getWindow().setAttributes(params);
dialog.getWindow().setDimAmount(0);
dialog.show();
}
}

@ -17,6 +17,7 @@ import com.fongmi.android.tv.Product;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.api.config.VodConfig;
import com.fongmi.android.tv.bean.Button;
import com.fongmi.android.tv.bean.Func;
import com.fongmi.android.tv.bean.History;
import com.fongmi.android.tv.bean.Result;
@ -44,6 +45,7 @@ import com.fongmi.android.tv.ui.presenter.HistoryPresenter;
import com.fongmi.android.tv.ui.presenter.ProgressPresenter;
import com.fongmi.android.tv.ui.presenter.VodPresenter;
import com.fongmi.android.tv.utils.ResUtil;
import com.github.catvod.utils.Prefers;
import com.google.common.collect.Lists;
import java.util.List;
@ -57,6 +59,7 @@ public class HomeFragment extends BaseFragment implements VodPresenter.OnClickLi
public HistoryPresenter mPresenter;
private ArrayObjectAdapter mAdapter;
private int homeUI;
private String button;
private Site getHome() {
return VodConfig.get().getHome();
@ -114,6 +117,7 @@ public class HomeFragment extends BaseFragment implements VodPresenter.OnClickLi
mAdapter.add(R.string.home_recommend);
mHistoryAdapter = new ArrayObjectAdapter(mPresenter = new HistoryPresenter(this));
homeUI = Setting.getHomeUI();
button = Prefers.getString("home_buttons");
}
public void addVideo(Result result) {
@ -129,21 +133,21 @@ public class HomeFragment extends BaseFragment implements VodPresenter.OnClickLi
private ListRow getFuncRow() {
ArrayObjectAdapter adapter = new ArrayObjectAdapter(new FuncPresenter(this));
adapter.add(Func.create(R.string.home_vod));
adapter.add(Func.create(R.string.home_live));
adapter.add(Func.create(R.string.home_search));
adapter.add(Func.create(R.string.home_keep));
adapter.add(Func.create(R.string.home_push));
adapter.add(Func.create(R.string.home_history_short));
adapter.add(Func.create(R.string.home_setting));
((Func) adapter.get(0)).setNextFocusLeft(((Func) adapter.get(adapter.size() - 1)).getId());
((Func) adapter.get(adapter.size() - 1)).setNextFocusRight(((Func) adapter.get(0)).getId());
List<Button> buttonList = Button.getButtons();
for(int i=0; i<buttonList.size(); i++) {
adapter.add(Func.create(buttonList.get(i).getResId()));
}
if (adapter.size() > 1) {
((Func) adapter.get(0)).setNextFocusLeft(((Func) adapter.get(adapter.size() - 1)).getId());
((Func) adapter.get(adapter.size() - 1)).setNextFocusRight(((Func) adapter.get(0)).getId());
}
return new ListRow(adapter);
}
private void refreshFuncRow() {
if (homeUI == Setting.getHomeUI()) return;
if (homeUI == Setting.getHomeUI() && button == Prefers.getString("home_buttons")) return;
homeUI = Setting.getHomeUI();
button = Prefers.getString("home_buttons");
mAdapter.removeItems(0, 1);
mAdapter.add(0, getFuncRow());
}

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/white"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M4,12l1.41,1.41L11,7.83V20h2V7.83l5.58,5.59L20,12l-8,-8 -8,8z" />
</vector>

@ -490,6 +490,7 @@
android:id="@+id/homeUI"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/selector_item"
android:focusable="true"
@ -515,6 +516,26 @@
</LinearLayout>
<LinearLayout
android:id="@+id/homeButtons"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/selector_item"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/setting_home_buttons"
android:textColor="@color/white"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

@ -0,0 +1,53 @@
<?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="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/select"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="marquee"
android:gravity="center"
android:singleLine="true"
android:textColor="@color/text"
android:textSize="18sp"
tools:text="泥巴" />
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/check"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="12dp"
android:buttonTint="@color/white"
android:clickable="false"
android:enabled="false"
android:focusable="false"
android:focusableInTouchMode="false" />
</LinearLayout>
<ImageView
android:id="@+id/up"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginLeft="10dp"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:padding="8dp"
android:src="@drawable/ic_action_up" />
</LinearLayout>

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<com.fongmi.android.tv.ui.custom.CustomRecyclerView
android:id="@+id/recycler"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:maxHeight="264dp"
tools:itemCount="5"
tools:listitem="@layout/adapter_buttons" />
</LinearLayout>

@ -84,6 +84,7 @@
<string name="setting_small_window_back_key">小窗返回键</string>
<string name="setting_home_change_config">首页换线</string>
<string name="setting_home_ui">首页UI</string>
<string name="setting_home_buttons">首页按钮</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>
<string name="setting_cache">缓存</string>

@ -84,6 +84,7 @@
<string name="setting_small_window_back_key">小窗返回鍵</string>
<string name="setting_home_change_config">首頁換線</string>
<string name="setting_home_ui">首頁UI</string>
<string name="setting_home_buttons">首頁按鈕</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>
<string name="setting_cache">暫存</string>

@ -84,6 +84,7 @@
<string name="setting_small_window_back_key">Small window back key</string>
<string name="setting_home_change_config">Home change config</string>
<string name="setting_home_ui">Home ui style</string>
<string name="setting_home_buttons">Home buttons</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>
<string name="setting_cache">Cache</string>

Loading…
Cancel
Save