Group link preview and info display bottom sheet.

This commit is contained in:
Alan Evans
2020-08-18 16:28:37 -03:00
committed by Greyson Parrelli
parent 477bb45df7
commit 09d167c16d
22 changed files with 799 additions and 106 deletions

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.util;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.View;
@@ -67,13 +68,22 @@ public final class AvatarUtil {
public static void loadIconIntoImageView(@NonNull Recipient recipient, @NonNull ImageView target) {
Context context = target.getContext();
request(GlideApp.with(context).asDrawable(), context, recipient).into(target);
requestCircle(GlideApp.with(context).asDrawable(), context, recipient).into(target);
}
public static Bitmap loadIconBitmapSquare(@NonNull Context context,
@NonNull Recipient recipient,
int width,
int height)
throws ExecutionException, InterruptedException
{
return requestSquare(GlideApp.with(context).asBitmap(), context, recipient).submit(width, height).get();
}
@WorkerThread
public static IconCompat getIconForNotification(@NonNull Context context, @NonNull Recipient recipient) {
try {
return IconCompat.createWithBitmap(request(GlideApp.with(context).asBitmap(), context, recipient).submit().get());
return IconCompat.createWithBitmap(requestCircle(GlideApp.with(context).asBitmap(), context, recipient).submit().get());
} catch (ExecutionException | InterruptedException e) {
return null;
}
@@ -88,10 +98,17 @@ public final class AvatarUtil {
.diskCacheStrategy(DiskCacheStrategy.ALL);
}
private static <T> GlideRequest<T> requestCircle(@NonNull GlideRequest<T> glideRequest, @NonNull Context context, @NonNull Recipient recipient) {
return request(glideRequest, context, recipient).circleCrop();
}
private static <T> GlideRequest<T> requestSquare(@NonNull GlideRequest<T> glideRequest, @NonNull Context context, @NonNull Recipient recipient) {
return request(glideRequest, context, recipient).centerCrop();
}
private static <T> GlideRequest<T> request(@NonNull GlideRequest<T> glideRequest, @NonNull Context context, @NonNull Recipient recipient) {
return glideRequest.load(new ProfileContactPhoto(recipient, recipient.getProfileAvatar()))
.error(getFallback(context, recipient))
.circleCrop()
.diskCacheStrategy(DiskCacheStrategy.ALL);
}

View File

@@ -24,7 +24,9 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.WebRtcCallActivity;
import org.thoughtcrime.securesms.conversation.ConversationActivity;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.ui.invitesandrequests.joining.GroupJoinBottomSheetDialogFragment;
import org.thoughtcrime.securesms.groups.ui.invitesandrequests.joining.GroupJoinUpdateRequiredBottomSheetDialogFragment;
import org.thoughtcrime.securesms.groups.v2.GroupInviteLinkUrl;
import org.thoughtcrime.securesms.logging.Log;
@@ -194,19 +196,22 @@ public class CommunicationActions {
{
GroupId.V2 groupId = GroupId.v2(groupInviteLinkUrl.getGroupMasterKey());
SimpleTask.run(SignalExecutors.BOUNDED, () ->
DatabaseFactory.getGroupDatabase(activity)
.getGroup(groupId)
.transform(groupRecord -> Recipient.resolved(groupRecord.getRecipientId()))
.orNull(),
recipient -> {
if (recipient != null) {
CommunicationActions.startConversation(activity, recipient, null);
Toast.makeText(activity, R.string.GroupJoinBottomSheetDialogFragment_you_are_already_a_member, Toast.LENGTH_SHORT).show();
} else {
GroupJoinUpdateRequiredBottomSheetDialogFragment.show(activity.getSupportFragmentManager());
}
});
SimpleTask.run(SignalExecutors.BOUNDED, () -> {
GroupDatabase.GroupRecord group = DatabaseFactory.getGroupDatabase(activity)
.getGroup(groupId)
.orNull();
return group != null && group.isActive() ? Recipient.resolved(group.getRecipientId())
: null;
},
recipient -> {
if (recipient != null) {
CommunicationActions.startConversation(activity, recipient, null);
Toast.makeText(activity, R.string.GroupJoinBottomSheetDialogFragment_you_are_already_a_member, Toast.LENGTH_SHORT).show();
} else {
GroupJoinBottomSheetDialogFragment.show(activity.getSupportFragmentManager(), groupInviteLinkUrl);
}
});
}
private static void startInsecureCallInternal(@NonNull Activity activity, @NonNull Recipient recipient) {

View File

@@ -30,15 +30,16 @@ import android.os.Build.VERSION_CODES;
import android.os.Handler;
import android.os.Looper;
import android.provider.Telephony;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresPermission;
import android.telephony.TelephonyManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.StyleSpan;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresPermission;
import com.annimon.stream.Stream;
import com.google.android.mms.pdu_alt.CharacterSets;
import com.google.android.mms.pdu_alt.EncodedStringValue;
@@ -339,6 +340,10 @@ public class Util {
return Optional.fromNullable(simCountryIso != null ? simCountryIso.toUpperCase() : null);
}
public static @NonNull <T> T firstNonNull(@Nullable T optional, @NonNull T fallback) {
return optional != null ? optional : fallback;
}
@SafeVarargs
public static @NonNull <T> T firstNonNull(T ... ts) {
for (T t : ts) {