diff options
-rw-r--r-- | src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java | 78 | ||||
-rw-r--r-- | src/main/res/drawable/mecmd_message_border.xml | 15 | ||||
-rw-r--r-- | src/main/res/layout/fragment_conversations_overview.xml | 0 | ||||
-rw-r--r-- | src/main/res/layout/message_mecmd.xml | 112 | ||||
-rw-r--r-- | src/main/res/layout/message_received.xml | 10 | ||||
-rw-r--r-- | src/main/res/layout/message_sent.xml | 75 | ||||
-rw-r--r-- | src/main/res/layout/message_status.xml | 4 | ||||
-rw-r--r-- | src/main/res/values/dimens.xml | 5 |
8 files changed, 273 insertions, 26 deletions
diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java b/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java index 9a501b89..a4711aa0 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java @@ -13,9 +13,13 @@ import android.net.Uri; import android.os.AsyncTask; import android.text.Spannable; import android.text.SpannableString; + import android.text.style.ForegroundColorSpan; + import android.text.style.StyleSpan; import android.text.util.Linkify; + +import android.util.DisplayMetrics; import android.util.Patterns; import android.view.View; import android.view.View.OnClickListener; @@ -29,11 +33,13 @@ import android.widget.TextView; import android.widget.Toast; import java.lang.ref.WeakReference; + import java.util.List; import java.util.concurrent.RejectedExecutionException; import java.util.regex.Matcher; import java.util.regex.Pattern; + import de.thedevstack.conversationsplus.ConversationsPlusApplication; import de.thedevstack.conversationsplus.ConversationsPlusColors; import de.thedevstack.conversationsplus.ConversationsPlusPreferences; @@ -44,6 +50,7 @@ import de.thedevstack.conversationsplus.entities.Conversation; import de.thedevstack.conversationsplus.entities.DownloadableFile; import de.thedevstack.conversationsplus.entities.FileParams; import de.thedevstack.conversationsplus.entities.Message; + import de.thedevstack.conversationsplus.entities.Transferable; import de.thedevstack.conversationsplus.enums.FileStatus; import de.thedevstack.conversationsplus.persistance.FileBackend; @@ -64,7 +71,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { private static final int SENT = 0; private static final int RECEIVED = 1; private static final int STATUS = 2; - private static final int NULL = 3; + private static final int ME_COMMAND = 3; private static final Pattern XMPP_PATTERN = Pattern .compile("xmpp\\:(?:(?:[" + Patterns.GOOD_IRI_CHAR @@ -73,12 +80,25 @@ public class MessageAdapter extends ArrayAdapter<Message> { private ConversationActivity activity; + private DisplayMetrics metrics; + private OnContactPictureClicked mOnContactPictureClickedListener; private OnContactPictureLongClicked mOnContactPictureLongClickedListener; + private OnLongClickListener openContextMenu = new OnLongClickListener() { + + @Override + public boolean onLongClick(View v) { + v.showContextMenu(); + return true; + } + }; + + public MessageAdapter(ConversationActivity activity, List<Message> messages) { super(activity, 0, messages); this.activity = activity; + metrics = getContext().getResources().getDisplayMetrics(); } public void setOnContactPictureClicked(OnContactPictureClicked listener) { @@ -92,11 +112,13 @@ public class MessageAdapter extends ArrayAdapter<Message> { @Override public int getViewTypeCount() { - return 3; + return 4; } public int getItemViewType(Message message) { - if (message.getType() == Message.TYPE_STATUS) { + if (message.hasMeCommand()) { + return ME_COMMAND; + } else if (message.getType() == Message.TYPE_STATUS) { return STATUS; } else if (message.getStatus() <= Message.STATUS_RECEIVED) { return RECEIVED; @@ -209,13 +231,13 @@ public class MessageAdapter extends ArrayAdapter<Message> { } } - String formatedTime = UIHelper.readableTimeDifferenceFull(getContext(), - message.getTimeSent()); + String formatedTime = UIHelper.readableTimeDifferenceFull(getContext(), message.getTimeSent()); if (message.getStatus() <= Message.STATUS_RECEIVED) { StringBuilder timeText = new StringBuilder(); timeText.append((null != formatedTime) ? formatedTime + ((null != info || null != filesize) ? " \u00B7 " : "") : ""); timeText.append((null != filesize) ? filesize + ((null != info) ? " \u00B7 " : "") : ""); timeText.append((null != info) ? info : ""); + viewHolder.time.setText(timeText); } else { if ((filesize != null) && (info != null)) { @@ -261,7 +283,10 @@ public class MessageAdapter extends ArrayAdapter<Message> { if (viewHolder.download_button != null) { viewHolder.download_button.setVisibility(View.GONE); } + if (null != viewHolder.image) { viewHolder.image.setVisibility(View.GONE); + } + viewHolder.messageBody.setVisibility(View.VISIBLE); viewHolder.messageBody.setText(text); viewHolder.messageBody.setTextColor(getMessageTextColor(viewHolder.darkBackground, false)); @@ -273,7 +298,9 @@ public class MessageAdapter extends ArrayAdapter<Message> { if (viewHolder.download_button != null) { viewHolder.download_button.setVisibility(View.GONE); } + viewHolder.image.setVisibility(View.GONE); + viewHolder.messageBody.setVisibility(View.VISIBLE); viewHolder.messageBody.setText(getContext().getString( R.string.decryption_failed)); @@ -286,7 +313,10 @@ public class MessageAdapter extends ArrayAdapter<Message> { if (viewHolder.download_button != null) { viewHolder.download_button.setVisibility(View.GONE); } + if (null != viewHolder.image) { viewHolder.image.setVisibility(View.GONE); + } + viewHolder.messageBody.setVisibility(View.VISIBLE); viewHolder.messageBody.setIncludeFontPadding(true); if (message.getBody() != null) { @@ -298,6 +328,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { body = message.getBody(); } final SpannableString formattedBody = new SpannableString(body); + if (message.getType() != Message.TYPE_PRIVATE) { if (message.hasMeCommand()) { final Spannable span = new SpannableString(formattedBody); @@ -310,8 +341,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { } else { String privateMarker; if (message.getStatus() <= Message.STATUS_RECEIVED) { - privateMarker = activity - .getString(R.string.private_message); + privateMarker = activity.getString(R.string.private_message); } else { final String to; if (message.getCounterpart() != null) { @@ -365,10 +395,12 @@ public class MessageAdapter extends ArrayAdapter<Message> { } viewHolder.messageBody.setTextColor(this.getMessageTextColor(viewHolder.darkBackground, true)); viewHolder.messageBody.setTypeface(null, Typeface.NORMAL); + viewHolder.messageBody.setOnLongClickListener(openContextMenu); } /** * Counts the number of occurrences of the pattern in body. + * * @param pattern the pattern to match * @param body the body to find the pattern * @return the number of occurrences @@ -386,6 +418,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { viewHolder.download_button.setVisibility(View.VISIBLE); viewHolder.download_button.setText(btnText); viewHolder.download_button.setOnClickListener(onClickListener); + viewHolder.download_button.setOnLongClickListener(openContextMenu); } private void displayFileInfoForFileMessage(final Message message, ViewHolder viewHolder) { @@ -418,7 +451,6 @@ public class MessageAdapter extends ArrayAdapter<Message> { } this.displayDownloadButton(viewHolder, btnText, new OnClickListener() { - @Override public void onClick(View v) { activity.startDownloadable(message); @@ -440,12 +472,12 @@ public class MessageAdapter extends ArrayAdapter<Message> { } this.displayDownloadButton(viewHolder, btnText, new OnClickListener() { - @Override public void onClick(View v) { openDownloadable(message); } }); + } private void displayLocationMessage(ViewHolder viewHolder, final Message message) { @@ -454,28 +486,30 @@ public class MessageAdapter extends ArrayAdapter<Message> { viewHolder.download_button.setVisibility(View.VISIBLE); viewHolder.download_button.setText(R.string.show_location); viewHolder.download_button.setOnClickListener(new OnClickListener() { - @Override public void onClick(View v) { showLocation(message); } }); + + viewHolder.download_button.setOnLongClickListener(openContextMenu); } - private void displayImageMessage(ViewHolder viewHolder, - final Message message) { + private void displayImageMessage(ViewHolder viewHolder, final Message message) { if (viewHolder.download_button != null) { viewHolder.download_button.setVisibility(View.GONE); } ImageUtil.loadBitmap(message, viewHolder.image, viewHolder.messageBody, true); - viewHolder.image.setOnClickListener(new OnClickListener() { + viewHolder.image.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { openDownloadable(message); } }); + + viewHolder.image.setOnLongClickListener(openContextMenu); } private View displayStatusMessage(final Message message, ViewHolder viewHolder) { @@ -491,6 +525,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { } viewHolder.status_message.setText(message.getBody()); } + return viewHolder.view; } @@ -558,10 +593,11 @@ public class MessageAdapter extends ArrayAdapter<Message> { } private void displayAvatar(final Message message, int type, ViewHolder viewHolder) { - if (type == RECEIVED) { + if (type == ME_COMMAND || (type == RECEIVED)) { // && message.getConversation().getMode() == Conversation.MODE_MULTI ImageView imageView = viewHolder.contact_picture; if (null != imageView) { this.loadAvatar(message, imageView); + imageView.setOnClickListener(new OnClickListener() { @Override @@ -605,6 +641,9 @@ public class MessageAdapter extends ArrayAdapter<Message> { case STATUS: viewResId = R.layout.message_status; break; + case ME_COMMAND: + viewResId = R.layout.message_mecmd; + break; } return activity.getLayoutInflater().inflate(viewResId, parent, false); @@ -614,7 +653,8 @@ public class MessageAdapter extends ArrayAdapter<Message> { View view = initializeView(type, parent); ViewHolder viewHolder = new ViewHolder(view); if (SENT == type - || RECEIVED == type) { + || RECEIVED == type + || ME_COMMAND == type) { viewHolder.message_box = ViewUtil.visible(view, R.id.message_box); viewHolder.indicator = (ImageView) view.findViewById(R.id.security_indicator); viewHolder.messageBody = (TextView) view.findViewById(R.id.message_body); @@ -626,7 +666,8 @@ public class MessageAdapter extends ArrayAdapter<Message> { viewHolder.download_button = (Button) view.findViewById(R.id.download_button); viewHolder.image = (ImageView) view.findViewById(R.id.message_image); } - if (RECEIVED == type) { // Extra block as preparation for new /me representation + if (ME_COMMAND == type + || (RECEIVED == type)) { // && message.getConversation().getMode() == Conversation.MODE_MULTI --> only muc received msgs viewHolder.contact_picture = ViewUtil.visible(view, R.id.message_photo); } if (RECEIVED == type) { @@ -691,9 +732,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { } else { displayInfoMessage(viewHolder, activity.getString(R.string.install_openkeychain)); if (viewHolder != null) { - viewHolder.message_box - .setOnClickListener(new OnClickListener() { - + viewHolder.message_box.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { activity.showInstallPgpDialog(); @@ -787,6 +826,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { protected ViewHolder(View view) { this.view = view; } + protected View view; protected LinearLayout message_box; diff --git a/src/main/res/drawable/mecmd_message_border.xml b/src/main/res/drawable/mecmd_message_border.xml new file mode 100644 index 00000000..990d0288 --- /dev/null +++ b/src/main/res/drawable/mecmd_message_border.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle" > + + <corners android:radius="2dp" /> + + <padding + android:bottom="1.5dp" + android:left="1.5dp" + android:right="1.5dp" + android:top="1.5dp" /> + + <solid android:color="@color/black12" /> + +</shape>
\ No newline at end of file diff --git a/src/main/res/layout/fragment_conversations_overview.xml b/src/main/res/layout/fragment_conversations_overview.xml index 2223219a..3f50a692 100644 --- a/src/main/res/layout/fragment_conversations_overview.xml +++ b/src/main/res/layout/fragment_conversations_overview.xml diff --git a/src/main/res/layout/message_mecmd.xml b/src/main/res/layout/message_mecmd.xml new file mode 100644 index 00000000..4074c5ba --- /dev/null +++ b/src/main/res/layout/message_mecmd.xml @@ -0,0 +1,112 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingBottom="3dp" + android:paddingLeft="8dp" + android:paddingRight="8dp" + android:paddingTop="3dp"> + + <LinearLayout + android:id="@+id/message_box" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:layout_alignParentRight="true" + android:layout_alignParentLeft="true" + android:background="@drawable/mecmd_message_border" + android:minHeight="53dp" + android:longClickable="true"> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:background="@color/grey50" + android:gravity="center_vertical" + android:orientation="vertical" + android:paddingBottom="4dp" + android:paddingLeft="5dp" + android:paddingRight="5dp" + android:paddingTop="4dp" > + + <RelativeLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + <com.makeramen.roundedimageview.RoundedImageView + android:id="@+id/message_photo" + android:layout_width="@dimen/msg_mecmd_avatar_size" + android:layout_height="@dimen/msg_mecmd_avatar_size" + android:layout_alignParentLeft="true" + android:layout_alignParentTop="true" + android:layout_marginRight="-1.5dp" + android:padding="0dp" + android:scaleType="fitXY" + android:src="@drawable/ic_profile" + app:riv_corner_radius="1dp"/> + + <github.ankushsachdeva.emojicon.EmojiconTextView + android:id="@+id/message_body" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toRightOf="@id/message_photo" + android:layout_marginLeft="8dp" + android:autoLink="web|phone|email" + android:textColor="@color/black87" + android:textSize="?attr/TextSizeBody" + app:emojiconSize="?attr/EmojiconSizeBody" + android:text=""/> + </RelativeLayout> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="right" + android:orientation="horizontal" + android:paddingTop="1dp" > + + <TextView + android:id="@+id/message_time" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:gravity="center_vertical" + android:text="@string/sending" + android:textColor="@color/black54" + android:textSize="?attr/TextSizeInfo" /> + + <TextView + android:id="@+id/message_encryption" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:gravity="center_vertical" + android:layout_marginRight="4sp" + android:textColor="@color/white70" + android:textStyle="bold" + android:textSize="?attr/TextSizeInfo" /> + + <ImageView + android:id="@+id/security_indicator" + android:layout_width="?attr/TextSizeInfo" + android:layout_height="?attr/TextSizeInfo" + android:layout_gravity="center_vertical" + android:layout_marginLeft="4sp" + android:alpha="0.54" + android:gravity="center_vertical" + android:src="@drawable/ic_lock_black_18dp" /> + + <ImageView + android:id="@+id/indicator_received" + android:layout_width="?attr/TextSizeInfo" + android:layout_height="?attr/TextSizeInfo" + android:layout_gravity="center_vertical" + android:layout_marginLeft="4sp" + android:alpha="0.54" + android:gravity="center_vertical" + android:src="@drawable/ic_received_indicator" /> + </LinearLayout> + </LinearLayout> + </LinearLayout> +</RelativeLayout>
\ No newline at end of file diff --git a/src/main/res/layout/message_received.xml b/src/main/res/layout/message_received.xml index 029b0d74..906e90bf 100644 --- a/src/main/res/layout/message_received.xml +++ b/src/main/res/layout/message_received.xml @@ -11,13 +11,14 @@ <com.makeramen.roundedimageview.RoundedImageView android:id="@+id/message_photo" - android:layout_width="48dp" - android:layout_height="48dp" + android:layout_width="@dimen/msg_avatar_size" + android:layout_height="@dimen/msg_avatar_size" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:scaleType="fitXY" android:src="@drawable/ic_profile" - app:riv_corner_radius="2dp" /> + app:riv_corner_radius="2dp" + android:visibility="gone" /> <LinearLayout android:id="@+id/message_box" @@ -29,7 +30,8 @@ android:minHeight="53dp" android:layout_marginTop="-2dp" android:layout_marginRight="-4dp" - android:longClickable="true"> + android:longClickable="true" + android:visibility="gone"> <LinearLayout android:layout_width="wrap_content" diff --git a/src/main/res/layout/message_sent.xml b/src/main/res/layout/message_sent.xml index 8bda9c8f..a114ad4c 100644 --- a/src/main/res/layout/message_sent.xml +++ b/src/main/res/layout/message_sent.xml @@ -31,7 +31,8 @@ android:background="@drawable/message_bubble_sent" android:minHeight="53dp" android:layout_marginLeft="-4dp" - android:longClickable="true"> + android:longClickable="true" + android:visibility="gone"> <LinearLayout android:layout_width="wrap_content" @@ -121,4 +122,76 @@ </LinearLayout> </LinearLayout> + <LinearLayout + android:id="@+id/mecmd_message_box" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:layout_alignParentRight="true" + android:layout_alignParentLeft="true" + android:background="@drawable/mecmd_message_border" + android:minHeight="53dp" + android:longClickable="true" + android:visibility="gone"> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:background="@color/grey50" + android:gravity="center_vertical" + android:orientation="vertical" + android:paddingBottom="4dp" + android:paddingLeft="5dp" + android:paddingRight="5dp" + android:paddingTop="4dp" > + + <github.ankushsachdeva.emojicon.EmojiconTextView + android:id="@+id/mecmd_message_body" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:autoLink="web|phone|email" + android:textColor="@color/black87" + android:textSize="?attr/TextSizeBody" + app:emojiconSize="?attr/EmojiconSizeBody" /> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="right" + android:orientation="horizontal" + android:paddingTop="1dp" > + + <TextView + android:id="@+id/mecmd_message_time" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:gravity="center_vertical" + android:text="@string/sending" + android:textColor="@color/black54" + android:textSize="?attr/TextSizeInfo" /> + + <ImageView + android:id="@+id/mecmd_security_indicator" + android:layout_width="?attr/TextSizeInfo" + android:layout_height="?attr/TextSizeInfo" + android:layout_gravity="center_vertical" + android:layout_marginLeft="4sp" + android:alpha="0.54" + android:gravity="center_vertical" + android:src="@drawable/ic_lock_black_18dp" /> + + <ImageView + android:id="@+id/mecmd_indicator_received" + android:layout_width="?attr/TextSizeInfo" + android:layout_height="?attr/TextSizeInfo" + android:layout_gravity="center_vertical" + android:layout_marginLeft="4sp" + android:alpha="0.54" + android:gravity="center_vertical" + android:src="@drawable/ic_received_indicator" /> + </LinearLayout> + </LinearLayout> + </LinearLayout> + </RelativeLayout>
\ No newline at end of file diff --git a/src/main/res/layout/message_status.xml b/src/main/res/layout/message_status.xml index aa02e154..4c1dbbc3 100644 --- a/src/main/res/layout/message_status.xml +++ b/src/main/res/layout/message_status.xml @@ -11,8 +11,8 @@ <com.makeramen.roundedimageview.RoundedImageView android:id="@+id/message_photo" - android:layout_width="32dp" - android:layout_height="32dp" + android:layout_width="@dimen/msg_status_avatar_size" + android:layout_height="@dimen/msg_status_avatar_size" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="-1.5dp" diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml index 7f20b59b..94ea6a62 100644 --- a/src/main/res/values/dimens.xml +++ b/src/main/res/values/dimens.xml @@ -9,5 +9,10 @@ <dimen name="ambilwarna_hsvWidth">240dp</dimen> <dimen name="ambilwarna_hueWidth">30dp</dimen> <dimen name="ambilwarna_spacer">8dp</dimen> + <dimen name="action_bar_title_text_size">18dp</dimen> <!-- redefinition here, because no access to original from android --> + <dimen name="avatar_size">56dp</dimen> + <dimen name="design_fab_image_size">@dimen/avatar_size</dimen> + <dimen name="msg_mecmd_avatar_size">24dp</dimen> <dimen name="msg_avatar_size">48dp</dimen> + <dimen name="msg_status_avatar_size">32dp</dimen> </resources> |