Skip to content
This repository was archived by the owner on Apr 12, 2022. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Improvements:

Bugfix:
- Fix bad constant values for homeserver CS api versions
- Ensure custom fields are sent for `m.room.message` Events (#515)
- Fix issue of blocked UI after a video call (#496, vector-im/riot-android#3311)

API Change:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/*
* Copyright 2020 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.matrix.androidsdk.event

import android.text.TextUtils
import androidx.test.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4
import com.google.gson.JsonParser
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import org.matrix.androidsdk.common.CommonTestHelper
import org.matrix.androidsdk.common.CryptoTestHelper
import org.matrix.androidsdk.common.TestApiCallback
import org.matrix.androidsdk.common.TestConstants
import org.matrix.androidsdk.core.Log
import org.matrix.androidsdk.data.RoomState
import org.matrix.androidsdk.listeners.MXEventListener
import org.matrix.androidsdk.rest.model.Event
import java.util.concurrent.CountDownLatch

@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class SendCustomEventTest {
private val mTestHelper = CommonTestHelper()
private val mCryptoTestHelper = CryptoTestHelper(mTestHelper)

@Test
fun test01_sendCustomEvent() {
Log.e(LOG_TAG, "test01_sendEvent")
val context = InstrumentationRegistry.getContext()
val bobSession = mTestHelper.createAccount(TestConstants.USER_BOB, mCryptoTestHelper.defaultSessionParams)
var roomId: String? = null
val lock1 = CountDownLatch(1)
bobSession.createRoom(object : TestApiCallback<String>(lock1) {
override fun onSuccess(info: String) {
roomId = info
super.onSuccess(info)
}
})
mTestHelper.await(lock1)
assertNotNull(roomId)
val room = bobSession.dataHandler.getRoom(roomId!!)
// Wait for the event
var receivedEvent: Event? = null
val lock3 = CountDownLatch(1)
bobSession.dataHandler.addListener(object : MXEventListener() {
override fun onLiveEvent(event: Event, roomState: RoomState) {
if (TextUtils.equals(event.getType(), Event.EVENT_TYPE_MESSAGE)) {
receivedEvent = event
lock3.countDown()
}
}
})
// Send event
val parser = JsonParser()
val element = parser.parse("{" +
"\"body\" : \"message body\"," +
"\"msgtype\" : \"m.text\"," +
"\"mirrorIdKey\" : \"customValue\"" +
"}")
val content = element.asJsonObject
val event = Event(Event.EVENT_TYPE_MESSAGE, content, bobSession.myUserId, roomId)
val lock2 = CountDownLatch(1)
room.sendEvent(event, TestApiCallback(lock2))
mTestHelper.await(lock2)
// Wait for the callback
mTestHelper.await(lock3)

assertNotNull(receivedEvent)
assertEquals("message body", receivedEvent!!.content.asJsonObject.get("body")?.asString)
assertEquals("m.text", receivedEvent!!.content.asJsonObject.get("msgtype")?.asString)
assertEquals("customValue", receivedEvent!!.content.asJsonObject.get("mirrorIdKey")?.asString)

bobSession.clear(context)
}

companion object {
private const val LOG_TAG = "EventTest"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2315,7 +2315,7 @@ public void onUnexpectedError(Exception e) {

if (Event.EVENT_TYPE_MESSAGE.equals(event.getType())) {
mDataHandler.getDataRetriever().getRoomsRestClient()
.sendMessage(event.eventId, getRoomId(), JsonUtils.toMessage(event.getContent()), localCB);
.sendMessage(event.eventId, getRoomId(), event.getContentAsJsonObject(), localCB);
} else {
mDataHandler.getDataRetriever().getRoomsRestClient()
.sendEventToRoom(event.eventId, getRoomId(), event.getType(), event.getContentAsJsonObject(), localCB);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import org.matrix.androidsdk.rest.model.Typing;
import org.matrix.androidsdk.rest.model.User;
import org.matrix.androidsdk.rest.model.UserIdAndReason;
import org.matrix.androidsdk.rest.model.message.Message;
import org.matrix.androidsdk.rest.model.sync.RoomResponse;

import java.util.List;
Expand Down Expand Up @@ -72,10 +71,10 @@ public interface RoomsApi {
*
* @param txId the transaction Id
* @param roomId the room id
* @param message the message
* @param content the message
*/
@PUT("rooms/{roomId}/send/m.room.message/{txId}")
Call<CreatedEvent> sendMessage(@Path("txId") String txId, @Path("roomId") String roomId, @Body Message message);
Call<CreatedEvent> sendMessage(@Path("txId") String txId, @Path("roomId") String roomId, @Body JsonObject content);

/**
* Update the power levels
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@
import org.matrix.androidsdk.rest.model.User;
import org.matrix.androidsdk.rest.model.UserIdAndReason;
import org.matrix.androidsdk.rest.model.filter.RoomEventFilter;
import org.matrix.androidsdk.rest.model.message.Message;
import org.matrix.androidsdk.rest.model.sync.AccountDataElement;
import org.matrix.androidsdk.rest.model.sync.RoomResponse;

Expand Down Expand Up @@ -83,20 +82,23 @@ public RoomsRestClient(HomeServerConnectionConfig hsConfig) {
*
* @param transactionId the unique transaction id (it should avoid duplicated messages)
* @param roomId the room id
* @param message the message
* @param content the message
* @param callback the callback containing the created event if successful
*/
public void sendMessage(final String transactionId, final String roomId, final Message message, final ApiCallback<CreatedEvent> callback) {
public void sendMessage(final String transactionId,
final String roomId,
final JsonObject content,
final ApiCallback<CreatedEvent> callback) {
// privacy
// final String description = "SendMessage : roomId " + roomId + " - message " + message.body;
final String description = "SendMessage : roomId " + roomId;

// the messages have their dedicated method in MXSession to be resent if there is no available network
mApi.sendMessage(transactionId, roomId, message)
mApi.sendMessage(transactionId, roomId, content)
.enqueue(new RestAdapterCallback<CreatedEvent>(description, mUnsentEventsManager, callback, new RestAdapterCallback.RequestRetryCallBack() {
@Override
public void onRetry() {
sendMessage(transactionId, roomId, message, callback);
sendMessage(transactionId, roomId, content, callback);
}
}));
}
Expand Down