From 22487a2ece1cf5b54dfde9a87539d4872f9fd4be Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 1 Jul 2022 15:24:19 +0800 Subject: [PATCH] Site dialog use leanback --- .../main/java/com/fongmi/bear/bean/Site.java | 4 + .../fongmi/bear/ui/activity/HomeActivity.java | 3 +- .../bear/ui/activity/SettingActivity.java | 27 ++++--- .../fongmi/bear/ui/activity/VodActivity.java | 32 ++++++-- .../fongmi/bear/ui/adapter/PageAdapter.java | 30 ------- .../fongmi/bear/ui/adapter/SiteAdapter.java | 81 ------------------- .../fongmi/bear/ui/fragment/VodFragment.java | 3 +- .../bear/ui/presenter/SitePresenter.java | 51 ++++++++++++ .../java/com/fongmi/bear/utils/Notify.java | 22 ++--- app/src/main/res/drawable/selector_site.xml | 2 +- app/src/main/res/layout/adapter_site.xml | 24 ++---- app/src/main/res/layout/dialog_site.xml | 16 ++-- 12 files changed, 123 insertions(+), 172 deletions(-) delete mode 100644 app/src/main/java/com/fongmi/bear/ui/adapter/PageAdapter.java delete mode 100644 app/src/main/java/com/fongmi/bear/ui/adapter/SiteAdapter.java create mode 100644 app/src/main/java/com/fongmi/bear/ui/presenter/SitePresenter.java diff --git a/app/src/main/java/com/fongmi/bear/bean/Site.java b/app/src/main/java/com/fongmi/bear/bean/Site.java index e56fb0e14..50a4dcf5f 100644 --- a/app/src/main/java/com/fongmi/bear/bean/Site.java +++ b/app/src/main/java/com/fongmi/bear/bean/Site.java @@ -103,6 +103,10 @@ public class Site { this.home = home; } + public void setActivated(Site item) { + this.home = item.equals(this); + } + @Override public boolean equals(Object obj) { if (this == obj) return true; diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java index 80b5ccdc6..552de045a 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java @@ -61,9 +61,8 @@ public class HomeActivity extends BaseActivity { selector.addPresenter(String.class, new TitlePresenter()); selector.addPresenter(ListRow.class, new CustomRowPresenter(16), VodPresenter.class); selector.addPresenter(ListRow.class, new CustomRowPresenter(16), FuncPresenter.class); - ItemBridgeAdapter adapter = new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector)); mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16)); - mBinding.recycler.setAdapter(adapter); + mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector))); } private void setViewModel() { diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java index 576204285..abc2a3406 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java @@ -8,7 +8,8 @@ import android.view.View; import android.view.inputmethod.EditorInfo; import androidx.appcompat.app.AlertDialog; -import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.leanback.widget.ArrayObjectAdapter; +import androidx.leanback.widget.ItemBridgeAdapter; import androidx.viewbinding.ViewBinding; import com.fongmi.bear.ApiConfig; @@ -17,14 +18,14 @@ import com.fongmi.bear.databinding.ActivitySettingBinding; import com.fongmi.bear.databinding.DialogConfigBinding; import com.fongmi.bear.databinding.DialogSiteBinding; import com.fongmi.bear.net.Callback; -import com.fongmi.bear.ui.adapter.SiteAdapter; +import com.fongmi.bear.ui.presenter.SitePresenter; import com.fongmi.bear.utils.Notify; import com.fongmi.bear.utils.Prefers; +import com.fongmi.bear.utils.ResUtil; public class SettingActivity extends BaseActivity { private ActivitySettingBinding mBinding; - private SiteAdapter mAdapter; public static void start(Activity activity) { activity.startActivityForResult(new Intent(activity, SettingActivity.class), 1000); @@ -39,14 +40,12 @@ public class SettingActivity extends BaseActivity { protected void initView() { mBinding.home.setText(ApiConfig.get().getHome().getName()); mBinding.url.setText(Prefers.getUrl()); - mAdapter = new SiteAdapter(); } @Override protected void initEvent() { mBinding.config.setOnClickListener(this::showConfig); mBinding.site.setOnClickListener(this::showSite); - mAdapter.setOnItemClickListener(this::onSiteClick); } private void showConfig(View view) { @@ -85,18 +84,22 @@ public class SettingActivity extends BaseActivity { if (ApiConfig.get().getSites().isEmpty()) return; int position = ApiConfig.get().getSites().indexOf(ApiConfig.get().getHome()); DialogSiteBinding bindingDialog = DialogSiteBinding.inflate(LayoutInflater.from(this)); - bindingDialog.site.setLayoutManager(new LinearLayoutManager(this)); - bindingDialog.site.getItemAnimator().setChangeDuration(0); - bindingDialog.site.setHasFixedSize(true); - bindingDialog.site.setAdapter(mAdapter); - mAdapter.addAll(ApiConfig.get().getSites()); - bindingDialog.site.scrollToPosition(position); + SitePresenter presenter = new SitePresenter(); + ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenter); + adapter.addAll(0, ApiConfig.get().getSites()); + presenter.setOnClickListener(item -> setSite(adapter, item)); + bindingDialog.recycler.setVerticalSpacing(ResUtil.dp2px(16)); + bindingDialog.recycler.setAdapter(new ItemBridgeAdapter(adapter)); + bindingDialog.recycler.scrollToPosition(position); Notify.show(this, bindingDialog.getRoot()); } - public void onSiteClick(Site item) { + public void setSite(ArrayObjectAdapter adapter, Site item) { + for (int i = 0; i < adapter.size(); i++) ((Site) adapter.get(i)).setActivated(item); + adapter.notifyArrayItemRangeChanged(0, adapter.size()); mBinding.home.setText(item.getName()); ApiConfig.get().setHome(item); setResult(RESULT_OK); + Notify.dismiss(); } } diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/VodActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/VodActivity.java index 4745a8cbf..33938b52a 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/VodActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/VodActivity.java @@ -7,6 +7,9 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.leanback.widget.ArrayObjectAdapter; import androidx.leanback.widget.ItemBridgeAdapter; import androidx.leanback.widget.OnChildViewHolderSelectedListener; @@ -16,7 +19,7 @@ import androidx.viewpager.widget.ViewPager; import com.fongmi.bear.bean.Result; import com.fongmi.bear.databinding.ActivityVodBinding; -import com.fongmi.bear.ui.adapter.PageAdapter; +import com.fongmi.bear.ui.fragment.VodFragment; import com.fongmi.bear.ui.presenter.TypePresenter; import com.fongmi.bear.utils.ResUtil; @@ -72,14 +75,31 @@ public class VodActivity extends BaseActivity { private void setRecyclerView() { mBinding.recycler.setHorizontalSpacing(ResUtil.dp2px(16)); mBinding.recycler.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); - ArrayObjectAdapter arrayObjectAdapter = new ArrayObjectAdapter(mTypePresenter = new TypePresenter()); - arrayObjectAdapter.addAll(0, mResult.getTypes()); - ItemBridgeAdapter adapter = new ItemBridgeAdapter(arrayObjectAdapter); - mBinding.recycler.setAdapter(adapter); + ArrayObjectAdapter adapter = new ArrayObjectAdapter(mTypePresenter = new TypePresenter()); + adapter.addAll(0, mResult.getTypes()); + mBinding.recycler.setAdapter(new ItemBridgeAdapter(adapter)); } private void setPager() { - mBinding.pager.setAdapter(new PageAdapter(getSupportFragmentManager(), mResult)); + mBinding.pager.setAdapter(new PageAdapter(getSupportFragmentManager())); if (mResult.getTypes().size() > 0) mBinding.pager.setOffscreenPageLimit(mResult.getTypes().size()); } + + class PageAdapter extends FragmentStatePagerAdapter { + + public PageAdapter(@NonNull FragmentManager fm) { + super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); + } + + @NonNull + @Override + public Fragment getItem(int position) { + return VodFragment.newInstance(mResult.getTypes().get(position).getTypeId(), mResult.getFilters().get(mResult.getTypes().get(position).getTypeId())); + } + + @Override + public int getCount() { + return mResult.getTypes().size(); + } + } } diff --git a/app/src/main/java/com/fongmi/bear/ui/adapter/PageAdapter.java b/app/src/main/java/com/fongmi/bear/ui/adapter/PageAdapter.java deleted file mode 100644 index 09751d8d1..000000000 --- a/app/src/main/java/com/fongmi/bear/ui/adapter/PageAdapter.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fongmi.bear.ui.adapter; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; - -import com.fongmi.bear.bean.Result; -import com.fongmi.bear.ui.fragment.VodFragment; - -public class PageAdapter extends FragmentStatePagerAdapter { - - private final Result result; - - public PageAdapter(@NonNull FragmentManager fm, Result result) { - super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); - this.result = result; - } - - @NonNull - @Override - public Fragment getItem(int position) { - return VodFragment.newInstance(result.getTypes().get(position).getTypeId(), result.getFilters().get(result.getTypes().get(position).getTypeId())); - } - - @Override - public int getCount() { - return result.getTypes().size(); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/bear/ui/adapter/SiteAdapter.java b/app/src/main/java/com/fongmi/bear/ui/adapter/SiteAdapter.java deleted file mode 100644 index 943374ad3..000000000 --- a/app/src/main/java/com/fongmi/bear/ui/adapter/SiteAdapter.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.fongmi.bear.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.bear.bean.Site; -import com.fongmi.bear.databinding.AdapterSiteBinding; - -import java.util.ArrayList; -import java.util.List; - -public class SiteAdapter extends RecyclerView.Adapter { - - private OnItemClickListener mListener; - private List mItems; - - public SiteAdapter() { - mItems = new ArrayList<>(); - } - - public interface OnItemClickListener { - void onItemClick(Site item); - } - - public void setOnItemClickListener(OnItemClickListener listener) { - this.mListener = listener; - } - - class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - - private final AdapterSiteBinding binding; - - public ViewHolder(@NonNull AdapterSiteBinding binding) { - super(binding.getRoot()); - this.binding = binding; - itemView.setOnClickListener(this); - } - - @Override - public void onClick(View view) { - Site item = mItems.get(getLayoutPosition()); - setHome(getLayoutPosition()); - mListener.onItemClick(item); - } - } - - private void setHome(int position) { - for (int i = 0; i < mItems.size(); i++) mItems.get(i).setHome(i == position); - notifyItemRangeChanged(0, mItems.size()); - } - - public void addAll(List items) { - mItems.clear(); - mItems.addAll(items); - notifyDataSetChanged(); - } - - @Override - public int getItemCount() { - return mItems.size(); - } - - @NonNull - @Override - public SiteAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ViewHolder(AdapterSiteBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull SiteAdapter.ViewHolder holder, int position) { - Site item = mItems.get(position); - holder.itemView.setSelected(item.isHome()); - holder.binding.name.setText(item.getName()); - if (item.isHome()) holder.itemView.requestFocus(); - else holder.itemView.clearFocus(); - } -} diff --git a/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java b/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java index d32e43508..c7563e21d 100644 --- a/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java +++ b/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java @@ -79,10 +79,9 @@ public class VodFragment extends Fragment implements Scroller.Callback { selector.addPresenter(String.class, new ProgressPresenter()); selector.addPresenter(ListRow.class, new CustomRowPresenter(16), VodPresenter.class); selector.addPresenter(ListRow.class, new CustomRowPresenter(8), FilterPresenter.class); - ItemBridgeAdapter adapter = new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector)); mBinding.recycler.addOnScrollListener(mScroller = new Scroller(this)); mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16)); - mBinding.recycler.setAdapter(adapter); + mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector))); } private void setViewModel() { diff --git a/app/src/main/java/com/fongmi/bear/ui/presenter/SitePresenter.java b/app/src/main/java/com/fongmi/bear/ui/presenter/SitePresenter.java new file mode 100644 index 000000000..9c1eebf78 --- /dev/null +++ b/app/src/main/java/com/fongmi/bear/ui/presenter/SitePresenter.java @@ -0,0 +1,51 @@ +package com.fongmi.bear.ui.presenter; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.leanback.widget.Presenter; + +import com.fongmi.bear.bean.Site; +import com.fongmi.bear.databinding.AdapterSiteBinding; + +public class SitePresenter extends Presenter { + + private OnClickListener mListener; + + public interface OnClickListener { + void onItemClick(Site item); + } + + public void setOnClickListener(OnClickListener listener) { + this.mListener = listener; + } + + @Override + public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { + return new ViewHolder(AdapterSiteBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { + Site item = (Site) object; + ViewHolder holder = (ViewHolder) viewHolder; + holder.view.setActivated(item.isHome()); + holder.binding.name.setText(item.getName()); + setOnClickListener(holder, view -> mListener.onItemClick(item)); + } + + @Override + public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { + } + + public static class ViewHolder extends Presenter.ViewHolder { + + private final AdapterSiteBinding binding; + + public ViewHolder(@NonNull AdapterSiteBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/bear/utils/Notify.java b/app/src/main/java/com/fongmi/bear/utils/Notify.java index 6d71516f3..537d12d49 100644 --- a/app/src/main/java/com/fongmi/bear/utils/Notify.java +++ b/app/src/main/java/com/fongmi/bear/utils/Notify.java @@ -18,8 +18,8 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; public class Notify { + private AlertDialog mDialog; private Toast mToast; - private AlertDialog mProgress; private static class Loader { static volatile Notify INSTANCE = new Notify(); @@ -38,13 +38,13 @@ public class Notify { } public static void show(Context context, View view) { - AlertDialog dialog = new MaterialAlertDialogBuilder(context).setView(view).create(); - dialog.getWindow().setDimAmount(0); + get().mDialog = new MaterialAlertDialogBuilder(context).setView(view).create(); + get().mDialog.getWindow().setDimAmount(0); DisplayMetrics metrics = ResUtil.getDisplayMetrics(); - WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); - params.width = (int) (metrics.widthPixels * 0.4f); - dialog.getWindow().setAttributes(params); - dialog.show(); + WindowManager.LayoutParams params = get().mDialog.getWindow().getAttributes(); + params.width = (int) (metrics.widthPixels * 0.3f); + get().mDialog.getWindow().setAttributes(params); + get().mDialog.show(); } public static AlertDialog show(Context context, View view, DialogInterface.OnClickListener listener) { @@ -56,13 +56,13 @@ public class Notify { public static void progress(Context context) { ViewProgressBinding binding = ViewProgressBinding.inflate(LayoutInflater.from(context)); - get().mProgress = new MaterialAlertDialogBuilder(context).setView(binding.getRoot()).create(); - get().mProgress.getWindow().setBackgroundDrawableResource(android.R.color.transparent); - get().mProgress.show(); + get().mDialog = new MaterialAlertDialogBuilder(context).setView(binding.getRoot()).create(); + get().mDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); + get().mDialog.show(); } public static void dismiss() { - if (get().mProgress != null && get().mProgress.isShowing()) get().mProgress.dismiss(); + if (get().mDialog != null && get().mDialog.isShowing()) get().mDialog.dismiss(); } private void makeText(String message) { diff --git a/app/src/main/res/drawable/selector_site.xml b/app/src/main/res/drawable/selector_site.xml index a8f75b185..2c7db3cfd 100644 --- a/app/src/main/res/drawable/selector_site.xml +++ b/app/src/main/res/drawable/selector_site.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_site.xml b/app/src/main/res/layout/adapter_site.xml index 7742e9424..d7728e5c7 100644 --- a/app/src/main/res/layout/adapter_site.xml +++ b/app/src/main/res/layout/adapter_site.xml @@ -1,22 +1,14 @@ - - - - - \ No newline at end of file + android:focusableInTouchMode="true" + android:gravity="center" + android:singleLine="true" + android:textColor="@color/white" + android:textSize="18sp" + tools:text="泥巴影院" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_site.xml b/app/src/main/res/layout/dialog_site.xml index 68890acdd..c897d951c 100644 --- a/app/src/main/res/layout/dialog_site.xml +++ b/app/src/main/res/layout/dialog_site.xml @@ -1,14 +1,8 @@ - - - - - \ No newline at end of file + android:clipChildren="false" + android:clipToPadding="false" + android:padding="16dp" /> \ No newline at end of file