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!