diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java
index 646da535d..bc721066c 100644
--- a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java
+++ b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java
@@ -27,11 +27,14 @@ import android.text.InputType;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
+import android.text.TextUtils;
import android.text.method.PasswordTransformationMethod;
import android.text.style.ClickableSpan;
import android.text.style.UnderlineSpan;
+import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
+import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
@@ -338,6 +341,23 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener
InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setTransformationMethod(new PasswordTransformationMethod());
+ TextView forgotPassword = new TextView(ActFmLoginActivity.this);
+ SpannableString text = new SpannableString(getString(R.string.actfm_ALA_forgot_password));
+ text.setSpan(new UnderlineSpan(), 0, text.length(), 0);
+ forgotPassword.setText(text);
+ LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+ DisplayMetrics metrics = getResources().getDisplayMetrics();
+ lp.setMargins(0, (int) (8 * metrics.density), 0, (int) (8 * metrics.density));
+ forgotPassword.setLayoutParams(lp);
+ forgotPassword.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ forgotPassword(email.getText().toString());
+ }
+ });
+ body.addView(forgotPassword);
+
+
ScrollView bodyScroll = new ScrollView(ActFmLoginActivity.this);
bodyScroll.addView(body);
@@ -362,6 +382,27 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener
}
};
+ private void forgotPassword(final String email) {
+ if (TextUtils.isEmpty(email)) {
+ DialogUtilities.okDialog(this, getString(R.string.actfm_ALA_enter_email), null);
+ } else {
+ final ProgressDialog pd = DialogUtilities.progressDialog(this, getString(R.string.DLG_please_wait));
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ actFmInvoker.invoke("user_reset_password", "email", email); //$NON-NLS-1$ //$NON-NLS-2$
+ DialogUtilities.okDialog(ActFmLoginActivity.this, getString(R.string.actfm_ALA_reset_sent, email), null);
+ } catch (IOException e) {
+ handleError(e);
+ } finally {
+ DialogUtilities.dismissDialog(ActFmLoginActivity.this, pd);
+ }
+ }
+ }).start();
+ }
+ }
+
private String generateRandomPassword() {
String acceptable = "abcdefghijklmnopqrstuvwxyz1234567890"; //$NON-NLS-1$
char[] chars = new char[8];
@@ -565,6 +606,8 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener
message = getString(R.string.actfm_ALA_error_user_exists);
else if ("incorrect_password".equals(code))
message = getString(R.string.actfm_ALA_error_wrong_password);
+ else if ("user_not_found".equals(code))
+ message = getString(R.string.actfm_ALA_error_user_not_found);
}
}
errors.setText(message);
diff --git a/astrid/res/values/strings-actfm.xml b/astrid/res/values/strings-actfm.xml
index 3310c5867..f9d547735 100644
--- a/astrid/res/values/strings-actfm.xml
+++ b/astrid/res/values/strings-actfm.xml
@@ -276,6 +276,18 @@
Sorry, that password was incorrect. Please try again.
+
+ Forgot password?
+
+
+ Please enter your email
+
+
+ Password reset sent to %s
+
+
+ User not found by that email. Try signing up instead!
+
Copy list