From 3f1e0d77e879ce01fb926820257ef2ef6b703dea Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 1 Jun 2022 14:57:30 +0200 Subject: [PATCH] Move more code to coroutines --- Habitica/build.gradle | 2 +- .../android/habitica/data/TaskRepository.kt | 2 +- .../android/habitica/data/UserRepository.kt | 2 +- .../data/implementation/TaskRepositoryImpl.kt | 4 +- .../data/implementation/UserRepositoryImpl.kt | 2 +- .../data/local/UserLocalRepository.kt | 2 +- .../RealmUserLocalRepository.kt | 8 ++-- .../habitica/helpers/LanguageHelper.kt | 4 -- .../habitica/ui/activities/BaseActivity.kt | 4 +- .../ui/activities/ChallengeFormActivity.kt | 1 - .../activities/HabitButtonWidgetActivity.kt | 13 +++++-- .../ui/fragments/AchievementsFragment.kt | 5 --- .../habitica/ui/fragments/BaseMainFragment.kt | 5 ++- .../ui/fragments/NavigationDrawerFragment.kt | 18 ++++----- .../habitica/ui/helpers/ToolbarColorHelper.kt | 39 +++++++------------ .../habitica/ui/viewmodels/TasksViewModel.kt | 34 +++++++++------- .../views/tasks/form/ReminderItemFormView.kt | 4 +- .../habitica/widget/TaskListFactory.kt | 39 +++++++------------ 18 files changed, 83 insertions(+), 105 deletions(-) diff --git a/Habitica/build.gradle b/Habitica/build.gradle index d336402ec..227a85a72 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -167,7 +167,7 @@ android { buildConfigField "String", "TESTING_LEVEL", "\"production\"" resConfigs 'en', 'bg', 'de', 'en-rGB', 'es', 'fr', 'hr-rHR', 'in', 'it', 'iw', 'ja', 'ko', 'lt', 'nl', 'pl', 'pt-rBR', 'pt-rPT', 'ru', 'tr', 'zh', 'zh-rTW' - versionCode 3510 + versionCode 3512 versionName "3.6" targetSdkVersion 32 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt index aa42414bf..6d75453f0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt @@ -63,7 +63,7 @@ interface TaskRepository : BaseRepository { fun getTaskCopies(userId: String): Flow> - fun getTaskCopies(tasks: List): Flowable> + fun getTaskCopies(tasks: List): List fun retrieveDailiesFromDate(date: Date): Flowable fun retrieveCompletedTodos(userId: String? = null): Flowable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt index 3fe9278b5..a6e0a321a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt @@ -88,7 +88,7 @@ interface UserRepository : BaseRepository { fun reroll(): Flowable fun retrieveTeamPlans(): Flowable> - fun getTeamPlans(): Flowable> + fun getTeamPlans(): Flow> fun retrieveTeamPlan(teamID: String): Flowable fun getTeamPlan(teamID: String): Flowable } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt index f085a8db6..61e227a76 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt @@ -24,6 +24,7 @@ import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Single import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.map import java.text.SimpleDateFormat import java.util.Date @@ -319,8 +320,7 @@ class TaskRepositoryImpl( override fun getTaskCopies(userId: String): Flow> = localRepository.getTasks(userId).map { localRepository.getUnmanagedCopy(it) } - override fun getTaskCopies(tasks: List): Flowable> = - Flowable.just(localRepository.getUnmanagedCopy(tasks)) + override fun getTaskCopies(tasks: List): List = localRepository.getUnmanagedCopy(tasks) override fun retrieveDailiesFromDate(date: Date): Flowable { val formatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.US) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt index 9d4f1ce9f..fa48cf115 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt @@ -371,7 +371,7 @@ class UserRepositoryImpl( } } - override fun getTeamPlans(): Flowable> { + override fun getTeamPlans(): Flow> { return localRepository.getTeamPlans(userID) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt index 3490b1a8d..89191688c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/UserLocalRepository.kt @@ -35,6 +35,6 @@ interface UserLocalRepository : BaseLocalRepository { fun getAchievements(): Flow> fun getQuestAchievements(userID: String): Flow> fun getUserQuestStatus(userID: String): Flowable - fun getTeamPlans(userID: String): Flowable> + fun getTeamPlans(userID: String): Flow> fun getTeamPlan(teamID: String): Flowable } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt index d3f40a27b..37336b9c6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmUserLocalRepository.kt @@ -125,14 +125,12 @@ class RealmUserLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } } - override fun getTeamPlans(userID: String): Flowable> { - return RxJavaBridge.toV3Flowable( - realm.where(TeamPlan::class.java) + override fun getTeamPlans(userID: String): Flow> { + return realm.where(TeamPlan::class.java) .equalTo("userID", userID) .findAll() - .asFlowable() + .toFlow() .filter { it.isLoaded } - ) } override fun getTeamPlan(teamID: String): Flowable { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.kt index 4b68749ab..217eba3d3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/LanguageHelper.kt @@ -27,10 +27,6 @@ class LanguageHelper(languageSharedPref: String?) { locale = Locale("pt", "PT") languageCode = "pt" } - "uk" -> { - locale = Locale("uk", "UA") - languageCode = "uk" - } else -> { locale = if (pref.contains("_")) { val languageCodeParts = pref.split("_".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt index 25f7f414d..928cdafaf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt @@ -199,12 +199,12 @@ abstract class BaseActivity : AppCompatActivity() { actionBar.setHomeButtonEnabled(true) } } - toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, this, overrideModernHeader) } + toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, this) } } override fun onCreateOptionsMenu(menu: Menu): Boolean { val ret = super.onCreateOptionsMenu(menu) - toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, this, overrideModernHeader) } + toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, this) } return ret } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt index 46294f876..1fa3148a5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt @@ -123,7 +123,6 @@ class ChallengeFormActivity : BaseActivity() { override fun onCreateOptionsMenu(menu: Menu): Boolean { val inflater = menuInflater inflater.inflate(R.menu.menu_create_challenge, menu) - findViewById(R.id.toolbar).let { ToolbarColorHelper.colorizeToolbar(it, this, overrideModernHeader) } return super.onCreateOptionsMenu(menu) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt index 52976d1f8..3d1e64465 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt @@ -17,10 +17,16 @@ import com.habitrpg.android.habitica.models.tasks.TaskType import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.adapter.SkillTasksRecyclerViewAdapter import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Named class HabitButtonWidgetActivity : BaseActivity() { + private val job = SupervisorJob() private lateinit var binding: WidgetConfigureHabitButtonBinding @@ -72,11 +78,12 @@ class HabitButtonWidgetActivity : BaseActivity() { adapter?.getTaskSelectionEvents()?.subscribe( { task -> taskSelected(task.id) }, RxErrorHandler.handleEmptyError() - ) - ?.let { compositeSubscription.add(it) } + )?.let { compositeSubscription.add(it) } binding.recyclerView.adapter = adapter - compositeSubscription.add(taskRepository.getTasksFlowable(TaskType.HABIT, userId).subscribe({ adapter?.data = it }, RxErrorHandler.handleEmptyError())) + CoroutineScope(Dispatchers.Main + job).launch { + adapter?.data = taskRepository.getTasks(TaskType.HABIT, userId).firstOrNull() ?: listOf() + } } private fun taskSelected(taskId: String?) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt index a7a760544..c74df6041 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt @@ -8,7 +8,6 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup -import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager @@ -19,7 +18,6 @@ import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.ui.adapter.AchievementsAdapter -import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.firstOrNull @@ -157,9 +155,6 @@ class AchievementsFragment : BaseMainFragment(R.id.toolbar)?.let { - ToolbarColorHelper.colorizeToolbar(it, activity, null) - } super.onCreateOptionsMenu(menu, inflater) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt index 298048cf2..68095a2d7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt @@ -58,7 +58,8 @@ abstract class BaseMainFragment : BaseFragment() { setHasOptionsMenu(true) updateTabLayoutVisibility() - + updateToolbarInteractivity() + if (hidesToolbar) { hideToolbar() disableToolbarScrolling() @@ -86,7 +87,7 @@ abstract class BaseMainFragment : BaseFragment() { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) - activity?.toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, activity, null) } + activity?.toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, activity) } updateToolbarInteractivity() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt index eee3ddfb7..0ecd0f045 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt @@ -50,6 +50,7 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import java.util.Calendar import java.util.Date @@ -171,17 +172,14 @@ class NavigationDrawerFragment : DialogFragment() { ) if (configManager.enableTeamBoards()) { - subscriptions?.add( + lifecycleScope.launch { userRepository.getTeamPlans() - .distinctUntilChanged { firstTeams, secondTeams -> firstTeams == secondTeams } - .subscribe( - { - getItemWithIdentifier(SIDEBAR_TEAMS)?.isVisible = it.isNotEmpty() - adapter.setTeams(it) - }, - RxErrorHandler.handleEmptyError() - ) - ) + .distinctUntilChanged() + .collect { + getItemWithIdentifier(SIDEBAR_TEAMS)?.isVisible = it.isNotEmpty() + adapter.setTeams(it) + } + } } else { getItemWithIdentifier(SIDEBAR_TEAMS)?.isVisible = false } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt index a1dd48519..3445886b5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/ToolbarColorHelper.kt @@ -25,7 +25,6 @@ import android.widget.TextView import androidx.appcompat.view.menu.ActionMenuItemView import androidx.appcompat.widget.ActionMenuView import androidx.appcompat.widget.Toolbar -import androidx.preference.PreferenceManager import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.getThemeColor import com.habitrpg.android.habitica.extensions.waitForLayout @@ -43,45 +42,33 @@ object ToolbarColorHelper { fun colorizeToolbar( toolbar: Toolbar, activity: Activity?, - overrideModernHeader: Boolean? = null ) { if (activity == null) return - val modernHeaderStyle = overrideModernHeader ?: PreferenceManager.getDefaultSharedPreferences(activity).getBoolean("modern_header_style", true) - val toolbarIconsColor = if (modernHeaderStyle) { - toolbar.setBackgroundColor(activity.getThemeColor(R.attr.headerBackgroundColor)) - activity.getThemeColor(R.attr.headerTextColor) - } else { - toolbar.setBackgroundColor(activity.getThemeColor(R.attr.colorPrimary)) - activity.getThemeColor(R.attr.toolbarContentColor) - } + toolbar.setBackgroundColor(activity.getThemeColor(R.attr.headerBackgroundColor)) + val toolbarIconsColor = activity.getThemeColor(R.attr.headerTextColor) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { activity.window.statusBarColor = activity.getThemeColor(R.attr.colorPrimaryDark) } val colorFilter = PorterDuffColorFilter(toolbarIconsColor, PorterDuff.Mode.MULTIPLY) for (i in 0 until toolbar.childCount) { - val v = toolbar.getChildAt(i) - - // Step 1 : Changing the color of back button (or open drawer button). - if (v is ImageButton) { - // Action Bar back button - v.drawable.colorFilter = colorFilter - } else if (v is ActionMenuView) { - for (j in 0 until v.childCount) { - - // Step 2: Changing the color of any ActionMenuViews - icons that are not back button, nor text, nor overflow menu icon. - // Colorize the ActionViews -> all icons that are NOT: back button | overflow menu - colorizeChild(v.getChildAt(j), toolbarIconsColor, colorFilter) + when (val v = toolbar.getChildAt(i)) { + is ImageButton -> { + v.drawable.colorFilter = colorFilter + } + is ActionMenuView -> { + for (j in 0 until v.childCount) { + colorizeChild(v.getChildAt(j), toolbarIconsColor, colorFilter) + } + } + is TextView -> { + v.setTextColor(toolbarIconsColor) } - } else if (v is TextView) { - v.setTextColor(toolbarIconsColor) } } - // Step 3: Changing the color of title and subtitle. toolbar.setTitleTextColor(toolbarIconsColor) toolbar.setSubtitleTextColor(toolbarIconsColor) - // Step 4: Changing the color of the Overflow Menu icon. setOverflowButtonColor(activity, toolbarIconsColor) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt index 5a9e1c0b0..d4810ed0f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt @@ -4,6 +4,7 @@ import android.content.SharedPreferences import android.text.format.DateUtils import androidx.core.content.edit import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.TagRepository import com.habitrpg.android.habitica.data.TaskRepository @@ -20,6 +21,7 @@ import io.realm.Case import io.realm.OrderedRealmCollection import io.realm.RealmQuery import io.realm.Sort +import kotlinx.coroutines.launch import java.util.Date import javax.inject.Inject import javax.inject.Named @@ -58,21 +60,25 @@ class TasksViewModel : BaseViewModel() { } init { - compositeSubscription.add( - userRepository.getTeamPlans() - .subscribe({ - owners = listOf(Pair(userID, userViewModel.displayName)) + it.map { - Pair( - it.id, - it.summary - ) + if (appConfigManager.enableTeamBoards()) { + viewModelScope.launch { + userRepository.getTeamPlans() + .collect { + owners = listOf(Pair(userID, userViewModel.displayName)) + it.map { + Pair( + it.id, + it.summary + ) + } + if (owners.size > 1 && canSwitchOwners.value != false) { + canSwitchOwners.value = owners.size > 1 + } } - if (owners.size > 1 && canSwitchOwners.value != false) { - canSwitchOwners.value = owners.size > 1 - } - }, RxErrorHandler.handleEmptyError()) - ) - compositeSubscription.add(userRepository.retrieveTeamPlans().subscribe({}, RxErrorHandler.handleEmptyError())) + } + compositeSubscription.add( + userRepository.retrieveTeamPlans().subscribe({}, RxErrorHandler.handleEmptyError()) + ) + } } internal fun refreshData(onComplete: () -> Unit) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/ReminderItemFormView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/ReminderItemFormView.kt index 199c251cc..805c49a87 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/ReminderItemFormView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/ReminderItemFormView.kt @@ -108,8 +108,8 @@ class ReminderItemFormView @JvmOverloads constructor( if (taskType == TaskType.DAILY) { val timePickerDialog = TimePickerDialog( context, this, - ZonedDateTime.now().hour, - ZonedDateTime.now().minute, + item.getZonedDateTime()?.hour ?: ZonedDateTime.now().hour, + item.getZonedDateTime()?.minute ?: ZonedDateTime.now().minute, android.text.format.DateFormat.is24HourFormat(context) ) timePickerDialog.show() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt index c97cfca71..22dc68344 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.widget import android.appwidget.AppWidgetManager import android.content.Context import android.content.Intent -import android.os.Handler import android.text.SpannableStringBuilder import android.widget.RemoteViews import android.widget.RemoteViewsService @@ -11,12 +10,14 @@ import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.UserRepository -import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.tasks.TaskType import com.habitrpg.android.habitica.ui.helpers.MarkdownParser -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.launch import javax.inject.Inject abstract class TaskListFactory internal constructor( @@ -26,6 +27,8 @@ abstract class TaskListFactory internal constructor( private val listItemResId: Int, private val listItemTextResId: Int ) : RemoteViewsService.RemoteViewsFactory { + private val job = SupervisorJob() + private val widgetId: Int = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0) @Inject lateinit var taskRepository: TaskRepository @@ -42,25 +45,13 @@ abstract class TaskListFactory internal constructor( if (!this::taskRepository.isInitialized) { return } - val mainHandler = Handler(context.mainLooper) - mainHandler.post { - taskRepository.getTasksFlowable(taskType) - .firstElement() - .toObservable() - .flatMap { Observable.fromIterable(it) } - .filter { task -> task.type == TaskType.TODO && !task.completed || task.isDisplayedActive } - .toList() - .flatMapMaybe { tasks -> taskRepository.getTaskCopies(tasks).firstElement() } - .subscribeOn(AndroidSchedulers.mainThread()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - { tasks -> - reloadData = false - taskList = tasks - AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(widgetId, R.id.list_view) - }, - RxErrorHandler.handleEmptyError() - ) + CoroutineScope(Dispatchers.Main + job).launch { + val tasks = taskRepository.getTasks(taskType).firstOrNull()?.filter { task -> + task.type == TaskType.TODO && !task.completed || task.isDisplayedActive + } ?: return@launch + taskList = taskRepository.getTaskCopies(tasks) + reloadData = false + AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(widgetId, R.id.list_view) } } @@ -94,7 +85,7 @@ abstract class TaskListFactory internal constructor( remoteView.setInt(R.id.checkbox_background, "setBackgroundResource", task.lightTaskColor) val fillInIntent = Intent() fillInIntent.putExtra(TaskListWidgetProvider.TASK_ID_ITEM, task.id) - remoteView.setOnClickFillInIntent(R.id.checkbox_background, fillInIntent) + //remoteView.setOnClickFillInIntent(R.id.checkbox_background, fillInIntent) } return remoteView }