|
|
|
|
@ -1,6 +1,7 @@ |
|
|
|
|
package com.fongmi.android.tv.ui.fragment; |
|
|
|
|
|
|
|
|
|
import android.view.LayoutInflater; |
|
|
|
|
import android.view.View; |
|
|
|
|
import android.view.ViewGroup; |
|
|
|
|
|
|
|
|
|
import androidx.annotation.NonNull; |
|
|
|
|
@ -8,15 +9,25 @@ import androidx.annotation.Nullable; |
|
|
|
|
import androidx.fragment.app.Fragment; |
|
|
|
|
import androidx.fragment.app.FragmentManager; |
|
|
|
|
import androidx.fragment.app.FragmentStatePagerAdapter; |
|
|
|
|
import androidx.lifecycle.ViewModelProvider; |
|
|
|
|
import androidx.viewbinding.ViewBinding; |
|
|
|
|
import androidx.viewpager.widget.ViewPager; |
|
|
|
|
|
|
|
|
|
import com.fongmi.android.tv.R; |
|
|
|
|
import com.fongmi.android.tv.api.ApiConfig; |
|
|
|
|
import com.fongmi.android.tv.bean.Class; |
|
|
|
|
import com.fongmi.android.tv.bean.Result; |
|
|
|
|
import com.fongmi.android.tv.bean.Site; |
|
|
|
|
import com.fongmi.android.tv.databinding.FragmentVodBinding; |
|
|
|
|
import com.fongmi.android.tv.event.RefreshEvent; |
|
|
|
|
import com.fongmi.android.tv.impl.SiteCallback; |
|
|
|
|
import com.fongmi.android.tv.model.SiteViewModel; |
|
|
|
|
import com.fongmi.android.tv.ui.activity.BaseFragment; |
|
|
|
|
import com.fongmi.android.tv.ui.adapter.TypeAdapter; |
|
|
|
|
import com.fongmi.android.tv.ui.custom.dialog.SiteDialog; |
|
|
|
|
import com.fongmi.android.tv.ui.fragment.child.ChildFragment; |
|
|
|
|
import com.fongmi.android.tv.ui.fragment.child.SiteFragment; |
|
|
|
|
import com.fongmi.android.tv.utils.ResUtil; |
|
|
|
|
import com.google.gson.Gson; |
|
|
|
|
|
|
|
|
|
import org.greenrobot.eventbus.Subscribe; |
|
|
|
|
@ -25,16 +36,21 @@ import org.greenrobot.eventbus.ThreadMode; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
public class VodFragment extends BaseFragment { |
|
|
|
|
public class VodFragment extends BaseFragment implements SiteCallback { |
|
|
|
|
|
|
|
|
|
private FragmentVodBinding mBinding; |
|
|
|
|
private TypeAdapter mAdapter; |
|
|
|
|
private Result mResult; |
|
|
|
|
private SiteViewModel mViewModel; |
|
|
|
|
private TypeAdapter mTypeAdapter; |
|
|
|
|
private PageAdapter mPageAdapter; |
|
|
|
|
|
|
|
|
|
public static VodFragment newInstance() { |
|
|
|
|
return new VodFragment(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Site getSite() { |
|
|
|
|
return ApiConfig.get().getHome(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { |
|
|
|
|
return mBinding = FragmentVodBinding.inflate(inflater, container, false); |
|
|
|
|
@ -42,63 +58,104 @@ public class VodFragment extends BaseFragment { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
protected void initView() { |
|
|
|
|
mBinding.recycler.setHasFixedSize(true); |
|
|
|
|
mBinding.recycler.setAdapter(mAdapter = new TypeAdapter()); |
|
|
|
|
mBinding.pager.setAdapter(new PageAdapter(getChildFragmentManager())); |
|
|
|
|
setRecyclerView(); |
|
|
|
|
setViewModel(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
protected void initEvent() { |
|
|
|
|
mAdapter.setListener(item -> mBinding.pager.setCurrentItem(mAdapter.setActivated(item))); |
|
|
|
|
mBinding.title.setOnClickListener(this::onTitle); |
|
|
|
|
mTypeAdapter.setListener(item -> mBinding.pager.setCurrentItem(mTypeAdapter.setActivated(item))); |
|
|
|
|
mBinding.pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { |
|
|
|
|
@Override |
|
|
|
|
public void onPageSelected(int position) { |
|
|
|
|
mBinding.recycler.smoothScrollToPosition(position); |
|
|
|
|
mAdapter.setActivated(position); |
|
|
|
|
mTypeAdapter.setActivated(position); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Subscribe(threadMode = ThreadMode.MAIN) |
|
|
|
|
public void onResult(Result result) { |
|
|
|
|
setAdapter(mResult = result); |
|
|
|
|
private void setRecyclerView() { |
|
|
|
|
mBinding.recycler.setHasFixedSize(true); |
|
|
|
|
mBinding.recycler.setItemAnimator(null); |
|
|
|
|
mBinding.recycler.setAdapter(mTypeAdapter = new TypeAdapter()); |
|
|
|
|
mBinding.pager.setAdapter(mPageAdapter = new PageAdapter(getChildFragmentManager())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setAdapter(Result result) { |
|
|
|
|
result.setTypes(getTypes()); |
|
|
|
|
mAdapter.addAll(result.getTypes()); |
|
|
|
|
Boolean filter = ApiConfig.get().getHome().isFilterable() ? false : null; |
|
|
|
|
for (Class item : mAdapter.getTypes()) if (result.getFilters().containsKey(item.getTypeId())) item.setFilter(filter); |
|
|
|
|
mBinding.pager.getAdapter().notifyDataSetChanged(); |
|
|
|
|
private void setViewModel() { |
|
|
|
|
mViewModel = new ViewModelProvider(this).get(SiteViewModel.class); |
|
|
|
|
mViewModel.result.observe(getViewLifecycleOwner(), result -> { |
|
|
|
|
mPageAdapter.setResult(result); |
|
|
|
|
setAdapter(result); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private List<Class> getTypes() { |
|
|
|
|
private List<Class> getTypes(Result result) { |
|
|
|
|
List<Class> types = new ArrayList<>(); |
|
|
|
|
for (String cate : ApiConfig.get().getHome().getCategories()) for (Class item : mResult.getTypes()) if (cate.equals(item.getTypeName())) types.add(item); |
|
|
|
|
for (String cate : getSite().getCategories()) for (Class type : result.getTypes()) if (cate.equals(type.getTypeName())) types.add(type); |
|
|
|
|
return types; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setAdapter(Result result) { |
|
|
|
|
result.setTypes(getTypes(result)); |
|
|
|
|
mTypeAdapter.addAll(result.getTypes()); |
|
|
|
|
Boolean filter = getSite().isFilterable() ? false : null; |
|
|
|
|
for (Class item : mTypeAdapter.getTypes()) if (result.getFilters().containsKey(item.getTypeId())) item.setFilter(filter); |
|
|
|
|
mPageAdapter.notifyDataSetChanged(); |
|
|
|
|
mBinding.pager.setCurrentItem(0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void onTitle(View view) { |
|
|
|
|
SiteDialog.create(this).filter(true).show(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void setSite(Site item) { |
|
|
|
|
ApiConfig.get().setHome(item); |
|
|
|
|
homeContent(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Subscribe(threadMode = ThreadMode.MAIN) |
|
|
|
|
public void onRefreshEvent(RefreshEvent event) { |
|
|
|
|
if (event.getType() == RefreshEvent.Type.VIDEO) homeContent(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void homeContent() { |
|
|
|
|
String home = getSite().getName(); |
|
|
|
|
mBinding.title.setText(home.isEmpty() ? ResUtil.getString(R.string.app_name) : home); |
|
|
|
|
if (getSite().getKey().isEmpty()) return; |
|
|
|
|
mViewModel.homeContent(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class PageAdapter extends FragmentStatePagerAdapter { |
|
|
|
|
|
|
|
|
|
private Result result; |
|
|
|
|
|
|
|
|
|
public PageAdapter(@NonNull FragmentManager fm) { |
|
|
|
|
super(fm); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setResult(Result result) { |
|
|
|
|
this.result = result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@NonNull |
|
|
|
|
@Override |
|
|
|
|
public Fragment getItem(int position) { |
|
|
|
|
Class type = mAdapter.get(position); |
|
|
|
|
String filter = new Gson().toJson(mResult.getFilters().get(type.getTypeId())); |
|
|
|
|
Class type = mTypeAdapter.get(position); |
|
|
|
|
if (position == 0) return SiteFragment.newInstance(result.getList()); |
|
|
|
|
String filter = new Gson().toJson(result.getFilters().get(type.getTypeId())); |
|
|
|
|
return ChildFragment.newInstance(type.getTypeId(), filter, type.getTypeFlag().equals("1")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public int getCount() { |
|
|
|
|
return mAdapter.getItemCount(); |
|
|
|
|
return mTypeAdapter.getItemCount(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { |
|
|
|
|
public int getItemPosition(@NonNull Object object) { |
|
|
|
|
return POSITION_NONE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|