Skip to content
Merged
20 changes: 13 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,10 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3'
implementation 'androidx.emoji:emoji-bundled:1.0.0'
implementation 'org.michaelevans.colorart:library:0.0.3'
implementation "android.arch.work:work-runtime:${workVersion}"
implementation "android.arch.work:work-runtime:1.0.0-beta01"
implementation "android.arch.work:work-firebase:${workVersion}"
androidTestImplementation "android.arch.work:work-testing:${workVersion}"

Expand Down Expand Up @@ -154,11 +154,11 @@ dependencies {

implementation 'net.orange-box.storebox:storebox-lib:1.4.0'

compileOnly "org.projectlombok:lombok:1.18.2"
annotationProcessor "org.projectlombok:lombok:1.18.2"
compileOnly "org.projectlombok:lombok:1.18.4"
annotationProcessor "org.projectlombok:lombok:1.18.4"

implementation 'com.jakewharton:butterknife:9.0.0-rc1'
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
implementation 'com.jakewharton:butterknife:9.0.0-rc2'
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc2'

implementation 'com.github.HITGIF:TextFieldBoxes:1.4.3'

Expand All @@ -168,6 +168,11 @@ dependencies {
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
implementation 'com.github.bumptech.glide:okhttp3-integration:4.8.0@aar'
implementation 'com.facebook.fresco:fresco:1.11.0'
implementation 'com.facebook.fresco:animated-webp:1.11.0'
implementation 'com.facebook.fresco:webpsupport:1.11.0'
implementation 'com.facebook.fresco:animated-gif:1.11.0'
implementation "com.facebook.fresco:imagepipeline-okhttp3:1.11.0"
implementation 'org.webrtc:google-webrtc:1.0.23295'
implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}"

Expand All @@ -181,7 +186,7 @@ dependencies {

implementation 'com.github.wooplr:Spotlight:1.3'

implementation 'com.github.mario:Chatkit:31d75fd532'
implementation 'com.github.mario:chatkit:628c909ef4'

implementation 'com.otaliastudios:autocomplete:1.1.0'

Expand All @@ -194,6 +199,7 @@ dependencies {

implementation 'uk.co.chrisjenx:calligraphy:2.3.0'

implementation group: 'eu.medsea.mimeutil', name: 'mime-util', version: '2.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation ('androidx.test.espresso:espresso-core:3.1.0-alpha4', {
exclude group: 'com.android.support', module: 'support-annotations'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import com.nextcloud.talk.R;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.models.database.UserEntity;
import com.nextcloud.talk.models.json.chat.ChatMessage;
import com.nextcloud.talk.models.json.rooms.Conversation;
import com.nextcloud.talk.utils.ApiUtils;
import com.nextcloud.talk.utils.glide.GlideApp;
Expand Down Expand Up @@ -125,7 +126,7 @@ public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, ConversationItemV
holder.dialogUnreadBubble.setVisibility(View.GONE);
}

String authorDisplayName = "";
String authorDisplayName;

if (conversation.isHasPassword()) {
holder.passwordProtectedRoomImageView.setVisibility(View.VISIBLE);
Expand All @@ -144,38 +145,45 @@ public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, ConversationItemV
holder.dialogDate.setText(DateUtils.getRelativeTimeSpanString(conversation.getLastActivity() * 1000L,
System.currentTimeMillis(), 0, DateUtils.FORMAT_ABBREV_RELATIVE));

if (conversation.getType() == Conversation.RoomType.ROOM_TYPE_ONE_TO_ONE_CALL || !(TextUtils.isEmpty(conversation.getLastMessage().getSystemMessage()))) {
if (!TextUtils.isEmpty(conversation.getLastMessage().getSystemMessage())) {
holder.dialogLastMessageUserAvatar.setVisibility(View.GONE);
holder.dialogLastMessage.setText(conversation.getLastMessage().getText());
} else {
holder.dialogLastMessageUserAvatar.setVisibility(View.VISIBLE);
if (conversation.getLastMessage().getActorId().equals(userEntity.getUserId())) {
authorDisplayName = context.getString(R.string.nc_chat_you) + ": ";
authorDisplayName = context.getString(R.string.nc_chat_you);
} else {
if (!TextUtils.isEmpty(conversation.getLastMessage().getActorDisplayName())) {
authorDisplayName = conversation.getLastMessage().getActorDisplayName() + ": ";
authorDisplayName = conversation.getLastMessage().getActorDisplayName();
} else {
authorDisplayName = context.getString(R.string.nc_nick_guest) + ": ";
authorDisplayName = context.getString(R.string.nc_nick_guest);
}
}

String fullString = authorDisplayName + conversation.getLastMessage().getText();
if (conversation.getLastMessage().getMessageType().equals(ChatMessage.MessageType.REGULAR_TEXT_MESSAGE)) {
authorDisplayName += ": ";
} else {
authorDisplayName += " ";
}

String fullString = authorDisplayName + conversation.getLastMessage().getLastMessageDisplayText();
Spannable spannableString = new SpannableString(fullString);
final StyleSpan boldStyleSpan = new StyleSpan(Typeface.BOLD);
spannableString.setSpan(boldStyleSpan, 0, fullString.indexOf(":") + 1, Spannable
.SPAN_INCLUSIVE_INCLUSIVE);
spannableString.setSpan(boldStyleSpan, 0, fullString.indexOf(" "), Spannable
.SPAN_INCLUSIVE_EXCLUSIVE);

holder.dialogLastMessage.setText(spannableString);
holder.dialogLastMessageUserAvatar.setVisibility(View.VISIBLE);

int smallAvatarSize = Math.round(context.getResources().getDimension(R.dimen.small_item_height));

if (conversation.getLastMessage().getActorType().equals("guests")) {
holder.dialogLastMessageUserAvatar.setVisibility(View.VISIBLE);
TextDrawable drawable = TextDrawable.builder().beginConfig().bold()
.endConfig().buildRound(String.valueOf(authorDisplayName.charAt(0)),
context.getResources().getColor(R.color.nc_grey));
holder.dialogLastMessageUserAvatar.setImageDrawable(drawable);
} else {
} else if (conversation.getLastMessage().getActorId().equals(userEntity.getUserId())
|| !conversation.getType().equals(Conversation.RoomType.ROOM_TYPE_ONE_TO_ONE_CALL)) {
holder.dialogLastMessageUserAvatar.setVisibility(View.VISIBLE);
GlideUrl glideUrl = new GlideUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(),
conversation.getLastMessage().getActorId(), R.dimen.small_item_height), new LazyHeaders.Builder()
.setHeader("Accept", "image/*")
Expand All @@ -190,6 +198,8 @@ public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, ConversationItemV
.override(smallAvatarSize, smallAvatarSize)
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
.into(holder.dialogLastMessageUserAvatar);
} else {
holder.dialogLastMessageUserAvatar.setVisibility(View.GONE);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,16 @@
import android.widget.TextView;

import com.amulyakhare.textdrawable.TextDrawable;
import com.facebook.drawee.view.SimpleDraweeView;
import com.google.android.flexbox.FlexboxLayout;
import com.kevalpatel2106.emoticongifkeyboard.widget.EmoticonTextView;
import com.nextcloud.talk.R;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.models.json.chat.ChatMessage;
import com.nextcloud.talk.utils.DisplayUtils;
import com.nextcloud.talk.utils.EmojiDetection;
import com.nextcloud.talk.utils.TextMatchers;
import com.nextcloud.talk.utils.database.user.UserUtils;
import com.stfalcon.chatkit.messages.MessageHolders;
import com.stfalcon.chatkit.utils.ShapeImageView;

import java.util.HashMap;
import java.util.Map;
Expand All @@ -65,7 +65,7 @@ public class MagicIncomingTextMessageViewHolder
EmoticonTextView messageText;

@BindView(R.id.messageUserAvatar)
ShapeImageView messageUserAvatarView;
SimpleDraweeView messageUserAvatarView;

@BindView(R.id.messageTime)
TextView messageTimeView;
Expand Down Expand Up @@ -156,7 +156,7 @@ public void onBind(ChatMessage message) {
}
}

} else if (EmojiDetection.isMessageWithSingleEmoticonOnly(context, message.getText())) {
} else if (TextMatchers.isMessageWithSingleEmoticonOnly(context, message.getText())) {
messageString.setSpan(new RelativeSizeSpan(2.5f), 0, messageString.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
layoutParams.setWrapBefore(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.models.json.chat.ChatMessage;
import com.nextcloud.talk.utils.DisplayUtils;
import com.nextcloud.talk.utils.EmojiDetection;
import com.nextcloud.talk.utils.TextMatchers;
import com.nextcloud.talk.utils.database.user.UserUtils;
import com.stfalcon.chatkit.messages.MessageHolders;

Expand Down Expand Up @@ -106,7 +106,7 @@ public void onBind(ChatMessage message) {
}
}

} else if (EmojiDetection.isMessageWithSingleEmoticonOnly(context, message.getText())) {
} else if (TextMatchers.isMessageWithSingleEmoticonOnly(context, message.getText())) {
messageString.setSpan(new RelativeSizeSpan(2.5f), 0, messageString.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
layoutParams.setWrapBefore(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

package com.nextcloud.talk.adapters.messages;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.net.Uri;
import android.view.View;
Expand All @@ -28,8 +29,8 @@
import com.nextcloud.talk.R;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.models.json.chat.ChatMessage;
import com.nextcloud.talk.utils.DisplayUtils;
import com.stfalcon.chatkit.messages.MessageHolders;
import com.stfalcon.chatkit.utils.RoundedImageView;

import butterknife.BindView;
import butterknife.ButterKnife;
Expand All @@ -44,38 +45,36 @@ public MagicPreviewMessageViewHolder(View itemView) {
ButterKnife.bind(this, itemView);
}

@SuppressLint("SetTextI18n")
@Override
public void onBind(ChatMessage message) {
super.onBind(message);

if (userAvatar != null) {
if (message.isGrouped) {
userAvatar.setVisibility(View.INVISIBLE);
((RoundedImageView) image).setCorners(R.dimen.message_bubble_corners_radius, R.dimen.message_bubble_corners_radius, 0, 0);
} else {
userAvatar.setVisibility(View.VISIBLE);
}
}


if (message.getUser().getId().equals(message.activeUserId)) {
time.setTextColor(NextcloudTalkApplication.getSharedApplication().getResources().getColor(R.color.white60));
if (!message.isGrouped) {
((RoundedImageView) image).setCorners(R.dimen.message_bubble_corners_radius, 0, 0, 0);
}
if (message.getMessageType() == ChatMessage.MessageType.SINGLE_NC_ATTACHMENT_MESSAGE) {
// it's a preview for a Nextcloud share
messageText.setText(message.getSelectedIndividualHashMap().get("name"));
DisplayUtils.setClickableString(message.getSelectedIndividualHashMap().get("name"), message.getSelectedIndividualHashMap().get("link"), messageText);
image.setOnClickListener(v -> {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(message.getSelectedIndividualHashMap().get("link")));
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
NextcloudTalkApplication.getSharedApplication().getApplicationContext().startActivity(browserIntent);
});
} else if (message.getMessageType() == ChatMessage.MessageType.SINGLE_LINK_GIPHY_MESSAGE){
messageText.setText("GIPHY");
DisplayUtils.setClickableString("GIPHY", "https://giphy.com", messageText);
} else if (message.getMessageType() == ChatMessage.MessageType.SINGLE_LINK_TENOR_MESSAGE) {
messageText.setText("Tenor");
DisplayUtils.setClickableString("Tenor", "https://tenor.com", messageText);
} else {
time.setTextColor(NextcloudTalkApplication.getSharedApplication().getResources().getColor(R.color.warm_grey_four));
if (!message.isGrouped) {
((RoundedImageView) image).setCorners(0, R.dimen.message_bubble_corners_radius, 0, 0);
}
messageText.setText("");
}


messageText.setText(message.getSelectedIndividualHashMap().get("name"));
image.setOnClickListener(v -> {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(message.getSelectedIndividualHashMap().get("link")));
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
NextcloudTalkApplication.getSharedApplication().getApplicationContext().startActivity(browserIntent);
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
import android.os.Build;
import android.util.Log;

import com.facebook.cache.disk.DiskCacheConfig;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import com.nextcloud.talk.dagger.modules.BusModule;
import com.nextcloud.talk.dagger.modules.ContextModule;
import com.nextcloud.talk.dagger.modules.DatabaseModule;
Expand All @@ -35,6 +38,7 @@
import com.nextcloud.talk.utils.ClosedInterfaceImpl;
import com.nextcloud.talk.utils.DeviceUtils;
import com.nextcloud.talk.utils.DisplayUtils;
import com.nextcloud.talk.utils.OkHttpNetworkFetcherWithCache;
import com.nextcloud.talk.utils.database.arbitrarystorage.ArbitraryStorageModule;
import com.nextcloud.talk.utils.database.user.UserModule;
import com.nextcloud.talk.webrtc.MagicWebRTCUtils;
Expand All @@ -45,6 +49,7 @@

import java.util.concurrent.TimeUnit;

import javax.inject.Inject;
import javax.inject.Singleton;

import androidx.lifecycle.LifecycleObserver;
Expand All @@ -55,6 +60,7 @@
import androidx.work.WorkManager;
import autodagger.AutoComponent;
import autodagger.AutoInjector;
import okhttp3.OkHttpClient;
import uk.co.chrisjenx.calligraphy.CalligraphyConfig;

@AutoComponent(
Expand All @@ -71,6 +77,9 @@
@Singleton
@AutoInjector(NextcloudTalkApplication.class)
public class NextcloudTalkApplication extends MultiDexApplication implements LifecycleObserver {
@Inject
OkHttpClient okHttpClient;

private static final String TAG = NextcloudTalkApplication.class.getSimpleName();

//region Singleton
Expand Down Expand Up @@ -124,6 +133,17 @@ public void onCreate() {

componentApplication.inject(this);

ImagePipelineConfig imagePipelineConfig = ImagePipelineConfig.newBuilder(this)
.setNetworkFetcher(new OkHttpNetworkFetcherWithCache(okHttpClient))
.setMainDiskCacheConfig(DiskCacheConfig.newBuilder(this)
.setMaxCacheSize(0)
.setMaxCacheSizeOnLowDiskSpace(0)
.setMaxCacheSizeOnVeryLowDiskSpace(0)
.build())
.build();

Fresco.initialize(this, imagePipelineConfig);

new ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync();
DeviceUtils.ignoreSpecialBatteryFeatures();

Expand Down
Loading