package com.nilhcem.bblfr.ui.baggers.list.filter; import android.content.Context; import android.content.Intent; import android.graphics.PorterDuff; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ProgressBar; import com.nilhcem.bblfr.R; import com.nilhcem.bblfr.core.ui.recyclerview.EmptyRecyclerView; import com.nilhcem.bblfr.core.ui.recyclerview.SimpleDividerItemDecoration; import com.nilhcem.bblfr.core.utils.CompatibilityUtils; import com.nilhcem.bblfr.jobs.baggers.BaggersService; import com.nilhcem.bblfr.model.baggers.City; import com.nilhcem.bblfr.ui.navigationdrawer.NavigationDrawerActivity; import com.nilhcem.bblfr.ui.navigationdrawer.NavigationDrawerEntry; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; import icepick.State; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import timber.log.Timber; public abstract class TagsListActivity extends NavigationDrawerActivity implements TagsListAdapter.OnFilterChangeListener { private static final String EXTRA_CITY = "mCity"; @Inject protected BaggersService mBaggersService; // A way to perform multiple ButterKnife injections on the same instance object. FilterDrawerViewHolder mFilterDrawer; static class FilterDrawerViewHolder { @BindView(R.id.filter_container) ViewGroup mContainer; @BindView(R.id.filter_drawer_layout) DrawerLayout mLayout; @BindView(R.id.filter_content_frame) FrameLayout mContent; @BindView(R.id.filter_drawer_view) EmptyRecyclerView mRecyclerView; @BindView(R.id.loading_view) ProgressBar mEmptyView; @BindView(R.id.toolbar) Toolbar mToolbar; } private Subscription mTagsSubscription; TagsListAdapter mTagsAdapter; @State protected boolean mIsFiltered; @State ArrayList<TagsListEntry> mTags; protected City mCity; protected static Intent createLaunchIntent(@NonNull Context context, @NonNull Class clazz, @NonNull City city) { Intent intent = new Intent(context, clazz); intent.putExtra(EXTRA_CITY, city); return intent; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setDataFromExtra(); initLayout(); } @Override protected void onStart() { super.onStart(); if (mTags == null) { mTagsSubscription = mBaggersService.getSessionsTags(mCity.id) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(tags -> { Timber.d("Tags loaded from database"); mTags = new ArrayList<>(tags); mTagsAdapter.updateItems(mTags); }); } else { mTagsAdapter.updateItems(mTags, false); } } @Override protected void onStop() { unsubscribe(mTagsSubscription); super.onStop(); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.baggers_list, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { DrawerLayout drawer = mFilterDrawer.mLayout; if (drawer != null) { if (item.getItemId() == R.id.action_filter_baggers) { if (drawer.isDrawerOpen(GravityCompat.END)) { drawer.closeDrawer(GravityCompat.END); } else { drawer.openDrawer(GravityCompat.END); } return true; } else if (item.getItemId() == android.R.id.home && drawer.isDrawerVisible(GravityCompat.END)) { drawer.closeDrawer(GravityCompat.END); return super.onOptionsItemSelected(item); } } return super.onOptionsItemSelected(item); } @Override public void onBackPressed() { if (mFilterDrawer.mLayout.isDrawerVisible(GravityCompat.END)) { mFilterDrawer.mLayout.closeDrawer(GravityCompat.END); } else if (mIsFiltered && !isNavigationDrawerVisible()) { resetFilter(); } else { super.onBackPressed(); } } @Override public void onFilterChanged(List<String> selectedTagsIds) { mIsFiltered = !selectedTagsIds.isEmpty(); } @Override protected void onNavigationDrawerEntryClicked(NavigationDrawerEntry entry) { super.onNavigationDrawerEntryClicked(entry); if (mIsFiltered) { resetFilter(); } } @Override public void setContentView(int layoutResID) { View inflated = LayoutInflater.from(this).inflate(layoutResID, mFilterDrawer.mContent, true); ButterKnife.bind(this, inflated); super.setContentView(mFilterDrawer.mContainer); } protected void resetFilter() { mIsFiltered = false; mTagsAdapter.resetFilter(); } private void initLayout() { mFilterDrawer = new FilterDrawerViewHolder(); View inflated = LayoutInflater.from(this).inflate(R.layout.tags_list_activity, getParentView(), false); ButterKnife.bind(mFilterDrawer, inflated); setSupportActionBar(mFilterDrawer.mToolbar); DrawerLayout drawer = mFilterDrawer.mLayout; drawer.setDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); lockNavigationDrawer(); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); unlockNavigationDrawer(); } }); drawer.setDrawerShadow(R.drawable.drawer_shadow_end, GravityCompat.END); mFilterDrawer.mEmptyView.getIndeterminateDrawable().setColorFilter(getResources().getColor(R.color.primary_light), PorterDuff.Mode.SRC_ATOP); EmptyRecyclerView recyclerView = mFilterDrawer.mRecyclerView; recyclerView.setEmptyView(mFilterDrawer.mEmptyView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new SimpleDividerItemDecoration(CompatibilityUtils.getDrawable(this, R.drawable.line_divider))); mTagsAdapter = new TagsListAdapter(this); recyclerView.setAdapter(mTagsAdapter); } private void setDataFromExtra() { mCity = getIntent().getParcelableExtra(EXTRA_CITY); if (mCity == null) { Timber.e("City must not be null"); } } }