From 7bc0b2181b384725fa31a32f7f37128f6c32503c Mon Sep 17 00:00:00 2001 From: moezbhatti Date: Sun, 18 Nov 2018 20:13:48 -0500 Subject: [PATCH] #1341 - Fix UI glitches with widget --- .../moez/QKSMS/manager/WidgetManagerImpl.kt | 11 +++++++++++ .../com/moez/QKSMS/util/NightModeManager.kt | 6 +++++- .../com/moez/QKSMS/manager/WidgetManager.kt | 2 ++ presentation/src/main/AndroidManifest.xml | 2 -- .../themepicker/ThemePickerPresenter.kt | 16 +++++++++++++--- .../QKSMS/feature/widget/WidgetAdapter.kt | 19 ++++++++----------- .../QKSMS/feature/widget/WidgetProvider.kt | 1 + 7 files changed, 40 insertions(+), 17 deletions(-) diff --git a/data/src/main/java/com/moez/QKSMS/manager/WidgetManagerImpl.kt b/data/src/main/java/com/moez/QKSMS/manager/WidgetManagerImpl.kt index e7b063a8..a8f3b26b 100644 --- a/data/src/main/java/com/moez/QKSMS/manager/WidgetManagerImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/manager/WidgetManagerImpl.kt @@ -18,6 +18,8 @@ */ package com.moez.QKSMS.manager +import android.appwidget.AppWidgetManager +import android.content.ComponentName import android.content.Context import android.content.Intent import com.klinker.android.send_message.BroadcastUtils @@ -29,4 +31,13 @@ class WidgetManagerImpl @Inject constructor(private val context: Context) : Widg BroadcastUtils.sendExplicitBroadcast(context, Intent(), WidgetManager.ACTION_NOTIFY_DATASET_CHANGED) } + override fun updateTheme() { + val ids = AppWidgetManager.getInstance(context) + .getAppWidgetIds(ComponentName("com.moez.QKSMS", "com.moez.QKSMS.feature.widget.WidgetProvider")) + + val intent = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) + + BroadcastUtils.sendExplicitBroadcast(context, intent, AppWidgetManager.ACTION_APPWIDGET_UPDATE) + } + } \ No newline at end of file diff --git a/data/src/main/java/com/moez/QKSMS/util/NightModeManager.kt b/data/src/main/java/com/moez/QKSMS/util/NightModeManager.kt index 4f38f584..068ea77a 100644 --- a/data/src/main/java/com/moez/QKSMS/util/NightModeManager.kt +++ b/data/src/main/java/com/moez/QKSMS/util/NightModeManager.kt @@ -22,6 +22,7 @@ import android.app.AlarmManager import android.app.PendingIntent import android.content.Context import android.content.Intent +import com.moez.QKSMS.manager.WidgetManager import com.moez.QKSMS.receiver.NightModeReceiver import java.text.SimpleDateFormat import java.util.* @@ -32,7 +33,8 @@ import javax.inject.Singleton @Singleton class NightModeManager @Inject constructor( private val context: Context, - private val prefs: Preferences) { + private val prefs: Preferences, + private val widgetManager: WidgetManager) { fun updateCurrentTheme() { // If night mode is not on auto, then there's nothing to do here @@ -45,6 +47,7 @@ class NightModeManager @Inject constructor( // If the last nightStart was more recent than the last nightEnd, then it's night time prefs.night.set(nightStartTime > nightEndTime) + widgetManager.updateTheme() } fun updateNightMode(mode: Int) { @@ -53,6 +56,7 @@ class NightModeManager @Inject constructor( // If it's not on auto mode, set the appropriate night mode if (mode != Preferences.NIGHT_MODE_AUTO) { prefs.night.set(mode == Preferences.NIGHT_MODE_ON) + widgetManager.updateTheme() } updateAlarms() diff --git a/domain/src/main/java/com/moez/QKSMS/manager/WidgetManager.kt b/domain/src/main/java/com/moez/QKSMS/manager/WidgetManager.kt index 86840d51..eabaab0a 100644 --- a/domain/src/main/java/com/moez/QKSMS/manager/WidgetManager.kt +++ b/domain/src/main/java/com/moez/QKSMS/manager/WidgetManager.kt @@ -26,4 +26,6 @@ interface WidgetManager { fun updateUnreadCount() + fun updateTheme() + } \ No newline at end of file diff --git a/presentation/src/main/AndroidManifest.xml b/presentation/src/main/AndroidManifest.xml index 5e5eaa13..3e6fece7 100644 --- a/presentation/src/main/AndroidManifest.xml +++ b/presentation/src/main/AndroidManifest.xml @@ -151,8 +151,6 @@ - - diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/themepicker/ThemePickerPresenter.kt b/presentation/src/main/java/com/moez/QKSMS/feature/themepicker/ThemePickerPresenter.kt index 7da036c2..609e1990 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/themepicker/ThemePickerPresenter.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/themepicker/ThemePickerPresenter.kt @@ -23,6 +23,7 @@ import com.moez.QKSMS.common.Navigator import com.moez.QKSMS.common.base.QkPresenter import com.moez.QKSMS.common.util.BillingManager import com.moez.QKSMS.common.util.Colors +import com.moez.QKSMS.manager.WidgetManager import com.moez.QKSMS.util.Preferences import com.uber.autodispose.kotlin.autoDisposable import io.reactivex.rxkotlin.Observables @@ -31,11 +32,12 @@ import javax.inject.Inject import javax.inject.Named class ThemePickerPresenter @Inject constructor( - @Named("threadId") threadId: Long, prefs: Preferences, + @Named("threadId") private val threadId: Long, private val billingManager: BillingManager, private val colors: Colors, - private val navigator: Navigator + private val navigator: Navigator, + private val widgetManager: WidgetManager ) : QkPresenter(ThemePickerState(threadId = threadId)) { private val theme: Preference = prefs.theme(threadId) @@ -50,7 +52,12 @@ class ThemePickerPresenter @Inject constructor( // Update the theme when a material theme is clicked view.themeSelected() .autoDisposable(view.scope()) - .subscribe { color -> theme.set(color) } + .subscribe { color -> + theme.set(color) + if (threadId == 0L) { + widgetManager.updateTheme() + } + } // Update the color of the apply button view.hsvThemeSelected() @@ -73,6 +80,9 @@ class ThemePickerPresenter @Inject constructor( view.showQksmsPlusSnackbar() } else { theme.set(color) + if (threadId == 0L) { + widgetManager.updateTheme() + } } } .autoDisposable(view.scope()) diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/widget/WidgetAdapter.kt b/presentation/src/main/java/com/moez/QKSMS/feature/widget/WidgetAdapter.kt index 9d48ae82..e3af1e40 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/widget/WidgetAdapter.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/widget/WidgetAdapter.kt @@ -62,21 +62,18 @@ class WidgetAdapter(intent: Intent) : RemoteViewsService.RemoteViewsFactory { private var conversations: List = listOf() private val appWidgetManager by lazy { AppWidgetManager.getInstance(context) } - // Cache colors, load lazily. This entire class is recreated when the widget is recreated, - // so if the theme changes then these values will be correct in the new instance - private val night by lazy { prefs.night.get() } - private val black by lazy { prefs.black.get() } - private val theme by lazy { colors.theme() } - private val background by lazy { - context.getColorCompat(when { + private val night get() = prefs.night.get() + private val black get() = prefs.black.get() + private val theme get() = colors.theme() + private val background + get() = context.getColorCompat(when { night && black -> R.color.black night && !black -> R.color.backgroundDark else -> R.color.white }) - } - private val textPrimary by lazy { context.getColorCompat(if (night) R.color.textPrimaryDark else R.color.textPrimary) } - private val textSecondary by lazy { context.getColorCompat(if (night) R.color.textSecondaryDark else R.color.textSecondary) } - private val textTertiary by lazy { context.getColorCompat(if (night) R.color.textTertiaryDark else R.color.textTertiary) } + private val textPrimary get() = context.getColorCompat(if (night) R.color.textPrimaryDark else R.color.textPrimary) + private val textSecondary get() = context.getColorCompat(if (night) R.color.textSecondaryDark else R.color.textSecondary) + private val textTertiary get() = context.getColorCompat(if (night) R.color.textTertiaryDark else R.color.textTertiary) override fun onCreate() { appComponent.inject(this) diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/widget/WidgetProvider.kt b/presentation/src/main/java/com/moez/QKSMS/feature/widget/WidgetProvider.kt index 2f6622ef..3c3960d8 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/widget/WidgetProvider.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/widget/WidgetProvider.kt @@ -59,6 +59,7 @@ class WidgetProvider : AppWidgetProvider() { override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { super.onUpdate(context, appWidgetManager, appWidgetIds) + updateData(context) for (appWidgetId in appWidgetIds) { updateWidget(context, appWidgetId, isSmallWidget(appWidgetManager, appWidgetId)) }