diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt index bc5c6eb36..082d38fa1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt @@ -8,7 +8,10 @@ import android.content.Intent import android.content.SharedPreferences import android.os.Build import android.os.Bundle +import android.text.InputType import android.view.View +import android.widget.EditText +import android.widget.LinearLayout import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.getSystemService @@ -23,6 +26,7 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.extensions.addCancelButton import com.habitrpg.android.habitica.extensions.addCloseButton +import com.habitrpg.android.habitica.extensions.addOkButton import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.activities.FixCharacterValuesActivity import com.habitrpg.android.habitica.ui.fragments.preferences.HabiticaAccountDialog.AccountUpdateConfirmed @@ -271,21 +275,58 @@ class AccountPreferenceFragment : } private fun showChangePasswordDialog() { - ChangePasswordBottomSheet{ oldPassword, newPassword -> - lifecycleScope.launchCatching { - KeyboardUtil.dismissKeyboard(activity) + ChangePasswordBottomSheet( + onForgotPassword = { showForgotPasswordDialog() }, + onPasswordChanged = { oldPassword, newPassword -> lifecycleScope.launchCatching { - val response = userRepository.updatePassword( - oldPassword, - newPassword, - newPassword, - ) - response?.apiToken?.let { - viewModel.saveTokens(it, user?.id ?: "") + KeyboardUtil.dismissKeyboard(activity) + lifecycleScope.launchCatching { + val response = userRepository.updatePassword( + oldPassword, + newPassword, + newPassword, + ) + response?.apiToken?.let { + viewModel.saveTokens(it, user?.id ?: "") + } } } } - }.show(childFragmentManager, ChangePasswordBottomSheet.TAG) + ).show(childFragmentManager, ChangePasswordBottomSheet.TAG) + + } + + private fun showForgotPasswordDialog() { + val input = EditText(requireContext()) + input.setAutofillHints(EditText.AUTOFILL_HINT_EMAIL_ADDRESS) + input.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS + input.hint = getString(R.string.forgot_password_hint_example) + input.textSize = 16f + val lp = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) + input.layoutParams = lp + val alertDialog = HabiticaAlertDialog(requireContext()) + alertDialog.setTitle(R.string.forgot_password_title) + alertDialog.setMessage(R.string.forgot_password_description) + alertDialog.setAdditionalContentView(input) + alertDialog.addButton(R.string.send, true) { _, _ -> + lifecycleScope.launchCatching { + userRepository.sendPasswordResetEmail(input.text.toString()) + showPasswordEmailConfirmation() + } + } + alertDialog.addCancelButton() + alertDialog.show() + } + + private fun showPasswordEmailConfirmation() { + val alert = HabiticaAlertDialog(requireContext()) + alert.setMessage(R.string.forgot_password_confirmation) + alert.addOkButton() + alert.show() } private fun showAddPasswordDialog(showEmail: Boolean) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ChangePasswordScreen.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ChangePasswordScreen.kt index 2fd15c1ad..25cab6a57 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ChangePasswordScreen.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/ChangePasswordScreen.kt @@ -160,21 +160,22 @@ fun ChangePasswordScreen( }, enabled = canSave, colors = ButtonDefaults.buttonColors( - containerColor = buttonColor, - disabledContainerColor = buttonColor.copy(alpha = 0.3f) + containerColor = colorResource(id = R.color.purple400_purple500), + disabledContainerColor = colorResource(id = R.color.purple400_purple500).copy(alpha = 0.3f) ), - shape = RoundedCornerShape(14.dp), + shape = RoundedCornerShape(12.dp), modifier = Modifier .fillMaxWidth() - + .height(60.dp) ) { Text( text = stringResource(R.string.change_password), color = Color.White, - fontSize = 17.sp, - fontWeight = FontWeight.Bold, + fontSize = 16.sp, + fontWeight = FontWeight.Medium ) } + Spacer(modifier = Modifier.height(18.dp)) TextButton(