From d7a10324f7666e61a7c424e1c0cf480a232e0aed Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 27 Mar 2019 15:09:59 +0100 Subject: [PATCH] Implement password changing --- .../res/layout/dialog_edittext_change_pw.xml | 33 ++ Habitica/res/values/strings.xml | 3 + Habitica/res/xml/preferences_fragment.xml | 537 +++++++++--------- .../android/habitica/data/ApiClient.kt | 2 +- .../android/habitica/data/UserRepository.kt | 2 +- .../data/implementation/ApiClientImpl.kt | 6 +- .../data/implementation/UserRepositoryImpl.kt | 5 +- .../AuthenticationPreferenceFragment.kt | 21 +- .../habitica/utils/ContentDeserializer.java | 7 + 9 files changed, 340 insertions(+), 276 deletions(-) create mode 100644 Habitica/res/layout/dialog_edittext_change_pw.xml diff --git a/Habitica/res/layout/dialog_edittext_change_pw.xml b/Habitica/res/layout/dialog_edittext_change_pw.xml new file mode 100644 index 000000000..6ce8f0938 --- /dev/null +++ b/Habitica/res/layout/dialog_edittext_change_pw.xml @@ -0,0 +1,33 @@ + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 1c4c73b69..093c25d1d 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -866,5 +866,8 @@ Only leader can create Challenges Create Party Add Local Authentication + Old Password + New Password + Repeat new Password diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml index c3491b339..3519f7b64 100644 --- a/Habitica/res/xml/preferences_fragment.xml +++ b/Habitica/res/xml/preferences_fragment.xml @@ -1,268 +1,271 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt index 587de93b6..ddc6e97a9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt @@ -241,7 +241,7 @@ interface ApiClient { fun updateEmail(newEmail: String, password: String): Flowable - fun updatePassword(newPassword: String, oldPassword: String, oldPasswordConfirmation: String): Flowable + fun updatePassword(oldPassword: String, newPassword: String, newPasswordConfirmation: String): Flowable fun allocatePoint(stat: String): 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 828abaf1b..fc513edee 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 @@ -63,7 +63,7 @@ interface UserRepository : BaseRepository { fun updateLoginName(newLoginName: String, password: String? = null): Maybe fun updateEmail(newEmail: String, password: String): Flowable - fun updatePassword(newPassword: String, oldPassword: String, oldPasswordConfirmation: String): Flowable + fun updatePassword(oldPassword: String, newPassword: String, newPasswordConfirmation: String): Flowable fun verifyUsername(username: String): Flowable fun allocatePoint(user: User?, stat: String): Flowable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index 7305bcd31..8017908e0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -723,11 +723,11 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; return apiService.updateEmail(updateObject).compose(configureApiCallObserver()) } - override fun updatePassword(newPassword: String, oldPassword: String, oldPasswordConfirmation: String): Flowable { + override fun updatePassword(oldPassword: String, newPassword: String, newPasswordConfirmation: String): Flowable { val updateObject = HashMap() - updateObject["newPassword"] = newPassword updateObject["password"] = oldPassword - updateObject["confirmPassowrd"] = oldPasswordConfirmation + updateObject["newPassword"] = newPassword + updateObject["confirmPassword"] = newPasswordConfirmation return apiService.updatePassword(updateObject).compose(configureApiCallObserver()) } 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 65cc05114..af5c9593d 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 @@ -11,7 +11,6 @@ import com.habitrpg.android.habitica.models.inventory.CustomizationSet import com.habitrpg.android.habitica.models.responses.SkillResponse import com.habitrpg.android.habitica.models.responses.UnlockResponse import com.habitrpg.android.habitica.models.responses.VerifyUsernameResponse -import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.User @@ -211,8 +210,8 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli override fun updateEmail(newEmail: String, password: String): Flowable = apiClient.updateEmail(newEmail, password) - override fun updatePassword(newPassword: String, oldPassword: String, oldPasswordConfirmation: String): Flowable = - apiClient.updatePassword(newPassword, oldPassword, oldPasswordConfirmation) + override fun updatePassword(oldPassword: String, newPassword: String, newPasswordConfirmation: String): Flowable = + apiClient.updatePassword(oldPassword, newPassword, newPasswordConfirmation) override fun allocatePoint(user: User?, stat: String): Flowable { if (user != null && user.isManaged) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt index 691bd5104..5933f4f69 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt @@ -52,6 +52,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { private fun updateUserFields() { configurePreference(findPreference("login_name"), user?.authentication?.localAuthentication?.username, false) configurePreference(findPreference("email"), user?.authentication?.localAuthentication?.email, true) + findPreference("change_password").isVisible = user?.authentication?.localAuthentication?.email?.isNotEmpty() == true findPreference("add_local_auth").isVisible = user?.authentication?.localAuthentication?.email?.isNotEmpty() != true findPreference("confirm_username").isVisible = user?.flags?.isVerifiedUsername != true } @@ -94,7 +95,25 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { } private fun showChangePasswordDialog() { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + val inflater = context?.layoutInflater + val view = inflater?.inflate(R.layout.dialog_edittext_change_pw, null) + val oldPasswordEditText = view?.findViewById(R.id.editText) + val passwordEditText = view?.findViewById(R.id.passwordEditText) + val passwordRepeatEditText = view?.findViewById(R.id.passwordRepeatEditText) + context.notNull { context -> + val dialog = AlertDialog.Builder(context) + .setTitle(R.string.change_password) + .setPositiveButton(R.string.change) { thisDialog, _ -> + thisDialog.dismiss() + userRepository.updatePassword(oldPasswordEditText?.text.toString(), passwordEditText?.text.toString(), passwordRepeatEditText?.text.toString()) + .subscribe(Consumer { + }, RxErrorHandler.handleEmptyError()) + } + .setNegativeButton(R.string.action_cancel) { thisDialog, _ -> thisDialog.dismiss() } + .create() + dialog.setView(view) + dialog.show() + } } private fun showEmailDialog() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ContentDeserializer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ContentDeserializer.java index df30a770f..72d320c03 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ContentDeserializer.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ContentDeserializer.java @@ -21,6 +21,7 @@ import com.habitrpg.android.habitica.models.inventory.Pet; import com.habitrpg.android.habitica.models.inventory.QuestContent; import java.lang.reflect.Type; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -57,11 +58,17 @@ public class ContentDeserializer implements JsonDeserializer { Map premiumPets = context.deserialize(object.get("premiumPets"), new TypeToken>() {}.getType()); Map questPets = context.deserialize(object.get("questPets"), new TypeToken>() {}.getType()); Map whackyPets = context.deserialize(object.get("whackyPets"), new TypeToken>() {}.getType()); + if (whackyPets == null) { + whackyPets = new HashMap<>(); + } Map mounts = context.deserialize(object.get("mounts"), new TypeToken>() {}.getType()); Map specialMounts = context.deserialize(object.get("specialMounts"), new TypeToken>() {}.getType()); Map premiumMounts = context.deserialize(object.get("premiumMounts"), new TypeToken>() {}.getType()); Map questMounts = context.deserialize(object.get("questMounts"), new TypeToken>() {}.getType()); Map whackyMounts = context.deserialize(object.get("whackyMounts"), new TypeToken>() {}.getType()); + if (whackyMounts == null) { + whackyMounts = new HashMap<>(); + } for (Egg egg : result.eggs) { for (HatchingPotion potion : result.hatchingPotions) {