Skip to content

Commit 005f313

Browse files
committed
refactor: unread widget to resolve deprecations
1 parent dc23729 commit 005f313

File tree

9 files changed

+82
-46
lines changed

9 files changed

+82
-46
lines changed

feature/widget/unread/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ dependencies {
1313
implementation(libs.preferencex)
1414

1515
testImplementation(libs.robolectric)
16+
testImplementation(projects.core.logging.testing)
1617
}
1718

1819
android {

feature/widget/unread/src/main/kotlin/app/k9mail/feature/widget/unread/BaseUnreadWidgetProvider.kt

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ import kotlinx.coroutines.CoroutineScope
1212
import kotlinx.coroutines.Dispatchers
1313
import kotlinx.coroutines.SupervisorJob
1414
import kotlinx.coroutines.launch
15-
import net.thunderbird.core.logging.legacy.Log
15+
import net.thunderbird.core.logging.Logger
1616
import org.koin.core.component.KoinComponent
1717
import org.koin.core.component.inject
1818

19+
private const val TAG = "BaseUnreadWidgetProvider"
20+
1921
/**
2022
* Unread widget provider that displays the number of unread messages on the user's home screen.
2123
*
@@ -48,6 +50,7 @@ import org.koin.core.component.inject
4850
*/
4951
abstract class BaseUnreadWidgetProvider : AppWidgetProvider(), KoinComponent {
5052
private val repository: UnreadWidgetRepository by inject()
53+
private val logger: Logger by inject()
5154
private val widgetScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
5255

5356
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
@@ -81,10 +84,8 @@ abstract class BaseUnreadWidgetProvider : AppWidgetProvider(), KoinComponent {
8184
val remoteViews = RemoteViews(context.packageName, R.layout.unread_widget_layout)
8285

8386
val appWidgetId = data.configuration.appWidgetId
84-
var clickIntent: Intent? = null
8587

86-
try {
87-
clickIntent = data.clickIntent
88+
val clickIntent = try {
8889
val unreadCount = data.unreadCount
8990

9091
if (unreadCount <= 0) {
@@ -98,17 +99,15 @@ abstract class BaseUnreadWidgetProvider : AppWidgetProvider(), KoinComponent {
9899
}
99100

100101
remoteViews.setTextViewText(R.id.title, data.title)
101-
} catch (e: Exception) {
102-
Log.e(e, "Error getting widget configuration")
103-
}
104102

105-
if (clickIntent == null) {
106-
// If the widget configuration couldn't be loaded we open the configuration
107-
// activity when the user clicks the widget.
108-
clickIntent = Intent(context, UnreadWidgetConfigurationActivity::class.java)
109-
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
103+
data.clickIntent
104+
} catch (e: Exception) {
105+
logger.error(TAG, e) { "Error getting widget configuration for widget ID $appWidgetId" }
106+
null
107+
} ?: Intent(context, UnreadWidgetConfigurationActivity::class.java).apply {
108+
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
109+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
110110
}
111-
clickIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
112111

113112
val pendingIntent = PendingIntentCompat.getActivity(
114113
context,

feature/widget/unread/src/main/kotlin/app/k9mail/feature/widget/unread/KoinModule.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ val unreadWidgetModule = module {
1919
folderRepository = get(),
2020
folderNameFormatter = get(),
2121
coreResourceProvider = get(),
22+
logger = get(),
2223
)
2324
}
2425
single {
@@ -27,6 +28,11 @@ val unreadWidgetModule = module {
2728
config = get(),
2829
)
2930
}
30-
single { UnreadWidgetUpdateListener(unreadWidgetUpdater = get()) }
31+
single {
32+
UnreadWidgetUpdateListener(
33+
unreadWidgetUpdater = get(),
34+
logger = get(),
35+
)
36+
}
3137
single { UnreadWidgetMigrations(accountRepository = get(), folderRepository = get()) }
3238
}

feature/widget/unread/src/main/kotlin/app/k9mail/feature/widget/unread/UnreadWidgetConfigurationActivity.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@ import android.appwidget.AppWidgetManager
44
import android.os.Bundle
55
import com.fsck.k9.ui.base.BaseActivity
66
import com.fsck.k9.ui.base.extensions.fragmentTransaction
7-
import net.thunderbird.core.logging.legacy.Log
7+
import net.thunderbird.core.logging.Logger
8+
import org.koin.android.ext.android.inject
9+
10+
private const val TAG = "UnreadWidgetConfigurationActivity"
811

912
/**
1013
* Activity to select an account for the unread widget.
1114
*/
1215
class UnreadWidgetConfigurationActivity : BaseActivity() {
1316

17+
private val logger: Logger by inject()
18+
1419
override fun onCreate(savedInstanceState: Bundle?) {
1520
super.onCreate(savedInstanceState)
1621
setLayout(R.layout.activity_unread_widget_configuration)
@@ -23,7 +28,7 @@ class UnreadWidgetConfigurationActivity : BaseActivity() {
2328
}
2429

2530
if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
26-
Log.e("Received an invalid widget ID")
31+
logger.error(TAG) { "Received an invalid widget ID" }
2732
finish()
2833
return
2934
}

feature/widget/unread/src/main/kotlin/app/k9mail/feature/widget/unread/UnreadWidgetConfigurationFragment.kt

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ import android.os.Bundle
77
import android.view.Menu
88
import android.view.MenuInflater
99
import android.view.MenuItem
10+
import android.view.View
1011
import android.widget.Toast
1112
import androidx.activity.result.ActivityResultLauncher
1213
import androidx.core.os.bundleOf
14+
import androidx.core.view.MenuProvider
15+
import androidx.lifecycle.Lifecycle
1316
import androidx.preference.CheckBoxPreference
1417
import androidx.preference.Preference
1518
import com.fsck.k9.Preferences
@@ -49,7 +52,6 @@ class UnreadWidgetConfigurationFragment : PreferenceFragmentCompat() {
4952
private var selectedFolderDisplayName: String? = null
5053

5154
override fun onCreatePreferencesFix(savedInstanceState: Bundle?, rootKey: String?) {
52-
setHasOptionsMenu(true)
5355
setPreferencesFromResource(R.xml.unread_widget_configuration, rootKey)
5456

5557
appWidgetId = arguments?.getInt(ARGUMENT_APP_WIDGET_ID) ?: error("Missing argument '$ARGUMENT_APP_WIDGET_ID'")
@@ -83,6 +85,36 @@ class UnreadWidgetConfigurationFragment : PreferenceFragmentCompat() {
8385
}
8486
}
8587

88+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
89+
super.onViewCreated(view, savedInstanceState)
90+
configureMenuHost()
91+
}
92+
93+
private fun configureMenuHost() {
94+
val menuHost = requireActivity()
95+
menuHost.addMenuProvider(
96+
object : MenuProvider {
97+
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
98+
menuInflater.inflate(R.menu.unread_widget_option, menu)
99+
}
100+
101+
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
102+
return when (menuItem.itemId) {
103+
R.id.done -> {
104+
if (validateWidget()) {
105+
updateWidgetAndExit()
106+
}
107+
true
108+
}
109+
else -> false
110+
}
111+
}
112+
},
113+
viewLifecycleOwner,
114+
Lifecycle.State.RESUMED,
115+
)
116+
}
117+
86118
override fun onSaveInstanceState(outState: Bundle) {
87119
super.onSaveInstanceState(outState)
88120
outState.putString(STATE_SELECTED_ACCOUNT_UUID, selectedAccountUuid)
@@ -145,23 +177,6 @@ class UnreadWidgetConfigurationFragment : PreferenceFragmentCompat() {
145177
unreadFolder.summary = folderDisplayName
146178
}
147179

148-
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
149-
inflater.inflate(R.menu.unread_widget_option, menu)
150-
}
151-
152-
override fun onOptionsItemSelected(item: MenuItem): Boolean {
153-
return when (item.itemId) {
154-
R.id.done -> {
155-
if (validateWidget()) {
156-
updateWidgetAndExit()
157-
}
158-
true
159-
}
160-
161-
else -> super.onOptionsItemSelected(item)
162-
}
163-
}
164-
165180
private fun validateWidget(): Boolean {
166181
return if (selectedAccountUuid == null) {
167182
Toast.makeText(requireContext(), R.string.unread_widget_account_not_selected, Toast.LENGTH_LONG).show()

feature/widget/unread/src/main/kotlin/app/k9mail/feature/widget/unread/UnreadWidgetDataProvider.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ import com.fsck.k9.activity.MainActivity
1111
import com.fsck.k9.ui.messagelist.DefaultFolderProvider
1212
import kotlinx.coroutines.runBlocking
1313
import net.thunderbird.core.android.account.LegacyAccountDto
14-
import net.thunderbird.core.logging.legacy.Log
14+
import net.thunderbird.core.logging.Logger
1515
import net.thunderbird.feature.search.legacy.LocalMessageSearch
1616
import net.thunderbird.feature.search.legacy.SearchAccount
1717

18+
private const val TAG = "UnreadWidgetDataProvider"
19+
20+
@Suppress("LongParameterList")
1821
class UnreadWidgetDataProvider(
1922
private val context: Context,
2023
private val preferences: Preferences,
@@ -23,6 +26,7 @@ class UnreadWidgetDataProvider(
2326
private val folderRepository: FolderRepository,
2427
private val folderNameFormatter: FolderNameFormatter,
2528
private val coreResourceProvider: CoreResourceProvider,
29+
private val logger: Logger,
2630
) {
2731
fun loadUnreadWidgetData(configuration: UnreadWidgetConfiguration): UnreadWidgetData? = with(configuration) {
2832
if (SearchAccount.UNIFIED_FOLDERS == accountUuid) {
@@ -87,7 +91,7 @@ class UnreadWidgetDataProvider(
8791
return if (folder != null) {
8892
folderNameFormatter.displayName(folder)
8993
} else {
90-
Log.e("Error loading folder for account %s, folder ID: %d", account, folderId)
94+
logger.error(TAG) { "Error loading folder for account ${account.id.asRaw()}, folder ID: $folderId" }
9195
""
9296
}
9397
}

feature/widget/unread/src/main/kotlin/app/k9mail/feature/widget/unread/UnreadWidgetRepository.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package app.k9mail.feature.widget.unread
22

33
import android.content.Context
44
import android.content.SharedPreferences
5+
import androidx.core.content.edit
56

67
internal class UnreadWidgetRepository(
78
private val context: Context,
@@ -11,10 +12,10 @@ internal class UnreadWidgetRepository(
1112

1213
fun saveWidgetConfiguration(configuration: UnreadWidgetConfiguration) {
1314
val appWidgetId = configuration.appWidgetId
14-
val editor = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit()
15-
editor.putString(PREF_PREFIX_KEY + appWidgetId, configuration.accountUuid)
16-
editor.putString(PREF_PREFIX_KEY + appWidgetId + PREF_FOLDER_ID_SUFFIX_KEY, configuration.folderId?.toString())
17-
editor.apply()
15+
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit {
16+
putString(PREF_PREFIX_KEY + appWidgetId, configuration.accountUuid)
17+
putString(PREF_PREFIX_KEY + appWidgetId + PREF_FOLDER_ID_SUFFIX_KEY, configuration.folderId?.toString())
18+
}
1819
}
1920

2021
fun getWidgetData(appWidgetId: Int): UnreadWidgetData? {
@@ -42,10 +43,10 @@ internal class UnreadWidgetRepository(
4243
}
4344

4445
fun deleteWidgetConfiguration(appWidgetId: Int) {
45-
val editor = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit()
46-
editor.remove(PREF_PREFIX_KEY + appWidgetId)
47-
editor.remove(PREF_PREFIX_KEY + appWidgetId + PREF_FOLDER_ID_SUFFIX_KEY)
48-
editor.apply()
46+
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit {
47+
remove(PREF_PREFIX_KEY + appWidgetId)
48+
remove(PREF_PREFIX_KEY + appWidgetId + PREF_FOLDER_ID_SUFFIX_KEY)
49+
}
4950
}
5051

5152
companion object {

feature/widget/unread/src/main/kotlin/app/k9mail/feature/widget/unread/UnreadWidgetUpdateListener.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,21 @@ package app.k9mail.feature.widget.unread
33
import app.k9mail.legacy.message.controller.SimpleMessagingListener
44
import com.fsck.k9.mail.Message
55
import net.thunderbird.core.android.account.LegacyAccountDto
6-
import net.thunderbird.core.logging.legacy.Log
6+
import net.thunderbird.core.logging.Logger
7+
8+
private const val TAG = "UnreadWidgetUpdateListener"
79

810
class UnreadWidgetUpdateListener(
911
private val unreadWidgetUpdater: UnreadWidgetUpdater,
12+
private val logger: Logger,
1013
) : SimpleMessagingListener() {
1114

1215
@Suppress("TooGenericExceptionCaught")
1316
private fun updateUnreadWidget() {
1417
try {
1518
unreadWidgetUpdater.updateAll()
1619
} catch (e: Exception) {
17-
Log.e(e, "Error while updating unread widget(s)")
20+
logger.error(TAG, e) { "Error while updating unread widget(s)" }
1821
}
1922
}
2023

feature/widget/unread/src/test/kotlin/app/k9mail/feature/widget/unread/UnreadWidgetDataProviderTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.fsck.k9.Preferences
1313
import com.fsck.k9.ui.messagelist.DefaultFolderProvider
1414
import kotlinx.coroutines.flow.Flow
1515
import net.thunderbird.core.android.account.LegacyAccountDto
16+
import net.thunderbird.core.logging.testing.TestLogger
1617
import net.thunderbird.feature.mail.folder.api.Folder
1718
import net.thunderbird.feature.mail.folder.api.FolderType
1819
import net.thunderbird.feature.search.legacy.LocalMessageSearch
@@ -46,6 +47,7 @@ class UnreadWidgetDataProviderTest : AutoCloseKoinTest() {
4647
folderRepository,
4748
folderNameFormatter,
4849
coreResourceProvider,
50+
logger = TestLogger(),
4951
)
5052

5153
@Before

0 commit comments

Comments
 (0)