mirror of
https://github.com/moparisthebest/k-9
synced 2025-02-20 04:31:47 -05:00

The problem: Configure the account (just an example -- problems can occur in other configurations as well): Message Format: HTML Reply quoting style: Prefix Quote message when replying: yes Reply after quoted text: yes Reply to a message that has a large quantity (20+) of \r\n scattered in the body of its HTML version (not an unusual scenario). Add a reply. Save the message as a draft. Go back & open the draft again. A fatal IndexOutOfBoundsException occurs. The cause: When the draft was saved, the X-K9mail-Identity header was computed and added to the message, then the text of the message was processed with MimeUtility.fixDraftTextBody, replacing all occurrences of \r\n with \n in the quoted message before being saved in LocalStore, thus invalidating the X-K9mail-Identity header. The fix: Remove MimeUtility.fixDraftTextBody and implement MessageCompose$EolConvertingEditText instead. Any message text placed in an EolConvertingEditText widget is assured to have \n line endings. Any message text extracted from an EolConvertingEditText widget is assured to have \r\n line endings. The X-K9mail-Identity header will always be computed correctly. Issues thought to be related: 4782, 5010, 5634, 5725 As noted in some of the referenced issues, errors didn't always result in a fatal exception, but instead with mixed up text. Ref: commit f9a35aeaeeae67bd88c3b253c25d06832ca7da73
323 lines
14 KiB
XML
323 lines
14 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="fill_parent"
|
|
android:orientation="vertical">
|
|
|
|
<ScrollView
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="0dip"
|
|
android:layout_weight="1"
|
|
android:scrollbarStyle="insideOverlay"
|
|
android:fillViewport="true">
|
|
|
|
<LinearLayout
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical" >
|
|
|
|
<LinearLayout
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginBottom="4dp"
|
|
android:paddingTop="6dp"
|
|
android:orientation="vertical"
|
|
android:background="#45bcbcbc">
|
|
|
|
<Button
|
|
android:id="@+id/identity"
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content"
|
|
android:gravity="center_vertical"
|
|
android:layout_marginLeft="6dip"
|
|
android:layout_marginRight="6dip"/>
|
|
|
|
<LinearLayout
|
|
android:id="@+id/to_wrapper"
|
|
android:layout_height="wrap_content"
|
|
android:baselineAligned="true"
|
|
android:gravity="bottom"
|
|
android:layout_marginLeft="6dip"
|
|
android:layout_marginRight="6dip"
|
|
android:layout_width="fill_parent">
|
|
|
|
<MultiAutoCompleteTextView
|
|
android:id="@+id/to"
|
|
android:layout_height="wrap_content"
|
|
android:inputType="textEmailAddress|textMultiLine"
|
|
android:imeOptions="actionNext"
|
|
android:hint="@string/message_compose_to_hint"
|
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
|
android:layout_width="0dp"
|
|
android:layout_marginRight="6dip"
|
|
android:layout_weight="1"/>
|
|
|
|
<ImageButton
|
|
android:id="@+id/add_to"
|
|
android:contentDescription="@string/message_compose_description_add_to"
|
|
android:src="?attr/messageComposeAddContactImage"
|
|
android:layout_height="wrap_content"
|
|
android:layout_width="wrap_content"
|
|
android:padding="8dip"
|
|
android:layout_marginTop="1dip"/>
|
|
|
|
</LinearLayout>
|
|
|
|
<LinearLayout
|
|
android:id="@+id/cc_wrapper"
|
|
android:visibility="gone"
|
|
android:layout_height="wrap_content"
|
|
android:baselineAligned="true"
|
|
android:gravity="bottom"
|
|
android:layout_marginLeft="6dip"
|
|
android:layout_marginRight="6dip"
|
|
android:layout_width="fill_parent">
|
|
|
|
<MultiAutoCompleteTextView
|
|
android:id="@+id/cc"
|
|
android:layout_width="0dp"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"
|
|
android:layout_marginRight="6dip"
|
|
android:inputType="textEmailAddress|textMultiLine"
|
|
android:imeOptions="actionNext"
|
|
android:hint="@string/message_compose_cc_hint"
|
|
android:textAppearance="?android:attr/textAppearanceMedium"/>
|
|
|
|
<ImageButton
|
|
android:id="@+id/add_cc"
|
|
android:contentDescription="@string/message_compose_description_add_cc"
|
|
android:src="?attr/messageComposeAddContactImage"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:padding="8dip"
|
|
android:layout_marginTop="1dip"/>
|
|
|
|
</LinearLayout>
|
|
|
|
<LinearLayout
|
|
android:id="@+id/bcc_wrapper"
|
|
android:visibility="gone"
|
|
android:layout_height="wrap_content"
|
|
android:baselineAligned="true"
|
|
android:gravity="bottom"
|
|
android:layout_marginLeft="6dip"
|
|
android:layout_marginRight="6dip"
|
|
android:layout_width="fill_parent">
|
|
|
|
<MultiAutoCompleteTextView
|
|
android:id="@+id/bcc"
|
|
android:layout_width="0dp"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginRight="6dip"
|
|
android:layout_weight="1"
|
|
android:inputType="textEmailAddress|textMultiLine"
|
|
android:imeOptions="actionNext"
|
|
android:hint="@string/message_compose_bcc_hint"
|
|
android:textAppearance="?android:attr/textAppearanceMedium"/>
|
|
|
|
<ImageButton
|
|
android:id="@+id/add_bcc"
|
|
android:contentDescription="@string/message_compose_description_add_bcc"
|
|
android:layout_marginTop="1dip"
|
|
android:layout_height="wrap_content"
|
|
android:layout_width="wrap_content"
|
|
android:padding="8dip"
|
|
android:src="?attr/messageComposeAddContactImage"/>
|
|
|
|
</LinearLayout>
|
|
|
|
<LinearLayout
|
|
android:id="@+id/layout_encrypt"
|
|
android:orientation="horizontal"
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content"
|
|
android:visibility="gone"
|
|
android:paddingLeft="6dip"
|
|
android:paddingRight="6dip">
|
|
|
|
<LinearLayout
|
|
android:orientation="horizontal"
|
|
android:layout_gravity="center_vertical"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1">
|
|
|
|
<CheckBox
|
|
android:text="@string/btn_crypto_sign"
|
|
android:id="@+id/cb_crypto_signature"
|
|
android:layout_gravity="center_vertical"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"/>
|
|
|
|
<LinearLayout
|
|
android:orientation="vertical"
|
|
android:layout_gravity="center_vertical"
|
|
android:layout_height="wrap_content"
|
|
android:layout_width="wrap_content"
|
|
android:paddingRight="2dip">
|
|
|
|
<TextView
|
|
android:id="@+id/userId"
|
|
android:ellipsize="end"
|
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"/>
|
|
|
|
<TextView
|
|
android:id="@+id/userIdRest"
|
|
android:textSize="10sp"
|
|
android:ellipsize="end"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"/>
|
|
|
|
</LinearLayout>
|
|
|
|
</LinearLayout>
|
|
|
|
<CheckBox
|
|
android:text="@string/btn_encrypt"
|
|
android:id="@+id/cb_encrypt"
|
|
android:layout_gravity="center_vertical"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"/>
|
|
|
|
</LinearLayout>
|
|
|
|
<EditText
|
|
android:id="@+id/subject"
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginLeft="6dip"
|
|
android:layout_marginRight="6dip"
|
|
android:hint="@string/message_compose_subject_hint"
|
|
android:inputType="textEmailSubject|textAutoCorrect|textCapSentences|textImeMultiLine"
|
|
android:imeOptions="actionNext"
|
|
android:singleLine="true"
|
|
android:textAppearance="?android:attr/textAppearanceMedium" />
|
|
|
|
<!--
|
|
Empty container for storing attachments. We'll stick
|
|
instances of message_compose_attachment.xml in here.
|
|
-->
|
|
<LinearLayout
|
|
android:id="@+id/attachments"
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical" />
|
|
|
|
<View
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="1dip"
|
|
android:background="@drawable/divider_horizontal_email" />
|
|
|
|
</LinearLayout>
|
|
|
|
<!-- We have to use "wrap_content" (not "0dip") for "layout_height", otherwise the
|
|
EditText won't properly grow in height while the user is typing the message -->
|
|
<view
|
|
class="com.fsck.k9.activity.MessageCompose$EolConvertingEditText"
|
|
android:id="@+id/message_content"
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"
|
|
android:gravity="top"
|
|
android:hint="@string/message_compose_content_hint"
|
|
android:inputType="textMultiLine|textAutoCorrect|textCapSentences"
|
|
android:imeOptions="actionDone|flagNoEnterAction"
|
|
android:minLines="3"
|
|
android:textAppearance="?android:attr/textAppearanceMedium" />
|
|
|
|
<view
|
|
class="com.fsck.k9.activity.MessageCompose$EolConvertingEditText"
|
|
android:id="@+id/upper_signature"
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content"
|
|
android:gravity="top"
|
|
android:editable="false"
|
|
android:minLines="0"
|
|
android:autoText="true"
|
|
android:capitalize="sentences"
|
|
android:hint="@string/message_compose_signature_hint"
|
|
android:inputType="textMultiLine|textAutoCorrect|textCapSentences"
|
|
android:textAppearance="?android:attr/textAppearanceMedium" />
|
|
|
|
<Button
|
|
android:id="@+id/quoted_text_show"
|
|
android:text="@string/message_compose_show_quoted_text_action"
|
|
android:textSize="16dip"
|
|
android:padding="0dip"
|
|
android:layout_gravity="right"
|
|
android:layout_height="wrap_content"
|
|
android:layout_width="match_parent"/>
|
|
|
|
<!-- Quoted text bar -->
|
|
<RelativeLayout
|
|
android:id="@+id/quoted_text_bar"
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content">
|
|
|
|
<view
|
|
class="com.fsck.k9.activity.MessageCompose$EolConvertingEditText"
|
|
android:id="@+id/quoted_text"
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content"
|
|
android:gravity="top"
|
|
android:minLines="3"
|
|
android:autoText="true"
|
|
android:capitalize="sentences"
|
|
android:inputType="textMultiLine|textAutoCorrect|textCapSentences"
|
|
android:textAppearance="?android:attr/textAppearanceMedium" />
|
|
|
|
<com.fsck.k9.view.MessageWebView
|
|
android:id="@+id/quoted_html"
|
|
android:layout_height="wrap_content"
|
|
android:layout_width="fill_parent" />
|
|
|
|
<LinearLayout
|
|
android:id="@+id/quoted_text_buttons"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_alignParentTop="true"
|
|
android:layout_alignParentRight="true">
|
|
|
|
<ImageButton
|
|
android:id="@+id/quoted_text_edit"
|
|
android:contentDescription="@string/message_compose_description_edit_quoted_text"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginRight="8dip"
|
|
android:background="@drawable/btn_edit" />
|
|
|
|
<ImageButton
|
|
android:id="@+id/quoted_text_delete"
|
|
android:contentDescription="@string/message_compose_description_delete_quoted_text"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:background="@drawable/btn_dialog" />
|
|
|
|
</LinearLayout>
|
|
|
|
</RelativeLayout>
|
|
|
|
<view
|
|
class="com.fsck.k9.activity.MessageCompose$EolConvertingEditText"
|
|
android:id="@+id/lower_signature"
|
|
android:layout_width="fill_parent"
|
|
android:layout_height="wrap_content"
|
|
android:gravity="top"
|
|
android:editable="false"
|
|
android:minLines="0"
|
|
android:autoText="true"
|
|
android:capitalize="sentences"
|
|
android:hint="@string/message_compose_signature_hint"
|
|
android:inputType="textMultiLine|textAutoCorrect|textCapSentences"
|
|
android:textAppearance="?android:attr/textAppearanceMedium" />
|
|
|
|
</LinearLayout>
|
|
|
|
</ScrollView>
|
|
|
|
</LinearLayout>
|