protected void showClientRemoteException(final FxAccountClientRemoteException e) { if (!e.isAccountLocked()) { remoteErrorTextView.setText(e.getErrorMessageStringResource()); return; } // This horrible bit of special-casing is because we want this error message // to contain a clickable, extra chunk of text, but we don't want to pollute // the exception class with Android specifics. final int messageId = e.getErrorMessageStringResource(); final int clickableId = R.string.fxaccount_resend_unlock_code_button_label; final Spannable span = Utils.interpolateClickableSpan( this, messageId, clickableId, new ClickableSpan() { @Override public void onClick(View widget) { // It would be best to capture the email address sent to the server // and use it here, but this will do for now. If the user modifies // the email address entered, the error text is hidden, so sending a // changed email address would be the result of an unusual race. final String email = emailEdit.getText().toString(); byte[] emailUTF8 = null; try { emailUTF8 = email.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { // It's okay, we'll fail in the code resender. } FxAccountUnlockCodeResender.resendUnlockCode( FxAccountAbstractSetupActivity.this, getAuthServerEndpoint(), emailUTF8); } }); remoteErrorTextView.setMovementMethod(LinkMovementMethod.getInstance()); remoteErrorTextView.setText(span); }