1
0
mirror of https://github.com/AllanWang/Frost-for-Facebook.git synced 2024-11-08 20:12:39 +01:00

Fix icon loading

This commit is contained in:
Allan Wang 2019-04-22 04:42:52 -04:00
parent 7f371a9532
commit ba0b4e70d9
No known key found for this signature in database
GPG Key ID: C93E3F9C679D7A56
6 changed files with 54 additions and 46 deletions

View File

@ -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)
}
/**

View File

@ -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 suspend fun loadNotifications() {
content = notifDao.selectNotifications(Prefs.userId, type)
private val glide = GlideApp.with(context).asBitmap()
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()
}
}
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android">
</appwidget-provider>
<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"/>