diff --git a/k9mail/src/main/java/com/fsck/k9/activity/MessageCompose.java b/k9mail/src/main/java/com/fsck/k9/activity/MessageCompose.java index bc434105b..982caad19 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/MessageCompose.java +++ b/k9mail/src/main/java/com/fsck/k9/activity/MessageCompose.java @@ -43,7 +43,6 @@ import android.os.Parcelable; import android.text.TextUtils; import android.text.TextWatcher; import android.text.util.Rfc822Tokenizer; -import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.ContextThemeWrapper; @@ -89,6 +88,7 @@ import com.fsck.k9.crypto.PgpData; import com.fsck.k9.fragment.ProgressDialogFragment; import com.fsck.k9.helper.ContactItem; import com.fsck.k9.helper.Contacts; +import com.fsck.k9.helper.SimpleTextWatcher; import com.fsck.k9.mail.filter.Base64; import com.fsck.k9.helper.HtmlConverter; import com.fsck.k9.helper.IdentityHelper; @@ -112,6 +112,7 @@ import com.fsck.k9.mail.internet.TextBody; import com.fsck.k9.mailstore.LocalMessage; import com.fsck.k9.mailstore.TempFileBody; import com.fsck.k9.mailstore.TempFileMessageBody; +import com.fsck.k9.ui.EolConvertingEditText; import com.fsck.k9.view.MessageWebView; import org.apache.james.mime4j.codec.EncoderUtil; @@ -297,20 +298,14 @@ public class MessageCompose extends K9Activity implements OnClickListener, private Button mQuotedTextShow; private View mQuotedTextBar; private ImageButton mQuotedTextEdit; - private ImageButton mQuotedTextDelete; private EolConvertingEditText mQuotedText; private MessageWebView mQuotedHTML; private InsertableHtmlContent mQuotedHtmlContent; // Container for HTML reply as it's being built. - private View mEncryptLayout; private CheckBox mCryptoSignatureCheckbox; private CheckBox mEncryptCheckbox; private TextView mCryptoSignatureUserId; private TextView mCryptoSignatureUserIdRest; - private ImageButton mAddToFromContacts; - private ImageButton mAddCcFromContacts; - private ImageButton mAddBccFromContacts; - private PgpData mPgpData = null; private String mOpenPgpProvider; private OpenPgpServiceConnection mOpenPgpServiceConnection; @@ -409,8 +404,6 @@ public class MessageCompose extends K9Activity implements OnClickListener, }; private Listener mListener = new Listener(); - private EmailAddressAdapter mAddressAdapter; - private Validator mAddressValidator; private FontSizes mFontSizes = K9.getFontSizes(); private ContextThemeWrapper mThemeContext; @@ -521,8 +514,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, // theme the whole content according to the theme (except the action bar) mThemeContext = new ContextThemeWrapper(this, K9.getK9ThemeResourceId(K9.getK9ComposerTheme())); - View v = ((LayoutInflater) mThemeContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)). - inflate(R.layout.message_compose, null); + View v = LayoutInflater.from(mThemeContext).inflate(R.layout.message_compose, null); TypedValue outValue = new TypedValue(); // background color needs to be forced mThemeContext.getTheme().resolveAttribute(R.attr.messageViewHeaderBackgroundColor, outValue, true); @@ -565,8 +557,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, mContacts = Contacts.getInstance(MessageCompose.this); - mAddressAdapter = new EmailAddressAdapter(mThemeContext); - mAddressValidator = new EmailAddressValidator(); + EmailAddressAdapter mAddressAdapter = new EmailAddressAdapter(mThemeContext); + Validator mAddressValidator = new EmailAddressValidator(); mChooseIdentityButton = (Button) findViewById(R.id.identity); mChooseIdentityButton.setOnClickListener(this); @@ -582,9 +574,10 @@ public class MessageCompose extends K9Activity implements OnClickListener, mSubjectView = (EditText) findViewById(R.id.subject); mSubjectView.getInputExtras(true).putBoolean("allowEmoji", true); - mAddToFromContacts = (ImageButton) findViewById(R.id.add_to); - mAddCcFromContacts = (ImageButton) findViewById(R.id.add_cc); - mAddBccFromContacts = (ImageButton) findViewById(R.id.add_bcc); + ImageButton mAddToFromContacts = (ImageButton) findViewById(R.id.add_to); + ImageButton mAddCcFromContacts = (ImageButton) findViewById(R.id.add_cc); + ImageButton mAddBccFromContacts = (ImageButton) findViewById(R.id.add_bcc); + mCcWrapper = (LinearLayout) findViewById(R.id.cc_wrapper); mBccWrapper = (LinearLayout) findViewById(R.id.bcc_wrapper); @@ -602,7 +595,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, mQuotedTextShow = (Button)findViewById(R.id.quoted_text_show); mQuotedTextBar = findViewById(R.id.quoted_text_bar); mQuotedTextEdit = (ImageButton)findViewById(R.id.quoted_text_edit); - mQuotedTextDelete = (ImageButton)findViewById(R.id.quoted_text_delete); + ImageButton mQuotedTextDelete = (ImageButton) findViewById(R.id.quoted_text_delete); mQuotedText = (EolConvertingEditText)findViewById(R.id.quoted_text); mQuotedText.getInputExtras(true).putBoolean("allowEmoji", true); @@ -617,81 +610,34 @@ public class MessageCompose extends K9Activity implements OnClickListener, } }); - TextWatcher watcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int before, int after) { - /* do nothing */ - } - + TextWatcher draftNeedsChangingTextWatcher = new SimpleTextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mDraftNeedsSaving = true; } - - @Override - public void afterTextChanged(android.text.Editable s) { /* do nothing */ } }; - // For watching changes to the To:, Cc:, and Bcc: fields for auto-encryption on a matching - // address. - TextWatcher recipientWatcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int before, int after) { - /* do nothing */ - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - mDraftNeedsSaving = true; - } - - @Override - public void afterTextChanged(android.text.Editable s) { - /* do nothing */ - } - }; - - TextWatcher sigwatcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int before, int after) { - /* do nothing */ - } - + TextWatcher signTextWatcher = new SimpleTextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mDraftNeedsSaving = true; mSignatureChanged = true; } - - @Override - public void afterTextChanged(android.text.Editable s) { /* do nothing */ } }; - mToView.addTextChangedListener(recipientWatcher); - mCcView.addTextChangedListener(recipientWatcher); - mBccView.addTextChangedListener(recipientWatcher); - mSubjectView.addTextChangedListener(watcher); + mToView.addTextChangedListener(draftNeedsChangingTextWatcher); + mCcView.addTextChangedListener(draftNeedsChangingTextWatcher); + mBccView.addTextChangedListener(draftNeedsChangingTextWatcher); + mSubjectView.addTextChangedListener(draftNeedsChangingTextWatcher); - mMessageContentView.addTextChangedListener(watcher); - mQuotedText.addTextChangedListener(watcher); + mMessageContentView.addTextChangedListener(draftNeedsChangingTextWatcher); + mQuotedText.addTextChangedListener(draftNeedsChangingTextWatcher); - /* Yes, there really are poeple who ship versions of android without a contact picker */ + /* Yes, there really are people who ship versions of android without a contact picker */ if (mContacts.hasContactPicker()) { - mAddToFromContacts.setOnClickListener(new OnClickListener() { - @Override public void onClick(View v) { - doLaunchContactPicker(CONTACT_PICKER_TO); - } - }); - mAddCcFromContacts.setOnClickListener(new OnClickListener() { - @Override public void onClick(View v) { - doLaunchContactPicker(CONTACT_PICKER_CC); - } - }); - mAddBccFromContacts.setOnClickListener(new OnClickListener() { - @Override public void onClick(View v) { - doLaunchContactPicker(CONTACT_PICKER_BCC); - } - }); + mAddToFromContacts.setOnClickListener(new DoLaunchOnClickListener(CONTACT_PICKER_TO)); + mAddCcFromContacts.setOnClickListener(new DoLaunchOnClickListener(CONTACT_PICKER_CC)); + mAddBccFromContacts.setOnClickListener(new DoLaunchOnClickListener(CONTACT_PICKER_BCC)); } else { mAddToFromContacts.setVisibility(View.GONE); mAddCcFromContacts.setVisibility(View.GONE); @@ -761,7 +707,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, mSignatureView = lowerSignature; upperSignature.setVisibility(View.GONE); } - mSignatureView.addTextChangedListener(sigwatcher); + mSignatureView.addTextChangedListener(signTextWatcher); if (!mIdentity.getSignatureUse()) { mSignatureView.setVisibility(View.GONE); @@ -813,34 +759,31 @@ public class MessageCompose extends K9Activity implements OnClickListener, mMessageReference.flag = Flag.FORWARDED; } - mEncryptLayout = findViewById(R.id.layout_encrypt); - mCryptoSignatureCheckbox = (CheckBox)findViewById(R.id.cb_crypto_signature); - mCryptoSignatureCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - updateMessageFormat(); - } - }); - mCryptoSignatureUserId = (TextView)findViewById(R.id.userId); - mCryptoSignatureUserIdRest = (TextView)findViewById(R.id.userIdRest); - mEncryptCheckbox = (CheckBox)findViewById(R.id.cb_encrypt); - mEncryptCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - updateMessageFormat(); - } - }); - - if (mSourceMessageBody != null) { - // mSourceMessageBody is set to something when replying to and forwarding decrypted - // messages, so the sender probably wants the message to be encrypted. - mEncryptCheckbox.setChecked(true); - } + final View mEncryptLayout = findViewById(R.id.layout_encrypt); initializeCrypto(); mOpenPgpProvider = mAccount.getOpenPgpProvider(); if (mOpenPgpProvider != null) { + mCryptoSignatureCheckbox = (CheckBox)findViewById(R.id.cb_crypto_signature); + final OnCheckedChangeListener updateListener = new OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + updateMessageFormat(); + } + }; + mCryptoSignatureCheckbox.setOnCheckedChangeListener(updateListener); + mCryptoSignatureUserId = (TextView)findViewById(R.id.userId); + mCryptoSignatureUserIdRest = (TextView)findViewById(R.id.userIdRest); + mEncryptCheckbox = (CheckBox)findViewById(R.id.cb_encrypt); + mEncryptCheckbox.setOnCheckedChangeListener(updateListener); + + if (mSourceMessageBody != null) { + // mSourceMessageBody is set to something when replying to and forwarding decrypted + // messages, so the sender probably wants the message to be encrypted. + mEncryptCheckbox.setChecked(true); + } + // New OpenPGP Provider API // bind to service @@ -2236,11 +2179,6 @@ public class MessageCompose extends K9Activity implements OnClickListener, } } - public void doLaunchContactPicker(int resultId) { - mIgnoreOnPause = true; - startActivityForResult(mContacts.contactPickerIntent(), resultId); - } - private void onAccountChosen(Account account, Identity identity) { if (!mAccount.equals(account)) { if (K9.DEBUG) { @@ -3955,34 +3893,18 @@ public class MessageCompose extends K9Activity implements OnClickListener, } } - /** - * An {@link EditText} extension with methods that convert line endings from - * {@code \r\n} to {@code \n} and back again when setting and getting text. - * - */ - public static class EolConvertingEditText extends EditText { + class DoLaunchOnClickListener implements OnClickListener { - public EolConvertingEditText(Context context, AttributeSet attrs) { - super(context, attrs); + private final int resultId; + + DoLaunchOnClickListener(int resultId) { + this.resultId = resultId; } - /** - * Return the text the EolConvertingEditText is displaying. - * - * @return A string with any line endings converted to {@code \r\n}. - */ - public String getCharacters() { - return getText().toString().replace("\n", "\r\n"); - } - - /** - * Sets the string value of the EolConvertingEditText. Any line endings - * in the string will be converted to {@code \n}. - * - * @param text - */ - public void setCharacters(CharSequence text) { - setText(text.toString().replace("\r\n", "\n")); + @Override + public void onClick(View v) { + mIgnoreOnPause = true; + startActivityForResult(mContacts.contactPickerIntent(), resultId); } } } diff --git a/k9mail/src/main/java/com/fsck/k9/helper/SimpleTextWatcher.java b/k9mail/src/main/java/com/fsck/k9/helper/SimpleTextWatcher.java new file mode 100644 index 000000000..94c2cc7b4 --- /dev/null +++ b/k9mail/src/main/java/com/fsck/k9/helper/SimpleTextWatcher.java @@ -0,0 +1,22 @@ +package com.fsck.k9.helper; + +import android.text.Editable; +import android.text.TextWatcher; + +/** + * all methods empty - but this way we can have TextWatchers with less boilder-plate where + * we just override the methods we want and not always al 3 + */ +public class SimpleTextWatcher implements TextWatcher { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + } +} diff --git a/k9mail/src/main/java/com/fsck/k9/ui/EolConvertingEditText.java b/k9mail/src/main/java/com/fsck/k9/ui/EolConvertingEditText.java new file mode 100644 index 000000000..b7fd8e09a --- /dev/null +++ b/k9mail/src/main/java/com/fsck/k9/ui/EolConvertingEditText.java @@ -0,0 +1,37 @@ +package com.fsck.k9.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.EditText; + +/** + * An {@link android.widget.EditText} extension with methods that convert line endings from + * {@code \r\n} to {@code \n} and back again when setting and getting text. + * + */ +public class EolConvertingEditText extends EditText { + + public EolConvertingEditText(Context context, AttributeSet attrs) { + super(context, attrs); + } + + /** + * Return the text the EolConvertingEditText is displaying. + * + * @return A string with any line endings converted to {@code \r\n}. + */ + public String getCharacters() { + return getText().toString().replace("\n", "\r\n"); + } + + /** + * Sets the string value of the EolConvertingEditText. Any line endings + * in the string will be converted to {@code \n}. + * + * @param text + */ + public void setCharacters(CharSequence text) { + setText(text.toString().replace("\r\n", "\n")); + } + +} diff --git a/k9mail/src/main/res/layout/message_compose.xml b/k9mail/src/main/res/layout/message_compose.xml index 674004582..16f9887e5 100644 --- a/k9mail/src/main/res/layout/message_compose.xml +++ b/k9mail/src/main/res/layout/message_compose.xml @@ -217,7 +217,7 @@