From a71444637ac8ee30c602ea64a13d5e22b05d7dcd Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 28 Dec 2018 21:07:21 +0100 Subject: [PATCH 01/14] Fixes #398 Signed-off-by: Mario Danic --- app/build.gradle | 11 ++- .../MagicIncomingTextMessageViewHolder.java | 8 +- .../MagicOutcomingTextMessageViewHolder.java | 4 +- .../MagicPreviewMessageViewHolder.java | 38 ++++----- .../application/NextcloudTalkApplication.java | 22 ++++++ .../talk/controllers/ChatController.java | 65 +++++----------- .../talk/dagger/modules/RestModule.java | 2 +- .../talk/models/json/chat/ChatMessage.java | 9 +++ .../nextcloud/talk/utils/DisplayUtils.java | 78 +++++++++++++++++++ .../utils/OkHttpNetworkFetcherWithCache.java | 42 ++++++++++ ...{EmojiDetection.java => TextMatchers.java} | 34 +++++++- .../main/res/drawable/incoming_corners.xml | 28 +++++++ .../res/drawable/shape_grouped_message.xml | 29 +++++++ .../shape_preview_text_incoming_message.xml | 4 +- .../shape_preview_text_outcoming_message.xml | 2 +- .../item_custom_incoming_preview_message.xml | 37 ++++----- .../item_custom_incoming_text_message.xml | 3 +- .../item_custom_outcoming_preview_message.xml | 62 +++++++-------- .../item_custom_outcoming_text_message.xml | 1 - 19 files changed, 344 insertions(+), 135 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/utils/OkHttpNetworkFetcherWithCache.java rename app/src/main/java/com/nextcloud/talk/utils/{EmojiDetection.java => TextMatchers.java} (74%) create mode 100644 app/src/main/res/drawable/incoming_corners.xml create mode 100644 app/src/main/res/drawable/shape_grouped_message.xml diff --git a/app/build.gradle b/app/build.gradle index e065eabc529..b874edb7ef1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -154,8 +154,8 @@ 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' @@ -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}" @@ -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' diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.java index f5193288291..6d1de33cfd0 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.java @@ -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; @@ -65,7 +65,7 @@ public class MagicIncomingTextMessageViewHolder EmoticonTextView messageText; @BindView(R.id.messageUserAvatar) - ShapeImageView messageUserAvatarView; + SimpleDraweeView messageUserAvatarView; @BindView(R.id.messageTime) TextView messageTimeView; @@ -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); 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 2459ab44c64..ef7be6b83ea 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 @@ -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; @@ -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); 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 index caf5ffe2119..52ee7713160 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java @@ -28,8 +28,9 @@ 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.TextMatchers; import com.stfalcon.chatkit.messages.MessageHolders; -import com.stfalcon.chatkit.utils.RoundedImageView; import butterknife.BindView; import butterknife.ButterKnife; @@ -51,31 +52,26 @@ public void onBind(ChatMessage 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); - } - } 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); - } + if (message.getSpecialURLType() == TextMatchers.SpecialURLType.NONE) { + // 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.getSpecialURLType() == TextMatchers.SpecialURLType.GIPHY){ + messageText.setText("GIPHY"); + DisplayUtils.setClickableString("GIPHY", "https://giphy.com", messageText); + } else if (message.getSpecialURLType() == TextMatchers.SpecialURLType.TENOR) { + messageText.setText("Tenor"); + DisplayUtils.setClickableString("Tenor", "https://tenor.com", messageText); } - - - 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); - }); } } diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java index 434f352afc3..b9c34ee734a 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java @@ -24,6 +24,10 @@ import android.os.Build; import android.util.Log; +import com.facebook.cache.disk.DiskCacheConfig; +import com.facebook.common.logging.FLog; +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; @@ -35,6 +39,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; @@ -45,6 +50,7 @@ import java.util.concurrent.TimeUnit; +import javax.inject.Inject; import javax.inject.Singleton; import androidx.lifecycle.LifecycleObserver; @@ -55,6 +61,7 @@ import androidx.work.WorkManager; import autodagger.AutoComponent; import autodagger.AutoInjector; +import okhttp3.OkHttpClient; import uk.co.chrisjenx.calligraphy.CalligraphyConfig; @AutoComponent( @@ -71,6 +78,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 @@ -124,6 +134,18 @@ 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); + FLog.setMinimumLoggingLevel(FLog.VERBOSE); + new ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync(); DeviceUtils.ignoreSpecialBatteryFeatures(); 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 8bb022a98c5..d865cdc3a71 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java @@ -25,10 +25,10 @@ import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.text.Editable; @@ -43,21 +43,17 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; -import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; -import com.amulyakhare.textdrawable.TextDrawable; import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; -import com.bumptech.glide.load.DataSource; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.engine.GlideException; -import com.bumptech.glide.load.resource.bitmap.CircleCrop; -import com.bumptech.glide.request.RequestListener; -import com.bumptech.glide.request.RequestOptions; -import com.bumptech.glide.request.target.Target; +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.drawee.interfaces.DraweeController; +import com.facebook.drawee.view.SimpleDraweeView; +import com.facebook.imagepipeline.request.ImageRequest; +import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.nextcloud.talk.R; import com.nextcloud.talk.activities.MagicCallActivity; import com.nextcloud.talk.adapters.messages.MagicIncomingTextMessageViewHolder; @@ -80,11 +76,11 @@ import com.nextcloud.talk.models.json.rooms.RoomsOverall; import com.nextcloud.talk.presenters.MentionAutocompletePresenter; import com.nextcloud.talk.utils.ApiUtils; +import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.KeyboardUtils; import com.nextcloud.talk.utils.NotificationUtils; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; -import com.nextcloud.talk.utils.glide.GlideApp; import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder; import com.otaliastudios.autocomplete.Autocomplete; import com.otaliastudios.autocomplete.AutocompleteCallback; @@ -97,7 +93,6 @@ 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; @@ -113,7 +108,6 @@ import javax.inject.Inject; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import autodagger.AutoInjector; @@ -326,38 +320,19 @@ protected void onViewBound(@NonNull View view) { adapter = new MessagesListAdapter<>(conversationUser.getUserId(), messageHolders, new ImageLoader() { @Override - public void loadImage(ImageView imageView, String url) { - 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); - } else { - GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext()) - .asBitmap() - .diskCacheStrategy(DiskCacheStrategy.NONE) - .override(480, 480) - .load(url) - .into(imageView); - } + public void loadImage(SimpleDraweeView imageView, String url) { + ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url)) + .setProgressiveRenderingEnabled(true) + .disableDiskCache() + .build(); + + DraweeController draweeController = Fresco.newDraweeControllerBuilder() + .setImageRequest(request) + .setControllerListener(DisplayUtils.getImageControllerListener(imageView)) + .setOldController(imageView.getController()) + .setAutoPlayAnimations(true) + .build(); + imageView.setController(draweeController); } }); } else { diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java b/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java index 69a59277f51..595a20fae3b 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java @@ -251,7 +251,7 @@ public Request authenticate(@NonNull Route route, @NonNull Response response) th } } - private class HeadersInterceptor implements Interceptor { + public static class HeadersInterceptor implements Interceptor { @Override public Response intercept(@NonNull Chain chain) throws IOException { 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 abb59fcbcd5..6332b7edaae 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 @@ -25,6 +25,7 @@ import com.nextcloud.talk.R; import com.nextcloud.talk.models.json.converters.EnumSystemMessageTypeConverter; import com.nextcloud.talk.utils.ApiUtils; +import com.nextcloud.talk.utils.TextMatchers; import com.stfalcon.chatkit.commons.models.IMessage; import com.stfalcon.chatkit.commons.models.IUser; import com.stfalcon.chatkit.commons.models.MessageContentType; @@ -44,6 +45,10 @@ @JsonObject public class ChatMessage implements IMessage, MessageContentType, MessageContentType.Image { + public TextMatchers.SpecialURLType getSpecialURLType() { + return TextMatchers.getSpecialUrlTypeMessage(getMessage()); + } + @Nullable @Override public String getImageUrl() { @@ -59,6 +64,10 @@ public String getImageUrl() { } } + if (getSpecialURLType() != TextMatchers.SpecialURLType.NONE) { + return getMessage().trim(); + } + return null; } diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java index fcada95ab92..7d628e51fcc 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java @@ -22,19 +22,33 @@ import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Typeface; +import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.Build; import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextPaint; import android.text.TextUtils; +import android.text.method.LinkMovementMethod; import android.text.style.AbsoluteSizeSpan; +import android.text.style.ClickableSpan; import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.util.DisplayMetrics; import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import com.facebook.drawee.controller.ControllerListener; +import com.facebook.drawee.view.SimpleDraweeView; +import com.facebook.imagepipeline.image.ImageInfo; import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; @@ -47,6 +61,8 @@ import androidx.annotation.ColorInt; import androidx.annotation.ColorRes; import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.widget.AppCompatDrawableManager; import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.DrawableCompat; @@ -55,6 +71,68 @@ public class DisplayUtils { private static final String TAG = "DisplayUtils"; + public static void setClickableString(String string, String url, TextView textView){ + SpannableString spannableString = new SpannableString(string); + spannableString.setSpan(new ClickableSpan() { + @Override + public void onClick(@NonNull View widget) { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + NextcloudTalkApplication.getSharedApplication().getApplicationContext().startActivity(browserIntent); + } + + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + ds.setUnderlineText(false); + } + }, 0, string.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + textView.setText(spannableString); + textView.setMovementMethod(LinkMovementMethod.getInstance()); + } + + private static void updateViewSize(@Nullable ImageInfo imageInfo, SimpleDraweeView draweeView) { + if (imageInfo != null) { + draweeView.getLayoutParams().width = imageInfo.getWidth(); + draweeView.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; + draweeView.setAspectRatio((float) imageInfo.getWidth() / imageInfo.getHeight()); + } + } + + public static ControllerListener getImageControllerListener(SimpleDraweeView draweeView) { + return new ControllerListener() { + @Override + public void onSubmit(String id, Object callerContext) { + + } + + @Override + public void onFinalImageSet(String id, @javax.annotation.Nullable Object imageInfo, @javax.annotation.Nullable Animatable animatable) { + updateViewSize((ImageInfo)imageInfo, draweeView); + } + + @Override + public void onIntermediateImageSet(String id, @javax.annotation.Nullable Object imageInfo) { + updateViewSize((ImageInfo) imageInfo, draweeView); + } + + @Override + public void onIntermediateImageFailed(String id, Throwable throwable) { + + } + + @Override + public void onFailure(String id, Throwable throwable) { + + } + + @Override + public void onRelease(String id) { + + } + }; + } + public static float convertDpToPixel(float dp, Context context) { Resources resources = context.getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); diff --git a/app/src/main/java/com/nextcloud/talk/utils/OkHttpNetworkFetcherWithCache.java b/app/src/main/java/com/nextcloud/talk/utils/OkHttpNetworkFetcherWithCache.java new file mode 100644 index 00000000000..0f923f92f87 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/utils/OkHttpNetworkFetcherWithCache.java @@ -0,0 +1,42 @@ +/* + * 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.utils; + +import com.facebook.imagepipeline.backends.okhttp3.OkHttpNetworkFetcher; + +import java.util.concurrent.Executor; + +import okhttp3.Call; +import okhttp3.OkHttpClient; + +public class OkHttpNetworkFetcherWithCache extends OkHttpNetworkFetcher { + public OkHttpNetworkFetcherWithCache(OkHttpClient okHttpClient) { + super(okHttpClient); + } + + public OkHttpNetworkFetcherWithCache(Call.Factory callFactory, Executor cancellationExecutor) { + super(callFactory, cancellationExecutor); + } + + public OkHttpNetworkFetcherWithCache(Call.Factory callFactory, Executor cancellationExecutor, boolean disableOkHttpCache) { + super(callFactory, cancellationExecutor, true); + } +} diff --git a/app/src/main/java/com/nextcloud/talk/utils/EmojiDetection.java b/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java similarity index 74% rename from app/src/main/java/com/nextcloud/talk/utils/EmojiDetection.java rename to app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java index af8314d567f..de971ffacb5 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/EmojiDetection.java +++ b/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java @@ -25,6 +25,7 @@ import android.content.Context; import android.text.TextUtils; import android.util.Log; +import android.util.Patterns; import com.nextcloud.talk.R; @@ -32,18 +33,49 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -public final class EmojiDetection { +public final class TextMatchers { private static final String TAG = "EmojiDetection"; private static Pattern regexPattern; + public enum SpecialURLType { + NONE, + GIPHY, + TENOR, + } + + public static SpecialURLType getSpecialUrlTypeMessage(@NonNull final String text) { + List links = new ArrayList<>(); + Matcher m = Patterns.WEB_URL.matcher(text); + while (m.find()) { + String url = m.group(); + links.add(url); + } + + if (links.size() == 1 && text.trim().length() == links.get(0).length()) { + String specialLink = links.get(0); + if (specialLink.startsWith("https://media.giphy.com/") && specialLink.endsWith(".gif")) { + return SpecialURLType.GIPHY; + } else if (specialLink.contains("tenor.com/")) { + Pattern pattern = Pattern.compile("https://media.*\\.tenor\\.com.*\\.gif.*", Pattern.CASE_INSENSITIVE); + if (pattern.matcher(specialLink).matches()) { + return SpecialURLType.TENOR; + } + } + } + + return SpecialURLType.NONE; + } + public static boolean isMessageWithSingleEmoticonOnly(@NonNull final Context context, @Nullable final CharSequence text) { diff --git a/app/src/main/res/drawable/incoming_corners.xml b/app/src/main/res/drawable/incoming_corners.xml new file mode 100644 index 00000000000..cda5311cefb --- /dev/null +++ b/app/src/main/res/drawable/incoming_corners.xml @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/shape_grouped_message.xml b/app/src/main/res/drawable/shape_grouped_message.xml new file mode 100644 index 00000000000..6d94b645a20 --- /dev/null +++ b/app/src/main/res/drawable/shape_grouped_message.xml @@ -0,0 +1,29 @@ + + + + + + + + + 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 index 4bbdc188b35..9a21b0f168c 100644 --- a/app/src/main/res/drawable/shape_preview_text_incoming_message.xml +++ b/app/src/main/res/drawable/shape_preview_text_incoming_message.xml @@ -26,7 +26,7 @@ android:topLeftRadius="0dp" android:bottomRightRadius="@dimen/message_bubble_corners_radius" android:bottomLeftRadius="@dimen/message_bubble_corners_radius" - android:topRightRadius="0dp" /> + android:topRightRadius="@dimen/message_bubble_corners_radius" /> - + 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 index de862033951..343688079e9 100644 --- a/app/src/main/res/drawable/shape_preview_text_outcoming_message.xml +++ b/app/src/main/res/drawable/shape_preview_text_outcoming_message.xml @@ -28,5 +28,5 @@ android:bottomLeftRadius="@dimen/message_bubble_corners_radius" android:topRightRadius="0dp" /> - + diff --git a/app/src/main/res/layout/item_custom_incoming_preview_message.xml b/app/src/main/res/layout/item_custom_incoming_preview_message.xml index 56ae9fd2715..ce3fdee7c29 100644 --- a/app/src/main/res/layout/item_custom_incoming_preview_message.xml +++ b/app/src/main/res/layout/item_custom_incoming_preview_message.xml @@ -19,6 +19,7 @@ --> - + android:layout_marginEnd="8dp" + app:roundAsCircle="true" /> + android:layout_toEndOf="@id/messageUserAvatar"> - + android:layout_width="480px" + android:layout_height="480px" + android:adjustViewBounds="true" + app:actualImageScaleType="fitCenter" /> + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp"> - - + android:textSize="12sp" /> + android:layout_alignParentEnd="true" + android:textColor="@color/warm_grey_four" /> diff --git a/app/src/main/res/layout/item_custom_incoming_text_message.xml b/app/src/main/res/layout/item_custom_incoming_text_message.xml index 1cb56d31cad..aa16418a6a5 100644 --- a/app/src/main/res/layout/item_custom_incoming_text_message.xml +++ b/app/src/main/res/layout/item_custom_incoming_text_message.xml @@ -27,10 +27,11 @@ android:layout_marginRight="16dp" android:layout_marginBottom="2dp"> - 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 index 19bb330af66..ba3cdf3a4f5 100644 --- a/app/src/main/res/layout/item_custom_outcoming_preview_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_preview_message.xml @@ -19,55 +19,47 @@ --> + + + android:layout_below="@id/image" + android:layout_alignStart="@+id/image" + android:layout_alignEnd="@id/image" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp"> - + android:autoLink="all" + android:textColorLink="@color/warm_grey_four" + android:textColor="@color/warm_grey_four" + android:textIsSelectable="true" + android:textSize="12sp" /> - - - - - - - - - - + android:layout_alignParentEnd="true" + android:textColor="@color/warm_grey_four" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/item_custom_outcoming_text_message.xml b/app/src/main/res/layout/item_custom_outcoming_text_message.xml index 40b41c5f3aa..f366107ee52 100644 --- a/app/src/main/res/layout/item_custom_outcoming_text_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_text_message.xml @@ -44,7 +44,6 @@ android:layout_height="wrap_content" android:layout_alignWithParentIfMissing="true" android:textColorHighlight="@color/nc_grey" - android:textIsSelectable="true" /> Date: Fri, 28 Dec 2018 21:11:50 +0100 Subject: [PATCH 02/14] Clean up Signed-off-by: Mario Danic --- .../shape_preview_text_incoming_message.xml | 32 ------------------- .../shape_preview_text_outcoming_message.xml | 32 ------------------- 2 files changed, 64 deletions(-) delete mode 100644 app/src/main/res/drawable/shape_preview_text_incoming_message.xml delete mode 100644 app/src/main/res/drawable/shape_preview_text_outcoming_message.xml 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 deleted file mode 100644 index 9a21b0f168c..00000000000 --- a/app/src/main/res/drawable/shape_preview_text_incoming_message.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - 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 deleted file mode 100644 index 343688079e9..00000000000 --- a/app/src/main/res/drawable/shape_preview_text_outcoming_message.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - From 1c1cc4ee099f8bc6ee04a50c4c6b792f3bb97075 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 28 Dec 2018 22:00:07 +0100 Subject: [PATCH 03/14] New line in layouts Signed-off-by: Mario Danic --- .../main/res/layout/item_custom_incoming_preview_message.xml | 2 +- .../main/res/layout/item_custom_outcoming_preview_message.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/item_custom_incoming_preview_message.xml b/app/src/main/res/layout/item_custom_incoming_preview_message.xml index ce3fdee7c29..576f9ac52f2 100644 --- a/app/src/main/res/layout/item_custom_incoming_preview_message.xml +++ b/app/src/main/res/layout/item_custom_incoming_preview_message.xml @@ -78,4 +78,4 @@ - \ 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 index ba3cdf3a4f5..011f9b4885a 100644 --- a/app/src/main/res/layout/item_custom_outcoming_preview_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_preview_message.xml @@ -62,4 +62,4 @@ android:textColor="@color/warm_grey_four" /> - \ No newline at end of file + From 4b530dbf6a475217d7bd8a31cca2fc39672a9f74 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 28 Dec 2018 22:05:10 +0100 Subject: [PATCH 04/14] Change send button scale type Signed-off-by: Mario Danic --- app/src/main/res/layout/view_message_input.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/view_message_input.xml b/app/src/main/res/layout/view_message_input.xml index d05fc3dbad5..c43aa530fbc 100644 --- a/app/src/main/res/layout/view_message_input.xml +++ b/app/src/main/res/layout/view_message_input.xml @@ -53,6 +53,7 @@ android:id="@id/messageSendButton" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:scaleType="fitCenter" android:layout_alignParentEnd="true" android:layout_centerVertical="true" /> From 0d6df931ea094a9fbcc4222a20cdde6e535b8f1a Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 28 Dec 2018 22:08:02 +0100 Subject: [PATCH 05/14] Add regular link type Signed-off-by: Mario Danic --- app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java b/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java index de971ffacb5..55859a57452 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java +++ b/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java @@ -49,6 +49,7 @@ public final class TextMatchers { public enum SpecialURLType { NONE, + REGULAR, GIPHY, TENOR, } @@ -70,6 +71,8 @@ public static SpecialURLType getSpecialUrlTypeMessage(@NonNull final String text if (pattern.matcher(specialLink).matches()) { return SpecialURLType.TENOR; } + } else { + return SpecialURLType.REGULAR; } } From 5cbb8c2e319c014a738ab6ae74a1093eb2c2a09b Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 28 Dec 2018 22:58:25 +0100 Subject: [PATCH 06/14] Significantly improve last message display Signed-off-by: Mario Danic --- .../talk/adapters/items/ConversationItem.java | 30 ++++++++++------ .../talk/models/json/chat/ChatMessage.java | 36 ++++++++++++++++++- app/src/main/res/values/strings.xml | 3 ++ 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index a7c0faa654f..178c3227663 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -42,6 +42,7 @@ import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.rooms.Conversation; import com.nextcloud.talk.utils.ApiUtils; +import com.nextcloud.talk.utils.TextMatchers; import com.nextcloud.talk.utils.glide.GlideApp; import org.apache.commons.lang3.StringUtils; @@ -144,38 +145,45 @@ public void bindViewHolder(FlexibleAdapter 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().getSpecialURLType().equals(TextMatchers.SpecialURLType.NONE)) { + 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/*") @@ -190,6 +198,8 @@ public void bindViewHolder(FlexibleAdapter adapter, ConversationItemV .override(smallAvatarSize, smallAvatarSize) .apply(RequestOptions.bitmapTransform(new CircleCrop())) .into(holder.dialogLastMessageUserAvatar); + } else { + holder.dialogLastMessageUserAvatar.setVisibility(View.GONE); } } 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 6332b7edaae..b822213df27 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 @@ -23,6 +23,7 @@ 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.nextcloud.talk.utils.TextMatchers; @@ -49,6 +50,19 @@ public TextMatchers.SpecialURLType getSpecialURLType() { return TextMatchers.getSpecialUrlTypeMessage(getMessage()); } + private boolean hasFileAttachment() { + if (messageParameters != null && messageParameters.size() > 0) { + for (String key : messageParameters.keySet()) { + Map individualHashMap = messageParameters.get(key); + if (individualHashMap.get("type").equals("file")) { + return true; + } + } + } + + return false; + } + @Nullable @Override public String getImageUrl() { @@ -64,7 +78,8 @@ public String getImageUrl() { } } - if (getSpecialURLType() != TextMatchers.SpecialURLType.NONE) { + if (!getSpecialURLType().equals(TextMatchers.SpecialURLType.NONE) && + !getSpecialURLType().equals(TextMatchers.SpecialURLType.REGULAR)) { return getMessage().trim(); } @@ -148,6 +163,25 @@ public String getText() { return ChatUtils.getParsedMessage(getMessage(), getMessageParameters()); } + public String getLastMessageDisplayText() { + if (getSpecialURLType().equals(TextMatchers.SpecialURLType.NONE)) { + return getText(); + } else { + if (getSpecialURLType().equals(TextMatchers.SpecialURLType.GIPHY) + || getSpecialURLType().equals(TextMatchers.SpecialURLType.TENOR)) { + return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_gif)); + } else if (getSpecialURLType().equals(TextMatchers.SpecialURLType.REGULAR)) { + if (hasFileAttachment()) { + return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_attachment)); + } else { + return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_link)); + } + } + } + + return ""; + } + @Override public IUser getUser() { return new IUser() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 276fe8c69a5..ff84c23211e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -180,6 +180,9 @@ New messages No messages yet You + sent a link. + sent a GIF. + sent an attachment. No more items to load. Refresh to retry. From 1b20b63d8cdba33e2f49627319154a11b663ab0a Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sat, 29 Dec 2018 01:42:24 +0100 Subject: [PATCH 07/14] Improve preview Signed-off-by: Mario Danic --- app/build.gradle | 1 + .../talk/adapters/items/ConversationItem.java | 5 +- .../MagicPreviewMessageViewHolder.java | 8 ++- .../talk/models/json/chat/ChatMessage.java | 62 ++++++++++++++----- .../nextcloud/talk/utils/TextMatchers.java | 50 ++++++++++----- app/src/main/res/values/strings.xml | 4 ++ 6 files changed, 94 insertions(+), 36 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b874edb7ef1..5649086c0a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -199,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' diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index 178c3227663..cd0e239a044 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -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.TextMatchers; @@ -126,7 +127,7 @@ public void bindViewHolder(FlexibleAdapter adapter, ConversationItemV holder.dialogUnreadBubble.setVisibility(View.GONE); } - String authorDisplayName = ""; + String authorDisplayName; if (conversation.isHasPassword()) { holder.passwordProtectedRoomImageView.setVisibility(View.VISIBLE); @@ -159,7 +160,7 @@ public void bindViewHolder(FlexibleAdapter adapter, ConversationItemV } } - if (conversation.getLastMessage().getSpecialURLType().equals(TextMatchers.SpecialURLType.NONE)) { + if (conversation.getLastMessage().getMessageType().equals(ChatMessage.MessageType.REGULAR_TEXT_MESSAGE)) { authorDisplayName += ": "; } else { authorDisplayName += " "; 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 index 52ee7713160..9b9070e9469 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java @@ -57,7 +57,7 @@ public void onBind(ChatMessage message) { } } - if (message.getSpecialURLType() == TextMatchers.SpecialURLType.NONE) { + 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); @@ -66,12 +66,14 @@ public void onBind(ChatMessage message) { browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); NextcloudTalkApplication.getSharedApplication().getApplicationContext().startActivity(browserIntent); }); - } else if (message.getSpecialURLType() == TextMatchers.SpecialURLType.GIPHY){ + } else if (message.getMessageType() == ChatMessage.MessageType.SINGLE_LINK_GIPHY_MESSAGE){ messageText.setText("GIPHY"); DisplayUtils.setClickableString("GIPHY", "https://giphy.com", messageText); - } else if (message.getSpecialURLType() == TextMatchers.SpecialURLType.TENOR) { + } else if (message.getMessageType() == ChatMessage.MessageType.SINGLE_LINK_TENOR_MESSAGE) { messageText.setText("Tenor"); DisplayUtils.setClickableString("Tenor", "https://tenor.com", messageText); + } else { + messageText.setText(""); } } } 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 b822213df27..212d5f99d83 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,6 +19,8 @@ */ package com.nextcloud.talk.models.json.chat; +import android.text.TextUtils; + import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonIgnore; import com.bluelinelabs.logansquare.annotation.JsonObject; @@ -33,8 +35,10 @@ import org.parceler.Parcel; +import java.util.Arrays; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; @@ -45,10 +49,9 @@ @Data @JsonObject public class ChatMessage implements IMessage, MessageContentType, MessageContentType.Image { - - public TextMatchers.SpecialURLType getSpecialURLType() { - return TextMatchers.getSpecialUrlTypeMessage(getMessage()); - } + List messageTypesToIgnore = Arrays.asList(MessageType.REGULAR_TEXT_MESSAGE, + MessageType.SYSTEM_MESSAGE, MessageType.SINGLE_LINK_VIDEO_MESSAGE, + MessageType.SINGLE_LINK_AUDIO_MESSAGE, MessageType.SINGLE_LINK_MESSAGE); private boolean hasFileAttachment() { if (messageParameters != null && messageParameters.size() > 0) { @@ -78,14 +81,38 @@ public String getImageUrl() { } } - if (!getSpecialURLType().equals(TextMatchers.SpecialURLType.NONE) && - !getSpecialURLType().equals(TextMatchers.SpecialURLType.REGULAR)) { + if (!messageTypesToIgnore.contains(getMessageType())) { return getMessage().trim(); } return null; } + public MessageType getMessageType() { + if (!TextUtils.isEmpty(getSystemMessage())) { + return MessageType.SYSTEM_MESSAGE; + } + + if (hasFileAttachment()) { + return MessageType.SINGLE_NC_ATTACHMENT_MESSAGE; + } + + return TextMatchers.getMessageTypeFromString(getText()); + } + + public enum MessageType { + REGULAR_TEXT_MESSAGE, + SYSTEM_MESSAGE, + SINGLE_LINK_GIPHY_MESSAGE, + SINGLE_LINK_TENOR_MESSAGE, + SINGLE_LINK_GIF_MESSAGE, + SINGLE_LINK_MESSAGE, + SINGLE_LINK_VIDEO_MESSAGE, + SINGLE_LINK_IMAGE_MESSAGE, + SINGLE_LINK_AUDIO_MESSAGE, + SINGLE_NC_ATTACHMENT_MESSAGE, + } + public enum SystemMessageType { DUMMY, CONVERSATION_CREATED, @@ -164,18 +191,23 @@ public String getText() { } public String getLastMessageDisplayText() { - if (getSpecialURLType().equals(TextMatchers.SpecialURLType.NONE)) { + if (getMessageType().equals(MessageType.REGULAR_TEXT_MESSAGE) || getMessageType().equals(MessageType.SYSTEM_MESSAGE)) { return getText(); } else { - if (getSpecialURLType().equals(TextMatchers.SpecialURLType.GIPHY) - || getSpecialURLType().equals(TextMatchers.SpecialURLType.TENOR)) { + if (getMessageType().equals(MessageType.SINGLE_LINK_GIPHY_MESSAGE) + || getMessageType().equals(MessageType.SINGLE_LINK_TENOR_MESSAGE) + || getMessageType().equals(MessageType.SINGLE_LINK_GIF_MESSAGE)) { return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_gif)); - } else if (getSpecialURLType().equals(TextMatchers.SpecialURLType.REGULAR)) { - if (hasFileAttachment()) { - return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_attachment)); - } else { - return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_link)); - } + } else if (getMessageType().equals(MessageType.SINGLE_NC_ATTACHMENT_MESSAGE)) { + return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_attachment)); + } else if (getMessageType().equals(MessageType.SINGLE_LINK_MESSAGE)) { + return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_link)); + } else if (getMessageType().equals(MessageType.SINGLE_LINK_AUDIO_MESSAGE)) { + return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_audio)); + } else if (getMessageType().equals(MessageType.SINGLE_LINK_VIDEO_MESSAGE)) { + return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_video)); + } else if (getMessageType().equals(MessageType.SINGLE_LINK_IMAGE_MESSAGE)) { + return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_image)); } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java b/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java index 55859a57452..cf4f99e0fa8 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java +++ b/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java @@ -28,6 +28,7 @@ import android.util.Patterns; import com.nextcloud.talk.R; +import com.nextcloud.talk.models.json.chat.ChatMessage; import java.io.BufferedReader; import java.io.IOException; @@ -40,6 +41,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import eu.medsea.mimeutil.MimeUtil; +import eu.medsea.mimeutil.detector.ExtensionMimeDetector; +import eu.medsea.mimeutil.detector.MagicMimeMimeDetector; +import eu.medsea.mimeutil.detector.OpendesktopMimeDetector; public final class TextMatchers { @@ -47,14 +52,7 @@ public final class TextMatchers { private static Pattern regexPattern; - public enum SpecialURLType { - NONE, - REGULAR, - GIPHY, - TENOR, - } - - public static SpecialURLType getSpecialUrlTypeMessage(@NonNull final String text) { + public static ChatMessage.MessageType getMessageTypeFromString(@NonNull final String text) { List links = new ArrayList<>(); Matcher m = Patterns.WEB_URL.matcher(text); while (m.find()) { @@ -65,18 +63,38 @@ public static SpecialURLType getSpecialUrlTypeMessage(@NonNull final String text if (links.size() == 1 && text.trim().length() == links.get(0).length()) { String specialLink = links.get(0); if (specialLink.startsWith("https://media.giphy.com/") && specialLink.endsWith(".gif")) { - return SpecialURLType.GIPHY; - } else if (specialLink.contains("tenor.com/")) { - Pattern pattern = Pattern.compile("https://media.*\\.tenor\\.com.*\\.gif.*", Pattern.CASE_INSENSITIVE); - if (pattern.matcher(specialLink).matches()) { - return SpecialURLType.TENOR; - } + return ChatMessage.MessageType.SINGLE_LINK_GIPHY_MESSAGE; + } else if (specialLink.contains("tenor.com/") && + Pattern.compile("https://media.*\\.tenor\\.com.*\\.gif.*", + Pattern.CASE_INSENSITIVE).matcher(specialLink).matches()) { + return ChatMessage.MessageType.SINGLE_LINK_TENOR_MESSAGE; } else { - return SpecialURLType.REGULAR; + if (specialLink.contains("?")) { + specialLink = specialLink.substring(0, specialLink.indexOf("?")); + } + MimeUtil.registerMimeDetector(MagicMimeMimeDetector.class.getName()); + MimeUtil.registerMimeDetector(ExtensionMimeDetector.class.getName()); + MimeUtil.registerMimeDetector(OpendesktopMimeDetector.class.getName()); + + String mimeType = MimeUtil.getMostSpecificMimeType(MimeUtil.getMimeTypes(specialLink)).toString(); + if (mimeType.startsWith("image/")) { + if (mimeType.equalsIgnoreCase("image/gif")) { + return ChatMessage.MessageType.SINGLE_LINK_GIF_MESSAGE; + } else { + return ChatMessage.MessageType.SINGLE_LINK_IMAGE_MESSAGE; + } + } else if (mimeType.startsWith("video/")) { + return ChatMessage.MessageType.SINGLE_LINK_VIDEO_MESSAGE; + } else if (mimeType.startsWith("audio/")) { + return ChatMessage.MessageType.SINGLE_LINK_AUDIO_MESSAGE; + } + + return ChatMessage.MessageType.SINGLE_LINK_MESSAGE; } } - return SpecialURLType.NONE; + // if we have 0 or more than 1 link, we're a regular message + return ChatMessage.MessageType.REGULAR_TEXT_MESSAGE; } public static boolean isMessageWithSingleEmoticonOnly(@NonNull final Context context, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ff84c23211e..d7aa5b45d52 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -183,6 +183,10 @@ sent a link. sent a GIF. sent an attachment. + sent an audio. + sent a video. + sent an image. + No more items to load. Refresh to retry. From c3ce9d8b5fe919270dea016e16079bd46acaaf03 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sat, 29 Dec 2018 02:04:56 +0100 Subject: [PATCH 08/14] Fix image scaling Signed-off-by: Mario Danic --- .../nextcloud/talk/application/NextcloudTalkApplication.java | 1 - app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java index b9c34ee734a..36e6c0c59ca 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java @@ -144,7 +144,6 @@ public void onCreate() { .build(); Fresco.initialize(this, imagePipelineConfig); - FLog.setMinimumLoggingLevel(FLog.VERBOSE); new ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync(); DeviceUtils.ignoreSpecialBatteryFeatures(); diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java index 7d628e51fcc..9d0fa8b731e 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java @@ -93,7 +93,7 @@ public void updateDrawState(TextPaint ds) { private static void updateViewSize(@Nullable ImageInfo imageInfo, SimpleDraweeView draweeView) { if (imageInfo != null) { - draweeView.getLayoutParams().width = imageInfo.getWidth(); + draweeView.getLayoutParams().width = imageInfo.getWidth() > 480 ? 480 : imageInfo.getWidth(); draweeView.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; draweeView.setAspectRatio((float) imageInfo.getWidth() / imageInfo.getHeight()); } From b28efa44dfd03890203aef39838acd2d0c9718f6 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sat, 29 Dec 2018 02:12:28 +0100 Subject: [PATCH 09/14] Auto-rotate the image if EXIF provides Signed-off-by: Mario Danic --- .../java/com/nextcloud/talk/controllers/ChatController.java | 2 ++ 1 file changed, 2 insertions(+) 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 d865cdc3a71..b0f0c553c4c 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java @@ -52,6 +52,7 @@ import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.view.SimpleDraweeView; +import com.facebook.imagepipeline.common.RotationOptions; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.nextcloud.talk.R; @@ -323,6 +324,7 @@ protected void onViewBound(@NonNull View view) { public void loadImage(SimpleDraweeView imageView, String url) { ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url)) .setProgressiveRenderingEnabled(true) + .setRotationOptions(RotationOptions.autoRotate()) .disableDiskCache() .build(); From 02785b3f9c3986515f2a072485d203b639f28911 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sat, 29 Dec 2018 02:25:58 +0100 Subject: [PATCH 10/14] Improve resizing by forcing layout Signed-off-by: Mario Danic --- app/build.gradle | 2 +- app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5649086c0a0..e08cafd4e94 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -157,7 +157,7 @@ dependencies { compileOnly "org.projectlombok:lombok:1.18.4" annotationProcessor "org.projectlombok:lombok:1.18.4" - implementation 'com.jakewharton:butterknife:9.0.0-rc1' + implementation 'com.jakewharton:butterknife:9.0.0-rc2' annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1' implementation 'com.github.HITGIF:TextFieldBoxes:1.4.3' diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java index 9d0fa8b731e..8c0d3bc51b3 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java @@ -96,6 +96,7 @@ private static void updateViewSize(@Nullable ImageInfo imageInfo, SimpleDraweeVi draweeView.getLayoutParams().width = imageInfo.getWidth() > 480 ? 480 : imageInfo.getWidth(); draweeView.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; draweeView.setAspectRatio((float) imageInfo.getWidth() / imageInfo.getHeight()); + draweeView.requestLayout(); } } From a472fbe7ce309865ae4add769e415584854ee575 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sat, 29 Dec 2018 02:38:28 +0100 Subject: [PATCH 11/14] Clean up imports Signed-off-by: Mario Danic --- .../java/com/nextcloud/talk/adapters/items/ConversationItem.java | 1 - .../talk/adapters/messages/MagicPreviewMessageViewHolder.java | 1 - .../com/nextcloud/talk/application/NextcloudTalkApplication.java | 1 - 3 files changed, 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index cd0e239a044..541a5683db3 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -43,7 +43,6 @@ 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.TextMatchers; import com.nextcloud.talk.utils.glide.GlideApp; import org.apache.commons.lang3.StringUtils; 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 index 9b9070e9469..bd23ca08357 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java @@ -29,7 +29,6 @@ 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.TextMatchers; import com.stfalcon.chatkit.messages.MessageHolders; import butterknife.BindView; diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java index 36e6c0c59ca..be3e6e011cf 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java @@ -25,7 +25,6 @@ import android.util.Log; import com.facebook.cache.disk.DiskCacheConfig; -import com.facebook.common.logging.FLog; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.imagepipeline.core.ImagePipelineConfig; import com.nextcloud.talk.dagger.modules.BusModule; From 2788de29a3ace909ea4ffd922ff94dff32bc882b Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sat, 29 Dec 2018 15:52:22 +0100 Subject: [PATCH 12/14] Clean up some of the lint warnings Signed-off-by: Mario Danic --- app/build.gradle | 6 ++-- .../MagicPreviewMessageViewHolder.java | 2 ++ .../main/res/drawable/incoming_corners.xml | 28 ------------------ .../res/drawable/shape_grouped_message.xml | 29 ------------------- .../item_custom_incoming_preview_message.xml | 4 ++- .../item_custom_outcoming_preview_message.xml | 4 ++- 6 files changed, 11 insertions(+), 62 deletions(-) delete mode 100644 app/src/main/res/drawable/incoming_corners.xml delete mode 100644 app/src/main/res/drawable/shape_grouped_message.xml diff --git a/app/build.gradle b/app/build.gradle index e08cafd4e94..83a337dce26 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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}" @@ -158,7 +158,7 @@ dependencies { annotationProcessor "org.projectlombok:lombok:1.18.4" implementation 'com.jakewharton:butterknife:9.0.0-rc2' - annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1' + annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc2' implementation 'com.github.HITGIF:TextFieldBoxes:1.4.3' 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 index bd23ca08357..f1c6ff82248 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java @@ -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; @@ -44,6 +45,7 @@ public MagicPreviewMessageViewHolder(View itemView) { ButterKnife.bind(this, itemView); } + @SuppressLint("SetTextI18n") @Override public void onBind(ChatMessage message) { super.onBind(message); diff --git a/app/src/main/res/drawable/incoming_corners.xml b/app/src/main/res/drawable/incoming_corners.xml deleted file mode 100644 index cda5311cefb..00000000000 --- a/app/src/main/res/drawable/incoming_corners.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/shape_grouped_message.xml b/app/src/main/res/drawable/shape_grouped_message.xml deleted file mode 100644 index 6d94b645a20..00000000000 --- a/app/src/main/res/drawable/shape_grouped_message.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/layout/item_custom_incoming_preview_message.xml b/app/src/main/res/layout/item_custom_incoming_preview_message.xml index 576f9ac52f2..d6fa3ebe9bd 100644 --- a/app/src/main/res/layout/item_custom_incoming_preview_message.xml +++ b/app/src/main/res/layout/item_custom_incoming_preview_message.xml @@ -20,6 +20,7 @@ + app:actualImageScaleType="fitCenter" + tools:ignore="PxUsage" /> + android:layout_alignParentEnd="true" + tools:ignore="PxUsage" /> Date: Sat, 29 Dec 2018 16:10:43 +0100 Subject: [PATCH 13/14] Update for new work manager Signed-off-by: Mario Danic --- .../main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java | 2 +- .../main/java/com/nextcloud/talk/jobs/NotificationWorker.java | 2 +- .../java/com/nextcloud/talk/jobs/PushRegistrationWorker.java | 2 +- .../main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java | 2 +- .../com/nextcloud/talk/jobs/WebsocketConnectionsWorker.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java index 66232ab1366..c6698f69aaf 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java @@ -163,6 +163,6 @@ public void onComplete() { }); } - return Result.SUCCESS; + return Result.success(); } } diff --git a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java index ae3d51f7b47..eaf8f705a52 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java @@ -509,6 +509,6 @@ public Result doWork() { } catch (Exception exception) { Log.d(TAG, "Something went very wrong " + exception.getLocalizedMessage()); } - return Result.SUCCESS; + return Result.success(); } } diff --git a/app/src/main/java/com/nextcloud/talk/jobs/PushRegistrationWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/PushRegistrationWorker.java index b56c2ebde55..6a908ed215b 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/PushRegistrationWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/PushRegistrationWorker.java @@ -42,6 +42,6 @@ public Result doWork() { pushUtils.generateRsa2048KeyPair(); pushUtils.pushRegistrationToServer(); - return Result.SUCCESS; + return Result.success(); } } diff --git a/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java b/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java index 64e1852280a..74719c72c83 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java @@ -155,6 +155,6 @@ public void onComplete() { OneTimeWorkRequest websocketConnectionsWorker = new OneTimeWorkRequest.Builder(WebsocketConnectionsWorker.class).build(); WorkManager.getInstance().enqueue(websocketConnectionsWorker); - return Result.SUCCESS; + return Result.success(); } } diff --git a/app/src/main/java/com/nextcloud/talk/jobs/WebsocketConnectionsWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/WebsocketConnectionsWorker.java index 128b687127d..529f8525729 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/WebsocketConnectionsWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/WebsocketConnectionsWorker.java @@ -81,6 +81,6 @@ public Result doWork() { } } - return Result.SUCCESS; + return Result.success(); } } From 4d3b4aa93c5621b4f9ab3a3f40e0005734d5e20c Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sat, 29 Dec 2018 21:03:13 +0100 Subject: [PATCH 14/14] Switch account removal worker to new return value Signed-off-by: Mario Danic --- .../main/java/com/nextcloud/talk/jobs/AccountRemovalWorker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalWorker.java index 54016f9628a..424682bc350 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalWorker.java @@ -249,6 +249,6 @@ public void onError(Throwable e) { } } - return Result.SUCCESS; + return Result.success(); } }