From 6176efdbb5cccdd353b56a3653b3ee76118ae911 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 11 Mar 2021 14:39:36 +0100 Subject: [PATCH] Finish 3.2.1 --- Habitica/build.gradle | 2 +- Habitica/res/values-es/strings.xml | 4 +- .../data/implementation/UserRepositoryImpl.kt | 16 +- .../models/auth/UserAuthResponse.java | 48 ------ .../habitica/models/auth/UserAuthResponse.kt | 15 ++ .../habitica/ui/activities/LoginActivity.kt | 4 +- .../tasks/RewardsRecyclerviewFragment.kt | 3 +- .../tasks/TaskRecyclerViewFragment.kt | 162 +++++++++--------- .../ui/fragments/tasks/TasksFragment.kt | 7 +- .../ui/fragments/tasks/TeamBoardFragment.kt | 4 +- fastlane/changelog.txt | 2 +- 11 files changed, 118 insertions(+), 149 deletions(-) delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.kt diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 2b70e4e69..a5273bfc5 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -150,7 +150,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 2858 + versionCode 2868 versionName "3.2.1" } diff --git a/Habitica/res/values-es/strings.xml b/Habitica/res/values-es/strings.xml index a84bd6ec3..4f5ea2ef9 100644 --- a/Habitica/res/values-es/strings.xml +++ b/Habitica/res/values-es/strings.xml @@ -935,8 +935,8 @@ %s Monturas %s Mascotas %s Tareas del Desafío - Eliminar %s Tareas - Mantener %s Tareas + Eliminar %d Tareas + Mantener %d Tareas Desafío Terminado Tu puedes enviar mensajes todavía, pero nadie puede enviartelas a ti. Puedes habilitarlo de nuevo desde Configuraciones. Los Mensajes Privados están desactivados 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 5c9bbcb80..0b0fcef7f 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 @@ -39,16 +39,24 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli override fun getUser(userID: String): Flowable = localRepository.getUser(userID) - override fun updateUser(updateData: Map): Flowable { + private fun updateUser(userID: String, updateData: Map): Flowable { return Flowable.zip(apiClient.updateUser(updateData), localRepository.getUser(userID).firstElement().toFlowable(), { newUser, user -> mergeUser(user, newUser) }) } - override fun updateUser(key: String, value: Any): Flowable { + private fun updateUser(userID: String, key: String, value: Any): Flowable { val updateData = HashMap() updateData[key] = value - return updateUser(updateData) + return updateUser(userID, updateData) + } + + override fun updateUser(updateData: Map): Flowable { + return updateUser(userID, updateData) + } + + override fun updateUser(key: String, value: Any): Flowable { + return updateUser(userID, key, value) } override fun retrieveUser(withTasks: Boolean): Flowable = @@ -76,7 +84,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli val timeZone = calendar.timeZone val offset = -TimeUnit.MINUTES.convert(timeZone.getOffset(calendar.timeInMillis).toLong(), TimeUnit.MILLISECONDS) if (offset.toInt() != user.preferences?.timezoneOffset ?: 0) { - return@flatMap updateUser("preferences.timezoneOffset", offset.toString()) + return@flatMap updateUser(user.id ?: "", "preferences.timezoneOffset", offset.toString()) } else { return@flatMap Flowable.just(user) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.java deleted file mode 100644 index a1cd8bc9a..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.habitrpg.android.habitica.models.auth; - -/** - * Created by magicmicky on 04/02/15. - */ -public class UserAuthResponse { - //we need apiToken and token, as both are possible returns - private String apiToken; - private String token; - private Boolean newUser = false; - private String id; - - public String getToken() { - if (this.token == null) { - return this.apiToken; - } else { - return this.token; - } - } - - public void setToken(String token) { - this.token = token; - } - - public String getApiToken() { - return apiToken; - } - - public void setApiToken(String apiToken) { - this.apiToken = apiToken; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Boolean getNewUser() { - return newUser; - } - - public void setNewUser(Boolean newUser) { - this.newUser = newUser; - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.kt new file mode 100644 index 000000000..d788e8c6f --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/auth/UserAuthResponse.kt @@ -0,0 +1,15 @@ +package com.habitrpg.android.habitica.models.auth + +class UserAuthResponse { + //we need apiToken and token, as both are possible returns + var apiToken: String = "" + var token: String + get() { + return apiToken + } + set(value) { + apiToken = value + } + var newUser = false + var id: String = "" +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt index 5e196d05c..8436cb154 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt @@ -364,7 +364,7 @@ class LoginActivity : BaseActivity(), Consumer { hideProgress() dismissKeyboard() try { - saveTokens(userAuthResponse.token, userAuthResponse.id) + saveTokens(userAuthResponse.apiToken, userAuthResponse.id) } catch (e: Exception) { crashlyticsProxy.logException(e) } @@ -375,7 +375,7 @@ class LoginActivity : BaseActivity(), Consumer { FirebaseAnalytics.getInstance(this).logEvent("user_registered", null) } - compositeSubscription.add(userRepository.retrieveUser(true) + compositeSubscription.add(userRepository.retrieveUser(true, true) .subscribe({ if (userAuthResponse.newUser) { this.startSetupActivity() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt index a89cdb403..5ab6b244c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt @@ -14,7 +14,6 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.shops.ShopItem -import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.SkillMemberActivity import com.habitrpg.android.habitica.ui.adapter.tasks.RewardsRecyclerViewAdapter @@ -123,7 +122,7 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { fun newInstance(context: Context?, classType: String, showCustomRewards: Boolean): RewardsRecyclerviewFragment { val fragment = RewardsRecyclerviewFragment() fragment.retainInstance = true - fragment.classType = classType + fragment.taskType = classType fragment.showCustomRewards = showCustomRewards if (context != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt index 9414a7f0e..865244dbc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt @@ -28,8 +28,6 @@ import com.habitrpg.android.habitica.helpers.TaskFilterHelper import com.habitrpg.android.habitica.models.responses.TaskDirection import com.habitrpg.android.habitica.models.responses.TaskScoringResult import com.habitrpg.android.habitica.models.tasks.Task -import com.habitrpg.android.habitica.models.user.User -import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.TaskFormActivity import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter @@ -44,7 +42,6 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import java.util.* import java.util.concurrent.TimeUnit import javax.inject.Inject -import javax.inject.Named open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { internal var canEditTasks: Boolean = true @@ -75,17 +72,17 @@ open class TaskRecyclerViewFragment : BaseFragment Unit) -> Unit)? = null internal val className: String - get() = this.classType ?: "" + get() = this.taskType ?: "" // TODO needs a bit of cleanup private fun setInnerAdapter() { - val adapter: BaseRecyclerViewAdapter<*, *>? = when (this.classType) { + val adapter: BaseRecyclerViewAdapter<*, *>? = when (this.taskType) { Task.TYPE_HABIT -> { HabitsRecyclerViewAdapter(null, true, R.layout.habit_item_card, taskFilterHelper) } @@ -106,10 +103,29 @@ open class TaskRecyclerViewFragment : BaseFragment HabiticaSnackbar.showSnackbar(activity.snackbarContainer, null, getString(R.string.notification_purchase_reward), BitmapDrawable(resources, HabiticaIconsHelper.imageOfGold()), @@ -123,7 +139,7 @@ open class TaskRecyclerViewFragment : BaseFragment if (direction == TaskDirection.UP) SoundManager.SoundPlusHabit else SoundManager.SoundMinusHabit Task.TYPE_DAILY -> SoundManager.SoundDaily Task.TYPE_TODO -> SoundManager.SoundTodo @@ -160,13 +176,13 @@ open class TaskRecyclerViewFragment : BaseFragment taskFilterHelper.setActiveFilter(Task.TYPE_TODO, Task.FILTER_ACTIVE) Task.TYPE_DAILY -> { val user = (activity as? MainActivity)?.user - if (user?.isValid == true && user?.preferences?.dailyDueDefaultView == true) { + if (user?.isValid == true && user.preferences?.dailyDueDefaultView == true) { taskFilterHelper.setActiveFilter(Task.TYPE_DAILY, Task.FILTER_ACTIVE) } } @@ -221,7 +237,7 @@ open class TaskRecyclerViewFragment : BaseFragment 0) { - when (this.classType) { - Task.TYPE_HABIT -> { - binding?.emptyIconView?.setImageResource(R.drawable.icon_habits) - binding?.emptyViewTitle?.setText(R.string.empty_title_habits_filtered) - binding?.emptyViewDescription?.setText(R.string.empty_description_habits_filtered) - } - Task.TYPE_DAILY -> { - binding?.emptyIconView?.setImageResource(R.drawable.icon_dailies) - binding?.emptyViewTitle?.setText(R.string.empty_title_dailies_filtered) - binding?.emptyViewDescription?.setText(R.string.empty_description_dailies_filtered) - } - Task.TYPE_TODO -> { - binding?.emptyIconView?.setImageResource(R.drawable.icon_todos) - binding?.emptyViewTitle?.setText(R.string.empty_title_todos_filtered) - binding?.emptyViewDescription?.setText(R.string.empty_description_todos_filtered) - } - Task.TYPE_REWARD -> { - binding?.emptyIconView?.setImageResource(R.drawable.icon_rewards) - binding?.emptyViewTitle?.setText(R.string.empty_title_rewards) - } + binding?.recyclerView?.setEmptyView(binding?.emptyView) + context?.let { binding?.emptyIconView?.setColorFilter(ContextCompat.getColor(it, R.color.text_dimmed), android.graphics.PorterDuff.Mode.MULTIPLY) } + if (taskFilterHelper.howMany(taskType) > 0) { + when (this.taskType) { + Task.TYPE_HABIT -> { + binding?.emptyIconView?.setImageResource(R.drawable.icon_habits) + binding?.emptyViewTitle?.setText(R.string.empty_title_habits_filtered) + binding?.emptyViewDescription?.setText(R.string.empty_description_habits_filtered) } - } else { - when (this.classType) { - Task.TYPE_HABIT -> { - binding?.emptyIconView?.setImageResource(R.drawable.icon_habits) - binding?.emptyViewTitle?.setText(R.string.empty_title_habits) - binding?.emptyViewDescription?.setText(R.string.empty_description_habits) - } - Task.TYPE_DAILY -> { - binding?.emptyIconView?.setImageResource(R.drawable.icon_dailies) - binding?.emptyViewTitle?.setText(R.string.empty_title_dailies) - binding?.emptyViewDescription?.setText(R.string.empty_description_dailies) - } - Task.TYPE_TODO -> { - binding?.emptyIconView?.setImageResource(R.drawable.icon_todos) - binding?.emptyViewTitle?.setText(R.string.empty_title_todos) - binding?.emptyViewDescription?.setText(R.string.empty_description_todos) - } - Task.TYPE_REWARD -> { - binding?.emptyIconView?.setImageResource(R.drawable.icon_rewards) - binding?.emptyViewTitle?.setText(R.string.empty_title_rewards) - } + Task.TYPE_DAILY -> { + binding?.emptyIconView?.setImageResource(R.drawable.icon_dailies) + binding?.emptyViewTitle?.setText(R.string.empty_title_dailies_filtered) + binding?.emptyViewDescription?.setText(R.string.empty_description_dailies_filtered) + } + Task.TYPE_TODO -> { + binding?.emptyIconView?.setImageResource(R.drawable.icon_todos) + binding?.emptyViewTitle?.setText(R.string.empty_title_todos_filtered) + binding?.emptyViewDescription?.setText(R.string.empty_description_todos_filtered) + } + Task.TYPE_REWARD -> { + binding?.emptyIconView?.setImageResource(R.drawable.icon_rewards) + binding?.emptyViewTitle?.setText(R.string.empty_title_rewards) + } + } + } else { + when (this.taskType) { + Task.TYPE_HABIT -> { + binding?.emptyIconView?.setImageResource(R.drawable.icon_habits) + binding?.emptyViewTitle?.setText(R.string.empty_title_habits) + binding?.emptyViewDescription?.setText(R.string.empty_description_habits) + } + Task.TYPE_DAILY -> { + binding?.emptyIconView?.setImageResource(R.drawable.icon_dailies) + binding?.emptyViewTitle?.setText(R.string.empty_title_dailies) + binding?.emptyViewDescription?.setText(R.string.empty_description_dailies) + } + Task.TYPE_TODO -> { + binding?.emptyIconView?.setImageResource(R.drawable.icon_todos) + binding?.emptyViewTitle?.setText(R.string.empty_title_todos) + binding?.emptyViewDescription?.setText(R.string.empty_description_todos) + } + Task.TYPE_REWARD -> { + binding?.emptyIconView?.setImageResource(R.drawable.icon_rewards) + binding?.emptyViewTitle?.setText(R.string.empty_title_rewards) } } } @@ -378,11 +371,11 @@ open class TaskRecyclerViewFragment : BaseFragment? = null if (context != null) { - when (fragment.classType) { + when (fragment.taskType) { Task.TYPE_HABIT -> { fragment.tutorialStepIdentifier = "habits" tutorialTexts = listOf(context.getString(R.string.tutorial_overview), context.getString(R.string.tutorial_habits_1), context.getString(R.string.tutorial_habits_2), context.getString(R.string.tutorial_habits_3), context.getString(R.string.tutorial_habits_4)) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt index ab8969f13..0de033c00 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt @@ -18,7 +18,6 @@ import com.habitrpg.android.habitica.extensions.getThemeColor import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.android.habitica.helpers.* import com.habitrpg.android.habitica.models.tasks.Task -import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.activities.TaskFormActivity import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment @@ -178,7 +177,7 @@ class TasksFragment : BaseMainFragment(), SearchView.O disposable = tagRepository.getTags().subscribe({ tagsList -> dialog.setTags(tagsList)}, RxErrorHandler.handleEmptyError()) dialog.setActiveTags(taskFilterHelper.tags) if (activeFragment != null) { - val taskType = activeFragment?.classType + val taskType = activeFragment?.taskType if (taskType != null) { dialog.setTaskType(taskType, taskFilterHelper.getActiveFilter(taskType)) } @@ -257,9 +256,9 @@ class TasksFragment : BaseMainFragment(), SearchView.O } private fun updateFilterIcon() { - val filterCount = taskFilterHelper.howMany(activeFragment?.classType) + val filterCount = taskFilterHelper.howMany(activeFragment?.taskType) - filterMenuItem?.isVisible = activeFragment?.classType != Task.TYPE_REWARD + filterMenuItem?.isVisible = activeFragment?.taskType != Task.TYPE_REWARD if (filterCount == 0) { filterMenuItem?.setIcon(R.drawable.ic_action_filter_list) context?.let { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt index feb7e923d..28f2d1e7c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt @@ -178,7 +178,7 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi disposable = tagRepository.getTags().subscribe({ tagsList -> dialog.setTags(tagsList)}, RxErrorHandler.handleEmptyError()) dialog.setActiveTags(taskFilterHelper.tags) if (activeFragment != null) { - val taskType = activeFragment?.classType + val taskType = activeFragment?.taskType if (taskType != null) { dialog.setTaskType(taskType, taskFilterHelper.getActiveFilter(taskType)) } @@ -265,7 +265,7 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi } var filterCount = 0 if (activeFragment != null) { - filterCount = taskFilterHelper.howMany(activeFragment?.classType) + filterCount = taskFilterHelper.howMany(activeFragment?.taskType) } if (filterCount == 0) { filterMenuItem?.setIcon(R.drawable.ic_action_filter_list) diff --git a/fastlane/changelog.txt b/fastlane/changelog.txt index c0c57196e..6057e994e 100644 --- a/fastlane/changelog.txt +++ b/fastlane/changelog.txt @@ -1 +1 @@ -In this update we've cleaned up Guilds and Challenges to look better than ever. Check them out and maybe find something new! Starting or leaving a Quest will update the Party view right away. Snowballs will actually transform your party members now. Certain notifications work better, bringing you to the right place and no longer crashing the app in some cases. Subscriber Mystery Boxes have a fancy new view when opening as well. Check these out and lots of other fixes by downloading the update! +We’ve added the ability to select different default launch screens! Do you mainly use Dailies or find yourself constantly checking off To Do’s? Now you can set the app to automatically launch to either of those screens, and more! Go to Settings to explore the various launch screen options. We’ve also fixed a few bugs with views not updating automatically. Hope you enjoy this newest Habitica update!