package net.reichholf.dreamdroid.fragment.abs; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.view.ActionMode; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import net.reichholf.dreamdroid.R; import net.reichholf.dreamdroid.activities.MainActivity; import net.reichholf.dreamdroid.activities.abs.MultiPaneHandler; import net.reichholf.dreamdroid.fragment.ActivityCallbackHandler; import net.reichholf.dreamdroid.fragment.dialogs.ActionDialog; import net.reichholf.dreamdroid.fragment.helper.FragmentHelper; import net.reichholf.dreamdroid.fragment.interfaces.IBaseFragment; import net.reichholf.dreamdroid.fragment.interfaces.IMutliPaneContent; import net.reichholf.dreamdroid.helpers.Statics; import net.reichholf.dreamdroid.widget.helper.ItemClickSupport; import net.reichholf.dreamdroid.widget.helper.ItemSelectionSupport; import net.reichholf.dreamdroid.widget.helper.SpacesItemDecoration; /** * @author Stephan */ public abstract class BaseRecyclerFragment extends Fragment implements ActivityCallbackHandler, IMutliPaneContent, IBaseFragment, ItemClickSupport.OnItemClickListener, ItemClickSupport.OnItemLongClickListener, SwipeRefreshLayout.OnRefreshListener, ActionDialog.DialogActionListener { private FragmentHelper mHelper; protected boolean mHasFabMain; protected boolean mEnableReload = true; protected boolean mShouldRetainInstance = true; protected boolean mCardListStyle = false; protected ItemClickSupport mItemClickSupport; protected ItemSelectionSupport mSelectionSupport; protected ActionMode mActionMode; protected boolean mIsActionMode; protected boolean mIsActionModeRequired; protected SwipeRefreshLayout mSwipeRefreshLayout; public BaseRecyclerFragment() { super(); mHelper = new FragmentHelper(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (mHelper == null) mHelper = new FragmentHelper(this); else mHelper.bindToFragment(this); mHelper.onCreate(savedInstanceState); if (mShouldRetainInstance) setRetainInstance(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.card_recycler_content, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { RecyclerView rv = getRecyclerView(); rv.setLayoutManager(new GridLayoutManager(getActivity(), 1)); rv.addItemDecoration(new SpacesItemDecoration(getAppCompatActivity().getResources().getDimensionPixelSize(R.dimen.recylcerview_content_margin))); mItemClickSupport = ItemClickSupport.addTo(rv); mItemClickSupport.setOnItemClickListener(this); mItemClickSupport.setOnItemLongClickListener(this); mSelectionSupport = ItemSelectionSupport.addTo(rv); super.onViewCreated(view, savedInstanceState); setFabEnabled(R.id.fab_reload, mEnableReload); setFabEnabled(R.id.fab_main, mHasFabMain); } protected void setFabEnabled(int id, boolean enabled) { FloatingActionButton fab = (FloatingActionButton) getAppCompatActivity().findViewById(id); if (fab == null) return; fab.setTag(R.id.fab_scrolling_view_behavior_enabled, enabled); if (enabled) { fab.show(); } else { fab.hide(); ((MainActivity) getAppCompatActivity()).unregisterFab(id); } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //noinspection ConstantConditions mSwipeRefreshLayout = (SwipeRefreshLayout) getView().findViewById(R.id.ptr_layout); mSwipeRefreshLayout.setOnRefreshListener(this); mHelper.onActivityCreated(savedInstanceState); } @Override public void onResume() { super.onResume(); mHelper.onResume(); } @Override public void onPause() { mHelper.onPause(); super.onPause(); } @Override public void onSaveInstanceState(Bundle outState) { mHelper.onSaveInstanceState(outState); super.onSaveInstanceState(outState); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); if (!getMultiPaneHandler().isDrawerOpen()) createOptionsMenu(menu, inflater); } @Override public void createOptionsMenu(Menu menu, MenuInflater inflater) { } @Override public MultiPaneHandler getMultiPaneHandler() { return mHelper.getMultiPaneHandler(); } @Override public boolean hasHeader() { return false; } public String getBaseTitle() { return mHelper.getBaseTitle(); } public void setBaseTitle(String baseTitle) { mHelper.setBaseTitle(baseTitle); } public String getCurrentTitle() { return mHelper.getCurrenTtitle(); } public void setCurrentTitle(String currentTitle) { mHelper.setCurrentTitle(currentTitle); } public void initTitle(String title) { mHelper.setBaseTitle(title); mHelper.setCurrentTitle(title); } protected void finish() { finish(Statics.RESULT_NONE, null); } protected void finish(int resultCode) { finish(resultCode, null); } protected void finish(int resultCode, Intent data) { mHelper.finish(resultCode, data); } protected AppCompatActivity getAppCompatActivity() { return (AppCompatActivity) getActivity(); } protected void showToast(String toastText) { Toast toast = Toast.makeText(getAppCompatActivity(), toastText, Toast.LENGTH_LONG); toast.show(); } protected void showToast(CharSequence toastText) { Toast toast = Toast.makeText(getAppCompatActivity(), toastText, Toast.LENGTH_LONG); toast.show(); } public RecyclerView getRecyclerView() { //noinspection ConstantConditions return (RecyclerView) getView().findViewById(android.R.id.list); } protected void setEmptyText(CharSequence emptyText) { setEmptyText(emptyText, R.drawable.ic_warning_48dp); } protected void setEmptyText(CharSequence emptyText, int topDrawable) { //noinspection ConstantConditions View view = getView(); if(view == null) return; TextView textView = (TextView) view.findViewById(android.R.id.empty); if (textView == null) return; textView.setCompoundDrawablesWithIntrinsicBounds(0, topDrawable, 0, 0); if(emptyText == null) { textView.setText(""); textView.setVisibility(View.GONE); } else { textView.setText(emptyText); textView.setVisibility(View.VISIBLE); } } @Override public void onItemClick(RecyclerView parent, View view, int position, long id) { } @Override public boolean onItemLongClick(RecyclerView parent, View view, int position, long id) { return false; } @Override public void onRefresh() { mSwipeRefreshLayout.setRefreshing(false); } @Override public void onDrawerClosed() { } @Override public void onDrawerOpened() { } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return false; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return false; } protected void startActionMode() { } protected void endActionMode() { if (mActionMode != null) mActionMode.finish(); mActionMode = null; } protected void registerFab(int id, int descriptionId, int backgroundResId, View.OnClickListener onClickListener) { registerFab(id, descriptionId, backgroundResId, onClickListener, false); } protected void registerFab(int id, int descriptionId, int backgroundResId, View.OnClickListener onClickListener, boolean topAligned) { FloatingActionButton fab = (FloatingActionButton) getAppCompatActivity().findViewById(id); if (fab == null) return; fab.setTag(R.id.fab_scrolling_view_behavior_enabled, true); fab.show(); fab.setContentDescription(getString(descriptionId)); fab.setImageResource(backgroundResId); fab.setOnClickListener(onClickListener); fab.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Toast.makeText(getAppCompatActivity(), v.getContentDescription(), Toast.LENGTH_SHORT).show(); return true; } }); } @Override public void onDialogAction(int action, Object details, String dialogTag) { } }