From d481d216c9538f72c23504d0ef0821bbc3fe1879 Mon Sep 17 00:00:00 2001 From: danijoo Date: Mon, 4 Jan 2016 02:51:36 +0100 Subject: [PATCH] filter icons && NotificationListLoaderManager --- .../NotificationListFragment.java | 82 +++++++++++-------- .../NotificationListLoaderCallbacks.java | 53 ++++++++++++ .../NotificationListLoaderManager.java | 23 ++++++ app/src/main/res/menu/main_activity.xml | 3 +- .../main/res/menu/notification_list_frag.xml | 14 ++++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 142 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderCallbacks.java create mode 100644 app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderManager.java create mode 100644 app/src/main/res/menu/notification_list_frag.xml diff --git a/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListFragment.java b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListFragment.java index 5f35b34..af193ce 100644 --- a/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListFragment.java +++ b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListFragment.java @@ -4,12 +4,12 @@ import android.database.Cursor; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; -import android.support.v4.app.LoaderManager; -import android.support.v4.content.CursorLoader; -import android.support.v4.content.Loader; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -22,9 +22,7 @@ import butterknife.Bind; import butterknife.ButterKnife; import timber.log.Timber; -public class NotificationListFragment extends Fragment implements LoaderManager.LoaderCallbacks, NotificationListAdapter.NotificationClickListener { - - final int LOADER_ID = 124; +public class NotificationListFragment extends Fragment implements NotificationListLoaderCallbacks.NotificationListView, NotificationListAdapter.NotificationClickListener { @Bind(R.id.nList_emptyView) View mEmptyView; @@ -33,6 +31,18 @@ public class NotificationListFragment extends Fragment implements LoaderManager. RecyclerView mNotificationList; private NotificationListAdapter mAdapter; + private boolean isFiltered = false; + private NotificationListLoaderManager mLoaderManager; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + setHasOptionsMenu(true); + super.onCreate(savedInstanceState); + mLoaderManager = new NotificationListLoaderManager( + getContext(), + getLoaderManager(), + this); + } @Nullable @Override @@ -40,7 +50,6 @@ public class NotificationListFragment extends Fragment implements LoaderManager. View view = inflater.inflate(R.layout.notification_list_fragment, container, false); ButterKnife.bind(this, view); mNotificationList.setLayoutManager(new LinearLayoutManager(getContext())); - return view; } @@ -50,50 +59,57 @@ public class NotificationListFragment extends Fragment implements LoaderManager. mAdapter = new NotificationListAdapter(getContext(), null); mAdapter.setNotificationClickListener(this); mNotificationList.setAdapter(mAdapter); - getLoaderManager().initLoader(LOADER_ID, Bundle.EMPTY, this); + mLoaderManager.loadNotificationsUnfiltered(); } @Override - public Loader onCreateLoader(int id, Bundle args) { - Timber.d("Loader created."); - return new CursorLoader( - getContext(), - Logged_notificationTable.CONTENT_URI, - null, - null, - null, - Logged_notificationTable.FIELD_DATE + " DESC" - ); + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.notification_list_frag, menu); + if (isFiltered) + menu.findItem(R.id.menu_filter).setVisible(false); + else + menu.findItem(R.id.menu_clear_filter).setVisible(false); } @Override - public void onLoadFinished(Loader loader, Cursor data) { - Timber.d("Loader finished. " + data.getCount() + " items."); - mAdapter.changeCursor(data); - checkIfEmpty(); + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_filter: + mLoaderManager.loadNotificationsUnfiltered(); + setIsFiltered(true); + return true; + case R.id.menu_clear_filter: + mLoaderManager.loadNotificationsUnfiltered(); + setIsFiltered(false); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + public void setIsFiltered(boolean filtered) { + isFiltered = filtered; + if (getActivity() != null) + getActivity().supportInvalidateOptionsMenu(); } @Override - public void onLoaderReset(Loader loader) { - Timber.d("Loader reset."); - mAdapter.changeCursor(null); - checkIfEmpty(); - } - - private void checkIfEmpty() { - if(mAdapter.getItemCount() == 0) { - mEmptyView.setVisibility(View.VISIBLE); + public void onChangeCursor(Cursor cursor) { + mAdapter.changeCursor(cursor); + if (mAdapter.getItemCount() == 0) { mNotificationList.setVisibility(View.GONE); + mEmptyView.setVisibility(View.VISIBLE); } else { - mEmptyView.setVisibility(View.GONE); mNotificationList.setVisibility(View.VISIBLE); + mEmptyView.setVisibility(View.GONE); } } @Override public void onNotificationClick(long id) { String qry = Logged_notificationTable.FIELD__ID + " = ? "; - String[] args = { String.valueOf(id) }; + String[] args = {String.valueOf(id)}; Cursor cursor = getContext().getContentResolver().query(Logged_notificationTable.CONTENT_URI, null, qry, args, null); LoggedNotification notification = Logged_notificationTable.getRow(cursor, true); Timber.e(notification.title); diff --git a/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderCallbacks.java b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderCallbacks.java new file mode 100644 index 0000000..8ea4126 --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderCallbacks.java @@ -0,0 +1,53 @@ +package net.headlezz.notificationlogger.notificationlist; + +import android.content.Context; +import android.database.Cursor; +import android.os.Bundle; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; + +import net.headlezz.notificationlogger.logger.Logged_notificationTable; + +import timber.log.Timber; + +public class NotificationListLoaderCallbacks implements LoaderManager.LoaderCallbacks { + + public interface NotificationListView { + void onChangeCursor(Cursor cursor); + } + + private Context mContext; + private NotificationListView mView; + + public NotificationListLoaderCallbacks(Context context, NotificationListView view) { + mContext = context; + mView = view; + } + + @Override + public Loader onCreateLoader(int id, Bundle args) { + Timber.d("Loader created."); + return new CursorLoader( + mContext, + Logged_notificationTable.CONTENT_URI, + null, + null, + null, + Logged_notificationTable.FIELD_DATE + " DESC" + ); + } + + @Override + public void onLoadFinished(Loader loader, Cursor data) { + Timber.d("Loader finished. " + data.getCount() + " items."); + mView.onChangeCursor(data); + } + + @Override + public void onLoaderReset(Loader loader) { + Timber.d("Loader reset."); + mView.onChangeCursor(null); + } + +} diff --git a/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderManager.java b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderManager.java new file mode 100644 index 0000000..2b0c7ca --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderManager.java @@ -0,0 +1,23 @@ +package net.headlezz.notificationlogger.notificationlist; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.LoaderManager; + +public class NotificationListLoaderManager { + + final int LOADER_ID = 124; + + LoaderManager mLoaderManager; + NotificationListLoaderCallbacks mLoaderCallbacks; + + public NotificationListLoaderManager(Context context, LoaderManager loaderManager, NotificationListLoaderCallbacks.NotificationListView notificationListView) { + mLoaderManager = loaderManager; + mLoaderCallbacks = new NotificationListLoaderCallbacks(context, notificationListView); + } + + void loadNotificationsUnfiltered() { + mLoaderManager.restartLoader(LOADER_ID, Bundle.EMPTY, mLoaderCallbacks); + } + +} diff --git a/app/src/main/res/menu/main_activity.xml b/app/src/main/res/menu/main_activity.xml index 93da5ac..6ed3e8c 100644 --- a/app/src/main/res/menu/main_activity.xml +++ b/app/src/main/res/menu/main_activity.xml @@ -5,6 +5,5 @@ android:id="@+id/menu_settings" android:orderInCategory="100" android:title="@string/menu_item_settings" - app:showAsAction="never" - /> + app:showAsAction="never" /> \ No newline at end of file diff --git a/app/src/main/res/menu/notification_list_frag.xml b/app/src/main/res/menu/notification_list_frag.xml new file mode 100644 index 0000000..af53b5f --- /dev/null +++ b/app/src/main/res/menu/notification_list_frag.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8eb0bd2..57459e0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,6 +55,8 @@ Notification small icon Application icon for %s Failed to display app info. + Filter + Clear filter Alarm