From af80d60ee19fbb549e16d4f615677d88aed71290 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 4 Oct 2017 17:33:33 +0200 Subject: [PATCH] implement changing login name and email --- .../res/layout/dialog_edittext_confirm_pw.xml | 19 ++++++ Habitica/res/values/strings.xml | 3 + Habitica/res/xml/preferences_fragment.xml | 7 --- .../android/habitica/api/ApiService.java | 9 +++ .../android/habitica/data/ApiClient.java | 6 ++ .../android/habitica/data/UserRepository.java | 6 ++ .../data/implementation/ApiClientImpl.java | 25 ++++++++ .../implementation/UserRepositoryImpl.java | 17 ++++++ .../habitica/extensions/Context-Extensions.kt | 8 +++ .../AuthenticationPreferenceFragment.kt | 61 +++++++++++++++++-- 10 files changed, 148 insertions(+), 13 deletions(-) create mode 100644 Habitica/res/layout/dialog_edittext_confirm_pw.xml create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Context-Extensions.kt diff --git a/Habitica/res/layout/dialog_edittext_confirm_pw.xml b/Habitica/res/layout/dialog_edittext_confirm_pw.xml new file mode 100644 index 000000000..b71ed9166 --- /dev/null +++ b/Habitica/res/layout/dialog_edittext_confirm_pw.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 265df0b25..19f4c4a41 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -683,4 +683,7 @@ Authentication Change your authentication options. Change Password + Change Email Address + Change Login Name + Change diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml index 9cc6783ce..c2db2c775 100644 --- a/Habitica/res/xml/preferences_fragment.xml +++ b/Habitica/res/xml/preferences_fragment.xml @@ -37,13 +37,6 @@ android:selectable="true" android:persistent="false" android:shouldDisableView="false"/> - - > sendPasswordResetEmail(@Body Map data); + + @PUT("user/auth/update-username") + Observable> updateLoginName(@Body Map data); + + @PUT("user/auth/update-email") + Observable> updateEmail(@Body Map data); + + @PUT("user/auth/update-password") + Observable> updatePassword(@Body Map data); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java index 155ddd365..0f78e68c4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java @@ -240,4 +240,10 @@ public interface ApiClient { Observable togglePinnedItem(String pinType, String path); Observable sendPasswordResetEmail(String email); + + Observable updateLoginName(String newLoginName, String password); + + Observable updateEmail(String newEmail, String password); + + Observable updatePassword(String newPassword, String oldPassword, String oldPasswordConfirmation); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.java index c9611e26d..e7757a11e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.java @@ -11,6 +11,8 @@ import com.habitrpg.android.habitica.models.social.ChatMessage; import com.habitrpg.android.habitica.models.tasks.Task; import com.habitrpg.android.habitica.models.user.User; +import org.jetbrains.annotations.NotNull; + import java.util.List; import java.util.Map; @@ -66,4 +68,8 @@ public interface UserRepository extends BaseRepository { Observable deleteAccount(String password); Observable sendPasswordResetEmail(String email); + + Observable updateLoginName(@NotNull String newLoginName, @NotNull String password); + Observable updateEmail(@NotNull String newEmail, @NotNull String password); + Observable updatePassword(@NotNull String newPassword, @NotNull String oldPassword, String oldPasswordConfirmation); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java index 9c663628b..e96c3020e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java @@ -956,4 +956,29 @@ public class ApiClientImpl implements Action1, ApiClient { data.put("email", email); return apiService.sendPasswordResetEmail(data).compose(configureApiCallObserver()); } + + @Override + public Observable updateLoginName(String newLoginName, String password) { + Map updateObject = new HashMap<>(); + updateObject.put("username", newLoginName); + updateObject.put("password", password); + return apiService.updateLoginName(updateObject).compose(configureApiCallObserver()); + } + + @Override + public Observable updateEmail(String newEmail, String password) { + Map updateObject = new HashMap<>(); + updateObject.put("newEmail", newEmail); + updateObject.put("password", password); + return apiService.updateEmail(updateObject).compose(configureApiCallObserver()); + } + + @Override + public Observable updatePassword(String newPassword, String oldPassword, String oldPasswordConfirmation) { + Map updateObject = new HashMap<>(); + updateObject.put("newPassword", newPassword); + updateObject.put("password", oldPassword); + updateObject.put("confirmPassowrd", oldPasswordConfirmation); + return apiService.updatePassword(updateObject).compose(configureApiCallObserver()); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java index 4fd0e83dc..3f3019142 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java @@ -16,6 +16,8 @@ import com.habitrpg.android.habitica.models.social.ChatMessage; import com.habitrpg.android.habitica.models.tasks.Task; import com.habitrpg.android.habitica.models.user.User; +import org.jetbrains.annotations.NotNull; + import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -256,6 +258,21 @@ public class UserRepositoryImpl extends BaseRepositoryImpl return apiClient.sendPasswordResetEmail(email); } + @Override + public Observable updateLoginName(@NotNull String newLoginName, @NotNull String password) { + return apiClient.updateLoginName(newLoginName, password); + } + + @Override + public Observable updateEmail(@NotNull String newEmail, @NotNull String password) { + return apiClient.updateEmail(newEmail, password); + } + + @Override + public Observable updatePassword(@NotNull String newPassword, @NotNull String oldPassword, String oldPasswordConfirmation) { + return apiClient.updatePassword(newPassword, oldPassword, oldPasswordConfirmation); + } + @Override public void runCron(List tasks) { Observable> observable; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Context-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Context-Extensions.kt new file mode 100644 index 000000000..7ae240583 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Context-Extensions.kt @@ -0,0 +1,8 @@ +package com.habitrpg.android.habitica.extensions + +import android.app.Service +import android.content.Context +import android.view.LayoutInflater + +val Context.layoutInflater: LayoutInflater + get() = this.getSystemService(Service.LAYOUT_INFLATER_SERVICE) as LayoutInflater 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 6065e0cbc..84f01f833 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 @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.preferences import android.app.ProgressDialog +import android.app.Service import android.content.ClipData import android.content.ClipboardManager import android.content.Context @@ -12,6 +13,7 @@ import android.support.v7.app.AlertDialog import android.support.v7.preference.EditTextPreference import android.support.v7.preference.Preference import android.support.v7.preference.PreferenceCategory +import android.view.LayoutInflater import android.widget.EditText import android.widget.LinearLayout import android.widget.Toast @@ -19,6 +21,7 @@ import com.habitrpg.android.habitica.HabiticaApplication import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand +import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.helpers.QrCodeManager import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.user.User @@ -42,14 +45,11 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { } private fun updateUserFields() { - configurePreference(findPreference("display_name"), user?.profile?.name) - configurePreference(findPreference("photo_url"), user?.profile?.imageUrl) - configurePreference(findPreference("about"), user?.profile?.blurb) + configurePreference(findPreference("login_name"), user?.authentication?.localAuthentication?.username) + configurePreference(findPreference("email"), user?.authentication?.localAuthentication?.email) } private fun configurePreference(preference: Preference?, value: String?) { - val editPreference = preference as? EditTextPreference - editPreference?.text = value preference?.summary = value } @@ -59,6 +59,9 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { override fun onPreferenceTreeClick(preference: Preference): Boolean { when (preference.key) { + "login_name" -> showLoginNameDialog() + "email" -> showEmailDialog() + "change_password" -> showChangePasswordDialog() "subscription_status" -> { if (user != null && user!!.purchased != null && user!!.purchased.plan != null) { val plan = user!!.purchased.plan @@ -80,6 +83,52 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { return super.onPreferenceTreeClick(preference) } + private fun showChangePasswordDialog() { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + private fun showEmailDialog() { + val inflater = context.layoutInflater + val view = inflater.inflate(R.layout.dialog_edittext_confirm_pw, null) + val emailEditText = view.findViewById(R.id.editText) + emailEditText.setText(user?.authentication?.localAuthentication?.email) + val passwordEditText = view.findViewById(R.id.passwordEditText) + val dialog = AlertDialog.Builder(context) + .setTitle(R.string.change_email) + .setPositiveButton(R.string.change) { thisDialog, _ -> + thisDialog.dismiss() + userRepository.updateEmail(emailEditText.text.toString(), passwordEditText.text.toString()) + .subscribe(Action1 { + configurePreference(findPreference("email"), emailEditText.text.toString()) + }, RxErrorHandler.handleEmptyError()) + } + .setNegativeButton(R.string.action_cancel) { thisDialog, _ -> thisDialog.dismiss() } + .create() + dialog.setView(view) + dialog.show() + } + + private fun showLoginNameDialog() { + val inflater = context.layoutInflater + val view = inflater.inflate(R.layout.dialog_edittext_confirm_pw, null) + val loginNameEditText = view.findViewById(R.id.editText) + loginNameEditText.setText(user?.authentication?.localAuthentication?.username) + val passwordEditText = view.findViewById(R.id.passwordEditText) + val dialog = AlertDialog.Builder(context) + .setTitle(R.string.change_login_name) + .setPositiveButton(R.string.change) { thisDialog, _ -> + thisDialog.dismiss() + userRepository.updateLoginName(loginNameEditText.text.toString(), passwordEditText.text.toString()) + .subscribe(Action1 { + configurePreference(findPreference("login_name"), loginNameEditText.text.toString()) + }, RxErrorHandler.handleEmptyError()) + } + .setNegativeButton(R.string.action_cancel) { thisDialog, _ -> thisDialog.dismiss() } + .create() + dialog.setView(view) + dialog.show() + } + private fun showAccountDeleteConfirmation() { val input = EditText(context) val lp = LinearLayout.LayoutParams( @@ -142,4 +191,4 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { .setPositiveButton(R.string.close) { dialogInterface, _ -> dialogInterface.dismiss() }.create() dialog.show() } -} +} \ No newline at end of file