/*
* Copyright (c) 2015 Ha Duy Trung
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.github.hidroh.materialistic;
import android.content.Context;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import javax.inject.Inject;
import io.github.hidroh.materialistic.widget.ListRecyclerViewAdapter;
import io.github.hidroh.materialistic.widget.SnappyLinearLayoutManager;
abstract class BaseListFragment extends BaseFragment implements Scrollable {
private static final String STATE_ADAPTER = "state:adapter";
@Inject CustomTabsDelegate mCustomTabsDelegate;
private KeyDelegate.RecyclerViewHelper mScrollableHelper;
protected RecyclerView mRecyclerView;
private final Preferences.Observable mPreferenceObservable = new Preferences.Observable();
@Override
public void onAttach(Context context) {
super.onAttach(context);
mPreferenceObservable.subscribe(context, this::onPreferenceChanged,
R.string.pref_font,
R.string.pref_text_size,
R.string.pref_list_item_view);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
getAdapter().setCardViewEnabled(Preferences.isListItemCardView(getActivity()));
if (savedInstanceState != null) {
getAdapter().restoreState(savedInstanceState.getBundle(STATE_ADAPTER));
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mRecyclerView.setLayoutManager(new SnappyLinearLayoutManager(getActivity(), false));
final int verticalMargin = getResources()
.getDimensionPixelSize(R.dimen.cardview_vertical_margin);
final int horizontalMargin = getResources()
.getDimensionPixelSize(R.dimen.cardview_horizontal_margin);
final int divider = getResources().getDimensionPixelSize(R.dimen.divider);
mRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
if (getAdapter().isCardViewEnabled()) {
outRect.set(horizontalMargin, verticalMargin, horizontalMargin, 0);
} else {
outRect.set(0, 0, 0, divider);
}
}
});
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getAdapter().setCustomTabsDelegate(mCustomTabsDelegate);
mRecyclerView.setAdapter(getAdapter());
mScrollableHelper = new KeyDelegate.RecyclerViewHelper(mRecyclerView,
KeyDelegate.RecyclerViewHelper.SCROLL_PAGE);
}
@Override
protected void createOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_list, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_list) {
showPreferences();
return true;
}
return super.onOptionsItemSelected(item);
}
private void showPreferences() {
Bundle args = new Bundle();
args.putInt(PopupSettingsFragment.EXTRA_TITLE, R.string.list_display_options);
args.putInt(PopupSettingsFragment.EXTRA_SUMMARY, R.string.pull_up_hint);
args.putIntArray(PopupSettingsFragment.EXTRA_XML_PREFERENCES, new int[]{
R.xml.preferences_font,
R.xml.preferences_list});
((DialogFragment) Fragment.instantiate(getActivity(),
PopupSettingsFragment.class.getName(), args))
.show(getFragmentManager(), PopupSettingsFragment.class.getName());
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBundle(STATE_ADAPTER, getAdapter().saveState());
}
@Override
public void onDetach() {
super.onDetach();
mPreferenceObservable.unsubscribe(getActivity());
mRecyclerView.setAdapter(null); // force adapter detach
}
@Override
public void scrollToTop() {
mScrollableHelper.scrollToTop();
}
@Override
public boolean scrollToNext() {
return mScrollableHelper.scrollToNext();
}
@Override
public boolean scrollToPrevious() {
return mScrollableHelper.scrollToPrevious();
}
private void onPreferenceChanged(int key, boolean contextChanged) {
if (contextChanged) {
mRecyclerView.setAdapter(getAdapter());
} else if (key == R.string.pref_list_item_view) {
getAdapter().setCardViewEnabled(Preferences.isListItemCardView(getActivity()));
}
}
protected abstract ListRecyclerViewAdapter getAdapter();
}