mirror of
https://github.com/moparisthebest/k-9
synced 2024-11-30 13:12:25 -05:00
Merge branch 'messageheader'
This commit is contained in:
commit
a089fadd9a
@ -17,7 +17,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:stretchColumns="1"
|
||||
android:shrinkColumns="1"
|
||||
android:background="@color/message_view_header_background">
|
||||
android:background="@drawable/message_view_header_background">
|
||||
|
||||
<TableRow>
|
||||
|
||||
@ -30,6 +30,7 @@
|
||||
|
||||
<LinearLayout
|
||||
android:paddingTop="2dip"
|
||||
android:paddingBottom="3dip"
|
||||
android:layout_column="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
@ -134,14 +135,56 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Dummy column that is used to ensure the height of the table row is large
|
||||
enough to fit the date/time column -->
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<!-- Date/Time + Icons -->
|
||||
<!-- Fixed spacing -->
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="18dp"/>
|
||||
|
||||
<!-- We don't want to hardcode the height of the star. The minHeight
|
||||
is that of 'answered'. -->
|
||||
<CheckBox
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="22sp"
|
||||
android:focusable="false"
|
||||
style="?android:attr/starStyle"/>
|
||||
|
||||
<!-- Two text views that will be set to the same height as their
|
||||
counterparts in the next colum -->
|
||||
<TextView
|
||||
android:id="@+id/dummy_date"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:singleLine="true"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dummy_time"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="10sp"
|
||||
android:singleLine="true"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Date/Time + Icons
|
||||
The height of this column is 'fill_parent' so we can put the show more/less
|
||||
indicator at the bottom. Unfortunately using 'fill_parent' also means that
|
||||
the views in this column will be cut of if their combined height exceeds
|
||||
that of the highest non-'fill_parent' column. That's why we need the dummy
|
||||
column above. -->
|
||||
<LinearLayout
|
||||
android:id="@+id/topright_container"
|
||||
android:layout_marginTop="2dip"
|
||||
android:layout_marginRight="6dip"
|
||||
android:orientation="vertical"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_marginLeft="6dp"
|
||||
android:gravity="right">
|
||||
|
||||
@ -188,57 +231,32 @@
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"/>
|
||||
|
||||
<!-- View that will take up all available space between the time and
|
||||
the show more/less indicator -->
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/show_additional_headers_icon"
|
||||
android:src="@drawable/show_more"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="6dp"
|
||||
android:layout_marginBottom="3dip"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
|
||||
<!-- Separator -->
|
||||
<!-- This layout has an explicit height because otherwise there will be strange
|
||||
display issues when the additional headers are shown. -->
|
||||
<LinearLayout
|
||||
android:id="@+id/show_additional_headers_area"
|
||||
android:orientation="vertical"
|
||||
<View
|
||||
android:id="@+id/separator"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="21.5dp"
|
||||
android:focusable="true"
|
||||
android:clickable="true"
|
||||
android:background="@drawable/separator_area_background">
|
||||
|
||||
<RelativeLayout
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="20dp">
|
||||
|
||||
<!-- Color chip 2 -->
|
||||
<View
|
||||
android:id="@+id/chip2"
|
||||
android:layout_marginRight="6dip"
|
||||
android:layout_width="6dip"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_alignParentLeft="true"/>
|
||||
|
||||
<!-- Show more/less indicator -->
|
||||
<ImageView
|
||||
android:id="@+id/show_additional_headers_icon"
|
||||
android:src="@drawable/show_more"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginRight="12dp"/>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<View
|
||||
android:id="@+id/separator"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="1.5dp"
|
||||
android:background="#59000000"/>
|
||||
|
||||
</LinearLayout>
|
||||
android:layout_height="1.5dp"
|
||||
android:background="#59000000"/>
|
||||
|
||||
<!-- Button area -->
|
||||
<LinearLayout
|
||||
|
@ -49,7 +49,6 @@ public class MessageHeader extends ScrollView implements OnClickListener {
|
||||
private DateFormat mTimeFormat;
|
||||
|
||||
private View mChip;
|
||||
private View mChip2;
|
||||
private CheckBox mFlagged;
|
||||
private int defaultSubjectColor;
|
||||
private LinearLayout mToContainerView;
|
||||
@ -63,6 +62,8 @@ public class MessageHeader extends ScrollView implements OnClickListener {
|
||||
private ImageView mShowAdditionalHeadersIcon;
|
||||
private SavedState mSavedState;
|
||||
|
||||
private OnLayoutChangedListener mOnLayoutChangedListener;
|
||||
|
||||
/**
|
||||
* Pair class is only available since API Level 5, so we need
|
||||
* this helper class unfortunately
|
||||
@ -95,13 +96,11 @@ public class MessageHeader extends ScrollView implements OnClickListener {
|
||||
mSubjectView = (TextView) findViewById(R.id.subject);
|
||||
mAdditionalHeadersView = (TextView) findViewById(R.id.additional_headers_view);
|
||||
mChip = findViewById(R.id.chip);
|
||||
mChip2 = findViewById(R.id.chip2);
|
||||
mDateView = (TextView) findViewById(R.id.date);
|
||||
mTimeView = (TextView) findViewById(R.id.time);
|
||||
mFlagged = (CheckBox) findViewById(R.id.flagged);
|
||||
mShowAdditionalHeadersIcon = (ImageView) findViewById(R.id.show_additional_headers_icon);
|
||||
|
||||
|
||||
defaultSubjectColor = mSubjectView.getCurrentTextColor();
|
||||
mSubjectView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageViewSubject());
|
||||
mTimeView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageViewTime());
|
||||
@ -116,14 +115,19 @@ public class MessageHeader extends ScrollView implements OnClickListener {
|
||||
((TextView) findViewById(R.id.to_label)).setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageViewTo());
|
||||
((TextView) findViewById(R.id.cc_label)).setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageViewCC());
|
||||
|
||||
findViewById(R.id.show_additional_headers_area).setOnClickListener(this);
|
||||
mFromView.setOnClickListener(this);
|
||||
findViewById(R.id.top_container).setOnClickListener(this);
|
||||
|
||||
TextView dummyDateView = (TextView) findViewById(R.id.dummy_date);
|
||||
TextView dummyTimeView = (TextView) findViewById(R.id.dummy_time);
|
||||
dummyTimeView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageViewTime());
|
||||
dummyDateView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageViewDate());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
switch (view.getId()) {
|
||||
case R.id.show_additional_headers_area: {
|
||||
case R.id.top_container: {
|
||||
onShowAdditionalHeaders();
|
||||
break;
|
||||
}
|
||||
@ -131,6 +135,11 @@ public class MessageHeader extends ScrollView implements OnClickListener {
|
||||
onAddSenderToContacts();
|
||||
break;
|
||||
}
|
||||
case R.id.to:
|
||||
case R.id.cc: {
|
||||
expand((TextView)view, ((TextView)view).getEllipsize() != null);
|
||||
layoutChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -250,8 +259,6 @@ public class MessageHeader extends ScrollView implements OnClickListener {
|
||||
int chipColorAlpha = (!message.isSet(Flag.SEEN)) ? 255 : 127;
|
||||
mChip.setBackgroundColor(chipColor);
|
||||
mChip.getBackground().setAlpha(chipColorAlpha);
|
||||
mChip2.setBackgroundColor(chipColor);
|
||||
mChip2.getBackground().setAlpha(chipColorAlpha);
|
||||
|
||||
setVisibility(View.VISIBLE);
|
||||
|
||||
@ -269,9 +276,27 @@ public class MessageHeader extends ScrollView implements OnClickListener {
|
||||
int currentVisibility = mAdditionalHeadersView.getVisibility();
|
||||
if (currentVisibility == View.VISIBLE) {
|
||||
hideAdditionalHeaders();
|
||||
expand(mToView, false);
|
||||
expand(mCcView, false);
|
||||
} else {
|
||||
showAdditionalHeaders();
|
||||
expand(mToView, true);
|
||||
expand(mCcView, true);
|
||||
}
|
||||
layoutChanged();
|
||||
}
|
||||
|
||||
/**
|
||||
* Expand or collapse a TextView by removing or adding the 2 lines limitation
|
||||
*/
|
||||
private void expand(TextView v, boolean expand) {
|
||||
if (expand) {
|
||||
v.setMaxLines(Integer.MAX_VALUE);
|
||||
v.setEllipsize(null);
|
||||
} else {
|
||||
v.setMaxLines(2);
|
||||
v.setEllipsize(android.text.TextUtils.TruncateAt.END);
|
||||
}
|
||||
}
|
||||
|
||||
private List<HeaderEntry> getAdditionalHeaders(final Message message)
|
||||
@ -378,4 +403,18 @@ public class MessageHeader extends ScrollView implements OnClickListener {
|
||||
out.writeInt((this.additionalHeadersVisible) ? 1 : 0);
|
||||
}
|
||||
}
|
||||
|
||||
public interface OnLayoutChangedListener {
|
||||
void onLayoutChanged();
|
||||
}
|
||||
|
||||
public void setOnLayoutChangedListener(OnLayoutChangedListener listener) {
|
||||
mOnLayoutChangedListener = listener;
|
||||
}
|
||||
|
||||
private void layoutChanged() {
|
||||
if (mOnLayoutChangedListener != null) {
|
||||
mOnLayoutChangedListener.onLayoutChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -33,7 +33,8 @@ import com.fsck.k9.mail.store.LocalStore.LocalMessage;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class SingleMessageView extends LinearLayout implements OnClickListener {
|
||||
public class SingleMessageView extends LinearLayout implements OnClickListener,
|
||||
MessageHeader.OnLayoutChangedListener {
|
||||
private boolean mScreenReaderEnabled;
|
||||
private MessageCryptoView mCryptoView;
|
||||
private MessageWebView mMessageContentView;
|
||||
@ -65,6 +66,7 @@ public class SingleMessageView extends LinearLayout implements OnClickListener {
|
||||
mHeaderPlaceHolder = (LinearLayout) findViewById(R.id.message_view_header_container);
|
||||
|
||||
mHeaderContainer = (MessageHeader) findViewById(R.id.header_container);
|
||||
mHeaderContainer.setOnLayoutChangedListener(this);
|
||||
|
||||
mAttachmentsContainer = findViewById(R.id.attachments_container);
|
||||
mInsideAttachmentsContainer = (LinearLayout) findViewById(R.id.inside_attachments_container);
|
||||
@ -508,6 +510,12 @@ public class SingleMessageView extends LinearLayout implements OnClickListener {
|
||||
mSavedState = savedState;
|
||||
}
|
||||
|
||||
public void onLayoutChanged() {
|
||||
if (mMessageContentView != null) {
|
||||
mMessageContentView.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
static class SavedState extends BaseSavedState {
|
||||
boolean attachmentViewVisible;
|
||||
boolean hiddenAttachmentsVisible;
|
||||
|
Loading…
Reference in New Issue
Block a user