Attempt to fix flashing widgets

pull/3971/head
Alex Baker 2 months ago
parent 4c492120b3
commit 52848a5308

@ -38,7 +38,6 @@ import org.tasks.location.GeofenceApi
import org.tasks.opentasks.OpenTaskContentObserver import org.tasks.opentasks.OpenTaskContentObserver
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.receivers.RefreshReceiver import org.tasks.receivers.RefreshReceiver
import org.tasks.receivers.ScreenUnlockReceiver
import org.tasks.scheduling.NotificationSchedulerIntentService import org.tasks.scheduling.NotificationSchedulerIntentService
import org.tasks.sync.SyncAdapters import org.tasks.sync.SyncAdapters
import org.tasks.themes.ThemeBase import org.tasks.themes.ThemeBase
@ -142,7 +141,6 @@ class TasksApplication : Application(), Configuration.Provider {
geofenceApi.get().registerAll() geofenceApi.get().registerAll()
appWidgetManager.get().reconfigureWidgets() appWidgetManager.get().reconfigureWidgets()
CaldavSynchronizer.registerFactories() CaldavSynchronizer.registerFactories()
registerScreenUnlockReceiver()
} }
override val workManagerConfiguration: Configuration override val workManagerConfiguration: Configuration
@ -167,16 +165,6 @@ class TasksApplication : Application(), Configuration.Provider {
} }
} }
private fun registerScreenUnlockReceiver() {
registerReceiver(
ScreenUnlockReceiver(appWidgetManager.get()),
IntentFilter().apply {
addAction(Intent.ACTION_USER_PRESENT)
addAction(Intent.ACTION_SCREEN_ON)
}
)
}
companion object { companion object {
@Suppress("KotlinConstantConditions") @Suppress("KotlinConstantConditions")
const val IS_GOOGLE_PLAY = BuildConfig.FLAVOR == "googleplay" const val IS_GOOGLE_PLAY = BuildConfig.FLAVOR == "googleplay"

@ -1,19 +0,0 @@
package org.tasks.receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import org.tasks.widget.AppWidgetManager
import timber.log.Timber
class ScreenUnlockReceiver(private val appWidgetManager: AppWidgetManager) : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
Intent.ACTION_USER_PRESENT,
Intent.ACTION_SCREEN_ON -> {
Timber.d("refreshing widgets: ${intent.action}")
appWidgetManager.updateWidgets()
}
}
}
}

@ -1,18 +1,20 @@
package org.tasks.widget package org.tasks.widget
import android.app.Activity
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager
import android.content.BroadcastReceiver
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.consumeAsFlow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.tasks.R import org.tasks.R
import org.tasks.compose.throttleLatest
import org.tasks.injection.ApplicationScope import org.tasks.injection.ApplicationScope
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
@ -22,6 +24,19 @@ class AppWidgetManager @Inject constructor(
@ApplicationScope private val scope: CoroutineScope, @ApplicationScope private val scope: CoroutineScope,
) { ) {
private val appWidgetManager: AppWidgetManager? = AppWidgetManager.getInstance(context) private val appWidgetManager: AppWidgetManager? = AppWidgetManager.getInstance(context)
private val updateChannel = Channel<Unit>(Channel.CONFLATED)
init {
updateChannel
.consumeAsFlow()
.throttleLatest(1000)
.onEach {
val appWidgetIds = widgetIds
Timber.d("updateWidgets: ${appWidgetIds.joinToString { it.toString() }}")
notifyAppWidgetViewDataChanged(appWidgetIds)
}
.launchIn(scope)
}
val widgetIds: IntArray val widgetIds: IntArray
get() = appWidgetManager get() = appWidgetManager
@ -37,31 +52,11 @@ class AppWidgetManager @Inject constructor(
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) .putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
.apply { action = AppWidgetManager.ACTION_APPWIDGET_UPDATE } .apply { action = AppWidgetManager.ACTION_APPWIDGET_UPDATE }
context.sendOrderedBroadcast( context.sendBroadcast(intent)
intent,
null,
object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
scope.launch {
Timber.d("Update widgets after reconfigure: ${appWidgetIds.joinToString { it.toString() }}")
// I don't like it, but this seems to give Android enough time to update
// the cache, and I don't have time to rewrite this in Glance right now
delay(100)
notifyAppWidgetViewDataChanged(ids)
}
}
},
null,
Activity.RESULT_OK,
null,
null
)
} }
fun updateWidgets() = scope.launch { fun updateWidgets() {
val appWidgetIds = widgetIds updateChannel.trySend(Unit)
Timber.d("updateWidgets: ${appWidgetIds.joinToString { it.toString() }}")
notifyAppWidgetViewDataChanged(appWidgetIds)
} }
fun exists(id: Int) = appWidgetManager?.getAppWidgetInfo(id) != null fun exists(id: Int) = appWidgetManager?.getAppWidgetInfo(id) != null

@ -57,7 +57,6 @@ class TasksWidget : AppWidgetProvider() {
appWidgetId, appWidgetId,
createWidget(context, appWidgetId, newOptions) createWidget(context, appWidgetId, newOptions)
) )
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view)
} }
private fun createWidget(context: Context, id: Int, options: Bundle): RemoteViews { private fun createWidget(context: Context, id: Int, options: Bundle): RemoteViews {
@ -94,7 +93,6 @@ class TasksWidget : AppWidgetProvider() {
R.id.list_view, R.id.list_view,
Intent(context, TasksWidgetAdapter::class.java) Intent(context, TasksWidgetAdapter::class.java)
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id) .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id)
.putExtra("extra_cache_buster", cacheBuster)
.setData(cacheBuster) .setData(cacheBuster)
) )
setPendingIntentTemplate(R.id.list_view, getPendingIntentTemplate(context)) setPendingIntentTemplate(R.id.list_view, getPendingIntentTemplate(context))

Loading…
Cancel
Save