home recommend

okjack
okjack 2 years ago
parent 9893333ae4
commit 6e3671b818
  1. 87
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
  2. 9
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java
  3. 95
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java
  4. 37
      app/src/leanback/res/layout/activity_setting_custom.xml
  5. 8
      app/src/main/java/com/fongmi/android/tv/Setting.java
  6. 6
      app/src/main/res/values-zh-rCN/strings.xml
  7. 6
      app/src/main/res/values-zh-rTW/strings.xml
  8. 6
      app/src/main/res/values/strings.xml

@ -27,6 +27,7 @@ import com.fongmi.android.tv.api.config.VodConfig;
import com.fongmi.android.tv.api.config.WallConfig;
import com.fongmi.android.tv.bean.Config;
import com.fongmi.android.tv.bean.Func;
import com.fongmi.android.tv.bean.History;
import com.fongmi.android.tv.bean.Result;
import com.fongmi.android.tv.bean.Site;
import com.fongmi.android.tv.bean.Style;
@ -47,6 +48,7 @@ import com.fongmi.android.tv.ui.custom.CustomTitleView;
import com.fongmi.android.tv.ui.dialog.SiteDialog;
import com.fongmi.android.tv.ui.presenter.FuncPresenter;
import com.fongmi.android.tv.ui.presenter.HeaderPresenter;
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.Clock;
@ -64,15 +66,18 @@ import org.greenrobot.eventbus.ThreadMode;
import java.util.List;
public class HomeActivity extends BaseActivity implements CustomTitleView.Listener, VodPresenter.OnClickListener, FuncPresenter.OnClickListener {
public class HomeActivity extends BaseActivity implements CustomTitleView.Listener, VodPresenter.OnClickListener, FuncPresenter.OnClickListener, HistoryPresenter.OnClickListener {
private ActivityHomeBinding mBinding;
private ArrayObjectAdapter mHistoryAdapter;
private HistoryPresenter mPresenter;
private ArrayObjectAdapter mAdapter;
private SiteViewModel mViewModel;
private boolean loading;
private boolean confirm;
private Result mResult;
private Clock mClock;
private int recommend;
private Site getHome() {
return VodConfig.get().getHome();
@ -111,6 +116,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
@Override
public void onChildViewHolderSelected(@NonNull RecyclerView parent, @Nullable RecyclerView.ViewHolder child, int position, int subposition) {
mBinding.toolbar.setVisibility(position == 0 ? View.VISIBLE : View.GONE);
if (mPresenter != null && mPresenter.isDelete()) setHistoryDelete(false);
}
});
}
@ -137,6 +143,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
selector.addPresenter(String.class, new ProgressPresenter());
selector.addPresenter(ListRow.class, new CustomRowPresenter(16), VodPresenter.class);
selector.addPresenter(ListRow.class, new CustomRowPresenter(16), FuncPresenter.class);
selector.addPresenter(ListRow.class, new CustomRowPresenter(16), HistoryPresenter.class);
mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector)));
mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16));
}
@ -151,7 +158,11 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
private void setAdapter() {
mAdapter.add(getFuncRow());
mAdapter.add(R.string.home_recommend);
int homeRecommend = Setting.getHomeRecommend();
if (homeRecommend == 0) mAdapter.add(R.string.home_history);
if (homeRecommend == 1) mAdapter.add(R.string.home_recommend);
if (homeRecommend == 0) mHistoryAdapter = new ArrayObjectAdapter(mPresenter = new HistoryPresenter(this));
recommend = homeRecommend;
}
private void initConfig() {
@ -168,6 +179,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
public void success() {
mBinding.progressLayout.showContent();
checkAction(getIntent());
getHistory();
getVideo();
setFocus();
}
@ -213,13 +225,14 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
int index = getRecommendIndex();
String title = getHome().getName();
mBinding.title.setText(title.isEmpty() ? ResUtil.getString(R.string.app_name) : title);
if (mAdapter.size() > index) mAdapter.removeItems(index, mAdapter.size() - index);
if (mAdapter.size() > index && index > -1) mAdapter.removeItems(index, mAdapter.size() - index);
if (getHome().getKey().isEmpty()) return;
mViewModel.homeContent();
mAdapter.add("progress");
}
private void addVideo(Result result) {
if (Setting.getHomeRecommend() == 0) return;
Style style = result.getStyle(getHome().getStyle());
for (List<Vod> items : Lists.partition(result.getList(), Product.getColumn(style))) {
ArrayObjectAdapter adapter = new ArrayObjectAdapter(new VodPresenter(this, style));
@ -230,18 +243,50 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
private ListRow getFuncRow() {
ArrayObjectAdapter adapter = new ArrayObjectAdapter(new FuncPresenter(this));
adapter.add(Func.create(R.string.home_history));
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));
if (Setting.getHomeRecommend() == 1) adapter.add(Func.create(R.string.home_history));
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());
return new ListRow(adapter);
}
private void getHistory() {
getHistory(false);
}
private void getHistory(boolean renew) {
if (Setting.getHomeRecommend() == 1) return;
List<History> items = History.get();
int historyIndex = getHistoryIndex();
int totalSize = mAdapter.size();
if (renew) mHistoryAdapter = new ArrayObjectAdapter(mPresenter = new HistoryPresenter(this));
if (renew) mAdapter.removeItems(historyIndex, 1);
if (totalSize == historyIndex || renew) mAdapter.add(historyIndex, new ListRow(mHistoryAdapter));
mHistoryAdapter.setItems(items, null);
}
private void setHistoryDelete(boolean delete) {
mPresenter.setDelete(delete);
mHistoryAdapter.notifyArrayItemRangeChanged(0, mHistoryAdapter.size());
}
private void clearHistory() {
mAdapter.removeItems(getHistoryIndex(), 1);
History.delete(VodConfig.getCid());
mPresenter.setDelete(false);
mHistoryAdapter.clear();
}
private int getHistoryIndex() {
for (int i = 0; i < mAdapter.size(); i++) if (mAdapter.get(i).equals(R.string.home_history)) return i + 1;
return -1;
}
private int getRecommendIndex() {
for (int i = 0; i < mAdapter.size(); i++) if (mAdapter.get(i).equals(R.string.home_recommend)) return i + 1;
return -1;
@ -288,6 +333,26 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
}
}
@Override
public void onItemClick(History item) {
VideoActivity.start(this, item.getSiteKey(), item.getVodId(), item.getVodName(), item.getVodPic());
}
@Override
public void onItemDelete(History item) {
mHistoryAdapter.remove(item.delete());
if (mHistoryAdapter.size() > 0) return;
mAdapter.removeItems(getHistoryIndex(), 1);
mPresenter.setDelete(false);
}
@Override
public boolean onLongClick() {
if (mPresenter.isDelete()) clearHistory();
else setHistoryDelete(true);
return true;
}
@Override
public void onItemClick(Vod item) {
if (getHome().isIndexs()) CollectActivity.start(this, item.getVodName());
@ -333,8 +398,12 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
int index = getRecommendIndex();
mAdapter.notifyArrayItemRangeChanged(index, mAdapter.size() - index);
break;
case HISTORY:
getHistory();
break;
case SIZE:
getVideo();
getHistory(true);
break;
}
}
@ -387,6 +456,14 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
super.onResume();
mClock.start();
setTitleView();
reloadHomeRecommend();
}
private void reloadHomeRecommend() {
if (recommend == Setting.getHomeRecommend()) return;
mAdapter.clear();
setAdapter();
initConfig();
}
@Override
@ -404,6 +481,8 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
protected void onBackPress() {
if (mBinding.progressLayout.isProgress()) {
mBinding.progressLayout.showContent();
} else if (mPresenter != null && mPresenter.isDelete()) {
setHistoryDelete(false);
} else if (mBinding.recycler.getSelectedPosition() != 0) {
mBinding.recycler.scrollToPosition(0);
} else if (!confirm) {

@ -23,6 +23,7 @@ public class SettingCustomActivity extends BaseActivity {
private String[] episode;
private String[] fullscreenMenuKey;
private String[] smallWindowBackKey;
private String[] homeRecommend;
@Override
protected ViewBinding getBinding() {
@ -52,6 +53,7 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.homeSiteLockText.setText(getSwitch(Setting.isHomeSiteLock()));
mBinding.incognitoText.setText(getSwitch(Setting.isIncognito()));
mBinding.smallWindowBackKeyText.setText((smallWindowBackKey = ResUtil.getStringArray(R.array.select_small_window_back_key))[Setting.getSmallWindowBackKey()]);
mBinding.homeRecommonedText.setText((homeRecommend = ResUtil.getStringArray(R.array.select_home_recommend))[Setting.getHomeRecommend()]);
}
@Override
@ -69,6 +71,7 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.homeSiteLock.setOnClickListener(this::setHomeSiteLock);
mBinding.incognito.setOnClickListener(this::setIncognito);
mBinding.smallWindowBackKey.setOnClickListener(this::setSmallWindowBackKey);
mBinding.homeRecommoned.setOnClickListener(this::setHomeRecommend);
}
private void setQuality(View view) {
@ -151,4 +154,10 @@ public class SettingCustomActivity extends BaseActivity {
mBinding.smallWindowBackKeyText.setText(smallWindowBackKey[index]);
}
private void setHomeRecommend(View view) {
int index = Setting.getHomeRecommend();
Setting.putHomeRecommend(index = index == homeRecommend.length - 1 ? 0 : ++index);
mBinding.homeRecommonedText.setText(homeRecommend[index]);
}
}

@ -0,0 +1,95 @@
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.Product;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.bean.History;
import com.fongmi.android.tv.databinding.AdapterVodBinding;
import com.fongmi.android.tv.utils.ImgUtil;
import com.fongmi.android.tv.utils.ResUtil;
public class HistoryPresenter extends Presenter {
private final OnClickListener mListener;
private int width, height;
private boolean delete;
public HistoryPresenter(OnClickListener listener) {
this.mListener = listener;
setLayoutSize();
}
public interface OnClickListener {
void onItemClick(History item);
void onItemDelete(History item);
boolean onLongClick();
}
public boolean isDelete() {
return delete;
}
public void setDelete(boolean delete) {
this.delete = delete;
}
private void setLayoutSize() {
int space = ResUtil.dp2px(48) + ResUtil.dp2px(16 * (Product.getColumn() - 1));
int base = ResUtil.getScreenWidth() - space;
width = base / Product.getColumn();
height = (int) (width / 0.75f);
}
@Override
public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
ViewHolder holder = new ViewHolder(AdapterVodBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
holder.binding.getRoot().getLayoutParams().width = width;
holder.binding.getRoot().getLayoutParams().height = height;
return holder;
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) {
History item = (History) object;
ViewHolder holder = (ViewHolder) viewHolder;
setClickListener(holder.view, item);
holder.binding.name.setText(item.getVodName());
holder.binding.site.setText(item.getSiteName());
holder.binding.site.setVisibility(item.getSiteVisible());
holder.binding.remark.setVisibility(delete ? View.GONE : View.VISIBLE);
holder.binding.delete.setVisibility(!delete ? View.GONE : View.VISIBLE);
holder.binding.remark.setText(ResUtil.getString(R.string.vod_last, item.getVodRemarks()));
ImgUtil.loadVod(item.getVodName(), item.getVodPic(), holder.binding.image);
}
private void setClickListener(View root, History item) {
root.setOnLongClickListener(view -> mListener.onLongClick());
root.setOnClickListener(view -> {
if (isDelete()) mListener.onItemDelete(item);
else mListener.onItemClick(item);
});
}
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
}
public static class ViewHolder extends Presenter.ViewHolder {
private final AdapterVodBinding binding;
public ViewHolder(@NonNull AdapterVodBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
}

@ -412,5 +412,42 @@
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/homeRecommoned"
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_recommend"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/homeRecommonedText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="歷史" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

@ -413,4 +413,12 @@ public class Setting {
return Prefers.getInt("small_window_back_key", 0);
}
public static void putHomeRecommend(int recommend) {
Prefers.put("home_recommend", recommend);
}
public static int getHomeRecommend() {
return Prefers.getInt("home_recommend", 0);
}
}

@ -80,6 +80,7 @@
<string name="setting_home_site_lock">首页源锁定</string>
<string name="setting_incognito">无痕模式</string>
<string name="setting_small_window_back_key">小窗返回键</string>
<string name="setting_home_recommend">首页推荐位</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>
<string name="setting_cache">缓存</string>
@ -226,6 +227,11 @@
<item>焦点移动</item>
</string-array>
<string-array name="select_home_recommend">
<item>播放历史</item>
<item>站点推荐</item>
</string-array>
<string-array name="select_caption">
<item>预设</item>
<item>系统</item>

@ -80,6 +80,7 @@
<string name="setting_home_site_lock">首頁源鎖定</string>
<string name="setting_incognito">無痕模式</string>
<string name="setting_small_window_back_key">小窗返回鍵</string>
<string name="setting_home_recommend">首页推薦位</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>
<string name="setting_cache">暫存</string>
@ -226,6 +227,11 @@
<item>焦點移動</item>
</string-array>
<string-array name="select_home_recommend">
<item>播放歷史</item>
<item>站點推薦</item>
</string-array>
<string-array name="select_caption">
<item>預設</item>
<item>系統</item>

@ -80,6 +80,7 @@
<string name="setting_home_site_lock">Home site lock</string>
<string name="setting_incognito">Incognito mode</string>
<string name="setting_small_window_back_key">Small window back key</string>
<string name="setting_home_recommend">Home recommend</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>
<string name="setting_cache">Cache</string>
@ -231,6 +232,11 @@
<item>Focus move</item>
</string-array>
<string-array name="select_home_recommend">
<item>History</item>
<item>Site recommend</item>
</string-array>
<string-array name="select_caption">
<item>Default</item>
<item>System</item>

Loading…
Cancel
Save