1
0
mirror of https://github.com/moparisthebest/k-9 synced 2024-12-26 01:28:50 -05:00
k-9/res/layout/message_compose.xml
Joe Steele bfb0316583 Fix fatal IndexOutOfBoundsException
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 f9a35aeaee
2013-10-11 11:39:15 -04:00

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>