diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cdf084a..a397742 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,6 +43,18 @@ android:name="net.headlezz.notificationlogger.logger.NotificationProvider" android:exported="true" /> + + + + + + + + + diff --git a/app/src/main/java/net/headlezz/notificationlogger/DatabaseUtils.java b/app/src/main/java/net/headlezz/notificationlogger/DatabaseUtils.java index 045a774..cc51b79 100644 --- a/app/src/main/java/net/headlezz/notificationlogger/DatabaseUtils.java +++ b/app/src/main/java/net/headlezz/notificationlogger/DatabaseUtils.java @@ -8,6 +8,7 @@ import net.headlezz.notificationlogger.logger.BlacklistItem; import net.headlezz.notificationlogger.logger.BlacklistTable; import net.headlezz.notificationlogger.logger.LoggedNotification; import net.headlezz.notificationlogger.logger.Logged_notificationTable; +import net.headlezz.notificationlogger.widget.WidgetUtils; public class DatabaseUtils { @@ -16,6 +17,7 @@ public class DatabaseUtils { Logged_notificationTable.CONTENT_URI, Logged_notificationTable.getContentValues(ln, false) ); + WidgetUtils.notifyWidgetsUpdate(context); } public static LoggedNotification getNotificationById(Context context, long id) { @@ -31,6 +33,7 @@ public class DatabaseUtils { // there are no notifications with negative ids, so we use this to select all rows String whereClause = Logged_notificationTable.FIELD_NOTIFICATION_ID + " != -1"; resolver.delete(Logged_notificationTable.CONTENT_URI, whereClause, new String[0]); + WidgetUtils.notifyWidgetsUpdate(context); } public static boolean isPackageBlacklisted(Context context, String packageName) { @@ -71,7 +74,7 @@ public class DatabaseUtils { context.getContentResolver().delete( BlacklistTable.CONTENT_URI, BlacklistTable.FIELD_PACKAGE_NAME + " = ?", - new String[] {packageName} + new String[]{packageName} ); } @@ -79,7 +82,8 @@ public class DatabaseUtils { context.getContentResolver().delete( Logged_notificationTable.CONTENT_URI, Logged_notificationTable.FIELD__ID + " = ?", - new String[] {String.valueOf(id)} + new String[]{String.valueOf(id)} ); + WidgetUtils.notifyWidgetsUpdate(context); } } diff --git a/app/src/main/java/net/headlezz/notificationlogger/widget/ListWidgetProvider.java b/app/src/main/java/net/headlezz/notificationlogger/widget/ListWidgetProvider.java new file mode 100644 index 0000000..d14f89f --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/widget/ListWidgetProvider.java @@ -0,0 +1,37 @@ +package net.headlezz.notificationlogger.widget; + +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.widget.RemoteViews; + +import net.headlezz.notificationlogger.R; + +public class ListWidgetProvider extends AppWidgetProvider { + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + for(int widgetId : appWidgetIds) { + RemoteViews rvs = updateWidgetListView(context, widgetId); + appWidgetManager.updateAppWidget(appWidgetIds, rvs); + } + super.onUpdate(context, appWidgetManager, appWidgetIds); + } + + private RemoteViews updateWidgetListView(Context context, int appWidgetId) { + RemoteViews rvs = new RemoteViews(context.getPackageName(), R.layout.widget_list); + + Intent serviceIntent = new Intent(context, ListWidgetService.class); + serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); + + rvs.setRemoteAdapter(R.id.list_widget_listView, serviceIntent); + rvs.setEmptyView(R.id.list_widget_listView, R.id.list_widget_empty_view); + + + + return rvs; + } +} diff --git a/app/src/main/java/net/headlezz/notificationlogger/widget/ListWidgetService.java b/app/src/main/java/net/headlezz/notificationlogger/widget/ListWidgetService.java new file mode 100644 index 0000000..60ff251 --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/widget/ListWidgetService.java @@ -0,0 +1,13 @@ +package net.headlezz.notificationlogger.widget; + +import android.appwidget.AppWidgetManager; +import android.content.Intent; +import android.widget.RemoteViewsService; + +public class ListWidgetService extends RemoteViewsService { + @Override + public RemoteViewsFactory onGetViewFactory(Intent intent) { + int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + return new ListWidgetViewFactory(getApplicationContext(), appWidgetId); + } +} diff --git a/app/src/main/java/net/headlezz/notificationlogger/widget/ListWidgetViewFactory.java b/app/src/main/java/net/headlezz/notificationlogger/widget/ListWidgetViewFactory.java new file mode 100644 index 0000000..9297177 --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/widget/ListWidgetViewFactory.java @@ -0,0 +1,87 @@ +package net.headlezz.notificationlogger.widget; + +import android.content.Context; +import android.database.Cursor; +import android.text.format.DateUtils; +import android.widget.RemoteViews; +import android.widget.RemoteViewsService; + +import net.headlezz.notificationlogger.R; +import net.headlezz.notificationlogger.logger.LoggedNotification; +import net.headlezz.notificationlogger.logger.Logged_notificationTable; + +import timber.log.Timber; + +public class ListWidgetViewFactory implements RemoteViewsService.RemoteViewsFactory { + + int mAppWidgetId; + Context mContext; + + Cursor mCursor; + + public ListWidgetViewFactory(Context context, int appWidgetId) { + mContext = context; + this.mAppWidgetId = appWidgetId; + } + + + @Override + public void onCreate() { /** ignored **/ } + + @Override + public void onDataSetChanged() { + Timber.d("ON DATA SET CHANGED"); + if(mCursor != null) { + mCursor.close(); + } + mCursor = mContext.getContentResolver().query(Logged_notificationTable.CONTENT_URI, null, null, null, Logged_notificationTable.FIELD_DATE + " DESC"); + } + + @Override + public void onDestroy() { + if(mCursor != null) + mCursor.close(); + } + + @Override + public int getCount() { + if(mCursor == null) { + Timber.d("cursor is null"); + return 0; + } + return mCursor.getCount(); + } + + @Override + public RemoteViews getViewAt(int position) { + RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_list_item); + mCursor.moveToPosition(position); + + LoggedNotification notification = Logged_notificationTable.getRow(mCursor, false); + + rv.setTextViewText(R.id.widget_list_item_title, notification.appName); + rv.setTextViewText(R.id.widget_list_item_notification, notification.title + ": " + notification.message); + rv.setTextViewText(R.id.widget_list_item_date, DateUtils.formatDateTime(mContext, notification.date, DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE)); + return rv; + } + + @Override + public RemoteViews getLoadingView() { + return null; + } + + @Override + public int getViewTypeCount() { + return 1; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public boolean hasStableIds() { + return true; + } +} diff --git a/app/src/main/java/net/headlezz/notificationlogger/widget/WidgetUtils.java b/app/src/main/java/net/headlezz/notificationlogger/widget/WidgetUtils.java new file mode 100644 index 0000000..12d5f6c --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/widget/WidgetUtils.java @@ -0,0 +1,17 @@ +package net.headlezz.notificationlogger.widget; + +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; +import android.content.Context; + +import net.headlezz.notificationlogger.R; + +public class WidgetUtils { + + public static void notifyWidgetsUpdate(Context context) { + AppWidgetManager manager = AppWidgetManager.getInstance(context); + int[] appWidgetIds = manager.getAppWidgetIds(new ComponentName(context, ListWidgetProvider.class)); + manager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.list_widget_listView); + } + +} diff --git a/app/src/main/res/drawable/widget_list_preview.png b/app/src/main/res/drawable/widget_list_preview.png new file mode 100644 index 0000000..18cd9ec Binary files /dev/null and b/app/src/main/res/drawable/widget_list_preview.png differ diff --git a/app/src/main/res/layout/widget_list.xml b/app/src/main/res/layout/widget_list.xml new file mode 100644 index 0000000..1365f1e --- /dev/null +++ b/app/src/main/res/layout/widget_list.xml @@ -0,0 +1,26 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_list_item.xml b/app/src/main/res/layout/widget_list_item.xml new file mode 100644 index 0000000..5278387 --- /dev/null +++ b/app/src/main/res/layout/widget_list_item.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/widget_info.xml b/app/src/main/res/xml/widget_info.xml new file mode 100644 index 0000000..0d319f4 --- /dev/null +++ b/app/src/main/res/xml/widget_info.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file