From e6ca51c59972fe0e266a0031e672127de8c4468f Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 21 Jun 2021 12:21:55 +0200 Subject: [PATCH] Lifecycle improvements --- Habitica/build.gradle | 2 +- .../ui/activities/ChallengeFormActivity.kt | 3 ++- .../ui/activities/FullProfileActivity.kt | 4 ++-- .../ui/fragments/NavigationDrawerFragment.kt | 3 ++- .../ui/fragments/skills/SkillsFragment.kt | 21 +++++++++---------- .../social/guilds/GuildDetailFragment.kt | 3 ++- .../social/party/PartyDetailFragment.kt | 7 ++++--- .../habitica/ui/helpers/MarkdownParser.kt | 1 - .../habitica/proxy/AnalyticsManagerImpl.kt | 5 +++++ fastlane/changelog.txt | 3 +-- 10 files changed, 29 insertions(+), 23 deletions(-) diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 06d5bdaf1..1fea665f2 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -146,7 +146,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 2974 + versionCode 2978 versionName "3.3" } 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 8e44ead97..17d02bc52 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 @@ -13,6 +13,7 @@ import android.widget.TextView import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.widget.AppCompatCheckedTextView import androidx.appcompat.widget.Toolbar +import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ChallengeRepository @@ -149,7 +150,7 @@ class ChallengeFormActivity : BaseActivity() { savingInProgress = false finish() if (!editMode) { - GlobalScope.launch(context = Dispatchers.Main) { + lifecycleScope.launch(context = Dispatchers.Main) { delay(500L) MainNavigationController.navigate(ChallengesOverviewFragmentDirections.openChallengeDetail(challengeId ?: "")) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt index 818d72a09..73b09ea50 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt @@ -7,6 +7,7 @@ import android.view.* import android.widget.* import androidx.core.content.ContextCompat import androidx.core.os.bundleOf +import androidx.lifecycle.lifecycleScope import coil.load import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent @@ -34,7 +35,6 @@ import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayTy import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import io.reactivex.rxjava3.core.Flowable import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.text.SimpleDateFormat @@ -176,7 +176,7 @@ class FullProfileActivity : BaseActivity() { private fun showSendMessageToUserDialog() { finish() - GlobalScope.launch(context = Dispatchers.Main) { + lifecycleScope.launch(context = Dispatchers.Main) { delay(1000L) MainNavigationController.navigate(R.id.inboxMessageListFragment, bundleOf(Pair("username", username), Pair("userID", userID))) } 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 f0afb6d27..0f1ddf94d 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 @@ -16,6 +16,7 @@ import androidx.core.content.edit import androidx.core.os.bundleOf import androidx.core.view.GravityCompat import androidx.fragment.app.DialogFragment +import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.ContentRepository @@ -209,7 +210,7 @@ class NavigationDrawerFragment : DialogFragment() { }).subscribe( { pair -> updateSeasonalMenuEntries(pair.first, pair.second) seasonalShopJob?.cancel() - seasonalShopJob = GlobalScope.launch(Dispatchers.Main) { + seasonalShopJob = lifecycleScope.launch(Dispatchers.Main) { val gearEvent = pair.first.events.firstOrNull { it.gear } while (gearEvent?.end?.after(Date()) == true || pair.second.isNotEmpty()) { updateSeasonalMenuEntries(pair.first, pair.second) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt index 675ec208e..fa8d39e13 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt @@ -9,6 +9,7 @@ import android.view.View import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat +import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentSkillsBinding @@ -26,8 +27,6 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar import io.reactivex.rxjava3.core.Flowable -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -110,6 +109,7 @@ class SkillsFragment : BaseMainFragment() { } private fun displaySkillResult(usedSkill: Skill?, response: SkillResponse) { + if (!isAdded) return adapter?.mana = response.user?.stats?.mp ?: 0.0 val activity = activity ?: return if ("special" == usedSkill?.habitClass) { @@ -124,15 +124,14 @@ class SkillsFragment : BaseMainFragment() { } } if (response.damage > 0) { - context?.let { - GlobalScope.launch(context = Dispatchers.Main) { - delay(2000L) - showSnackbar(activity.snackbarContainer, null, - context?.getString(R.string.caused_damage), - BitmapDrawable(resources, HabiticaIconsHelper.imageOfDamage()), - ContextCompat.getColor(it, R.color.green_10), "+%.01f".format(response.damage), - HabiticaSnackbar.SnackbarDisplayType.SUCCESS) - } + lifecycleScope.launch { + delay(2000L) + if (!isAdded) return@launch + showSnackbar(activity.snackbarContainer, null, + context?.getString(R.string.caused_damage), + BitmapDrawable(resources, HabiticaIconsHelper.imageOfDamage()), + ContextCompat.getColor(activity, R.color.green_10), "+%.01f".format(response.damage), + HabiticaSnackbar.SnackbarDisplayType.SUCCESS) } } compositeSubscription.add(userRepository.retrieveUser(false).subscribe({ }, RxErrorHandler.handleEmptyError())) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt index 57b3c30a9..c4f0ee518 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt @@ -8,6 +8,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts +import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.MainNavDirections import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent @@ -157,7 +158,7 @@ class GuildDetailFragment : BaseFragment() { val context = context if (context != null) { var groupChallenges = getGroupChallenges() - GlobalScope.launch(Dispatchers.Main) { + lifecycleScope.launch(Dispatchers.Main) { delay(500) if (groupChallenges.isNotEmpty()) { val alert = HabiticaAlertDialog(context) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt index 3203edd2b..7e6fb8eea 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt @@ -9,6 +9,7 @@ import android.widget.TextView import androidx.appcompat.widget.AppCompatEditText import androidx.core.content.ContextCompat import androidx.core.os.bundleOf +import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository @@ -135,7 +136,7 @@ class PartyDetailFragment : BaseFragment() { binding?.newQuestButton?.visibility = View.GONE binding?.questDetailButton?.visibility = View.VISIBLE binding?.questImageWrapper?.visibility = View.VISIBLE - GlobalScope.launch(Dispatchers.Main) { + lifecycleScope.launch(Dispatchers.Main) { delay(500) inventoryRepository.getQuestContent(party.quest?.key ?: "") .subscribe({ this@PartyDetailFragment.updateQuestContent(it) }, RxErrorHandler.handleEmptyError()) @@ -355,8 +356,8 @@ class PartyDetailFragment : BaseFragment() { internal fun leaveParty() { val context = context if (context != null) { - var groupChallenges = getGroupChallenges() - GlobalScope.launch(Dispatchers.Main) { + val groupChallenges = getGroupChallenges() + lifecycleScope.launch(Dispatchers.Main) { delay(500) if (groupChallenges.isNotEmpty()) { val alert = HabiticaAlertDialog(context) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt index 9e5aa78b1..e7e405fc1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.kt @@ -8,7 +8,6 @@ import android.text.SpannableString import android.text.Spanned import android.text.method.LinkMovementMethod import android.widget.TextView -import androidx.core.content.ContextCompat.startActivity import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.extensions.handleUrlClicks import com.habitrpg.android.habitica.helpers.RxErrorHandler diff --git a/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/AnalyticsManagerImpl.kt b/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/AnalyticsManagerImpl.kt index f8226c708..c4f4063d3 100644 --- a/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/AnalyticsManagerImpl.kt +++ b/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/AnalyticsManagerImpl.kt @@ -17,6 +17,11 @@ class AnalyticsManagerImpl(context: Context): AnalyticsManager { } override fun logException(t: Throwable) { + if (t is org.solovyev.android.checkout.BillingException) { + if (t.response == org.solovyev.android.checkout.ResponseCodes.USER_CANCELED) { + return + } + } FirebaseCrashlytics.getInstance().recordException(t) } diff --git a/fastlane/changelog.txt b/fastlane/changelog.txt index d1afef1e2..de0221881 100644 --- a/fastlane/changelog.txt +++ b/fastlane/changelog.txt @@ -1,2 +1 @@ -This latest update improves the use of certain skills. Now we will display how much damage you do to a boss right when you use a skill like Brutal Smash. The list of tasks that displays when you use a skill will only show viable tasks as well now. We’ve also made some improvements to the mini notifications you receive when getting an item or level up, clarified the reason given for equipment being locked, and fixed a few pesky bugs in the process. Hope you enjoy! - +In this update, we’ve improved more of our notifications so they bring you to the relevant screen when tapped. When customizing your avatar, you’ll be able to see your avatar updating in real time as you select different options. You can also see your current Gems when gifting Gems from your balance now. We've fixed a few bugs too, including one where tasks wouldn’t load when the app is left running in the background for awhile, and another where Dailies wouldn’t filter properly on launch.