aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/db/NotificationDb.kt5
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/widgets/NotificationWidget.kt60
-rw-r--r--app/src/main/res/drawable/ic_refresh_24dp.xml5
-rw-r--r--app/src/main/res/layout/widget_notifications.xml20
-rw-r--r--app/src/main/res/values/dimens.xml2
-rw-r--r--app/src/main/res/xml/notification_widget_info.xml8
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"/>