mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-20 20:19:42 +01:00
Lots of work on files preview
This commit is contained in:
parent
435b73e3f9
commit
a788c20b4a
@ -115,7 +115,7 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin
|
|||||||
}
|
}
|
||||||
|
|
||||||
Resources resources = NextcloudTalkApplication.getSharedApplication().getResources();
|
Resources resources = NextcloudTalkApplication.getSharedApplication().getResources();
|
||||||
if (message.isGrouped()) {
|
if (message.isGrouped) {
|
||||||
Drawable bubbleDrawable = DisplayUtils.getMessageSelector(resources.getColor(R.color.colorPrimary),
|
Drawable bubbleDrawable = DisplayUtils.getMessageSelector(resources.getColor(R.color.colorPrimary),
|
||||||
resources.getColor(R.color.transparent),
|
resources.getColor(R.color.transparent),
|
||||||
resources.getColor(R.color.colorPrimary), R.drawable.shape_grouped_outcoming_message);
|
resources.getColor(R.color.colorPrimary), R.drawable.shape_grouped_outcoming_message);
|
||||||
|
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Nextcloud Talk application
|
||||||
|
*
|
||||||
|
* @author Mario Danic
|
||||||
|
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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<ChatMessage> {
|
||||||
|
|
||||||
|
@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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -72,15 +72,6 @@ public class MagicSystemMessageViewHolder extends MessageHolders.IncomingTextMes
|
|||||||
|
|
||||||
messageString = DisplayUtils.searchAndColor(message.getText(),
|
messageString = DisplayUtils.searchAndColor(message.getText(),
|
||||||
messageString, "@" + individualHashMap.get("name"), color);
|
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);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,6 +61,7 @@ import com.nextcloud.talk.R;
|
|||||||
import com.nextcloud.talk.activities.MagicCallActivity;
|
import com.nextcloud.talk.activities.MagicCallActivity;
|
||||||
import com.nextcloud.talk.adapters.messages.MagicIncomingTextMessageViewHolder;
|
import com.nextcloud.talk.adapters.messages.MagicIncomingTextMessageViewHolder;
|
||||||
import com.nextcloud.talk.adapters.messages.MagicOutcomingTextMessageViewHolder;
|
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.adapters.messages.MagicSystemMessageViewHolder;
|
||||||
import com.nextcloud.talk.api.NcApi;
|
import com.nextcloud.talk.api.NcApi;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
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.MessagesList;
|
||||||
import com.stfalcon.chatkit.messages.MessagesListAdapter;
|
import com.stfalcon.chatkit.messages.MessagesListAdapter;
|
||||||
import com.stfalcon.chatkit.utils.DateFormatter;
|
import com.stfalcon.chatkit.utils.DateFormatter;
|
||||||
|
import com.stfalcon.chatkit.utils.RoundedImageView;
|
||||||
import com.webianks.library.PopupBubble;
|
import com.webianks.library.PopupBubble;
|
||||||
|
|
||||||
import org.parceler.Parcels;
|
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.setIncomingTextConfig(MagicIncomingTextMessageViewHolder.class, R.layout.item_custom_incoming_text_message);
|
||||||
messageHolders.setOutcomingTextConfig(MagicOutcomingTextMessageViewHolder.class, R.layout.item_custom_outcoming_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,
|
messageHolders.registerContentType(CONTENT_TYPE_SYSTEM_MESSAGE, MagicSystemMessageViewHolder.class,
|
||||||
R.layout.item_system_message, MagicSystemMessageViewHolder.class, R.layout.item_system_message,
|
R.layout.item_system_message, MagicSystemMessageViewHolder.class, R.layout.item_system_message,
|
||||||
this);
|
this);
|
||||||
@ -315,28 +320,37 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
adapter = new MessagesListAdapter<>(conversationUser.getUserId(), messageHolders, new ImageLoader() {
|
adapter = new MessagesListAdapter<>(conversationUser.getUserId(), messageHolders, new ImageLoader() {
|
||||||
@Override
|
@Override
|
||||||
public void loadImage(ImageView imageView, String url) {
|
public void loadImage(ImageView imageView, String url) {
|
||||||
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
if (!(imageView instanceof RoundedImageView)) {
|
||||||
.asBitmap()
|
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
.asBitmap()
|
||||||
.load(url)
|
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||||
.centerInside()
|
.load(url)
|
||||||
.override(imageView.getMeasuredWidth(), imageView.getMeasuredHeight())
|
.centerInside()
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
.override(imageView.getMeasuredWidth(), imageView.getMeasuredHeight())
|
||||||
.listener(new RequestListener<Bitmap>() {
|
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
||||||
@Override
|
.listener(new RequestListener<Bitmap>() {
|
||||||
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
|
@Override
|
||||||
TextDrawable drawable = TextDrawable.builder().beginConfig().bold()
|
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
|
||||||
.endConfig().buildRound("?", getResources().getColor(R.color.nc_grey));
|
TextDrawable drawable = TextDrawable.builder().beginConfig().bold()
|
||||||
imageView.setImageDrawable(drawable);
|
.endConfig().buildRound("?", getResources().getColor(R.color.nc_grey));
|
||||||
return true;
|
imageView.setImageDrawable(drawable);
|
||||||
}
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {
|
public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.into(imageView);
|
.into(imageView);
|
||||||
|
} else {
|
||||||
|
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
||||||
|
.asBitmap()
|
||||||
|
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||||
|
.override(480, 480)
|
||||||
|
.load(url)
|
||||||
|
.into(imageView);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -19,10 +19,13 @@
|
|||||||
*/
|
*/
|
||||||
package com.nextcloud.talk.models.json.chat;
|
package com.nextcloud.talk.models.json.chat;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import com.bluelinelabs.logansquare.annotation.JsonField;
|
import com.bluelinelabs.logansquare.annotation.JsonField;
|
||||||
import com.bluelinelabs.logansquare.annotation.JsonIgnore;
|
import com.bluelinelabs.logansquare.annotation.JsonIgnore;
|
||||||
import com.bluelinelabs.logansquare.annotation.JsonObject;
|
import com.bluelinelabs.logansquare.annotation.JsonObject;
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
import com.nextcloud.talk.models.json.converters.EnumSystemMessageTypeConverter;
|
import com.nextcloud.talk.models.json.converters.EnumSystemMessageTypeConverter;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
import com.stfalcon.chatkit.commons.models.IMessage;
|
import com.stfalcon.chatkit.commons.models.IMessage;
|
||||||
@ -33,13 +36,34 @@ import org.parceler.Parcel;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@Parcel
|
@Parcel
|
||||||
@Data
|
@Data
|
||||||
@JsonObject
|
@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<String, String> 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 {
|
public enum SystemMessageType {
|
||||||
DUMMY,
|
DUMMY,
|
||||||
@ -85,11 +109,21 @@ public class ChatMessage implements IMessage, MessageContentType {
|
|||||||
SystemMessageType systemMessageType;
|
SystemMessageType systemMessageType;
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
boolean isGrouped;
|
public boolean isGrouped;
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
String activeUserId;
|
public String activeUserId;
|
||||||
|
@JsonIgnore
|
||||||
|
public Map<String, String> selectedIndividualHashMap;
|
||||||
|
|
||||||
|
|
||||||
|
public Map<String, String> getSelectedIndividualHashMap() {
|
||||||
|
return selectedIndividualHashMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedIndividualHashMap(Map<String, String> selectedIndividualHashMap) {
|
||||||
|
this.selectedIndividualHashMap = selectedIndividualHashMap;
|
||||||
|
}
|
||||||
|
|
||||||
public String getBaseUrl() {
|
public String getBaseUrl() {
|
||||||
return baseUrl;
|
return baseUrl;
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,7 @@ public class PushUtils {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String generateSHA512Hash(String pushToken) {
|
private String generateSHA512Hash(String pushToken) {
|
||||||
MessageDigest messageDigest = null;
|
MessageDigest messageDigest = null;
|
||||||
try {
|
try {
|
||||||
messageDigest = MessageDigest.getInstance("SHA-512");
|
messageDigest = MessageDigest.getInstance("SHA-512");
|
||||||
@ -175,7 +175,7 @@ public class PushUtils {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String bytesToHex(byte[] bytes) {
|
private String bytesToHex(byte[] bytes) {
|
||||||
StringBuilder result = new StringBuilder();
|
StringBuilder result = new StringBuilder();
|
||||||
for (byte individualByte : bytes) {
|
for (byte individualByte : bytes) {
|
||||||
result.append(Integer.toString((individualByte & 0xff) + 0x100, 16)
|
result.append(Integer.toString((individualByte & 0xff) + 0x100, 16)
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Nextcloud Talk application
|
||||||
|
~
|
||||||
|
~ @author Mario Danic
|
||||||
|
~ Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||||
|
~
|
||||||
|
~ 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 <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
|
||||||
|
<corners
|
||||||
|
android:topLeftRadius="0dp"
|
||||||
|
android:bottomRightRadius="@dimen/message_bubble_corners_radius"
|
||||||
|
android:bottomLeftRadius="@dimen/message_bubble_corners_radius"
|
||||||
|
android:topRightRadius="0dp" />
|
||||||
|
|
||||||
|
<solid android:color="@color/white_two" />
|
||||||
|
</shape>
|
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Nextcloud Talk application
|
||||||
|
~
|
||||||
|
~ @author Mario Danic
|
||||||
|
~ Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||||
|
~
|
||||||
|
~ 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 <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
|
||||||
|
<corners
|
||||||
|
android:topLeftRadius="6dp"
|
||||||
|
android:bottomRightRadius="6dp"
|
||||||
|
android:bottomLeftRadius="@dimen/message_bubble_corners_radius"
|
||||||
|
android:topRightRadius="0dp" />
|
||||||
|
|
||||||
|
<solid android:color="@color/colorPrimary" />
|
||||||
|
</shape>
|
@ -92,6 +92,10 @@
|
|||||||
app:outcomingTextLinkColor="@color/nc_outcoming_text_default"
|
app:outcomingTextLinkColor="@color/nc_outcoming_text_default"
|
||||||
app:outcomingTextSize="@dimen/chat_text_size"
|
app:outcomingTextSize="@dimen/chat_text_size"
|
||||||
app:outcomingTimeTextSize="12sp"
|
app:outcomingTimeTextSize="12sp"
|
||||||
|
app:outcomingImageTimeTextSize="12sp"
|
||||||
|
app:incomingImageTimeTextSize="12sp"
|
||||||
|
app:outcomingImageTimeTextColor="@color/white60"
|
||||||
|
app:incomingImageTimeTextColor="@color/warm_grey_four"
|
||||||
app:textAutoLink="all"/>
|
app:textAutoLink="all"/>
|
||||||
|
|
||||||
<com.webianks.library.PopupBubble
|
<com.webianks.library.PopupBubble
|
||||||
|
@ -0,0 +1,80 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
|
~ Nextcloud Talk application
|
||||||
|
~
|
||||||
|
~ @author Mario Danic
|
||||||
|
~ Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||||
|
~
|
||||||
|
~ 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 <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginTop="2dp"
|
||||||
|
android:layout_marginBottom="2dp">
|
||||||
|
|
||||||
|
<com.stfalcon.chatkit.utils.ShapeImageView
|
||||||
|
android:id="@id/messageUserAvatar"
|
||||||
|
android:layout_width="40dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_marginEnd="8dp" />
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_toEndOf="@id/messageUserAvatar"
|
||||||
|
android:background="@drawable/shape_preview_text_incoming_message">
|
||||||
|
|
||||||
|
<com.stfalcon.chatkit.utils.RoundedImageView
|
||||||
|
android:id="@id/image"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:adjustViewBounds="true" />
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/image"
|
||||||
|
android:layout_alignStart="@+id/image"
|
||||||
|
android:layout_alignEnd="@id/image"
|
||||||
|
android:layout_margin="8dp">
|
||||||
|
|
||||||
|
<com.kevalpatel2106.emoticongifkeyboard.widget.EmoticonTextView
|
||||||
|
android:id="@id/messageText"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/dark_grey_two"
|
||||||
|
android:textIsSelectable="true"
|
||||||
|
android:textSize="14sp" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@id/imageOverlay"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@id/messageTime"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/messageText"
|
||||||
|
android:layout_alignParentEnd="true"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
|
~ Nextcloud Talk application
|
||||||
|
~
|
||||||
|
~ @author Mario Danic
|
||||||
|
~ Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||||
|
~
|
||||||
|
~ 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 <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="2dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginBottom="2dp">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:background="@drawable/shape_preview_text_outcoming_message">
|
||||||
|
|
||||||
|
<com.stfalcon.chatkit.utils.RoundedImageView
|
||||||
|
android:id="@id/image"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:adjustViewBounds="true" />
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/image"
|
||||||
|
android:layout_alignStart="@+id/image"
|
||||||
|
android:layout_alignEnd="@id/image"
|
||||||
|
android:layout_margin="8dp">
|
||||||
|
|
||||||
|
<com.kevalpatel2106.emoticongifkeyboard.widget.EmoticonTextView
|
||||||
|
android:id="@id/messageText"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/nc_outcoming_text_default"
|
||||||
|
android:textIsSelectable="true"
|
||||||
|
android:textSize="14sp" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@id/imageOverlay"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@id/messageTime"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/messageText"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:textColor="@color/white60"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
</RelativeLayout>
|
@ -35,8 +35,7 @@
|
|||||||
android:id="@id/attachmentButtonSpace"
|
android:id="@id/attachmentButtonSpace"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_toEndOf="@id/attachmentButton"
|
android:layout_toEndOf="@id/attachmentButton"/>
|
||||||
android:layout_toRightOf="@id/attachmentButton"/>
|
|
||||||
|
|
||||||
<com.kevalpatel2106.emoticongifkeyboard.widget.EmoticonEditText
|
<com.kevalpatel2106.emoticongifkeyboard.widget.EmoticonEditText
|
||||||
android:id="@id/messageInput"
|
android:id="@id/messageInput"
|
||||||
@ -44,8 +43,6 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
android:layout_toEndOf="@id/attachmentButtonSpace"
|
android:layout_toEndOf="@id/attachmentButtonSpace"
|
||||||
android:layout_toLeftOf="@id/sendButtonSpace"
|
|
||||||
android:layout_toRightOf="@id/attachmentButtonSpace"
|
|
||||||
android:layout_toStartOf="@id/sendButtonSpace"
|
android:layout_toStartOf="@id/sendButtonSpace"
|
||||||
android:inputType="textAutoCorrect|textAutoComplete|textMultiLine|textCapSentences"/>
|
android:inputType="textAutoCorrect|textAutoComplete|textMultiLine|textCapSentences"/>
|
||||||
|
|
||||||
@ -53,7 +50,6 @@
|
|||||||
android:id="@id/sendButtonSpace"
|
android:id="@id/sendButtonSpace"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_toLeftOf="@id/messageSendButton"
|
|
||||||
android:layout_toStartOf="@id/messageSendButton"/>
|
android:layout_toStartOf="@id/messageSendButton"/>
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
@ -61,7 +57,6 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_alignParentRight="true"
|
|
||||||
android:layout_centerVertical="true"/>
|
android:layout_centerVertical="true"/>
|
||||||
|
|
||||||
</merge>
|
</merge>
|
||||||
|
Loading…
Reference in New Issue
Block a user