aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java78
-rw-r--r--src/main/res/drawable/mecmd_message_border.xml15
-rw-r--r--src/main/res/layout/fragment_conversations_overview.xml0
-rw-r--r--src/main/res/layout/message_mecmd.xml112
-rw-r--r--src/main/res/layout/message_received.xml10
-rw-r--r--src/main/res/layout/message_sent.xml75
-rw-r--r--src/main/res/layout/message_status.xml4
-rw-r--r--src/main/res/values/dimens.xml5
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>