/* * Copyright (c) 2017 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com> * All Rights Reserved. */ package me.zhanghai.android.douya.item.ui; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.view.ViewCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.android.volley.VolleyError; import butterknife.BindView; import butterknife.ButterKnife; import me.zhanghai.android.douya.R; import me.zhanghai.android.douya.item.content.BaseItemResource; import me.zhanghai.android.douya.network.api.info.frodo.CollectableItem; import me.zhanghai.android.douya.ui.RatioImageView; import me.zhanghai.android.douya.util.DrawableUtils; import me.zhanghai.android.douya.util.FragmentUtils; import me.zhanghai.android.douya.util.StatusBarColorUtils; import me.zhanghai.android.douya.util.ViewUtils; public abstract class BaseItemFragment<SimpleItemType extends CollectableItem, ItemType extends SimpleItemType> extends Fragment implements BaseItemResource.Listener<ItemType> { private static final String KEY_PREFIX = BaseItemFragment.class.getName() + '.'; private static final String EXTRA_ITEM_ID = KEY_PREFIX + "item_id"; private static final String EXTRA_SIMPLE_ITEM = KEY_PREFIX + "simple_item"; private static final String EXTRA_ITEM = KEY_PREFIX + "item"; @BindView(R.id.toolbar) Toolbar mToolbar; @BindView(R.id.backdrop) RatioImageView mBackdropImage; @BindView(R.id.backdrop_scrim) View mBackdropScrim; @BindView(R.id.backdrop_play) ImageView mBackdropPlayImage; @BindView(R.id.content) RecyclerView mContentList; private long mItemId; private SimpleItemType mSimpleItem; private ItemType mItem; private BaseItemResource<SimpleItemType, ItemType> mItemResource; public BaseItemFragment<SimpleItemType, ItemType> setArguments(long itemId, SimpleItemType simpleItem, ItemType item) { Bundle arguments = FragmentUtils.ensureArguments(this); arguments.putLong(EXTRA_ITEM_ID, itemId); arguments.putParcelable(EXTRA_SIMPLE_ITEM, simpleItem); arguments.putParcelable(EXTRA_ITEM, item); return this; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle arguments = getArguments(); mItemId = arguments.getLong(EXTRA_ITEM_ID); mSimpleItem = arguments.getParcelable(EXTRA_SIMPLE_ITEM); mItem = arguments.getParcelable(EXTRA_ITEM); setHasOptionsMenu(true); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.base_item_fragment, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.bind(this, view); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mItemResource = onAttachItemResource(mItemId, mSimpleItem, mItem); AppCompatActivity activity = (AppCompatActivity) getActivity(); activity.setSupportActionBar(mToolbar); StatusBarColorUtils.set(Color.TRANSPARENT, activity); ViewUtils.setLayoutFullscreen(activity); mBackdropImage.setRatio(16, 9); ViewCompat.setBackground(mBackdropScrim, DrawableUtils.makeScrimDrawable(Gravity.TOP)); mContentList.setLayoutManager(new LinearLayoutManager(activity)); mContentList.setAdapter(onCreateAdapter()); if (mItemResource.has()) { updateWithItem(mItemResource.get()); } else if (mItemResource.hasSimpleItem()) { updateWithSimpleItem(mItemResource.getSimpleItem()); } } protected abstract BaseItemResource<SimpleItemType, ItemType> onAttachItemResource(long itemId, SimpleItemType simpleItem, ItemType item); protected abstract RecyclerView.Adapter<?> onCreateAdapter(); @Override public void onDestroy() { super.onDestroy(); mItemResource.detach(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: getActivity().finish(); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onLoadItemStarted(int requestCode) { } @Override public void onLoadItemFinished(int requestCode) { } @Override public void onLoadItemError(int requestCode, VolleyError error) { } @Override public void onItemChanged(int requestCode, ItemType newItem) { updateWithItem(newItem); } protected void updateWithItem(ItemType item) { updateWithSimpleItem(item); } protected void updateWithSimpleItem(SimpleItemType simpleItem) { getActivity().setTitle(simpleItem.title); } }