Przeglądaj źródła

Fix #494

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 6 lat temu
rodzic
commit
f3877b4bb5

+ 71 - 3
app/src/main/java/com/nextcloud/talk/controllers/ChatController.java

@@ -59,6 +59,8 @@ import com.nextcloud.talk.api.NcApi;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
 import com.nextcloud.talk.callbacks.MentionAutocompleteCallback;
 import com.nextcloud.talk.controllers.base.BaseController;
+import com.nextcloud.talk.events.UserMentionClickEvent;
+import com.nextcloud.talk.models.RetrofitBucket;
 import com.nextcloud.talk.models.database.UserEntity;
 import com.nextcloud.talk.models.json.call.Call;
 import com.nextcloud.talk.models.json.call.CallOverall;
@@ -98,6 +100,9 @@ import io.reactivex.Observer;
 import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.Disposable;
 import io.reactivex.schedulers.Schedulers;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
 import org.parceler.Parcels;
 import retrofit2.HttpException;
 import retrofit2.Response;
@@ -120,6 +125,8 @@ public class ChatController extends BaseController implements MessagesListAdapte
     AppPreferences appPreferences;
     @Inject
     Context context;
+    @Inject
+    EventBus eventBus;
     @BindView(R.id.messagesListView)
     MessagesList messagesListView;
     @BindView(R.id.messageInputView)
@@ -170,6 +177,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
     private MenuItem conversationVideoMenuItem;
 
     private boolean readOnlyCheckPerformed;
+
     public ChatController(Bundle args) {
         super(args);
         setHasOptionsMenu(true);
@@ -502,6 +510,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
     @Override
     protected void onAttach(@NonNull View view) {
         super.onAttach(view);
+        eventBus.register(this);
 
         isLeavingForConversation = false;
         ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomId(roomId);
@@ -544,7 +553,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
         NotificationUtils.cancelExistingNotifications(getApplicationContext(), conversationUser);
 
         if (inChat) {
-            if (wasDetached & conversationUser.hasSpreedCapabilityWithName("no-ping")) {
+            if (wasDetached && conversationUser.hasSpreedCapabilityWithName("no-ping")) {
                 wasDetached = false;
                 joinRoomWithPassword();
             }
@@ -555,6 +564,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
     protected void onDetach(@NonNull View view) {
         super.onDetach(view);
         ApplicationWideCurrentRoomHolder.getInstance().clear();
+        eventBus.unregister(this);
 
         if (conversationUser.hasSpreedCapabilityWithName("no-ping")
                 && getActivity() != null && !getActivity().isChangingConfigurations() && !isLeavingForConversation) {
@@ -683,7 +693,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
             } else {
                 pullChatMessages(1);
             }
-         }
+        }
     }
 
     private void leaveRoom() {
@@ -701,7 +711,6 @@ public class ChatController extends BaseController implements MessagesListAdapte
                     @Override
                     public void onNext(GenericOverall genericOverall) {
                         dispose();
-                        currentConversation = null;
                         if (!isDestroyed() && !isBeingDestroyed() && !wasDetached) {
                             getRouter().popCurrentController();
                         }
@@ -1160,4 +1169,63 @@ public class ChatController extends BaseController implements MessagesListAdapte
 
         return false;
     }
+
+    @Subscribe(threadMode = ThreadMode.BACKGROUND)
+    public void onMessageEvent(UserMentionClickEvent userMentionClickEvent) {
+        if ((!currentConversation.getType().equals(Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL) || !currentConversation.getName().equals(userMentionClickEvent.getUserId()))) {
+            RetrofitBucket retrofitBucket =
+                    ApiUtils.getRetrofitBucketForCreateRoom(conversationUser.getBaseUrl(), "1",
+                            userMentionClickEvent.getUserId(), null);
+
+            ncApi.createRoom(credentials,
+                    retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
+                    .subscribeOn(Schedulers.newThread())
+                    .observeOn(AndroidSchedulers.mainThread())
+                    .subscribe(new Observer<RoomOverall>() {
+                        @Override
+                        public void onSubscribe(Disposable d) {
+
+                        }
+
+                        @Override
+                        public void onNext(RoomOverall roomOverall) {
+                            Intent conversationIntent = new Intent(getActivity(), MagicCallActivity.class);
+                            Bundle bundle = new Bundle();
+                            bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, conversationUser);
+                            bundle.putString(BundleKeys.KEY_ROOM_TOKEN, roomOverall.getOcs().getData().getToken());
+                            bundle.putString(BundleKeys.KEY_ROOM_ID, roomOverall.getOcs().getData().getRoomId());
+
+                            if (conversationUser.hasSpreedCapabilityWithName("chat-v2")) {
+                                bundle.putParcelable(BundleKeys.KEY_ACTIVE_CONVERSATION,
+                                        Parcels.wrap(roomOverall.getOcs().getData()));
+                                conversationIntent.putExtras(bundle);
+
+                                getRouter().pushController((RouterTransaction.with(new ChatController(bundle))
+                                        .pushChangeHandler(new HorizontalChangeHandler())
+                                        .popChangeHandler(new HorizontalChangeHandler())));
+                            } else {
+                                conversationIntent.putExtras(bundle);
+                                startActivity(conversationIntent);
+                                new Handler().postDelayed(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        if (!isDestroyed() && !isBeingDestroyed()) {
+                                            getRouter().popCurrentController();
+                                        }
+                                    }
+                                }, 100);
+                            }
+                        }
+
+                        @Override
+                        public void onError(Throwable e) {
+
+                        }
+
+                        @Override
+                        public void onComplete() {
+                        }
+                    });
+        }
+    }
 }

+ 28 - 0
app/src/main/java/com/nextcloud/talk/events/UserMentionClickEvent.java

@@ -0,0 +1,28 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Mario Danic
+ * Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.nextcloud.talk.events;
+
+import lombok.Data;
+
+@Data
+public class UserMentionClickEvent {
+    private final String userId;
+}

+ 12 - 0
app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java

@@ -65,10 +65,12 @@ import com.facebook.imagepipeline.request.ImageRequestBuilder;
 import com.google.android.material.chip.ChipDrawable;
 import com.nextcloud.talk.R;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
+import com.nextcloud.talk.events.UserMentionClickEvent;
 import com.nextcloud.talk.models.database.UserEntity;
 import com.nextcloud.talk.utils.text.Spans;
 import com.vanniktech.emoji.EmojiEditText;
 import com.vanniktech.emoji.EmojiTextView;
+import org.greenrobot.eventbus.EventBus;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
@@ -291,6 +293,13 @@ public class DisplayUtils {
                 Pattern.CASE_INSENSITIVE | Pattern.LITERAL | Pattern.MULTILINE)
                 .matcher(spannableString);
 
+        ClickableSpan clickableSpan = new ClickableSpan() {
+            @Override
+            public void onClick(@NonNull View widget) {
+                EventBus.getDefault().post(new UserMentionClickEvent(id));
+            }
+        };
+
         int lastStartIndex = -1;
         Spans.MentionChipSpan mentionChipSpan;
         while (m.find()) {
@@ -302,6 +311,9 @@ public class DisplayUtils {
                     DynamicDrawableSpan.ALIGN_BASELINE, id,
                     label);
             spannableString.setSpan(mentionChipSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+            if ("user".equals(type) && !conversationUser.getUserId().equals(id)) {
+                spannableString.setSpan(clickableSpan, start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
+            }
         }
 
         return spannableString;