package com.progscrape.ui; import android.content.Context; import android.os.Parcelable; import android.support.v4.view.ViewCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.progscrape.event.ActivityEvent; import com.progscrape.R; import com.progscrape.modules.Injector; import com.squareup.otto.Bus; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.InjectView; import icepick.Icepick; import icepick.Icicle; public class StoriesView extends LinearLayout { @InjectView(R.id.story_recycler) protected RecyclerView stories; @InjectView(R.id.toolbar) protected Toolbar toolbar; @InjectView(R.id.toolbar_title) protected TextView title; @InjectView(R.id.swipe_refresh) protected SwipeRefreshLayout refresh; @Inject protected TrendingStoryAdapterFactory storiesAdapterFactory; @Inject protected Bus bus; @Icicle Parcelable scrollPos = null; private TrendingStoryAdapter adapter; public StoriesView(Context context, AttributeSet attrs) { super(context, attrs); if (!isInEditMode()) Injector.obtain(context, ActivityComponent.class).inject(this); } @Override public Parcelable onSaveInstanceState() { scrollPos = getLayoutManager().onSaveInstanceState(); Log.i("stories", "Saving scroll position: " + scrollPos); return Icepick.saveInstanceState(this, super.onSaveInstanceState()); } @Override public void onRestoreInstanceState(Parcelable state) { super.onRestoreInstanceState(Icepick.restoreInstanceState(this, state)); Log.i("stories", "Loading scroll position: " + scrollPos); } @Override protected void onFinishInflate() { super.onFinishInflate(); if (isInEditMode()) return; ButterKnife.inject(this); adapter = storiesAdapterFactory.create(getContext()); stories.setAdapter(adapter); stories.setLayoutManager(new LinearLayoutManager(getContext())); adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { boolean first = true; @Override public void onChanged() { Log.i("stories", "onChanged, scrollPos = " + scrollPos + ", first = " + first); if (first) { first = false; if (scrollPos != null) getLayoutManager().onRestoreInstanceState(scrollPos); } } }); stories.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { refresh.setEnabled(stories.getScrollY() == 0); } }); } public void setTag(String tag) { if (tag != null) { toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); title.setText(tag); title.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); toolbar.setNavigationOnClickListener(new OnClickListener() { @Override public void onClick(View v) { bus.post(ActivityEvent.POP_BACK); } }); } else { DrawerArrowDrawable drawable = new DrawerArrowDrawable(getContext()) { @Override boolean isLayoutRtl() { return ViewCompat.getLayoutDirection(StoriesView.this) == ViewCompat.LAYOUT_DIRECTION_RTL; } }; toolbar.setNavigationIcon(drawable); toolbar.setNavigationOnClickListener(new OnClickListener() { @Override public void onClick(View v) { bus.post(ActivityEvent.TOGGLE_DRAWER); } }); } } private LinearLayoutManager getLayoutManager() { return (LinearLayoutManager)stories.getLayoutManager(); } public void scrollToTop() { stories.smoothScrollToPosition(0); } }