diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java index 0c7c6b764..158120135 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java @@ -115,7 +115,7 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin } Resources resources = NextcloudTalkApplication.getSharedApplication().getResources(); - if (message.isGrouped()) { + if (message.isGrouped) { Drawable bubbleDrawable = DisplayUtils.getMessageSelector(resources.getColor(R.color.colorPrimary), resources.getColor(R.color.transparent), resources.getColor(R.color.colorPrimary), R.drawable.shape_grouped_outcoming_message); diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java new file mode 100644 index 000000000..bf7e7e10e --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java @@ -0,0 +1,73 @@ +/* + * Nextcloud Talk application + * + * @author Mario Danic + * Copyright (C) 2017-2018 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.adapters.messages; + +import android.content.Intent; +import android.net.Uri; +import android.view.View; +import android.widget.TextView; + +import com.nextcloud.talk.R; +import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.models.json.chat.ChatMessage; +import com.stfalcon.chatkit.messages.MessageHolders; +import com.stfalcon.chatkit.utils.RoundedImageView; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class MagicPreviewMessageViewHolder extends MessageHolders.IncomingImageMessageViewHolder { + + @BindView(R.id.messageText) + TextView messageText; + + public MagicPreviewMessageViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); + } + + @Override + public void onBind(ChatMessage message) { + super.onBind(message); + + if (userAvatar != null) { + if (message.isGrouped) { + userAvatar.setVisibility(View.INVISIBLE); + } else { + userAvatar.setVisibility(View.VISIBLE); + } + } + + if (message.isGrouped) { + ((RoundedImageView) image).setCorners(R.dimen.message_bubble_corners_radius, R.dimen.message_bubble_corners_radius, 0, 0); + } else if (message.getUser().getId().equals(message.activeUserId)) { + ((RoundedImageView) image).setCorners(R.dimen.message_bubble_corners_radius, 0, 0, 0); + } else { + ((RoundedImageView) image).setCorners(0, R.dimen.message_bubble_corners_radius, 0, 0); + } + + messageText.setText(message.getSelectedIndividualHashMap().get("name")); + image.setOnClickListener(v -> { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(message.getSelectedIndividualHashMap().get("link"))); + NextcloudTalkApplication.getSharedApplication().getApplicationContext().startActivity(browserIntent); + }); + } +} diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicSystemMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicSystemMessageViewHolder.java index 312fa9801..c3f39a64d 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicSystemMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicSystemMessageViewHolder.java @@ -72,15 +72,6 @@ public class MagicSystemMessageViewHolder extends MessageHolders.IncomingTextMes messageString = DisplayUtils.searchAndColor(message.getText(), messageString, "@" + individualHashMap.get("name"), color); - } else if (individualHashMap.get("type").equals("file")) { - color = context.getResources().getColor(R.color - .colorPrimary); - messageString = DisplayUtils.searchAndColor(message.getText(), messageString, individualHashMap - .get("name"), color); - itemView.setOnClickListener(v -> { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(individualHashMap.get("link"))); - context.startActivity(browserIntent); - }); } } } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java index 4624e674e..7895b6cbe 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java @@ -61,6 +61,7 @@ import com.nextcloud.talk.R; import com.nextcloud.talk.activities.MagicCallActivity; import com.nextcloud.talk.adapters.messages.MagicIncomingTextMessageViewHolder; import com.nextcloud.talk.adapters.messages.MagicOutcomingTextMessageViewHolder; +import com.nextcloud.talk.adapters.messages.MagicPreviewMessageViewHolder; import com.nextcloud.talk.adapters.messages.MagicSystemMessageViewHolder; import com.nextcloud.talk.api.NcApi; import com.nextcloud.talk.application.NextcloudTalkApplication; @@ -95,6 +96,7 @@ import com.stfalcon.chatkit.messages.MessageInput; import com.stfalcon.chatkit.messages.MessagesList; import com.stfalcon.chatkit.messages.MessagesListAdapter; import com.stfalcon.chatkit.utils.DateFormatter; +import com.stfalcon.chatkit.utils.RoundedImageView; import com.webianks.library.PopupBubble; import org.parceler.Parcels; @@ -308,6 +310,9 @@ public class ChatController extends BaseController implements MessagesListAdapte messageHolders.setIncomingTextConfig(MagicIncomingTextMessageViewHolder.class, R.layout.item_custom_incoming_text_message); messageHolders.setOutcomingTextConfig(MagicOutcomingTextMessageViewHolder.class, R.layout.item_custom_outcoming_text_message); + messageHolders.setIncomingImageConfig(MagicPreviewMessageViewHolder.class, R.layout.item_custom_incoming_preview_message); + messageHolders.setOutcomingImageConfig(MagicPreviewMessageViewHolder.class, R.layout.item_custom_outcoming_preview_message); + messageHolders.registerContentType(CONTENT_TYPE_SYSTEM_MESSAGE, MagicSystemMessageViewHolder.class, R.layout.item_system_message, MagicSystemMessageViewHolder.class, R.layout.item_system_message, this); @@ -315,28 +320,37 @@ public class ChatController extends BaseController implements MessagesListAdapte adapter = new MessagesListAdapter<>(conversationUser.getUserId(), messageHolders, new ImageLoader() { @Override public void loadImage(ImageView imageView, String url) { - GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext()) - .asBitmap() - .diskCacheStrategy(DiskCacheStrategy.NONE) - .load(url) - .centerInside() - .override(imageView.getMeasuredWidth(), imageView.getMeasuredHeight()) - .apply(RequestOptions.bitmapTransform(new CircleCrop())) - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - TextDrawable drawable = TextDrawable.builder().beginConfig().bold() - .endConfig().buildRound("?", getResources().getColor(R.color.nc_grey)); - imageView.setImageDrawable(drawable); - return true; - } + if (!(imageView instanceof RoundedImageView)) { + GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext()) + .asBitmap() + .diskCacheStrategy(DiskCacheStrategy.NONE) + .load(url) + .centerInside() + .override(imageView.getMeasuredWidth(), imageView.getMeasuredHeight()) + .apply(RequestOptions.bitmapTransform(new CircleCrop())) + .listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + TextDrawable drawable = TextDrawable.builder().beginConfig().bold() + .endConfig().buildRound("?", getResources().getColor(R.color.nc_grey)); + imageView.setImageDrawable(drawable); + return true; + } - @Override - public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - return false; - } - }) - .into(imageView); + @Override + public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + return false; + } + }) + .into(imageView); + } else { + GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext()) + .asBitmap() + .diskCacheStrategy(DiskCacheStrategy.NONE) + .override(480, 480) + .load(url) + .into(imageView); + } } }); } else { diff --git a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java index 32ee2c89d..9ce801baa 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java @@ -19,10 +19,13 @@ */ package com.nextcloud.talk.models.json.chat; +import android.util.Log; + import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonIgnore; import com.bluelinelabs.logansquare.annotation.JsonObject; import com.nextcloud.talk.R; +import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.models.json.converters.EnumSystemMessageTypeConverter; import com.nextcloud.talk.utils.ApiUtils; import com.stfalcon.chatkit.commons.models.IMessage; @@ -33,13 +36,34 @@ import org.parceler.Parcel; import java.util.Date; import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import androidx.annotation.Nullable; import lombok.Data; @Parcel @Data @JsonObject -public class ChatMessage implements IMessage, MessageContentType { +public class ChatMessage implements IMessage, MessageContentType, MessageContentType.Image { + + @Nullable + @Override + public String getImageUrl() { + if (messageParameters != null && messageParameters.size() > 0) { + for (String key : messageParameters.keySet()) { + Map individualHashMap = messageParameters.get(key); + if (individualHashMap.get("type").equals("file")) { + selectedIndividualHashMap = individualHashMap; + return String.format(Locale.getDefault(), + "%s/index.php/core/preview?fileId=%s&x=%d&y=%d&forceIcon=1", + baseUrl, individualHashMap.get("id"), 480, 480); + } + } + } + + return null; + } public enum SystemMessageType { DUMMY, @@ -85,11 +109,21 @@ public class ChatMessage implements IMessage, MessageContentType { SystemMessageType systemMessageType; @JsonIgnore - boolean isGrouped; + public boolean isGrouped; @JsonIgnore - String activeUserId; + public String activeUserId; + @JsonIgnore + public Map selectedIndividualHashMap; + public Map getSelectedIndividualHashMap() { + return selectedIndividualHashMap; + } + + public void setSelectedIndividualHashMap(Map selectedIndividualHashMap) { + this.selectedIndividualHashMap = selectedIndividualHashMap; + } + public String getBaseUrl() { return baseUrl; } diff --git a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java b/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java index 480bef904..e49c04a2c 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java @@ -163,7 +163,7 @@ public class PushUtils { return -1; } - public String generateSHA512Hash(String pushToken) { + private String generateSHA512Hash(String pushToken) { MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("SHA-512"); @@ -175,7 +175,7 @@ public class PushUtils { return ""; } - public String bytesToHex(byte[] bytes) { + private String bytesToHex(byte[] bytes) { StringBuilder result = new StringBuilder(); for (byte individualByte : bytes) { result.append(Integer.toString((individualByte & 0xff) + 0x100, 16) diff --git a/app/src/main/res/drawable/shape_preview_text_incoming_message.xml b/app/src/main/res/drawable/shape_preview_text_incoming_message.xml new file mode 100644 index 000000000..4bbdc188b --- /dev/null +++ b/app/src/main/res/drawable/shape_preview_text_incoming_message.xml @@ -0,0 +1,32 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/shape_preview_text_outcoming_message.xml b/app/src/main/res/drawable/shape_preview_text_outcoming_message.xml new file mode 100644 index 000000000..de8620339 --- /dev/null +++ b/app/src/main/res/drawable/shape_preview_text_outcoming_message.xml @@ -0,0 +1,32 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/controller_chat.xml b/app/src/main/res/layout/controller_chat.xml index cc97750b7..b91ec5d69 100644 --- a/app/src/main/res/layout/controller_chat.xml +++ b/app/src/main/res/layout/controller_chat.xml @@ -92,6 +92,10 @@ app:outcomingTextLinkColor="@color/nc_outcoming_text_default" app:outcomingTextSize="@dimen/chat_text_size" app:outcomingTimeTextSize="12sp" + app:outcomingImageTimeTextSize="12sp" + app:incomingImageTimeTextSize="12sp" + app:outcomingImageTimeTextColor="@color/white60" + app:incomingImageTimeTextColor="@color/warm_grey_four" app:textAutoLink="all"/> + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_custom_outcoming_preview_message.xml b/app/src/main/res/layout/item_custom_outcoming_preview_message.xml new file mode 100644 index 000000000..84b0d28f2 --- /dev/null +++ b/app/src/main/res/layout/item_custom_outcoming_preview_message.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_message_input.xml b/app/src/main/res/layout/view_message_input.xml index a6a7ad10b..a609dffe0 100644 --- a/app/src/main/res/layout/view_message_input.xml +++ b/app/src/main/res/layout/view_message_input.xml @@ -35,8 +35,7 @@ android:id="@id/attachmentButtonSpace" android:layout_width="0dp" android:layout_height="0dp" - android:layout_toEndOf="@id/attachmentButton" - android:layout_toRightOf="@id/attachmentButton"/> + android:layout_toEndOf="@id/attachmentButton"/> @@ -53,7 +50,6 @@ android:id="@id/sendButtonSpace" android:layout_width="0dp" android:layout_height="0dp" - android:layout_toLeftOf="@id/messageSendButton" android:layout_toStartOf="@id/messageSendButton"/>