diff options
Diffstat (limited to 'app')
6 files changed, 54 insertions, 46 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/db/NotificationDb.kt b/app/src/main/kotlin/com/pitchedapps/frost/db/NotificationDb.kt index 532bb435..d4b51c1e 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/db/NotificationDb.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/db/NotificationDb.kt @@ -137,8 +137,11 @@ interface NotificationDao { suspend fun NotificationDao.deleteAll() = dao { _deleteAll() } -suspend fun NotificationDao.selectNotifications(userId: Long, type: String): List<NotificationContent> = dao { +fun NotificationDao.selectNotificationsSync(userId: Long, type: String): List<NotificationContent> = _selectNotifications(userId, type).map { it.toNotifContent() } + +suspend fun NotificationDao.selectNotifications(userId: Long, type: String): List<NotificationContent> = dao { + selectNotificationsSync(userId, type) } /** diff --git a/app/src/main/kotlin/com/pitchedapps/frost/widgets/NotificationWidget.kt b/app/src/main/kotlin/com/pitchedapps/frost/widgets/NotificationWidget.kt index e7a17c8e..6ba0a3d6 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/widgets/NotificationWidget.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/widgets/NotificationWidget.kt @@ -22,37 +22,34 @@ import android.content.Context import android.content.Intent import android.widget.RemoteViews import android.widget.RemoteViewsService -import androidx.annotation.ColorRes -import ca.allanwang.kau.utils.ContextHelper +import androidx.annotation.ColorInt +import ca.allanwang.kau.utils.dimenPixelSize import ca.allanwang.kau.utils.withAlpha -import com.bumptech.glide.request.target.AppWidgetTarget import com.pitchedapps.frost.R import com.pitchedapps.frost.db.NotificationDao -import com.pitchedapps.frost.db.selectNotifications +import com.pitchedapps.frost.db.selectNotificationsSync import com.pitchedapps.frost.glide.FrostGlide import com.pitchedapps.frost.glide.GlideApp import com.pitchedapps.frost.services.NOTIF_CHANNEL_GENERAL import com.pitchedapps.frost.services.NotificationContent +import com.pitchedapps.frost.utils.L import com.pitchedapps.frost.utils.Prefs import com.pitchedapps.frost.widgets.NotificationWidget.Companion.NOTIF_WIDGET_IDS import com.pitchedapps.frost.widgets.NotificationWidget.Companion.NOTIF_WIDGET_TYPE -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.runBlocking import org.koin.standalone.KoinComponent import org.koin.standalone.inject -import kotlin.coroutines.CoroutineContext class NotificationWidget : AppWidgetProvider() { override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { super.onUpdate(context, appWidgetManager, appWidgetIds) - val views = RemoteViews(context.packageName, com.pitchedapps.frost.R.layout.widget_notifications) val intent = NotificationWidgetService.createIntent(context, NOTIF_CHANNEL_GENERAL, appWidgetIds) for (id in appWidgetIds) { + val views = RemoteViews(context.packageName, R.layout.widget_notifications) + views.setBackgroundColor(R.id.widget_layout_container, Prefs.bgColor) views.setRemoteAdapter(R.id.widget_notification_list, intent) appWidgetManager.updateAppWidget(id, views) } + appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_notification_list) } companion object { @@ -61,6 +58,10 @@ class NotificationWidget : AppWidgetProvider() { } } +private fun RemoteViews.setBackgroundColor(viewId: Int, @ColorInt color: Int) { + setInt(viewId, "setBackgroundColor", color) +} + class NotificationWidgetService : RemoteViewsService() { override fun onGetViewFactory(intent: Intent): RemoteViewsFactory = NotificationWidgetDataProvider(this, intent) @@ -73,7 +74,7 @@ class NotificationWidgetService : RemoteViewsService() { } class NotificationWidgetDataProvider(val context: Context, val intent: Intent) : RemoteViewsService.RemoteViewsFactory, - CoroutineScope, KoinComponent { + KoinComponent { private val notifDao: NotificationDao by inject() @Volatile @@ -83,25 +84,20 @@ class NotificationWidgetDataProvider(val context: Context, val intent: Intent) : private val widgetIds = intent.getIntArrayExtra(NOTIF_WIDGET_IDS) - private lateinit var job: Job - override val coroutineContext: CoroutineContext - get() = ContextHelper.dispatcher + job + private val avatarSize = context.dimenPixelSize(R.dimen.avatar_image_size) + + private val glide = GlideApp.with(context).asBitmap() - private suspend fun loadNotifications() { - content = notifDao.selectNotifications(Prefs.userId, type) + private fun loadNotifications() { + content = notifDao.selectNotificationsSync(Prefs.userId, type) + L._d { "Updated notif widget with ${content.size} items" } } override fun onCreate() { - job = SupervisorJob() - runBlocking { - loadNotifications() - } } override fun onDataSetChanged() { - runBlocking { - loadNotifications() - } + loadNotifications() } override fun getLoadingView(): RemoteViews? = null @@ -112,29 +108,23 @@ class NotificationWidgetDataProvider(val context: Context, val intent: Intent) : override fun getViewAt(position: Int): RemoteViews { val views = RemoteViews(context.packageName, R.layout.widget_notification_item) - val glide = GlideApp.with(context).asBitmap() val notif = content[position] + L._d { "View $position $notif" } views.setBackgroundColor(R.id.item_frame, Prefs.nativeBgColor(notif.unread)) views.setTextColor(R.id.item_content, Prefs.textColor) views.setTextViewText(R.id.item_content, notif.text) views.setTextColor(R.id.item_date, Prefs.textColor.withAlpha(150)) views.setTextViewText(R.id.item_date, notif.timestamp.toString()) // TODO - glide.load(notif.profileUrl).transform(FrostGlide.circleCrop) - .into(AppWidgetTarget(context, R.id.item_avatar, views)) +// views.setOnClickPendingIntent() + val avatar = glide.load(notif.profileUrl).transform(FrostGlide.circleCrop).submit(avatarSize, avatarSize).get() + views.setImageViewBitmap(R.id.item_avatar, avatar) return views } - private fun RemoteViews.setBackgroundColor(viewId: Int, @ColorRes color: Int) { - setInt(viewId, "setBackgroundColor", color) - } - override fun getCount(): Int = content.size - override fun getViewTypeCount(): Int { - TODO("not implemented") - } + override fun getViewTypeCount(): Int = 1 override fun onDestroy() { - job.cancel() } -} +}
\ No newline at end of file diff --git a/app/src/main/res/drawable/ic_refresh_24dp.xml b/app/src/main/res/drawable/ic_refresh_24dp.xml new file mode 100644 index 00000000..cc2d1e04 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh_24dp.xml @@ -0,0 +1,5 @@ +<vector android:height="24dp" android:tint="#FFFFFF" + android:viewportHeight="24.0" android:viewportWidth="24.0" + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="#FF000000" android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z"/> +</vector> diff --git a/app/src/main/res/layout/widget_notifications.xml b/app/src/main/res/layout/widget_notifications.xml index fd68e20a..098bb9eb 100644 --- a/app/src/main/res/layout/widget_notifications.xml +++ b/app/src/main/res/layout/widget_notifications.xml @@ -1,22 +1,30 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" - android:layout_width="match_parent" android:layout_height="match_parent"> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:id="@+id/widget_layout_container" + android:orientation="vertical"> + <LinearLayout - android:id="@+id/widget_layout_main" + android:id="@+id/widget_layout_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingStart="@dimen/kau_padding_small" android:paddingEnd="@dimen/kau_padding_small"> + <ImageView android:id="@+id/img_refresh" android:layout_width="@dimen/toolbar_icon_size" + android:layout_margin="@dimen/kau_padding_small" android:layout_height="@dimen/toolbar_icon_size" - android:layout_gravity="center_vertical"/> + android:layout_gravity="center_vertical" + android:src="@drawable/ic_refresh_24dp" /> </LinearLayout> + <ListView android:id="@+id/widget_notification_list" android:layout_width="match_parent" - android:layout_height="match_parent"> - </ListView> + android:layout_height="0dp" + android:layout_weight="1" /> </LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 53dad5ef..847e74cb 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -10,5 +10,5 @@ <dimen name="intro_bar_height">64dp</dimen> <dimen name="badge_icon_size">20dp</dimen> - <dimen name="toolbar_icon_size">18dp</dimen> + <dimen name="toolbar_icon_size">24dp</dimen> </resources> diff --git a/app/src/main/res/xml/notification_widget_info.xml b/app/src/main/res/xml/notification_widget_info.xml index 3cb97ed7..2b8b4fb5 100644 --- a/app/src/main/res/xml/notification_widget_info.xml +++ b/app/src/main/res/xml/notification_widget_info.xml @@ -1,4 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> -<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"> - -</appwidget-provider>
\ No newline at end of file +<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" + android:initialKeyguardLayout="@layout/widget_notifications" + android:initialLayout="@layout/widget_notifications" + android:minHeight="110dp" + android:minWidth="180dp"/> |