diff --git a/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListFilterDialog.java b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListFilterDialog.java new file mode 100644 index 0000000..61dbe17 --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListFilterDialog.java @@ -0,0 +1,71 @@ +package net.headlezz.notificationlogger.notificationlist; + +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; + +import net.headlezz.notificationlogger.R; + +import butterknife.Bind; +import butterknife.ButterKnife; + +public class NotificationListFilterDialog extends AlertDialog implements DialogInterface.OnClickListener { + + NotificationListFilterDialogCallbacks mCallbacks; + + @Bind(R.id.notification_filter_etTitle) + EditText etTitle; + + @Bind(R.id.notification_filter_etMessage) + EditText etMessage; + + @Bind(R.id.notification_filter_etAppName) + EditText etAppName; + + @Bind(R.id.notification_filter_etPackage) + EditText etPackageName; + + interface NotificationListFilterDialogCallbacks { + void onFilterNotificationList( + String title, + String message, + String appName, + String packageName + ); + } + + public NotificationListFilterDialog(Context context, NotificationListFilterDialogCallbacks cb) { + super(context); + mCallbacks = cb; + + setButton(BUTTON_POSITIVE, context.getString(R.string.filter_dialog_ok), this); + setButton(BUTTON_NEGATIVE, context.getString(R.string.filter_dialog_cancel), this); + + View view = LayoutInflater.from(getContext()).inflate(R.layout.notification_list_filter_dialog, null); + setView(view); + + setTitle(context.getString(R.string.filter_dialog_title)); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ButterKnife.bind(this); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if(which == BUTTON_POSITIVE) + mCallbacks.onFilterNotificationList( + etTitle.getText().toString(), + etMessage.getText().toString(), + etAppName.getText().toString(), + etPackageName.getText().toString() + ); + } + +} 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 af193ce..27deeea 100644 --- a/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListFragment.java +++ b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListFragment.java @@ -22,7 +22,7 @@ import butterknife.Bind; import butterknife.ButterKnife; import timber.log.Timber; -public class NotificationListFragment extends Fragment implements NotificationListLoaderCallbacks.NotificationListView, NotificationListAdapter.NotificationClickListener { +public class NotificationListFragment extends Fragment implements NotificationListLoaderCallbacks.NotificationListView, NotificationListAdapter.NotificationClickListener, NotificationListFilterDialog.NotificationListFilterDialogCallbacks { @Bind(R.id.nList_emptyView) View mEmptyView; @@ -76,8 +76,7 @@ public class NotificationListFragment extends Fragment implements NotificationLi public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_filter: - mLoaderManager.loadNotificationsUnfiltered(); - setIsFiltered(true); + new NotificationListFilterDialog(getContext(), this).show(); return true; case R.id.menu_clear_filter: mLoaderManager.loadNotificationsUnfiltered(); @@ -116,4 +115,11 @@ public class NotificationListFragment extends Fragment implements NotificationLi new NotificationInfoDialog(getContext(), notification).show(); } + + @Override + public void onFilterNotificationList(String title, String message, String appName, String packageName) { + Timber.d("Selected filter: " + title + "/" + message + "/" + appName + "/" + packageName); + setIsFiltered(true); + mLoaderManager.loadNotificationsFiltered(title, message, appName, packageName); + } } diff --git a/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderCallbacks.java b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderCallbacks.java index 8ea4126..c4ea1db 100644 --- a/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderCallbacks.java +++ b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderCallbacks.java @@ -9,6 +9,9 @@ import android.support.v4.content.Loader; import net.headlezz.notificationlogger.logger.Logged_notificationTable; +import java.util.ArrayList; +import java.util.List; + import timber.log.Timber; public class NotificationListLoaderCallbacks implements LoaderManager.LoaderCallbacks { @@ -27,13 +30,44 @@ public class NotificationListLoaderCallbacks implements LoaderManager.LoaderCall @Override public Loader onCreateLoader(int id, Bundle args) { + // TODO apply filters Timber.d("Loader created."); + String titleFilter = args.containsKey(Logged_notificationTable.FIELD_TITLE) ? args.getString(Logged_notificationTable.FIELD_TITLE) : ""; + String messageFilter = args.containsKey(Logged_notificationTable.FIELD_MESSAGE) ? args.getString(Logged_notificationTable.FIELD_MESSAGE) : ""; + String appNameFilter = args.containsKey(Logged_notificationTable.FIELD_APP_NAME) ? args.getString(Logged_notificationTable.FIELD_APP_NAME) : ""; + String packageFilter = args.containsKey(Logged_notificationTable.FIELD_PACKAGE_NAME) ? args.getString(Logged_notificationTable.FIELD_PACKAGE_NAME) : ""; + + StringBuilder selectionClauseBuilder = new StringBuilder(); + List selectionParams = new ArrayList<>(); + if(!titleFilter.isEmpty()) { + selectionClauseBuilder.append(Logged_notificationTable.FIELD_TITLE + " like ?"); + selectionParams.add("%" + titleFilter + "%"); + } + if(!messageFilter.isEmpty()) { + if(selectionClauseBuilder.length() > 0) + selectionClauseBuilder.append(" AND "); + selectionClauseBuilder.append(Logged_notificationTable.FIELD_MESSAGE + " like ?"); + selectionParams.add("%" + messageFilter + "%"); + } + if(!appNameFilter.isEmpty()) { + if(selectionClauseBuilder.length() > 0) + selectionClauseBuilder.append(" AND "); + selectionClauseBuilder.append(Logged_notificationTable.FIELD_APP_NAME + " like ?"); + selectionParams.add("%" + appNameFilter + "%"); + } + if(!packageFilter.isEmpty()) { + if(selectionClauseBuilder.length() > 0) + selectionClauseBuilder.append(" AND "); + selectionClauseBuilder.append(Logged_notificationTable.FIELD_PACKAGE_NAME + " like ?"); + selectionParams.add("%" + packageFilter + "%"); + } + return new CursorLoader( mContext, Logged_notificationTable.CONTENT_URI, null, - null, - null, + selectionClauseBuilder.toString(), + selectionParams.toArray(new String[selectionParams.size()]), Logged_notificationTable.FIELD_DATE + " DESC" ); } diff --git a/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderManager.java b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderManager.java index 2b0c7ca..1a3754e 100644 --- a/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderManager.java +++ b/app/src/main/java/net/headlezz/notificationlogger/notificationlist/NotificationListLoaderManager.java @@ -2,8 +2,11 @@ package net.headlezz.notificationlogger.notificationlist; import android.content.Context; import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.v4.app.LoaderManager; +import net.headlezz.notificationlogger.logger.Logged_notificationTable; + public class NotificationListLoaderManager { final int LOADER_ID = 124; @@ -20,4 +23,24 @@ public class NotificationListLoaderManager { mLoaderManager.restartLoader(LOADER_ID, Bundle.EMPTY, mLoaderCallbacks); } + void loadNotificationsFiltered(@Nullable String titleFilter, @Nullable String messageFilter, @Nullable String appNameFilter, @Nullable String packageFilter) { + Bundle bundle = new Bundle(); + + if(titleFilter != null && !titleFilter.isEmpty()) + bundle.putString(Logged_notificationTable.FIELD_TITLE, titleFilter); + + if(messageFilter != null && !messageFilter .isEmpty()) + bundle.putString(Logged_notificationTable.FIELD_MESSAGE, messageFilter); + + + if(appNameFilter != null && !appNameFilter.isEmpty()) + bundle.putString(Logged_notificationTable.FIELD_APP_NAME, appNameFilter); + + + if(packageFilter != null && !packageFilter.isEmpty()) + bundle.putString(Logged_notificationTable.FIELD_PACKAGE_NAME, packageFilter); + + mLoaderManager.restartLoader(LOADER_ID, bundle, mLoaderCallbacks); + } + } diff --git a/app/src/main/res/layout/notification_list_filter_dialog.xml b/app/src/main/res/layout/notification_list_filter_dialog.xml new file mode 100644 index 0000000..a94bc4b --- /dev/null +++ b/app/src/main/res/layout/notification_list_filter_dialog.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + \ 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 57459e0..7a37324 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,6 +57,9 @@ Failed to display app info. Filter Clear filter + OK + Cancel + Filter Alarm