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 2f9257f95..490972bcd 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 @@ -102,7 +102,7 @@ public class MagicIncomingTextMessageViewHolder messageAuthor.setText(R.string.nc_nick_guest); } - if (!message.isGrouped) { + if (!message.isGrouped() && !message.isOneToOneConversation()) { messageUserAvatarView.setVisibility(View.VISIBLE); if (message.getActorType().equals("guests")) { TextDrawable drawable = TextDrawable.builder().beginConfig().bold() @@ -125,8 +125,11 @@ public class MagicIncomingTextMessageViewHolder messageUserAvatarView.getHierarchy().setPlaceholderImage(drawable); } } else { - - messageUserAvatarView.setVisibility(View.INVISIBLE); + if (message.isOneToOneConversation()) { + messageUserAvatarView.setVisibility(View.GONE); + } else { + messageUserAvatarView.setVisibility(View.INVISIBLE); + } messageAuthor.setVisibility(View.GONE); } @@ -135,14 +138,19 @@ public class MagicIncomingTextMessageViewHolder resources.getColor(R.color.bg_message_list_incoming_bubble_dark2) : resources.getColor(R.color.bg_message_list_incoming_bubble); + int bubbleResource = R.drawable.shape_incoming_message; + + if (message.isGrouped) { + bubbleResource = R.drawable.shape_grouped_incoming_message; + } + Drawable bubbleDrawable = DisplayUtils.getMessageSelector(bg_bubble_color, resources.getColor(R.color.transparent), - bg_bubble_color, R.drawable.shape_grouped_incoming_message); + bg_bubble_color, bubbleResource); ViewCompat.setBackground(bubble, bubbleDrawable); HashMap> messageParameters = message.getMessageParameters(); - Context context = NextcloudTalkApplication.Companion.getSharedApplication().getApplicationContext(); itemView.setSelected(false); messageTimeView.setTextColor(context.getResources().getColor(R.color.warm_grey_four)); 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 953ad546d..455ca5375 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 @@ -81,8 +81,12 @@ public class MagicPreviewMessageViewHolder extends MessageHolders.IncomingImageM public void onBind(ChatMessage message) { super.onBind(message); if (userAvatar != null) { - if (message.isGrouped) { - userAvatar.setVisibility(View.INVISIBLE); + if (message.isGrouped || message.isOneToOneConversation()) { + if (message.isOneToOneConversation()) { + userAvatar.setVisibility(View.GONE); + } else { + userAvatar.setVisibility(View.INVISIBLE); + } } else { userAvatar.setVisibility(View.VISIBLE); 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 0b26e9484..90bb4ae55 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java @@ -25,6 +25,7 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; +import android.graphics.Bitmap; import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -48,6 +49,8 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.core.graphics.drawable.RoundedBitmapDrawable; +import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; import androidx.emoji.widget.EmojiEditText; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -55,9 +58,16 @@ import androidx.recyclerview.widget.RecyclerView; import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler; +import com.facebook.common.executors.UiThreadImmediateExecutorService; +import com.facebook.common.references.CloseableReference; +import com.facebook.datasource.DataSource; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.view.SimpleDraweeView; +import com.facebook.imagepipeline.core.ImagePipeline; +import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber; +import com.facebook.imagepipeline.image.CloseableImage; +import com.facebook.imagepipeline.request.ImageRequest; import com.nextcloud.talk.R; import com.nextcloud.talk.activities.MagicCallActivity; import com.nextcloud.talk.adapters.messages.MagicIncomingTextMessageViewHolder; @@ -129,6 +139,7 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; import javax.inject.Inject; import autodagger.AutoInjector; @@ -265,6 +276,8 @@ public class ChatController extends BaseController implements MessagesListAdapte currentConversation = roomOverall.getOcs().getData(); + loadAvatarForStatusBar(); + conversationName = currentConversation.getDisplayName(); setTitle(); setupMentionAutocomplete(); @@ -312,6 +325,7 @@ public class ChatController extends BaseController implements MessagesListAdapte if (roomId.equals(conversation.getRoomId())) { roomToken = conversation.getToken(); currentConversation = conversation; + loadAvatarForStatusBar(); checkLobbyState(); checkReadOnlyState(); conversationName = conversation.getDisplayName(); @@ -343,6 +357,36 @@ public class ChatController extends BaseController implements MessagesListAdapte return inflater.inflate(R.layout.controller_chat, container, false); } + private void loadAvatarForStatusBar() { + if (currentConversation != null && currentConversation.getType().equals(Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL) && getActivity() != null && conversationVoiceCallMenuItem != null) { + int avatarSize = + (int) DisplayUtils.convertDpToPixel(conversationVoiceCallMenuItem.getIcon().getIntrinsicWidth(), getActivity()); + + ImageRequest imageRequest = + DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithNameAndPixels(conversationUser.getBaseUrl(), + currentConversation.getName(), avatarSize / 2), null); + + ImagePipeline imagePipeline = Fresco.getImagePipeline(); + DataSource> dataSource = imagePipeline.fetchDecodedImage(imageRequest, null); + + dataSource.subscribe(new BaseBitmapDataSubscriber() { + @Override + protected void onNewResultImpl(@Nullable Bitmap bitmap) { + if (getActionBar() != null && bitmap != null && getResources() != null) { + RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap); + roundedBitmapDrawable.setCircular(true); + roundedBitmapDrawable.setAntiAlias(true); + getActionBar().setIcon(roundedBitmapDrawable); + } + } + + @Override + protected void onFailureImpl(DataSource> dataSource) { + } + }, UiThreadImmediateExecutorService.getInstance()); + } + } + @Override protected void onViewBound(@NonNull View view) { super.onViewBound(view); @@ -351,7 +395,6 @@ public class ChatController extends BaseController implements MessagesListAdapte boolean adapterWasNull = false; if (adapter == null) { - loadingProgressBar.setVisibility(View.VISIBLE); adapterWasNull = true; @@ -483,6 +526,7 @@ public class ChatController extends BaseController implements MessagesListAdapte } if (currentConversation != null) { + loadAvatarForStatusBar(); checkLobbyState(); } @@ -691,6 +735,10 @@ public class ChatController extends BaseController implements MessagesListAdapte getActivity().findViewById(R.id.toolbar).setOnClickListener(null); } + if (getActionBar() != null) { + getActionBar().setIcon(null); + } + adapter = null; inChat = false; } @@ -1059,6 +1107,7 @@ public class ChatController extends BaseController implements MessagesListAdapte } ChatMessage chatMessage = chatMessageList.get(i); + chatMessage.setOneToOneConversation(currentConversation.getType().equals(Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL)); chatMessage.setLinkPreviewAllowed(isLinkPreviewAllowed); chatMessage.setActiveUser(conversationUser); @@ -1112,6 +1161,7 @@ public class ChatController extends BaseController implements MessagesListAdapte if (adapter != null) { chatMessage.setGrouped(adapter.isPreviousSameAuthor(chatMessage.getActorId(), -1) && (adapter.getSameAuthorLastMessagesCount(chatMessage.getActorId()) % 5) > 0); + chatMessage.setOneToOneConversation(currentConversation.getType().equals(Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL)); adapter.addToStart(chatMessage, shouldScroll); } @@ -1176,6 +1226,8 @@ public class ChatController extends BaseController implements MessagesListAdapte conversationInfoMenuItem = menu.findItem(R.id.conversation_info); conversationVoiceCallMenuItem = menu.findItem(R.id.conversation_voice_call); conversationVideoMenuItem = menu.findItem(R.id.conversation_video_call); + + loadAvatarForStatusBar(); } } 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 c863f0111..18f5f83ce 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 @@ -45,6 +45,8 @@ public class ChatMessage implements IMessage, MessageContentType, MessageContent @JsonIgnore public boolean isGrouped; @JsonIgnore + public boolean isOneToOneConversation; + @JsonIgnore public UserEntity activeUser; @JsonIgnore public Map selectedIndividualHashMap; diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9e7ed5a06..93822f260 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -42,8 +42,7 @@ android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar" app:contentInsetStart="24dp" app:contentInsetStartWithNavigation="0dp" - app:popupTheme="@style/appActionBarPopupMenu" - app:titleMarginStart="0dp" /> + app:popupTheme="@style/appActionBarPopupMenu" />