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