From 02a82b2a872386e983f50b0f2d034bfca8e67f8d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 3 Oct 2018 12:20:50 +0200 Subject: [PATCH 01/79] Add test for Room name --- .../lazyloading/LazyLoadingTestHelper.java | 2 +- .../lazyloading/RoomNameScenarioData.java | 35 +++++ .../androidsdk/lazyloading/RoomNameTest.java | 85 ++++++++++ .../lazyloading/RoomNameTestHelper.java | 146 ++++++++++++++++++ 4 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameScenarioData.java create mode 100644 matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java create mode 100644 matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingTestHelper.java index 5b36e7b66..5c136de07 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingTestHelper.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingTestHelper.java @@ -56,7 +56,7 @@ public LazyLoadingTestHelper(CommonTestHelper mCommonTestHelper) { * - Alice sends 50 messages * - Alice makes an initial /sync with lazy-loading enabled or not * - * @param withLazyLoading true to enable lazy loading for alice account + * @param withLazyLoading true to enable lazy loading for Alice, Bob and Sam accounts * @return initialized data */ public LazyLoadingScenarioData createScenario(boolean withLazyLoading) throws Exception { diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameScenarioData.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameScenarioData.java new file mode 100644 index 000000000..7cf82b5d8 --- /dev/null +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameScenarioData.java @@ -0,0 +1,35 @@ +/* + * Copyright 2018 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.lazyloading; + +import org.matrix.androidsdk.MXSession; + +import java.util.List; + +/** + * Data holder for lazy loading tests + * The sessions are not synced by default as you want to perform some custom tests + */ +public class RoomNameScenarioData { + final List userSessions; + + final String roomId; + + public RoomNameScenarioData(List userSessions, String roomId) { + this.userSessions = userSessions; + this.roomId = roomId; + } +} \ No newline at end of file diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java new file mode 100644 index 000000000..12656256d --- /dev/null +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java @@ -0,0 +1,85 @@ +/* + * Copyright 2018 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.lazyloading; + +import android.support.test.InstrumentationRegistry; + +import junit.framework.Assert; + +import org.junit.BeforeClass; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; +import org.matrix.androidsdk.MXSession; +import org.matrix.androidsdk.RestClient; +import org.matrix.androidsdk.common.CommonTestHelper; + +@FixMethodOrder(MethodSorters.JVM) +public class RoomNameTest { + + private CommonTestHelper mTestHelper = new CommonTestHelper(); + private RoomNameTestHelper mRoomNameTestHelper = new RoomNameTestHelper(mTestHelper); + + @BeforeClass + public static void init() { + RestClient.initUserAgent(InstrumentationRegistry.getContext()); + } + + @Test + public void RoomName_noName_ShouldLoadAllMembers() throws Exception { + RoomState_noName(false); + } + + @Test + public void RoomName_noName_LazyLoading() throws Exception { + RoomState_noName(true); + } + + private void RoomState_noName(final boolean withLazyLoading) throws Exception { + checkAllName( mRoomNameTestHelper.createScenario(1, null, withLazyLoading), null); + checkAllName( mRoomNameTestHelper.createScenario(2, null, withLazyLoading), null); + checkAllName( mRoomNameTestHelper.createScenario(3, null, withLazyLoading), null); + checkAllName( mRoomNameTestHelper.createScenario(10, null, withLazyLoading), null); + } + + @Test + public void RoomName_name_ShouldLoadAllMembers() throws Exception { + RoomState_name(false); + } + + @Test + public void RoomName_name_LazyLoading() throws Exception { + RoomState_name(true); + } + + private void RoomState_name(final boolean withLazyLoading) throws Exception { + checkAllName( mRoomNameTestHelper.createScenario(1, "Room name", withLazyLoading), "Room name"); + checkAllName( mRoomNameTestHelper.createScenario(2, "Room name", withLazyLoading), "Room name"); + checkAllName( mRoomNameTestHelper.createScenario(3, "Room name", withLazyLoading), "Room name"); + checkAllName( mRoomNameTestHelper.createScenario(10, "Room name", withLazyLoading), "Room name"); + } + + /* ========================================================================================== + * PRIVATE + * ========================================================================================== */ + + private void checkAllName(RoomNameScenarioData roomNameScenarioData, String expectedName) { + for (MXSession session : roomNameScenarioData.userSessions) { + Assert.assertEquals(expectedName, session.getDataHandler().getRoom(roomNameScenarioData.roomId).getState().name); + } + } +} diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java new file mode 100644 index 000000000..09418929f --- /dev/null +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java @@ -0,0 +1,146 @@ +/* + * Copyright 2018 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.lazyloading; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import junit.framework.Assert; + +import org.matrix.androidsdk.MXSession; +import org.matrix.androidsdk.common.CommonTestHelper; +import org.matrix.androidsdk.common.SessionTestParams; +import org.matrix.androidsdk.common.TestApiCallback; +import org.matrix.androidsdk.data.Room; +import org.matrix.androidsdk.data.RoomState; +import org.matrix.androidsdk.rest.model.Event; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CountDownLatch; + +import javax.annotation.Nullable; + +/** + * + */ +public class RoomNameTestHelper { + + private final CommonTestHelper mTestHelper; + + public RoomNameTestHelper(CommonTestHelper mCommonTestHelper) { + mTestHelper = mCommonTestHelper; + } + + /** + * Create a base scenario for all room name tests + * + * @param nbOfUsers nb of user to create and to invite in the room (min to 1) + * @param roomName initial room name, or null for no room name + * @param withLazyLoading true to enable lazy loading for alice account + * @return initialized data + */ + public RoomNameScenarioData createScenario(final int nbOfUsers, + @Nullable final String roomName, + final boolean withLazyLoading) throws Exception { + + final SessionTestParams createSessionParams = SessionTestParams.newBuilder() + .withInitialSync(true) + .build(); + + List createdSessions = new ArrayList<>(nbOfUsers); + + // Create all the accounts + for (int i = 0; i < nbOfUsers; i++) { + MXSession session = mTestHelper.createAccount("User_" + i, createSessionParams); + + createdSessions.add(session); + } + + Assert.assertEquals(nbOfUsers, createdSessions.size()); + + // First user create a Room + + final MXSession firstSession = createdSessions.get(0); + + final Map results = new HashMap<>(); + CountDownLatch latch = new CountDownLatch(1); + firstSession.createRoom(new TestApiCallback(latch) { + @Override + public void onSuccess(String info) { + results.put("roomId", info); + super.onSuccess(info); + } + }); + mTestHelper.await(latch); + + final String roomId = results.get("roomId"); + final Room room = firstSession.getDataHandler().getRoom(roomId); + + // Update room name + if (roomName != null) { + latch = new CountDownLatch(1); + room.updateName(roomName, new TestApiCallback(latch)); + mTestHelper.await(latch); + } + + //update join rules + latch = new CountDownLatch(1); + room.updateJoinRules(RoomState.JOIN_RULE_PUBLIC, new TestApiCallback(latch)); + mTestHelper.await(latch); + + // TODO Test with invitations + // all other users join the room + for (int i = 1; i < nbOfUsers; i++) { + latch = new CountDownLatch(1); + createdSessions.get(i).joinRoom(roomId, new TestApiCallback(latch)); + mTestHelper.await(latch); + } + + //invite dave + latch = new CountDownLatch(1); + room.invite("@dave:localhost:8480", new TestApiCallback(latch)); + mTestHelper.await(latch); + + // Send messages + final List messages = mTestHelper.sendTextMessage(room, "User message", 50); + + Assert.assertEquals(50, messages.size()); + + // Clear sessions and open new ones + final Context context = InstrumentationRegistry.getContext(); + + for (MXSession session : createdSessions) { + session.clear(context); + } + + final SessionTestParams logSessionParams = SessionTestParams.newBuilder() + .withLazyLoading(withLazyLoading) + .build(); + + List loggedSessions = new ArrayList<>(nbOfUsers); + + for (MXSession session : createdSessions) { + MXSession loggedSession = mTestHelper.logIntoAccount(session.getMyUserId(), logSessionParams); + + loggedSessions.add(loggedSession); + } + + return new RoomNameScenarioData(loggedSessions, roomId); + } +} From 08be71c4aee81e7d7c235adca2dcb4c3e4090cdc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 3 Oct 2018 15:04:31 +0200 Subject: [PATCH 02/79] Better code --- .../androidsdk/lazyloading/RoomNameTest.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java index 12656256d..1678cb43b 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java @@ -28,12 +28,17 @@ import org.matrix.androidsdk.RestClient; import org.matrix.androidsdk.common.CommonTestHelper; +import java.util.Arrays; +import java.util.List; + @FixMethodOrder(MethodSorters.JVM) public class RoomNameTest { private CommonTestHelper mTestHelper = new CommonTestHelper(); private RoomNameTestHelper mRoomNameTestHelper = new RoomNameTestHelper(mTestHelper); + private List userQuantities = Arrays.asList(1, 2, 3, 10); + @BeforeClass public static void init() { RestClient.initUserAgent(InstrumentationRegistry.getContext()); @@ -50,10 +55,9 @@ public void RoomName_noName_LazyLoading() throws Exception { } private void RoomState_noName(final boolean withLazyLoading) throws Exception { - checkAllName( mRoomNameTestHelper.createScenario(1, null, withLazyLoading), null); - checkAllName( mRoomNameTestHelper.createScenario(2, null, withLazyLoading), null); - checkAllName( mRoomNameTestHelper.createScenario(3, null, withLazyLoading), null); - checkAllName( mRoomNameTestHelper.createScenario(10, null, withLazyLoading), null); + for (int qty : userQuantities) { + checkAllName(mRoomNameTestHelper.createScenario(qty, null, withLazyLoading), null); + } } @Test @@ -67,10 +71,9 @@ public void RoomName_name_LazyLoading() throws Exception { } private void RoomState_name(final boolean withLazyLoading) throws Exception { - checkAllName( mRoomNameTestHelper.createScenario(1, "Room name", withLazyLoading), "Room name"); - checkAllName( mRoomNameTestHelper.createScenario(2, "Room name", withLazyLoading), "Room name"); - checkAllName( mRoomNameTestHelper.createScenario(3, "Room name", withLazyLoading), "Room name"); - checkAllName( mRoomNameTestHelper.createScenario(10, "Room name", withLazyLoading), "Room name"); + for (int qty : userQuantities) { + checkAllName(mRoomNameTestHelper.createScenario(qty, "Room name " + qty, withLazyLoading), "Room name " + qty); + } } /* ========================================================================================== From e48bc4b9a34b849d5a1b25352bafb5b2f8d5bc53 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 3 Oct 2018 15:09:43 +0200 Subject: [PATCH 03/79] Cleanup manifest --- matrix-sdk/src/main/AndroidManifest.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/matrix-sdk/src/main/AndroidManifest.xml b/matrix-sdk/src/main/AndroidManifest.xml index b57fd6a07..4bfd8ee9d 100644 --- a/matrix-sdk/src/main/AndroidManifest.xml +++ b/matrix-sdk/src/main/AndroidManifest.xml @@ -1,13 +1,16 @@ - - + - + @@ -17,10 +20,7 @@ - - + From df926f75edf2cb394bd036d60ffd477896e3101a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 3 Oct 2018 15:19:57 +0200 Subject: [PATCH 04/79] Remove unused drawable resource --- .../src/main/res/drawable-xxhdpi/matrix_user.png | Bin 510 -> 0 bytes .../res/layout/adapter_item_icon_and_text.xml | 14 ++++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) delete mode 100755 matrix-sdk/src/main/res/drawable-xxhdpi/matrix_user.png diff --git a/matrix-sdk/src/main/res/drawable-xxhdpi/matrix_user.png b/matrix-sdk/src/main/res/drawable-xxhdpi/matrix_user.png deleted file mode 100755 index 4a47aaf96d7cb0341d40eaa46c61fbe4eee208b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 510 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0h38YK~#8N?VG_4 z!Y~X&`~N>Z#Eo?lPnJy!%t&15nkJ6prkxna%|GMj@gD`C444oYV;stNH-L(-&u8b) zzH06AO$L<9)XG5}P4c?qZs5+NwVG_Lw%Yk<070RRLj z!!)iYqzq6IqvuJ*)e=bCi=PI`L6@>*Uj?)Pq>satp}%JUQE>M-B_O^F><*YjI<5iV z7H|QWMXonOy%9RS?5zf*`+(bv;Oa(51^nZEKmiE9PA5Ri01<)ZC7^a<6b}X9&bQA3 z + android:paddingBottom="10dp"> + tools:src="@tools:sample/avatars" /> + android:textColor="@android:color/white" + tools:text="A text here" + tools:textColor="@android:color/black" /> \ No newline at end of file From 7191b245bc53cc091541d4f57c2edb0ab9c40e99 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 3 Oct 2018 15:21:06 +0200 Subject: [PATCH 05/79] Remove empty file --- matrix-sdk/src/main/res/values/dimens.xml | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 matrix-sdk/src/main/res/values/dimens.xml diff --git a/matrix-sdk/src/main/res/values/dimens.xml b/matrix-sdk/src/main/res/values/dimens.xml deleted file mode 100644 index f11f7450a..000000000 --- a/matrix-sdk/src/main/res/values/dimens.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - From b9b11c5902b430db7f05dcc12879991617250459 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 3 Oct 2018 15:21:45 +0200 Subject: [PATCH 06/79] Remove unused String resource --- matrix-sdk/src/main/res/values-ar/strings.xml | 2 +- matrix-sdk/src/main/res/values-bg/strings.xml | 2 +- matrix-sdk/src/main/res/values-ca/strings.xml | 2 +- matrix-sdk/src/main/res/values-da/strings.xml | 2 +- matrix-sdk/src/main/res/values-de/strings.xml | 1 - matrix-sdk/src/main/res/values-el/strings.xml | 1 - matrix-sdk/src/main/res/values-es-rMX/strings.xml | 1 - matrix-sdk/src/main/res/values-es/strings.xml | 1 - matrix-sdk/src/main/res/values-eu/strings.xml | 2 +- matrix-sdk/src/main/res/values-fi/strings.xml | 2 +- matrix-sdk/src/main/res/values-fr/strings.xml | 2 +- matrix-sdk/src/main/res/values-gl/strings.xml | 1 - matrix-sdk/src/main/res/values-hu/strings.xml | 3 +-- matrix-sdk/src/main/res/values-is/strings.xml | 3 +-- matrix-sdk/src/main/res/values-it/strings.xml | 3 +-- matrix-sdk/src/main/res/values-lv/strings.xml | 3 +-- matrix-sdk/src/main/res/values-nl/strings.xml | 1 - matrix-sdk/src/main/res/values-nn/strings.xml | 1 - matrix-sdk/src/main/res/values-pl/strings.xml | 3 +-- matrix-sdk/src/main/res/values-pt-rBR/strings.xml | 1 - matrix-sdk/src/main/res/values-pt/strings.xml | 1 - matrix-sdk/src/main/res/values-ru/strings.xml | 1 - matrix-sdk/src/main/res/values-sk/strings.xml | 3 +-- matrix-sdk/src/main/res/values-te/strings.xml | 1 - matrix-sdk/src/main/res/values-th/strings.xml | 3 +-- matrix-sdk/src/main/res/values-uk/strings.xml | 3 +-- matrix-sdk/src/main/res/values-zh-rCN/strings.xml | 1 - matrix-sdk/src/main/res/values-zh-rTW/strings.xml | 3 +-- matrix-sdk/src/main/res/values/strings.xml | 2 -- 29 files changed, 16 insertions(+), 39 deletions(-) diff --git a/matrix-sdk/src/main/res/values-ar/strings.xml b/matrix-sdk/src/main/res/values-ar/strings.xml index 5d4d33f63..8dd1e074b 100644 --- a/matrix-sdk/src/main/res/values-ar/strings.xml +++ b/matrix-sdk/src/main/res/values-ar/strings.xml @@ -1,5 +1,5 @@ -عُدّة تطوير البرمجيات لِ‍«ماترِكس» على أندرويد + أرسل ⁨%1$s⁩ صورة. diff --git a/matrix-sdk/src/main/res/values-bg/strings.xml b/matrix-sdk/src/main/res/values-bg/strings.xml index 70de11ac4..674b2d627 100644 --- a/matrix-sdk/src/main/res/values-bg/strings.xml +++ b/matrix-sdk/src/main/res/values-bg/strings.xml @@ -1,5 +1,5 @@ -Matrix Android SDK + %1$s: %2$s %1$s изпрати снимка. diff --git a/matrix-sdk/src/main/res/values-ca/strings.xml b/matrix-sdk/src/main/res/values-ca/strings.xml index 539ca6a14..95e37d459 100644 --- a/matrix-sdk/src/main/res/values-ca/strings.xml +++ b/matrix-sdk/src/main/res/values-ca/strings.xml @@ -14,7 +14,7 @@ %1$s vos ha convidat %1$s ha rebutjat la invitació %1$s ha fet fora a %2$s - Android SDK de Matrix + %1$s ha canviat el seu nom visible de %2$s a %3$s %1$s ha eliminat el seu nom visible (%2$s) diff --git a/matrix-sdk/src/main/res/values-da/strings.xml b/matrix-sdk/src/main/res/values-da/strings.xml index d7c37c1dd..7fb23eca9 100644 --- a/matrix-sdk/src/main/res/values-da/strings.xml +++ b/matrix-sdk/src/main/res/values-da/strings.xml @@ -1,5 +1,5 @@ -Matrix Android SDK + %1$s: %2$s %1$s sendte et billede. diff --git a/matrix-sdk/src/main/res/values-de/strings.xml b/matrix-sdk/src/main/res/values-de/strings.xml index d58c94045..bb507f5d1 100644 --- a/matrix-sdk/src/main/res/values-de/strings.xml +++ b/matrix-sdk/src/main/res/values-de/strings.xml @@ -1,6 +1,5 @@ - Matrix-Android-SDK %1$s: %2$s %1$s hat ein Bild gesendet. diff --git a/matrix-sdk/src/main/res/values-el/strings.xml b/matrix-sdk/src/main/res/values-el/strings.xml index ff855d714..510e8a7dc 100644 --- a/matrix-sdk/src/main/res/values-el/strings.xml +++ b/matrix-sdk/src/main/res/values-el/strings.xml @@ -22,7 +22,6 @@ Ο/Η %1$s άλλαξε το όνομα του δωματίου σε: %2$s Ο/Η %s απάντησε στην κλήση. Ο/Η %s τερμάτισε την κλήση. - SDK για Android του Matrix Ο/Η %s πραγματοποίησε μια κλήση βίντεο. Ο/Η %s πραγματοποίησε μια κλήση ήχου. diff --git a/matrix-sdk/src/main/res/values-es-rMX/strings.xml b/matrix-sdk/src/main/res/values-es-rMX/strings.xml index 57fb929b4..d0c70d898 100644 --- a/matrix-sdk/src/main/res/values-es-rMX/strings.xml +++ b/matrix-sdk/src/main/res/values-es-rMX/strings.xml @@ -1,6 +1,5 @@ - Matrix Android SDK %1$s: %2$s %1$s envió una imagen. diff --git a/matrix-sdk/src/main/res/values-es/strings.xml b/matrix-sdk/src/main/res/values-es/strings.xml index a6cc2bd70..52e88ff43 100644 --- a/matrix-sdk/src/main/res/values-es/strings.xml +++ b/matrix-sdk/src/main/res/values-es/strings.xml @@ -1,6 +1,5 @@ - SDK de Matrix Android %1$s: %2$s %1$s envió una imagen. diff --git a/matrix-sdk/src/main/res/values-eu/strings.xml b/matrix-sdk/src/main/res/values-eu/strings.xml index 41d306f67..dc4485ea3 100644 --- a/matrix-sdk/src/main/res/values-eu/strings.xml +++ b/matrix-sdk/src/main/res/values-eu/strings.xml @@ -1,5 +1,5 @@ -Matrix Android SDK + %1$s: %2$s %1$s erabiltzaileak irudi bat bidali du. diff --git a/matrix-sdk/src/main/res/values-fi/strings.xml b/matrix-sdk/src/main/res/values-fi/strings.xml index dac28a3bb..0df62bbff 100644 --- a/matrix-sdk/src/main/res/values-fi/strings.xml +++ b/matrix-sdk/src/main/res/values-fi/strings.xml @@ -57,7 +57,7 @@ Sähköpostiosoite Puhelinnumero -Matrix Android SDK + " käyttäjän %1$s toimesta" Takaisinveto epäonnistui diff --git a/matrix-sdk/src/main/res/values-fr/strings.xml b/matrix-sdk/src/main/res/values-fr/strings.xml index 039e71290..7be428788 100644 --- a/matrix-sdk/src/main/res/values-fr/strings.xml +++ b/matrix-sdk/src/main/res/values-fr/strings.xml @@ -1,5 +1,5 @@ -SDK Matrix Android + %1$s : %2$s %1$s a envoyé une image. diff --git a/matrix-sdk/src/main/res/values-gl/strings.xml b/matrix-sdk/src/main/res/values-gl/strings.xml index 5110fb773..871a28104 100644 --- a/matrix-sdk/src/main/res/values-gl/strings.xml +++ b/matrix-sdk/src/main/res/values-gl/strings.xml @@ -2,7 +2,6 @@ Enderezo de correo Fallo ao subir a páxina - Matrix Android SDK %1$s: %2$s %1$s enviou unha imaxe. diff --git a/matrix-sdk/src/main/res/values-hu/strings.xml b/matrix-sdk/src/main/res/values-hu/strings.xml index ccbcead0c..e36cc75b5 100644 --- a/matrix-sdk/src/main/res/values-hu/strings.xml +++ b/matrix-sdk/src/main/res/values-hu/strings.xml @@ -1,6 +1,5 @@ -Matrix Android SDK - + %1$s: %2$s %1$s küldött egy képet. diff --git a/matrix-sdk/src/main/res/values-is/strings.xml b/matrix-sdk/src/main/res/values-is/strings.xml index e665055ac..eaf6e3f63 100644 --- a/matrix-sdk/src/main/res/values-is/strings.xml +++ b/matrix-sdk/src/main/res/values-is/strings.xml @@ -1,6 +1,5 @@ -Matrix Android SDK - + %1$s: %2$s %1$s sendi mynd. %1$s sendi límmerki. diff --git a/matrix-sdk/src/main/res/values-it/strings.xml b/matrix-sdk/src/main/res/values-it/strings.xml index 5348662fe..cca7c47c4 100644 --- a/matrix-sdk/src/main/res/values-it/strings.xml +++ b/matrix-sdk/src/main/res/values-it/strings.xml @@ -1,6 +1,5 @@ -Matrix Android SDK - + %1$s: %2$s %1$s ha inviato un\'immagine. diff --git a/matrix-sdk/src/main/res/values-lv/strings.xml b/matrix-sdk/src/main/res/values-lv/strings.xml index 0e7a9cc0b..6cac4f26b 100644 --- a/matrix-sdk/src/main/res/values-lv/strings.xml +++ b/matrix-sdk/src/main/res/values-lv/strings.xml @@ -1,6 +1,5 @@ -Matrix Android SDK - + %1$s: %2$s %1$s nosūtīja attēlu. diff --git a/matrix-sdk/src/main/res/values-nl/strings.xml b/matrix-sdk/src/main/res/values-nl/strings.xml index 11f8e438d..972c5b552 100644 --- a/matrix-sdk/src/main/res/values-nl/strings.xml +++ b/matrix-sdk/src/main/res/values-nl/strings.xml @@ -1,6 +1,5 @@ - Matrix Android SDK %1$s: %2$s %1$s stuurde een afbeelding. diff --git a/matrix-sdk/src/main/res/values-nn/strings.xml b/matrix-sdk/src/main/res/values-nn/strings.xml index b9010f0ce..cb23e62bb 100644 --- a/matrix-sdk/src/main/res/values-nn/strings.xml +++ b/matrix-sdk/src/main/res/values-nn/strings.xml @@ -1,7 +1,6 @@ Kryptert melding - Matrix-Android-SDK %1$s: %2$s %1$s sende eit bilete. diff --git a/matrix-sdk/src/main/res/values-pl/strings.xml b/matrix-sdk/src/main/res/values-pl/strings.xml index 9cdc88bd1..7b8109c0b 100644 --- a/matrix-sdk/src/main/res/values-pl/strings.xml +++ b/matrix-sdk/src/main/res/values-pl/strings.xml @@ -1,6 +1,5 @@ -Matrix Android SDK - + %1$s: %2$s %1$s wysłał zdjęcie. diff --git a/matrix-sdk/src/main/res/values-pt-rBR/strings.xml b/matrix-sdk/src/main/res/values-pt-rBR/strings.xml index 25e573909..dbaf33612 100644 --- a/matrix-sdk/src/main/res/values-pt-rBR/strings.xml +++ b/matrix-sdk/src/main/res/values-pt-rBR/strings.xml @@ -1,6 +1,5 @@ - Matrix Android SDK %1$s: %2$s %1$s enviou uma imagem. diff --git a/matrix-sdk/src/main/res/values-pt/strings.xml b/matrix-sdk/src/main/res/values-pt/strings.xml index 6d8500a6a..1fa4eeff7 100644 --- a/matrix-sdk/src/main/res/values-pt/strings.xml +++ b/matrix-sdk/src/main/res/values-pt/strings.xml @@ -1,6 +1,5 @@ - Matrix Android SDK %1$s: %2$s %1$s enviou uma imagem. diff --git a/matrix-sdk/src/main/res/values-ru/strings.xml b/matrix-sdk/src/main/res/values-ru/strings.xml index 704ea394d..bb7b14e01 100644 --- a/matrix-sdk/src/main/res/values-ru/strings.xml +++ b/matrix-sdk/src/main/res/values-ru/strings.xml @@ -1,6 +1,5 @@ - Matrix Android SDK %1$s: %2$s %1$s отправил(а) изображение. diff --git a/matrix-sdk/src/main/res/values-sk/strings.xml b/matrix-sdk/src/main/res/values-sk/strings.xml index fb98be023..ee532e9d1 100644 --- a/matrix-sdk/src/main/res/values-sk/strings.xml +++ b/matrix-sdk/src/main/res/values-sk/strings.xml @@ -1,6 +1,5 @@ -Matrix Android SDK - + %1$s: %2$s %1$s poslal obrázok. diff --git a/matrix-sdk/src/main/res/values-te/strings.xml b/matrix-sdk/src/main/res/values-te/strings.xml index 207e69c03..c34de973d 100644 --- a/matrix-sdk/src/main/res/values-te/strings.xml +++ b/matrix-sdk/src/main/res/values-te/strings.xml @@ -57,7 +57,6 @@ ఇమెయిల్ చిరునామా ఫోను నంబరు -మ్యాట్రిక్స్ అండ్రొఇడ్ ఏస్ డి కె %1$s: %2$s %1$s ఒక చిత్రం పంపారు. diff --git a/matrix-sdk/src/main/res/values-th/strings.xml b/matrix-sdk/src/main/res/values-th/strings.xml index d8374c668..5ddb5276d 100644 --- a/matrix-sdk/src/main/res/values-th/strings.xml +++ b/matrix-sdk/src/main/res/values-th/strings.xml @@ -1,5 +1,4 @@ -Matrix Android SDK - + %1$s: %2$s diff --git a/matrix-sdk/src/main/res/values-uk/strings.xml b/matrix-sdk/src/main/res/values-uk/strings.xml index 24cf67446..75a5a7889 100644 --- a/matrix-sdk/src/main/res/values-uk/strings.xml +++ b/matrix-sdk/src/main/res/values-uk/strings.xml @@ -1,6 +1,5 @@ -Matrix Android SDK - + %1$s: %2$s %1$s відправив зображення. diff --git a/matrix-sdk/src/main/res/values-zh-rCN/strings.xml b/matrix-sdk/src/main/res/values-zh-rCN/strings.xml index 5d5edf5c4..bf8f9d6ef 100644 --- a/matrix-sdk/src/main/res/values-zh-rCN/strings.xml +++ b/matrix-sdk/src/main/res/values-zh-rCN/strings.xml @@ -61,7 +61,6 @@ %1$s 接受了 %2$s 的邀请 无法撤回 - Matrix Android SDK %1$s:%2$s %1$s 发送了一张贴纸。 diff --git a/matrix-sdk/src/main/res/values-zh-rTW/strings.xml b/matrix-sdk/src/main/res/values-zh-rTW/strings.xml index 516201cbf..7e247991c 100644 --- a/matrix-sdk/src/main/res/values-zh-rTW/strings.xml +++ b/matrix-sdk/src/main/res/values-zh-rTW/strings.xml @@ -1,6 +1,5 @@ -Matrix Android 軟體開發工具 - + %1$s:%2$s %1$s 傳送了一張圖片。 diff --git a/matrix-sdk/src/main/res/values/strings.xml b/matrix-sdk/src/main/res/values/strings.xml index 28e684ed8..adaca9b40 100644 --- a/matrix-sdk/src/main/res/values/strings.xml +++ b/matrix-sdk/src/main/res/values/strings.xml @@ -1,6 +1,4 @@ - Matrix Android SDK - %1$s: %2$s %1$s sent an image. %1$s sent a sticker. From ea21045c384b2788c6453abc941cc23bbc4a8f13 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 4 Oct 2018 18:36:46 +0200 Subject: [PATCH 07/79] Add comment --- matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java | 1 + 1 file changed, 1 insertion(+) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java index 0706ed978..bfd3f2cda 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java @@ -737,6 +737,7 @@ public void onMatrixError(MatrixError e) { Log.e(LOG_TAG, "join onMatrixError " + e.getMessage()); if (MatrixError.UNKNOWN.equals(e.errcode) && TextUtils.equals("No known servers", e.error)) { + // It can happen when user wants to join a room he was invited to, but the inviter has left // minging kludge until https://matrix.org/jira/browse/SYN-678 is fixed // 'Error when trying to join an empty room should be more explicit e.error = getStore().getContext().getString(org.matrix.androidsdk.R.string.room_error_join_failed_empty_room); From d1d702e5c81aa477f8032fe42139f7ccb14c139f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 5 Oct 2018 09:37:51 +0200 Subject: [PATCH 08/79] Make mCredentials private --- .../org/matrix/androidsdk/MXDataHandler.java | 4 --- .../org/matrix/androidsdk/RestClient.java | 2 +- .../androidsdk/rest/api/ProfileApi.java | 2 +- .../rest/client/LoginRestClient.java | 12 ++++----- .../rest/client/ProfileRestClient.java | 16 ++++++------ .../rest/client/RoomsRestClient.java | 6 ++--- .../model/login/TokenRefreshResponse.java | 25 +++++++++++++++++-- 7 files changed, 42 insertions(+), 25 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java index 77d829a62..770d34c31 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java @@ -24,7 +24,6 @@ import android.text.TextUtils; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import org.matrix.androidsdk.call.MXCallsManager; @@ -53,7 +52,6 @@ import org.matrix.androidsdk.rest.client.ProfileRestClient; import org.matrix.androidsdk.rest.client.RoomsRestClient; import org.matrix.androidsdk.rest.client.ThirdPidRestClient; -import org.matrix.androidsdk.rest.json.ConditionDeserializer; import org.matrix.androidsdk.rest.model.ChunkEvents; import org.matrix.androidsdk.rest.model.Event; import org.matrix.androidsdk.rest.model.MatrixError; @@ -62,7 +60,6 @@ import org.matrix.androidsdk.rest.model.RoomMember; import org.matrix.androidsdk.rest.model.User; import org.matrix.androidsdk.rest.model.bingrules.BingRule; -import org.matrix.androidsdk.rest.model.bingrules.Condition; import org.matrix.androidsdk.rest.model.bingrules.PushRuleSet; import org.matrix.androidsdk.rest.model.bingrules.PushRulesResponse; import org.matrix.androidsdk.rest.model.group.InvitedGroupSync; @@ -75,7 +72,6 @@ import org.matrix.androidsdk.util.Log; import org.matrix.androidsdk.util.MXOsHandler; -import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java index fc02ec8a5..b2d55cfb3 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java @@ -87,7 +87,7 @@ public enum EndPointServer { private static final int READ_TIMEOUT_MS = 60000; private static final int WRITE_TIMEOUT_MS = 60000; - protected Credentials mCredentials; + private Credentials mCredentials; protected T mApi; diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/api/ProfileApi.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/api/ProfileApi.java index c3e69d0ec..9cb7b14ba 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/api/ProfileApi.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/api/ProfileApi.java @@ -110,7 +110,7 @@ public interface ProfileApi { * @param refreshParams the refresh token parameters */ @POST(RestClient.URI_API_PREFIX_PATH_R0 + "tokenrefresh") - Call tokenrefresh(@Body TokenRefreshParams refreshParams); + Call tokenRefresh(@Body TokenRefreshParams refreshParams); /** * List all 3PIDs linked to the Matrix user account. diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/LoginRestClient.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/LoginRestClient.java index cdb6fb8be..6344ae769 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/LoginRestClient.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/LoginRestClient.java @@ -136,8 +136,8 @@ public void onRetry() { @Override public void success(JsonObject jsonObject, Response response) { onEventSent(); - mCredentials = gson.fromJson(jsonObject, Credentials.class); - callback.onSuccess(mCredentials); + setCredentials(gson.fromJson(jsonObject, Credentials.class)); + callback.onSuccess(getCredentials()); } }); } @@ -281,8 +281,8 @@ public void onRetry() { @Override public void success(JsonObject jsonObject, Response response) { onEventSent(); - mCredentials = gson.fromJson(jsonObject, Credentials.class); - callback.onSuccess(mCredentials); + setCredentials(gson.fromJson(jsonObject, Credentials.class)); + callback.onSuccess(getCredentials()); } }); } @@ -334,8 +334,8 @@ public void onRetry() { @Override public void success(JsonObject jsonObject, Response response) { onEventSent(); - mCredentials = gson.fromJson(jsonObject, Credentials.class); - callback.onSuccess(mCredentials); + setCredentials(gson.fromJson(jsonObject, Credentials.class)); + callback.onSuccess(getCredentials()); } }); } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/ProfileRestClient.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/ProfileRestClient.java index c678b4e1f..25f36daec 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/ProfileRestClient.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/ProfileRestClient.java @@ -102,7 +102,7 @@ public void updateDisplayname(final String newName, final ApiCallback call // don't retry if the network comes back // let the user chooses what he want to do - mApi.displayname(mCredentials.userId, user) + mApi.displayname(getCredentials().userId, user) .enqueue(new RestAdapterCallback(description, mUnsentEventsManager, callback, new RestAdapterCallback.RequestRetryCallBack() { @Override public void onRetry() { @@ -150,7 +150,7 @@ public void updateAvatarUrl(final String newUrl, final ApiCallback callbac User user = new User(); user.setAvatarUrl(newUrl); - mApi.avatarUrl(mCredentials.userId, user) + mApi.avatarUrl(getCredentials().userId, user) .enqueue(new RestAdapterCallback(description, mUnsentEventsManager, callback, new RestAdapterCallback.RequestRetryCallBack() { @Override public void onRetry() { @@ -297,17 +297,17 @@ public void refreshTokens(final ApiCallback callback) { final String description = "refreshTokens"; TokenRefreshParams params = new TokenRefreshParams(); - params.refresh_token = mCredentials.refreshToken; + params.refresh_token = getCredentials().refreshToken; - mApi.tokenrefresh(params) + mApi.tokenRefresh(params) .enqueue(new RestAdapterCallback(description, mUnsentEventsManager, callback, null) { @Override - public void success(TokenRefreshResponse tokenreponse, Response response) { + public void success(TokenRefreshResponse tokenResponse, Response response) { onEventSent(); - mCredentials.refreshToken = tokenreponse.refresh_token; - mCredentials.accessToken = tokenreponse.access_token; + getCredentials().refreshToken = tokenResponse.refreshToken; + getCredentials().accessToken = tokenResponse.accessToken; if (null != callback) { - callback.onSuccess(mCredentials); + callback.onSuccess(getCredentials()); } } }); diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/RoomsRestClient.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/RoomsRestClient.java index 43930bc1f..0ebcf34f6 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/RoomsRestClient.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/RoomsRestClient.java @@ -857,7 +857,7 @@ public void addTag(final String roomId, final String tag, final Double order, fi Map hashMap = new HashMap<>(); hashMap.put("order", order); - mApi.addTag(mCredentials.userId, roomId, tag, hashMap) + mApi.addTag(getCredentials().userId, roomId, tag, hashMap) .enqueue(new RestAdapterCallback(description, mUnsentEventsManager, callback, new RestAdapterCallback.RequestRetryCallBack() { @Override public void onRetry() { @@ -876,7 +876,7 @@ public void onRetry() { public void removeTag(final String roomId, final String tag, final ApiCallback callback) { final String description = "removeTag : roomId " + roomId + " - tag " + tag; - mApi.removeTag(mCredentials.userId, roomId, tag) + mApi.removeTag(getCredentials().userId, roomId, tag) .enqueue(new RestAdapterCallback(description, mUnsentEventsManager, callback, new RestAdapterCallback.RequestRetryCallBack() { @Override public void onRetry() { @@ -898,7 +898,7 @@ public void updateURLPreviewStatus(final String roomId, final boolean status, fi Map params = new HashMap<>(); params.put(AccountDataRestClient.ACCOUNT_DATA_KEY_URL_PREVIEW_DISABLE, !status); - mApi.updateAccountData(mCredentials.userId, roomId, Event.EVENT_TYPE_URL_PREVIEW, params) + mApi.updateAccountData(getCredentials().userId, roomId, Event.EVENT_TYPE_URL_PREVIEW, params) .enqueue(new RestAdapterCallback(description, mUnsentEventsManager, callback, new RestAdapterCallback.RequestRetryCallBack() { @Override public void onRetry() { diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/login/TokenRefreshResponse.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/login/TokenRefreshResponse.java index 57e5ad39f..8b6d4518a 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/login/TokenRefreshResponse.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/login/TokenRefreshResponse.java @@ -1,8 +1,29 @@ +/* + * Copyright 2018 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.rest.model.login; +import com.google.gson.annotations.SerializedName; + public class TokenRefreshResponse { - public String access_token; - public String refresh_token; + @SerializedName("access_token") + public String accessToken; + + @SerializedName("refresh_token") + public String refreshToken; } From b992aaed7472b056ebc88ae0272caacb30b79c37 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 5 Oct 2018 09:42:18 +0200 Subject: [PATCH 09/79] Cleanup RestClient --- .../java/org/matrix/androidsdk/RestClient.java | 16 ---------------- .../matrix/androidsdk/rest/api/EventsApi.java | 1 + .../androidsdk/rest/client/EventsRestClient.java | 4 ---- .../androidsdk/rest/client/GroupsRestClient.java | 4 ---- 4 files changed, 1 insertion(+), 24 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java index b2d55cfb3..7b6a5f1d1 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java @@ -404,20 +404,4 @@ public Credentials getCredentials() { public void setCredentials(Credentials credentials) { mCredentials = credentials; } - - /** - * Default protected constructor for unit tests. - */ - protected RestClient() { - } - - /** - * Protected setter for injection by unit tests. - * - * @param api the api object - */ - @VisibleForTesting() - protected void setApi(T api) { - mApi = api; - } } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/api/EventsApi.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/api/EventsApi.java index 813c5b43d..d8dd58173 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/api/EventsApi.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/api/EventsApi.java @@ -39,6 +39,7 @@ /** * The events API. + * This interface contains also a lot of miscellaneous requests */ public interface EventsApi { diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/EventsRestClient.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/EventsRestClient.java index b36a5b18f..d28219d71 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/EventsRestClient.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/EventsRestClient.java @@ -66,10 +66,6 @@ public EventsRestClient(HomeServerConnectionConfig hsConfig) { super(hsConfig, EventsApi.class, "", false); } - protected EventsRestClient(EventsApi api) { - mApi = api; - } - /** * Retrieves the third party server protocols * diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/GroupsRestClient.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/GroupsRestClient.java index 364cc0d2d..609dd7a74 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/GroupsRestClient.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/client/GroupsRestClient.java @@ -60,10 +60,6 @@ public GroupsRestClient(HomeServerConnectionConfig hsConfig) { super(hsConfig, GroupsApi.class, RestClient.URI_API_PREFIX_PATH_R0, false); } - protected GroupsRestClient(GroupsApi api) { - mApi = api; - } - /** * Create a group. * From 38681426bca11e7d0f2bfd0a17514af71095fe7f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 5 Oct 2018 09:47:53 +0200 Subject: [PATCH 10/79] Ensure all sessions are cleared in the tests --- .../androidsdk/common/CommonTestHelper.java | 44 +++++++++++++++++++ .../lazyloading/LazyLoadingScenarioData.java | 6 +-- .../lazyloading/RoomMembersTest.java | 4 ++ .../lazyloading/RoomNameScenarioData.java | 2 +- .../androidsdk/lazyloading/RoomNameTest.java | 8 +++- .../lazyloading/RoomNameTestHelper.java | 10 +---- .../androidsdk/lazyloading/RoomStateTest.java | 6 +++ .../lazyloading/RoomSummaryTest.java | 3 ++ .../androidsdk/lazyloading/SearchTest.java | 1 + 9 files changed, 69 insertions(+), 15 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java index bcbef2901..c7f8235cd 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java @@ -31,6 +31,8 @@ import org.matrix.androidsdk.data.RoomMediaMessage; import org.matrix.androidsdk.data.store.IMXStore; import org.matrix.androidsdk.data.store.MXFileStore; +import org.matrix.androidsdk.lazyloading.LazyLoadingScenarioData; +import org.matrix.androidsdk.lazyloading.RoomNameScenarioData; import org.matrix.androidsdk.listeners.MXEventListener; import org.matrix.androidsdk.rest.client.LoginRestClient; import org.matrix.androidsdk.rest.model.Event; @@ -355,4 +357,46 @@ public void onSuccess(Credentials credentials) { public void await(CountDownLatch latch) throws InterruptedException { Assert.assertTrue(latch.await(TestConstants.AWAIT_TIME_OUT_MILLIS, TimeUnit.MILLISECONDS)); } + + /** + * Clear all non null sessions in lazy loading scenario data + * + * @param data + */ + public void clearAllSessions(LazyLoadingScenarioData data) { + List sessionsToClear = new ArrayList<>(); + if (data.aliceSession != null) { + sessionsToClear.add(data.aliceSession); + } + if (data.bobSession != null) { + sessionsToClear.add(data.bobSession); + } + if (data.samSession != null) { + sessionsToClear.add(data.samSession); + } + + clearAllSessions(sessionsToClear); + } + + /** + * Clear all sessions in room name scenario data + * + * @param data + */ + public void clearAllSessions(RoomNameScenarioData data) { + clearAllSessions(data.userSessions); + } + + /** + * Clear all provided sessions + * + * @param sessions the sessions to clear + */ + public void clearAllSessions(List sessions) { + final Context context = InstrumentationRegistry.getContext(); + + for (MXSession session : sessions) { + session.clear(context); + } + } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingScenarioData.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingScenarioData.java index c7f3798be..8a71ef9ed 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingScenarioData.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingScenarioData.java @@ -22,9 +22,9 @@ * The sessions are not synced by default as you want to perform some custom tests */ public class LazyLoadingScenarioData { - final MXSession aliceSession; - final MXSession bobSession; - final MXSession samSession; + final public MXSession aliceSession; + final public MXSession bobSession; + final public MXSession samSession; final String roomId; final String bobMessageId; diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomMembersTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomMembersTest.java index 82c3aee1a..6e76317b4 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomMembersTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomMembersTest.java @@ -65,6 +65,7 @@ public void onSuccess(List roomMembers) { } }); mTestHelper.await(lock); + mTestHelper.clearAllSessions(data); } @Test @@ -90,6 +91,7 @@ public void onSuccess(List roomMembers) { } }); mTestHelper.await(lock); + mTestHelper.clearAllSessions(data); } @Test @@ -115,6 +117,7 @@ public void onSuccess(List roomMembers) { } }); mTestHelper.await(lock); + mTestHelper.clearAllSessions(data); } @Test @@ -137,6 +140,7 @@ private void RoomMembers_CheckAlreadyLoadedCount(final boolean withLazyLoading) } else { Assert.assertEquals(4, members.size()); } + mTestHelper.clearAllSessions(data); } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameScenarioData.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameScenarioData.java index 7cf82b5d8..5f6b5455e 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameScenarioData.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameScenarioData.java @@ -24,7 +24,7 @@ * The sessions are not synced by default as you want to perform some custom tests */ public class RoomNameScenarioData { - final List userSessions; + final public List userSessions; final String roomId; diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java index 1678cb43b..3610cbc24 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java @@ -56,7 +56,9 @@ public void RoomName_noName_LazyLoading() throws Exception { private void RoomState_noName(final boolean withLazyLoading) throws Exception { for (int qty : userQuantities) { - checkAllName(mRoomNameTestHelper.createScenario(qty, null, withLazyLoading), null); + RoomNameScenarioData data = mRoomNameTestHelper.createScenario(qty, null, withLazyLoading); + checkAllName(data, null); + mTestHelper.clearAllSessions(data); } } @@ -72,7 +74,9 @@ public void RoomName_name_LazyLoading() throws Exception { private void RoomState_name(final boolean withLazyLoading) throws Exception { for (int qty : userQuantities) { - checkAllName(mRoomNameTestHelper.createScenario(qty, "Room name " + qty, withLazyLoading), "Room name " + qty); + RoomNameScenarioData data = mRoomNameTestHelper.createScenario(qty, "Room name " + qty, withLazyLoading); + checkAllName(data, "Room name " + qty); + mTestHelper.clearAllSessions(data); } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java index 09418929f..1157ae126 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java @@ -15,9 +15,6 @@ */ package org.matrix.androidsdk.lazyloading; -import android.content.Context; -import android.support.test.InstrumentationRegistry; - import junit.framework.Assert; import org.matrix.androidsdk.MXSession; @@ -26,7 +23,6 @@ import org.matrix.androidsdk.common.TestApiCallback; import org.matrix.androidsdk.data.Room; import org.matrix.androidsdk.data.RoomState; -import org.matrix.androidsdk.rest.model.Event; import java.util.ArrayList; import java.util.HashMap; @@ -123,11 +119,7 @@ public void onSuccess(String info) { Assert.assertEquals(50, messages.size()); // Clear sessions and open new ones - final Context context = InstrumentationRegistry.getContext(); - - for (MXSession session : createdSessions) { - session.clear(context); - } + mTestHelper.clearAllSessions(createdSessions); final SessionTestParams logSessionParams = SessionTestParams.newBuilder() .withLazyLoading(withLazyLoading) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomStateTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomStateTest.java index 3d613bc30..cc365fb61 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomStateTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomStateTest.java @@ -70,6 +70,7 @@ private void RoomState_InitialSync(final boolean withLazyLoading) throws Excepti Assert.assertEquals(1, aliceRoom.getNumberOfInvitedMembers()); Assert.assertEquals(3, aliceRoom.getNumberOfJoinedMembers()); + mTestHelper.clearAllSessions(data); } @Test @@ -107,6 +108,7 @@ public void onEvent(Event event, EventTimeline.Direction direction, RoomState ro Assert.assertEquals(1, aliceRoom.getNumberOfInvitedMembers()); Assert.assertEquals(3, aliceRoom.getNumberOfJoinedMembers()); + mTestHelper.clearAllSessions(data); } @Test @@ -165,6 +167,7 @@ public void onEvent(Event event, EventTimeline.Direction direction, RoomState ro }); recursiveBackPaginate(liveTimeline, 0, 30, 120); mTestHelper.await(lock); + mTestHelper.clearAllSessions(data); } @Test @@ -201,6 +204,7 @@ public void onSuccess(Void info) { Assert.assertEquals(1, aliceRoom.getNumberOfInvitedMembers()); Assert.assertEquals(3, aliceRoom.getNumberOfJoinedMembers()); + mTestHelper.clearAllSessions(data); } @Test @@ -266,6 +270,7 @@ public void onSuccess(Integer info) { } }); mTestHelper.await(lock); + mTestHelper.clearAllSessions(data); } @Test @@ -338,6 +343,7 @@ public void onSuccess(Integer info) { } }); mTestHelper.await(lock); + mTestHelper.clearAllSessions(data); } /** diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomSummaryTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomSummaryTest.java index 03ecb85b5..5294a1950 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomSummaryTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomSummaryTest.java @@ -66,6 +66,7 @@ private void RoomSummary_CheckMembership(boolean withLazyLoading) throws Excepti final RoomSummary samRoomSummary = samRoom.getRoomSummary(); Assert.assertNotNull(samRoomSummary); Assert.assertTrue(samRoomSummary.isJoined()); + mTestHelper.clearAllSessions(data); } @Test @@ -92,6 +93,7 @@ private void RoomSummary_MemberCount(boolean withLazyLoading) throws Exception { Assert.assertEquals(0, roomSummary.getNumberOfJoinedMembers()); Assert.assertEquals(0, roomSummary.getNumberOfInvitedMembers()); } + mTestHelper.clearAllSessions(data); } @Test @@ -115,6 +117,7 @@ private void RoomSummary_CheckRoomSummaryIsNullAfterLeavingFromAnotherDevice(boo mTestHelper.syncSession(data.aliceSession, false); final RoomSummary roomSummary = data.aliceSession.getDataHandler().getStore().getSummary(data.roomId); Assert.assertNull(roomSummary); + mTestHelper.clearAllSessions(data); } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/SearchTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/SearchTest.java index ae279e62e..827096909 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/SearchTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/SearchTest.java @@ -51,6 +51,7 @@ public void onSuccess(SearchResponse info) { } }); mTestHelper.await(lock); + mTestHelper.clearAllSessions(data); } } From 4572f43e0cedd09ab87c7e2044ce105ed3c382ac Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 5 Oct 2018 11:25:54 +0200 Subject: [PATCH 11/79] Fix room name test --- .../androidsdk/lazyloading/RoomNameTestHelper.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java index 1157ae126..46ca5c014 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java @@ -113,26 +113,23 @@ public void onSuccess(String info) { room.invite("@dave:localhost:8480", new TestApiCallback(latch)); mTestHelper.await(latch); - // Send messages - final List messages = mTestHelper.sendTextMessage(room, "User message", 50); - - Assert.assertEquals(50, messages.size()); - - // Clear sessions and open new ones - mTestHelper.clearAllSessions(createdSessions); - final SessionTestParams logSessionParams = SessionTestParams.newBuilder() .withLazyLoading(withLazyLoading) + .withInitialSync(true) .build(); List loggedSessions = new ArrayList<>(nbOfUsers); + // open new sessions, using the same user ids for (MXSession session : createdSessions) { MXSession loggedSession = mTestHelper.logIntoAccount(session.getMyUserId(), logSessionParams); loggedSessions.add(loggedSession); } + // Clear created sessions (must be done after getting the user ids) + mTestHelper.clearAllSessions(createdSessions); + return new RoomNameScenarioData(loggedSessions, roomId); } } From dd516d7d3998cee0d09e5600c24af3461f061d6c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 5 Oct 2018 17:12:12 +0200 Subject: [PATCH 12/79] typo --- .../src/main/java/org/matrix/androidsdk/data/RoomState.java | 2 +- .../matrix/androidsdk/data/timeline/TimelineStateHolder.java | 2 +- .../main/java/org/matrix/androidsdk/rest/model/RoomMember.java | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java index 30d17eba6..16181bbe2 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java @@ -98,7 +98,7 @@ public class RoomState implements Externalizable { // merged from mAliasesByHomeServerUrl private List mMergedAliasesList; - // + // Map of list of state event, the key are the event type private Map> mStateEvents = new HashMap<>(); // The canonical alias of the room. diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java index 06efac789..6f26c1e2e 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java @@ -93,7 +93,7 @@ public void setBackState(@NonNull final RoomState state) { } /** - * Make a deep copy or the dedicated state. + * Make a deep copy of the dedicated state. * * @param direction the room state direction to deep copy. */ diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomMember.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomMember.java index 8006c1474..f6c2f7f91 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomMember.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomMember.java @@ -44,7 +44,9 @@ public class RoomMember implements Externalizable { // not supported by the server sync response by computed from the room state events public static final String MEMBERSHIP_KICK = "kick"; + @SerializedName("displayname") public String displayname; + @SerializedName("avatar_url") public String avatarUrl; public String membership; public Invite thirdPartyInvite; From c66197236670d7019b467bad2202a0cf6bb81e67 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 8 Oct 2018 18:25:59 +0200 Subject: [PATCH 13/79] Better API for IMXCall --- .../src/main/java/org/matrix/androidsdk/call/IMXCall.java | 6 ++++-- .../src/main/java/org/matrix/androidsdk/call/MXCall.java | 6 +++++- .../main/java/org/matrix/androidsdk/call/MXChromeCall.java | 6 +++++- .../main/java/org/matrix/androidsdk/call/MXWebRtcCall.java | 6 +++++- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/call/IMXCall.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/call/IMXCall.java index 944580f91..ab7dfb3b2 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/call/IMXCall.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/call/IMXCall.java @@ -24,6 +24,8 @@ import org.matrix.androidsdk.data.Room; import org.matrix.androidsdk.rest.model.Event; +import javax.annotation.Nullable; + /** * Audio/video call interface. * See {@link MXWebRtcCall} and {@link MXChromeCall}. @@ -170,9 +172,9 @@ public interface IMXCall { /** * The call is hung up. * - * @param reason the reason + * @param reason the reason, or null for no reason. Reasons are used to indicate errors in the current VoIP implementation. */ - void hangup(String reason); + void hangup(@Nullable String reason); /** * Add a listener to the call manager. diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXCall.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXCall.java index 51bde742f..0f2f04ebf 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXCall.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXCall.java @@ -40,6 +40,8 @@ import java.util.Set; import java.util.Timer; +import javax.annotation.Nullable; + /** * This class is the default implementation */ @@ -217,8 +219,10 @@ public void onAnsweredElsewhere() { /** * The call is hung up. + * + * @param reason the reason, or null for no reason. Reasons are used to indicate errors in the current VoIP implementation. */ - public void hangup(String reason) { + public void hangup(@Nullable String reason) { } // getters / setters diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXChromeCall.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXChromeCall.java index 6ece1d208..257868ad8 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXChromeCall.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXChromeCall.java @@ -44,6 +44,8 @@ import java.util.Timer; import java.util.TimerTask; +import javax.annotation.Nullable; + public class MXChromeCall extends MXCall { private static final String LOG_TAG = MXChromeCall.class.getSimpleName(); @@ -379,9 +381,11 @@ public void run() { /** * The call is hung up. + * + * @param reason the reason, or null for no reason. Reasons are used to indicate errors in the current VoIP implementation. */ @Override - public void hangup(String reason) { + public void hangup(@Nullable String reason) { super.hangup(reason); if (!CALL_STATE_CREATED.equals(getCallState()) && (null != mWebView)) { diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXWebRtcCall.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXWebRtcCall.java index dc689ddbb..6bd2ab630 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXWebRtcCall.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/call/MXWebRtcCall.java @@ -58,6 +58,8 @@ import java.util.Timer; import java.util.TimerTask; +import javax.annotation.Nullable; + public class MXWebRtcCall extends MXCall { private static final String LOG_TAG = MXWebRtcCall.class.getSimpleName(); @@ -1638,9 +1640,11 @@ public void onSetFailure(String s) { /** * The call is hung up. + * + * @param reason the reason, or null for no reason. Reasons are used to indicate errors in the current VoIP implementation. */ @Override - public void hangup(String reason) { + public void hangup(@Nullable String reason) { super.hangup(reason); Log.d(LOG_TAG, "## hangup(): reason=" + reason); From 229529f9c3361b5df98d172707921a7ded6385bd Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 9 Oct 2018 10:28:08 +0200 Subject: [PATCH 14/79] Better separation of concerns --- .../androidsdk/common/CommonTestHelper.java | 31 ------------------- .../lazyloading/LazyLoadingTestHelper.java | 21 +++++++++++++ .../lazyloading/RoomMembersTest.java | 8 ++--- .../androidsdk/lazyloading/RoomNameTest.java | 4 +-- .../lazyloading/RoomNameTestHelper.java | 9 ++++++ .../androidsdk/lazyloading/RoomStateTest.java | 12 +++---- .../lazyloading/RoomSummaryTest.java | 6 ++-- .../androidsdk/lazyloading/SearchTest.java | 2 +- 8 files changed, 46 insertions(+), 47 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java index c7f8235cd..0507390f8 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java @@ -31,8 +31,6 @@ import org.matrix.androidsdk.data.RoomMediaMessage; import org.matrix.androidsdk.data.store.IMXStore; import org.matrix.androidsdk.data.store.MXFileStore; -import org.matrix.androidsdk.lazyloading.LazyLoadingScenarioData; -import org.matrix.androidsdk.lazyloading.RoomNameScenarioData; import org.matrix.androidsdk.listeners.MXEventListener; import org.matrix.androidsdk.rest.client.LoginRestClient; import org.matrix.androidsdk.rest.model.Event; @@ -358,35 +356,6 @@ public void await(CountDownLatch latch) throws InterruptedException { Assert.assertTrue(latch.await(TestConstants.AWAIT_TIME_OUT_MILLIS, TimeUnit.MILLISECONDS)); } - /** - * Clear all non null sessions in lazy loading scenario data - * - * @param data - */ - public void clearAllSessions(LazyLoadingScenarioData data) { - List sessionsToClear = new ArrayList<>(); - if (data.aliceSession != null) { - sessionsToClear.add(data.aliceSession); - } - if (data.bobSession != null) { - sessionsToClear.add(data.bobSession); - } - if (data.samSession != null) { - sessionsToClear.add(data.samSession); - } - - clearAllSessions(sessionsToClear); - } - - /** - * Clear all sessions in room name scenario data - * - * @param data - */ - public void clearAllSessions(RoomNameScenarioData data) { - clearAllSessions(data.userSessions); - } - /** * Clear all provided sessions * diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingTestHelper.java index 5c136de07..77a0ac6ff 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingTestHelper.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/LazyLoadingTestHelper.java @@ -29,6 +29,7 @@ import org.matrix.androidsdk.data.RoomState; import org.matrix.androidsdk.rest.model.Event; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -138,4 +139,24 @@ public void onSuccess(String info) { samSession = mTestHelper.logIntoAccount(samId, logSessionParams); return new LazyLoadingScenarioData(aliceSession, bobSession, samSession, roomId, bobMessageId); } + + /** + * Clear all non null sessions in lazy loading scenario data + * + * @param data + */ + public void clearAllSessions(LazyLoadingScenarioData data) { + List sessionsToClear = new ArrayList<>(); + if (data.aliceSession != null) { + sessionsToClear.add(data.aliceSession); + } + if (data.bobSession != null) { + sessionsToClear.add(data.bobSession); + } + if (data.samSession != null) { + sessionsToClear.add(data.samSession); + } + + mTestHelper.clearAllSessions(sessionsToClear); + } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomMembersTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomMembersTest.java index 6e76317b4..dd0d9c4af 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomMembersTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomMembersTest.java @@ -65,7 +65,7 @@ public void onSuccess(List roomMembers) { } }); mTestHelper.await(lock); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } @Test @@ -91,7 +91,7 @@ public void onSuccess(List roomMembers) { } }); mTestHelper.await(lock); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } @Test @@ -117,7 +117,7 @@ public void onSuccess(List roomMembers) { } }); mTestHelper.await(lock); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } @Test @@ -140,7 +140,7 @@ private void RoomMembers_CheckAlreadyLoadedCount(final boolean withLazyLoading) } else { Assert.assertEquals(4, members.size()); } - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java index 3610cbc24..2b4be86da 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTest.java @@ -58,7 +58,7 @@ private void RoomState_noName(final boolean withLazyLoading) throws Exception { for (int qty : userQuantities) { RoomNameScenarioData data = mRoomNameTestHelper.createScenario(qty, null, withLazyLoading); checkAllName(data, null); - mTestHelper.clearAllSessions(data); + mRoomNameTestHelper.clearAllSessions(data); } } @@ -76,7 +76,7 @@ private void RoomState_name(final boolean withLazyLoading) throws Exception { for (int qty : userQuantities) { RoomNameScenarioData data = mRoomNameTestHelper.createScenario(qty, "Room name " + qty, withLazyLoading); checkAllName(data, "Room name " + qty); - mTestHelper.clearAllSessions(data); + mRoomNameTestHelper.clearAllSessions(data); } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java index 46ca5c014..65e5af31f 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomNameTestHelper.java @@ -132,4 +132,13 @@ public void onSuccess(String info) { return new RoomNameScenarioData(loggedSessions, roomId); } + + /** + * Clear all sessions in room name scenario data + * + * @param data + */ + public void clearAllSessions(RoomNameScenarioData data) { + mTestHelper.clearAllSessions(data.userSessions); + } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomStateTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomStateTest.java index cc365fb61..7f4cbcce8 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomStateTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomStateTest.java @@ -70,7 +70,7 @@ private void RoomState_InitialSync(final boolean withLazyLoading) throws Excepti Assert.assertEquals(1, aliceRoom.getNumberOfInvitedMembers()); Assert.assertEquals(3, aliceRoom.getNumberOfJoinedMembers()); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } @Test @@ -108,7 +108,7 @@ public void onEvent(Event event, EventTimeline.Direction direction, RoomState ro Assert.assertEquals(1, aliceRoom.getNumberOfInvitedMembers()); Assert.assertEquals(3, aliceRoom.getNumberOfJoinedMembers()); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } @Test @@ -167,7 +167,7 @@ public void onEvent(Event event, EventTimeline.Direction direction, RoomState ro }); recursiveBackPaginate(liveTimeline, 0, 30, 120); mTestHelper.await(lock); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } @Test @@ -204,7 +204,7 @@ public void onSuccess(Void info) { Assert.assertEquals(1, aliceRoom.getNumberOfInvitedMembers()); Assert.assertEquals(3, aliceRoom.getNumberOfJoinedMembers()); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } @Test @@ -270,7 +270,7 @@ public void onSuccess(Integer info) { } }); mTestHelper.await(lock); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } @Test @@ -343,7 +343,7 @@ public void onSuccess(Integer info) { } }); mTestHelper.await(lock); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } /** diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomSummaryTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomSummaryTest.java index 5294a1950..5d7742a68 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomSummaryTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/RoomSummaryTest.java @@ -66,7 +66,7 @@ private void RoomSummary_CheckMembership(boolean withLazyLoading) throws Excepti final RoomSummary samRoomSummary = samRoom.getRoomSummary(); Assert.assertNotNull(samRoomSummary); Assert.assertTrue(samRoomSummary.isJoined()); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } @Test @@ -93,7 +93,7 @@ private void RoomSummary_MemberCount(boolean withLazyLoading) throws Exception { Assert.assertEquals(0, roomSummary.getNumberOfJoinedMembers()); Assert.assertEquals(0, roomSummary.getNumberOfInvitedMembers()); } - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } @Test @@ -117,7 +117,7 @@ private void RoomSummary_CheckRoomSummaryIsNullAfterLeavingFromAnotherDevice(boo mTestHelper.syncSession(data.aliceSession, false); final RoomSummary roomSummary = data.aliceSession.getDataHandler().getStore().getSummary(data.roomId); Assert.assertNull(roomSummary); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/SearchTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/SearchTest.java index 827096909..7d19e8b8c 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/SearchTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/lazyloading/SearchTest.java @@ -51,7 +51,7 @@ public void onSuccess(SearchResponse info) { } }); mTestHelper.await(lock); - mTestHelper.clearAllSessions(data); + mLazyLoadingTestHelper.clearAllSessions(data); } } From 77d6c881abdb308a292b8e9f1fb16249182f41dc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 9 Oct 2018 14:48:01 +0200 Subject: [PATCH 15/79] Avoid creation of Gson object (Riot #2608) --- .../main/java/org/matrix/androidsdk/data/Room.java | 4 ++-- .../java/org/matrix/androidsdk/util/JsonUtils.java | 11 +++++++++++ .../data/timeline/TimelinePushWorkerTest.java | 3 ++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java index 0706ed978..72c881e99 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java @@ -268,7 +268,7 @@ private void handleEphemeralEvents(List events) { List typingUsers = null; try { - typingUsers = (new Gson()).fromJson(eventContent.get("user_ids"), new TypeToken>() { + typingUsers = JsonUtils.getBasicGson().fromJson(eventContent.get("user_ids"), new TypeToken>() { }.getType()); } catch (Exception e) { Log.e(LOG_TAG, "## handleEphemeralEvents() : exception " + e.getMessage(), e); @@ -630,7 +630,7 @@ public void onSucceed(JsonObject object) { Map map = null; try { - map = new Gson().fromJson(object, new TypeToken>() { + map = JsonUtils.getBasicGson().fromJson(object, new TypeToken>() { }.getType()); } catch (Exception e) { Log.e(LOG_TAG, "joinWithThirdPartySigned : Gson().fromJson failed" + e.getMessage(), e); diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/util/JsonUtils.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/util/JsonUtils.java index 2ab142c0a..74a25e121 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/util/JsonUtils.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/util/JsonUtils.java @@ -70,6 +70,8 @@ public class JsonUtils { private static final String LOG_TAG = JsonUtils.class.getSimpleName(); + private static final Gson basicGson = new Gson(); + private static final Gson gson = new GsonBuilder() .setFieldNamingStrategy(new MatrixFieldNamingStrategy()) .excludeFieldsWithModifiers(Modifier.PRIVATE, Modifier.STATIC) @@ -101,6 +103,15 @@ public class JsonUtils { .registerTypeAdapter(Boolean.class, new BooleanDeserializer(true)) .create(); + /** + * Provides the basic JSON parser. + * + * @return the basic JSON parser + */ + public static Gson getBasicGson() { + return basicGson; + } + /** * Provides the JSON parser. * diff --git a/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelinePushWorkerTest.java b/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelinePushWorkerTest.java index 420d6c615..e7301bd5a 100644 --- a/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelinePushWorkerTest.java +++ b/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelinePushWorkerTest.java @@ -26,6 +26,7 @@ import org.matrix.androidsdk.rest.model.Event; import org.matrix.androidsdk.rest.model.bingrules.BingRule; import org.matrix.androidsdk.util.BingRulesManager; +import org.matrix.androidsdk.util.JsonUtils; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @@ -75,7 +76,7 @@ public void triggerPush_WhenEventHasNoLifetime_ShouldTriggerPush() { @Test public void triggerPush_WhenMaxLifetimeIsReached_ShouldNotTriggerPush() { - final Gson gson = new Gson(); + final Gson gson = JsonUtils.getBasicGson(); final BingRule bingRule = Mockito.mock(BingRule.class); Mockito.when(bingRule.shouldNotify()).thenReturn(true); Mockito.when(mBingRulesManager.fulfilledBingRule(Mockito.any(Event.class))).thenReturn(bingRule); From e5c4a65a03dca98f8ff2ea3f411b5e8c91e654d6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Oct 2018 10:44:33 +0200 Subject: [PATCH 16/79] Version++ --- matrix-sdk/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix-sdk/build.gradle b/matrix-sdk/build.gradle index 2d8bb2e11..ac73596fa 100644 --- a/matrix-sdk/build.gradle +++ b/matrix-sdk/build.gradle @@ -14,8 +14,8 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 26 - versionCode 911 - versionName "0.9.11" + versionCode 912 + versionName "0.9.12-dev" resValue "string", "flavor_description", "SDKApp" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } From 7349b3e9cbb9589c74343a13e4d146dc0817e593 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Oct 2018 10:59:11 +0200 Subject: [PATCH 17/79] Version++ --- CHANGES.rst | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 34a03ccfd..e952fc63b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,30 @@ +Changes to Matrix Android SDK in 0.9.12 (2018-XX-XX) +======================================================= + +Features: + - + +Improvements: + - + +Bugfix: + - + +API Change: + - + +Translations: + - + +Others: + - + +Build: + - + +Test: + - + Changes to Matrix Android SDK in 0.9.11 (2018-10-10) ======================================================= From 3b286aa04a9ed56c9e9caf465a528cfd1cfb3d0c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Oct 2018 11:34:47 +0200 Subject: [PATCH 18/79] Remove unused string --- matrix-sdk/src/main/res/values-ko/strings.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/matrix-sdk/src/main/res/values-ko/strings.xml b/matrix-sdk/src/main/res/values-ko/strings.xml index 7c468208e..146fed131 100644 --- a/matrix-sdk/src/main/res/values-ko/strings.xml +++ b/matrix-sdk/src/main/res/values-ko/strings.xml @@ -1,6 +1,5 @@ -Matrix 안드로이드 SDK - + %1$s: %2$s %s\'의 초대 From d7b2ded24afd3485339bc66ab13f141177a51eff Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Oct 2018 16:35:07 +0200 Subject: [PATCH 19/79] Improve code --- .../HomeServerConnectionConfig.java | 26 +++++++++---------- .../org/matrix/androidsdk/RestClient.java | 2 +- .../matrix/androidsdk/ssl/Fingerprint.java | 24 ++++++++--------- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java index fc1396116..c2e8232ce 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java @@ -253,14 +253,6 @@ public JSONObject toJson() throws JSONException { * @throws JSONException the conversion failure reason */ public static HomeServerConnectionConfig fromJson(JSONObject jsonObject) throws JSONException { - JSONArray fingerprintArray = jsonObject.optJSONArray("fingerprints"); - List fingerprints = new ArrayList<>(); - if (fingerprintArray != null) { - for (int i = 0; i < fingerprintArray.length(); i++) { - fingerprints.add(Fingerprint.fromJson(fingerprintArray.getJSONObject(i))); - } - } - JSONObject credentialsObj = jsonObject.optJSONObject("credentials"); Credentials creds = credentialsObj != null ? Credentials.fromJson(credentialsObj) : null; @@ -268,9 +260,15 @@ public static HomeServerConnectionConfig fromJson(JSONObject jsonObject) throws .withHomeServerUri(Uri.parse(jsonObject.getString("home_server_url"))) .withIdentityServerUri(jsonObject.has("identity_server_url") ? Uri.parse(jsonObject.getString("identity_server_url")) : null) .withCredentials(creds) - .withAllowedFingerPrints(fingerprints) .withPin(jsonObject.optBoolean("pin", false)); + JSONArray fingerprintArray = jsonObject.optJSONArray("fingerprints"); + if (fingerprintArray != null) { + for (int i = 0; i < fingerprintArray.length(); i++) { + builder.addAllowedFingerPrint(Fingerprint.fromJson(fingerprintArray.getJSONObject(i))); + } + } + // Set the anti-virus server uri if any if (jsonObject.has("antivirus_server_url")) { builder.withAntiVirusServerUri(Uri.parse(jsonObject.getString("antivirus_server_url"))); @@ -374,12 +372,12 @@ public Builder withCredentials(@Nullable Credentials credentials) { } /** - * @param allowedFingerprints If using SSL, allow server certs that match these fingerprints. + * @param allowedFingerprint If using SSL, allow server certs that match this fingerprint. * @return this builder */ - public Builder withAllowedFingerPrints(@Nullable List allowedFingerprints) { - if (allowedFingerprints != null) { - mHomeServerConnectionConfig.mAllowedFingerprints.addAll(allowedFingerprints); + public Builder addAllowedFingerPrint(@Nullable Fingerprint allowedFingerprint) { + if (allowedFingerprint != null) { + mHomeServerConnectionConfig.mAllowedFingerprints.add(allowedFingerprint); } return this; @@ -481,7 +479,7 @@ public Builder withAllowHttpConnection() { * - https://www.ssi.gouv.fr/uploads/2017/02/security-recommendations-for-tls_v1.1.pdf * - https://developer.android.com/reference/javax/net/ssl/SSLEngine * - * @param tlsLimitations true to use Tls limitations + * @param tlsLimitations true to use Tls limitations * @param enableCompatibilityMode set to true for Android < 20 * @return this builder */ diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java index 7b6a5f1d1..8cdbdb716 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java @@ -202,7 +202,7 @@ public Response intercept(Chain chain) throws IOException { okHttpClientBuilder.hostnameVerifier(CertUtil.newHostnameVerifier(hsConfig)); okHttpClientBuilder.connectionSpecs(CertUtil.newConnectionSpecs(hsConfig)); } catch (Exception e) { - Log.e(LOG_TAG, "## RestClient() setSslSocketFactory failed" + e.getMessage(), e); + Log.e(LOG_TAG, "## RestClient() setSslSocketFactory failed: " + e.getMessage(), e); } mOkHttpClient = okHttpClientBuilder.build(); diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/Fingerprint.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/Fingerprint.java index 8f2eab1b6..647ba3c97 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/Fingerprint.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/Fingerprint.java @@ -1,5 +1,6 @@ /* * Copyright 2016 OpenMarket Ltd + * Copyright 2018 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. @@ -29,30 +30,27 @@ * Represents a X509 Certificate fingerprint. */ public class Fingerprint { - public enum HashType {SHA1, SHA256} + public enum HashType { + SHA1, + SHA256 + } - private final byte[] mBytes; private final HashType mHashType; + private final byte[] mBytes; private String mDisplayableHexRepr; - public Fingerprint(byte[] bytes, HashType hashType) { - mBytes = bytes; + public Fingerprint(HashType hashType, byte[] bytes) { mHashType = hashType; + mBytes = bytes; mDisplayableHexRepr = null; } public static Fingerprint newSha256Fingerprint(X509Certificate cert) throws CertificateException { - return new Fingerprint( - CertUtil.generateSha256Fingerprint(cert), - HashType.SHA256 - ); + return new Fingerprint(HashType.SHA256, CertUtil.generateSha256Fingerprint(cert)); } public static Fingerprint newSha1Fingerprint(X509Certificate cert) throws CertificateException { - return new Fingerprint( - CertUtil.generateSha1Fingerprint(cert), - HashType.SHA1 - ); + return new Fingerprint(HashType.SHA1, CertUtil.generateSha1Fingerprint(cert)); } public HashType getType() { @@ -91,7 +89,7 @@ public static Fingerprint fromJson(JSONObject obj) throws JSONException { throw new JSONException("Unrecognized hash type: " + hashTypeStr); } - return new Fingerprint(fingerprintBytes, hashType); + return new Fingerprint(hashType, fingerprintBytes); } public boolean matchesCert(X509Certificate cert) throws CertificateException { From 7ffc157feadc6d8dbeed7f596d6bb8cdee190df9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Oct 2018 16:35:51 +0200 Subject: [PATCH 20/79] Ensure a TrustManager is set if pin is set to true --- .../src/main/java/org/matrix/androidsdk/ssl/CertUtil.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java index 85f5b4620..0aeab9cfb 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java @@ -177,10 +177,12 @@ public static Pair newPinnedSSLSocketFactory break; } } + } else { + defaultTrustManager = new PinnedTrustManager(hsConfig.getAllowedFingerprints(), null); } TrustManager[] trustPinned = new TrustManager[]{ - new PinnedTrustManager(hsConfig.getAllowedFingerprints(), defaultTrustManager) + defaultTrustManager }; SSLSocketFactory sslSocketFactory; From c9a1e01f53dea9c08ea885e9ea1441530a063a20 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Oct 2018 16:36:41 +0200 Subject: [PATCH 21/79] Ensure HomeServerConnectionConfig other elements are not lost --- .../java/org/matrix/androidsdk/MXSession.java | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java index 49286e9cd..930566172 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java @@ -113,7 +113,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.regex.Pattern; /** * Class that represents one user's session with a particular home server. @@ -2552,27 +2551,15 @@ public Builder withFileEncryption(boolean enableFileEncryption) { * @return this builder, to chain calls */ public Builder withPushServerUrl(@Nullable String pushServerUrl) { - // If not empty, create a special PushersRestClient - PushersRestClient pushersRestClient = null; - + // If not empty, alter the Uri of the PushersRestClient if (!TextUtils.isEmpty(pushServerUrl)) { - // pusher uses a custom server try { - HomeServerConnectionConfig alteredHsConfig = new HomeServerConnectionConfig.Builder() - .withHomeServerUri(Uri.parse(pushServerUrl)) - .withCredentials(mxSession.mHsConfig.getCredentials()) - .build(); - pushersRestClient = new PushersRestClient(alteredHsConfig); + mxSession.mPushersRestClient.mHsConfig.setHomeserverUri(Uri.parse(pushServerUrl)); } catch (Exception e) { Log.e(LOG_TAG, "## withPushServerUrl() failed " + e.getMessage(), e); } } - if (null != pushersRestClient) { - // Replace the existing client - mxSession.mPushersRestClient = pushersRestClient; - } - return this; } From deec25edb8690b555c215868dadbff688797e7a4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Oct 2018 17:02:27 +0200 Subject: [PATCH 22/79] Touch CHANGES.rst --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index e952fc63b..a6f92a87a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,7 @@ Features: - Improvements: - - + - Improve certificate pinning management for HomeServerConnectionConfig. Bugfix: - From ea4c0b5bbaa844b88d25f16b9f17d5c4fbe60ec0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Oct 2018 12:34:11 +0200 Subject: [PATCH 23/79] Add @Nullable annotation --- .../java/org/matrix/androidsdk/ssl/PinnedTrustManager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/PinnedTrustManager.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/PinnedTrustManager.java index 5d29a0ead..c1bad3a4f 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/PinnedTrustManager.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/PinnedTrustManager.java @@ -1,5 +1,6 @@ /* * Copyright 2016 OpenMarket Ltd + * Copyright 2018 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. @@ -20,6 +21,7 @@ import java.security.cert.X509Certificate; import java.util.List; +import javax.annotation.Nullable; import javax.net.ssl.X509TrustManager; /** @@ -28,6 +30,7 @@ */ public class PinnedTrustManager implements X509TrustManager { private final List mFingerprints; + @Nullable private final X509TrustManager mDefaultTrustManager; /** @@ -35,7 +38,7 @@ public class PinnedTrustManager implements X509TrustManager { * @param defaultTrustManager Optional trust manager to fall back on if cert does not match * any of the fingerprints. Can be null. */ - public PinnedTrustManager(List fingerprints, X509TrustManager defaultTrustManager) { + public PinnedTrustManager(List fingerprints, @Nullable X509TrustManager defaultTrustManager) { mFingerprints = fingerprints; mDefaultTrustManager = defaultTrustManager; } @@ -69,7 +72,7 @@ public void checkServerTrusted(X509Certificate[] chain, String s) throws Certifi } } catch (CertificateException e) { // If there is an exception we fall back to checking fingerprints - if (mFingerprints == null || mFingerprints.size() == 0) { + if (mFingerprints == null || mFingerprints.isEmpty()) { throw new UnrecognizedCertificateException(chain[0], Fingerprint.newSha256Fingerprint(chain[0]), e.getCause()); } } From 09a2a8e882f1cff9cb9a55bfdef05ee558ad8f3f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Oct 2018 12:35:17 +0200 Subject: [PATCH 24/79] rename variable for clarity --- .../org/matrix/androidsdk/ssl/CertUtil.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java index 0aeab9cfb..427c73353 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java @@ -150,26 +150,26 @@ public static Pair newPinnedSSLSocketFactory // If we haven't specified that we wanted to pin the certs, fallback to standard // X509 checks if fingerprints don't match. if (!hsConfig.shouldPin()) { - TrustManagerFactory tf = null; + TrustManagerFactory trustManagerFactory = null; // get the PKIX instance try { - tf = TrustManagerFactory.getInstance("PKIX"); + trustManagerFactory = TrustManagerFactory.getInstance("PKIX"); } catch (Exception e) { Log.e(LOG_TAG, "## newPinnedSSLSocketFactory() : TrustManagerFactory.getInstance failed " + e.getMessage(), e); } // it doesn't exist, use the default one. - if (null == tf) { + if (null == trustManagerFactory) { try { - tf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); } catch (Exception e) { Log.e(LOG_TAG, "## addRule : onBingRuleUpdateFailure failed " + e.getMessage(), e); } } - tf.init((KeyStore) null); - TrustManager[] trustManagers = tf.getTrustManagers(); + trustManagerFactory.init((KeyStore) null); + TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); for (int i = 0; i < trustManagers.length; i++) { if (trustManagers[i] instanceof X509TrustManager) { @@ -181,7 +181,7 @@ public static Pair newPinnedSSLSocketFactory defaultTrustManager = new PinnedTrustManager(hsConfig.getAllowedFingerprints(), null); } - TrustManager[] trustPinned = new TrustManager[]{ + TrustManager[] trustManagers = new TrustManager[]{ defaultTrustManager }; @@ -189,10 +189,10 @@ public static Pair newPinnedSSLSocketFactory if (hsConfig.forceUsageOfTlsVersions() && hsConfig.getAcceptedTlsVersions() != null) { // Force usage of accepted Tls Versions for Android < 20 - sslSocketFactory = new TLSSocketFactory(trustPinned, hsConfig.getAcceptedTlsVersions()); + sslSocketFactory = new TLSSocketFactory(trustManagers, hsConfig.getAcceptedTlsVersions()); } else { SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(null, trustPinned, new java.security.SecureRandom()); + sslContext.init(null, trustManagers, new java.security.SecureRandom()); sslSocketFactory = sslContext.getSocketFactory(); } From b9b12e8fb1834b9892892fe88acbdf02e2d391c8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Oct 2018 12:36:07 +0200 Subject: [PATCH 25/79] better log --- .../src/main/java/org/matrix/androidsdk/ssl/CertUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java index 427c73353..888f4999d 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java @@ -164,7 +164,8 @@ public static Pair newPinnedSSLSocketFactory try { trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); } catch (Exception e) { - Log.e(LOG_TAG, "## addRule : onBingRuleUpdateFailure failed " + e.getMessage(), e); + Log.e(LOG_TAG, "## newPinnedSSLSocketFactory() : TrustManagerFactory.getInstance with default algorithm failed " + + e.getMessage(), e); } } From 6ed430986a28c3a6041bf4bdbf0b11ff53088102 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Oct 2018 12:37:14 +0200 Subject: [PATCH 26/79] Avoid NPE --- .../java/org/matrix/androidsdk/ssl/CertUtil.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java index 888f4999d..4d540db7a 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java @@ -160,7 +160,7 @@ public static Pair newPinnedSSLSocketFactory } // it doesn't exist, use the default one. - if (null == trustManagerFactory) { + if (trustManagerFactory == null) { try { trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); } catch (Exception e) { @@ -169,13 +169,15 @@ public static Pair newPinnedSSLSocketFactory } } - trustManagerFactory.init((KeyStore) null); - TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); + if (trustManagerFactory != null) { + trustManagerFactory.init((KeyStore) null); + TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); - for (int i = 0; i < trustManagers.length; i++) { - if (trustManagers[i] instanceof X509TrustManager) { - defaultTrustManager = (X509TrustManager) trustManagers[i]; - break; + for (int i = 0; i < trustManagers.length; i++) { + if (trustManagers[i] instanceof X509TrustManager) { + defaultTrustManager = (X509TrustManager) trustManagers[i]; + break; + } } } } else { From c5073097d2cd58901ff2bda43791dc100974031f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Oct 2018 13:26:09 +0200 Subject: [PATCH 27/79] Better try catch blocks --- .../org/matrix/androidsdk/ssl/CertUtil.java | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java index 4d540db7a..2c5aec23b 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java @@ -22,7 +22,9 @@ import org.matrix.androidsdk.util.Log; import java.security.KeyStore; +import java.security.KeyStoreException; import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; @@ -144,32 +146,32 @@ public static UnrecognizedCertificateException getCertificateException(Throwable * @return SSLSocket factory */ public static Pair newPinnedSSLSocketFactory(HomeServerConnectionConfig hsConfig) { - try { - X509TrustManager defaultTrustManager = null; - - // If we haven't specified that we wanted to pin the certs, fallback to standard - // X509 checks if fingerprints don't match. - if (!hsConfig.shouldPin()) { - TrustManagerFactory trustManagerFactory = null; + X509TrustManager defaultTrustManager = null; + + // If we haven't specified that we wanted to pin the certs, fallback to standard + // X509 checks if fingerprints don't match. + if (!hsConfig.shouldPin()) { + TrustManagerFactory trustManagerFactory = null; + + // get the PKIX instance + try { + trustManagerFactory = TrustManagerFactory.getInstance("PKIX"); + } catch (NoSuchAlgorithmException e) { + Log.e(LOG_TAG, "## newPinnedSSLSocketFactory() : TrustManagerFactory.getInstance failed " + e.getMessage(), e); + } - // get the PKIX instance + // it doesn't exist, use the default one. + if (trustManagerFactory == null) { try { - trustManagerFactory = TrustManagerFactory.getInstance("PKIX"); - } catch (Exception e) { - Log.e(LOG_TAG, "## newPinnedSSLSocketFactory() : TrustManagerFactory.getInstance failed " + e.getMessage(), e); - } - - // it doesn't exist, use the default one. - if (trustManagerFactory == null) { - try { - trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); - } catch (Exception e) { - Log.e(LOG_TAG, "## newPinnedSSLSocketFactory() : TrustManagerFactory.getInstance with default algorithm failed " - + e.getMessage(), e); - } + trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + } catch (NoSuchAlgorithmException e) { + Log.e(LOG_TAG, "## newPinnedSSLSocketFactory() : TrustManagerFactory.getInstance with default algorithm failed " + + e.getMessage(), e); } + } - if (trustManagerFactory != null) { + if (trustManagerFactory != null) { + try { trustManagerFactory.init((KeyStore) null); TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); @@ -179,17 +181,21 @@ public static Pair newPinnedSSLSocketFactory break; } } + } catch (KeyStoreException e) { + Log.e(LOG_TAG, "## newPinnedSSLSocketFactory() : " + e.getMessage(), e); } - } else { - defaultTrustManager = new PinnedTrustManager(hsConfig.getAllowedFingerprints(), null); } + } else { + defaultTrustManager = new PinnedTrustManager(hsConfig.getAllowedFingerprints(), null); + } - TrustManager[] trustManagers = new TrustManager[]{ - defaultTrustManager - }; + TrustManager[] trustManagers = new TrustManager[]{ + defaultTrustManager + }; - SSLSocketFactory sslSocketFactory; + SSLSocketFactory sslSocketFactory; + try { if (hsConfig.forceUsageOfTlsVersions() && hsConfig.getAcceptedTlsVersions() != null) { // Force usage of accepted Tls Versions for Android < 20 sslSocketFactory = new TLSSocketFactory(trustManagers, hsConfig.getAcceptedTlsVersions()); @@ -199,10 +205,12 @@ public static Pair newPinnedSSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); } - return new Pair<>(sslSocketFactory, defaultTrustManager); } catch (Exception e) { + // This is too fatal throw new RuntimeException(e); } + + return new Pair<>(sslSocketFactory, defaultTrustManager); } /** From eaa0730c2216e32f7a5ed713c9d95497441e9ef5 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Oct 2018 13:27:28 +0200 Subject: [PATCH 28/79] Better trustManager handling --- .../main/java/org/matrix/androidsdk/ssl/CertUtil.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java index 2c5aec23b..2b8b8b8e9 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java @@ -1,5 +1,6 @@ /* * Copyright 2016 OpenMarket Ltd + * Copyright 2018 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. @@ -185,12 +186,12 @@ public static Pair newPinnedSSLSocketFactory Log.e(LOG_TAG, "## newPinnedSSLSocketFactory() : " + e.getMessage(), e); } } - } else { - defaultTrustManager = new PinnedTrustManager(hsConfig.getAllowedFingerprints(), null); } + X509TrustManager trustManager = new PinnedTrustManager(hsConfig.getAllowedFingerprints(), defaultTrustManager); + TrustManager[] trustManagers = new TrustManager[]{ - defaultTrustManager + trustManager }; SSLSocketFactory sslSocketFactory; @@ -204,13 +205,12 @@ public static Pair newPinnedSSLSocketFactory sslContext.init(null, trustManagers, new java.security.SecureRandom()); sslSocketFactory = sslContext.getSocketFactory(); } - } catch (Exception e) { // This is too fatal throw new RuntimeException(e); } - return new Pair<>(sslSocketFactory, defaultTrustManager); + return new Pair<>(sslSocketFactory, trustManager); } /** From c1451e90ce5960e271c19873f311861368e8825f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Oct 2018 16:36:41 +0200 Subject: [PATCH 29/79] Revert "Ensure HomeServerConnectionConfig other elements are not lost" This reverts commit c9a1e01f53dea9c08ea885e9ea1441530a063a20. --- .../java/org/matrix/androidsdk/MXSession.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java index 930566172..49286e9cd 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java @@ -113,6 +113,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; /** * Class that represents one user's session with a particular home server. @@ -2551,15 +2552,27 @@ public Builder withFileEncryption(boolean enableFileEncryption) { * @return this builder, to chain calls */ public Builder withPushServerUrl(@Nullable String pushServerUrl) { - // If not empty, alter the Uri of the PushersRestClient + // If not empty, create a special PushersRestClient + PushersRestClient pushersRestClient = null; + if (!TextUtils.isEmpty(pushServerUrl)) { + // pusher uses a custom server try { - mxSession.mPushersRestClient.mHsConfig.setHomeserverUri(Uri.parse(pushServerUrl)); + HomeServerConnectionConfig alteredHsConfig = new HomeServerConnectionConfig.Builder() + .withHomeServerUri(Uri.parse(pushServerUrl)) + .withCredentials(mxSession.mHsConfig.getCredentials()) + .build(); + pushersRestClient = new PushersRestClient(alteredHsConfig); } catch (Exception e) { Log.e(LOG_TAG, "## withPushServerUrl() failed " + e.getMessage(), e); } } + if (null != pushersRestClient) { + // Replace the existing client + mxSession.mPushersRestClient = pushersRestClient; + } + return this; } From c85131360b816f48f7da3cabcd8cd435ac50f3ad Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Oct 2018 18:10:39 +0200 Subject: [PATCH 30/79] Ensure HomeServerConnectionConfig other elements are not lost - the right way --- .../androidsdk/HomeServerConnectionConfig.java | 12 ++++++++++++ .../main/java/org/matrix/androidsdk/MXSession.java | 3 +-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java index c2e8232ce..49c78e96b 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java @@ -314,6 +314,18 @@ public Builder() { mHomeServerConnectionConfig = new HomeServerConnectionConfig(); } + /** + * create a Builder from an existing HomeServerConnectionConfig + */ + public Builder(HomeServerConnectionConfig from) { + try { + mHomeServerConnectionConfig = HomeServerConnectionConfig.fromJson(from.toJson()); + } catch (JSONException e) { + // Should not happen + throw new RuntimeException("Unable to create a HomeServerConnectionConfig", e); + } + } + /** * @param hsUri The URI to use to connect to the homeserver. Cannot be null * @return this builder diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java index 49286e9cd..531b1a4c2 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXSession.java @@ -2558,9 +2558,8 @@ public Builder withPushServerUrl(@Nullable String pushServerUrl) { if (!TextUtils.isEmpty(pushServerUrl)) { // pusher uses a custom server try { - HomeServerConnectionConfig alteredHsConfig = new HomeServerConnectionConfig.Builder() + HomeServerConnectionConfig alteredHsConfig = new HomeServerConnectionConfig.Builder(mxSession.mPushersRestClient.mHsConfig) .withHomeServerUri(Uri.parse(pushServerUrl)) - .withCredentials(mxSession.mHsConfig.getCredentials()) .build(); pushersRestClient = new PushersRestClient(alteredHsConfig); } catch (Exception e) { From 256a5a35e1458a889e19143308ff953e2e27b2dc Mon Sep 17 00:00:00 2001 From: toriko Date: Fri, 12 Oct 2018 03:35:50 +0000 Subject: [PATCH 31/79] Added translation using Weblate (Japanese) --- matrix-sdk/src/main/res/values-ja/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 matrix-sdk/src/main/res/values-ja/strings.xml diff --git a/matrix-sdk/src/main/res/values-ja/strings.xml b/matrix-sdk/src/main/res/values-ja/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/matrix-sdk/src/main/res/values-ja/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From d1565d4e4e293a61af81d20c60435e1008dc5992 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 12 Oct 2018 15:57:23 +0200 Subject: [PATCH 32/79] Remove useless member in model (bad copy paste) --- .../model/sync/RoomSyncUnreadNotifications.java | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/sync/RoomSyncUnreadNotifications.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/sync/RoomSyncUnreadNotifications.java index d9cf25605..e6b6aa53e 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/sync/RoomSyncUnreadNotifications.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/sync/RoomSyncUnreadNotifications.java @@ -1,13 +1,13 @@ -/* +/* * Copyright 2016 OpenMarket Ltd * Copyright 2018 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. @@ -16,19 +16,10 @@ */ package org.matrix.androidsdk.rest.model.sync; -import org.matrix.androidsdk.rest.model.Event; - -import java.util.List; - /** - `MXRoomSyncUnreadNotifications` represents the unread counts for a room. + * `MXRoomSyncUnreadNotifications` represents the unread counts for a room. */ public class RoomSyncUnreadNotifications { - /** - * List of account data events (array of Event). - */ - public List events; - /** * The number of unread messages that match the push notification rules. */ From 2d443fa74f9ddaf6f4f3f472008211f508251f22 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 12 Oct 2018 17:51:32 +0200 Subject: [PATCH 33/79] Enable CLEARTEXT communication for http endpoints (vector-im/riot-android#2495) --- CHANGES.rst | 2 +- .../androidsdk/common/CommonTestHelper.java | 1 - .../HomeServerConnectionConfig.java | 19 ------------------- .../org/matrix/androidsdk/RestClient.java | 5 +++-- .../org/matrix/androidsdk/ssl/CertUtil.java | 6 ++++-- 5 files changed, 8 insertions(+), 25 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index a6f92a87a..e1b601501 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,7 +8,7 @@ Improvements: - Improve certificate pinning management for HomeServerConnectionConfig. Bugfix: - - + - Enable CLEARTEXT communication for http endpoints (vector-im/riot-android#2495) API Change: - diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java index 0507390f8..4bae8ad38 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/common/CommonTestHelper.java @@ -76,7 +76,6 @@ public HomeServerConnectionConfig createHomeServerConfig(@Nullable Credentials c final HomeServerConnectionConfig hs = new HomeServerConnectionConfig.Builder() .withHomeServerUri(Uri.parse(TestConstants.TESTS_HOME_SERVER_URL)) .withCredentials(credentials) - .withAllowHttpConnection() .build(); return hs; } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java index 49c78e96b..c404c2f78 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java @@ -20,7 +20,6 @@ import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; import org.json.JSONArray; import org.json.JSONException; @@ -57,8 +56,6 @@ public class HomeServerConnectionConfig { private List mTlsCipherSuites; // should accept TLS extensions private boolean mShouldAcceptTlsExtensions = true; - // allow Http connection - private boolean mAllowHttpExtension; // Force usage of TLS versions private boolean mForceUsageTlsVersions; @@ -161,13 +158,6 @@ public boolean shouldAcceptTlsExtensions() { return mShouldAcceptTlsExtensions; } - /** - * @return true if Http connection is allowed (false by default). - */ - public boolean isHttpConnectionAllowed() { - return mAllowHttpExtension; - } - /** * @return true if the usage of TlsVersions has to be forced */ @@ -476,15 +466,6 @@ public Builder withAntiVirusServerUri(@Nullable Uri antivirusServerUri) { return this; } - /** - * For test only: allow Http connection - */ - @VisibleForTesting - public Builder withAllowHttpConnection() { - mHomeServerConnectionConfig.mAllowHttpExtension = true; - return this; - } - /** * Convenient method to limit the TLS versions and cipher suites for this Builder * Ref: diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java index 8cdbdb716..6c959e347 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/RestClient.java @@ -196,17 +196,18 @@ public Response intercept(Chain chain) throws IOException { okHttpClientBuilder.dispatcher(new Dispatcher(new MXRestExecutorService())); } + final String endPoint = makeEndpoint(hsConfig, uriPrefix, endPointServer); + try { Pair pair = CertUtil.newPinnedSSLSocketFactory(hsConfig); okHttpClientBuilder.sslSocketFactory(pair.first, pair.second); okHttpClientBuilder.hostnameVerifier(CertUtil.newHostnameVerifier(hsConfig)); - okHttpClientBuilder.connectionSpecs(CertUtil.newConnectionSpecs(hsConfig)); + okHttpClientBuilder.connectionSpecs(CertUtil.newConnectionSpecs(hsConfig, endPoint)); } catch (Exception e) { Log.e(LOG_TAG, "## RestClient() setSslSocketFactory failed: " + e.getMessage(), e); } mOkHttpClient = okHttpClientBuilder.build(); - final String endPoint = makeEndpoint(hsConfig, uriPrefix, endPointServer); // Rest adapter for turning API interfaces into actual REST-calling objects Retrofit.Builder builder = new Retrofit.Builder() diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java index 2b8b8b8e9..60b638f32 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/ssl/CertUtil.java @@ -17,6 +17,7 @@ package org.matrix.androidsdk.ssl; +import android.support.annotation.NonNull; import android.util.Pair; import org.matrix.androidsdk.HomeServerConnectionConfig; @@ -253,9 +254,10 @@ public boolean verify(String hostname, SSLSession session) { * Create a list of accepted TLS specifications for a hs config. * * @param hsConfig the hs config. + * @param url the url of the end point, used to check if we have to enable CLEARTEXT communication. * @return a list of accepted TLS specifications. */ - public static List newConnectionSpecs(HomeServerConnectionConfig hsConfig) { + public static List newConnectionSpecs(@NonNull HomeServerConnectionConfig hsConfig, @NonNull String url) { final ConnectionSpec.Builder builder = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS); final List tlsVersions = hsConfig.getAcceptedTlsVersions(); @@ -274,7 +276,7 @@ public static List newConnectionSpecs(HomeServerConnectionConfig list.add(builder.build()); - if (hsConfig.isHttpConnectionAllowed()) { + if (url.startsWith("http://")) { list.add(ConnectionSpec.CLEARTEXT); } From 615837d2a0c7cff065d4f282209d1d0241e30b0f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 12 Oct 2018 17:51:59 +0200 Subject: [PATCH 34/79] Rename member --- .../HomeServerConnectionConfig.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java index c404c2f78..e7272f675 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/HomeServerConnectionConfig.java @@ -39,7 +39,7 @@ public class HomeServerConnectionConfig { // the home server URI - private Uri mHsUri; + private Uri mHomeServerUri; // the identity server URI private Uri mIdentityServerUri; // the anti-virus server URI @@ -72,14 +72,14 @@ private HomeServerConnectionConfig() { * @param uri the new HS uri */ public void setHomeserverUri(Uri uri) { - mHsUri = uri; + mHomeServerUri = uri; } /** * @return the home server uri */ public Uri getHomeserverUri() { - return mHsUri; + return mHomeServerUri; } /** @@ -90,7 +90,7 @@ public Uri getIdentityServerUri() { return mIdentityServerUri; } // Else consider the HS uri by default. - return mHsUri; + return mHomeServerUri; } /** @@ -101,7 +101,7 @@ public Uri getAntiVirusServerUri() { return mAntiVirusServerUri; } // Else consider the HS uri by default. - return mHsUri; + return mHomeServerUri; } /** @@ -168,7 +168,7 @@ public boolean forceUsageOfTlsVersions() { @Override public String toString() { return "HomeserverConnectionConfig{" + - "mHsUri=" + mHsUri + + "mHomeServerUri=" + mHomeServerUri + ", mIdentityServerUri=" + mIdentityServerUri + ", mAntiVirusServerUri=" + mAntiVirusServerUri + ", mAllowedFingerprints size=" + mAllowedFingerprints.size() + @@ -189,7 +189,7 @@ public String toString() { public JSONObject toJson() throws JSONException { JSONObject json = new JSONObject(); - json.put("home_server_url", mHsUri.toString()); + json.put("home_server_url", mHomeServerUri.toString()); json.put("identity_server_url", getIdentityServerUri().toString()); if (mAntiVirusServerUri != null) { json.put("antivirus_server_url", mAntiVirusServerUri.toString()); @@ -317,24 +317,24 @@ public Builder(HomeServerConnectionConfig from) { } /** - * @param hsUri The URI to use to connect to the homeserver. Cannot be null + * @param homeServerUri The URI to use to connect to the homeserver. Cannot be null * @return this builder */ - public Builder withHomeServerUri(final Uri hsUri) { - if (hsUri == null || (!"http".equals(hsUri.getScheme()) && !"https".equals(hsUri.getScheme()))) { - throw new RuntimeException("Invalid home server URI: " + hsUri); + public Builder withHomeServerUri(final Uri homeServerUri) { + if (homeServerUri == null || (!"http".equals(homeServerUri.getScheme()) && !"https".equals(homeServerUri.getScheme()))) { + throw new RuntimeException("Invalid home server URI: " + homeServerUri); } // remove trailing / - if (hsUri.toString().endsWith("/")) { + if (homeServerUri.toString().endsWith("/")) { try { - String url = hsUri.toString(); - mHomeServerConnectionConfig.mHsUri = Uri.parse(url.substring(0, url.length() - 1)); + String url = homeServerUri.toString(); + mHomeServerConnectionConfig.mHomeServerUri = Uri.parse(url.substring(0, url.length() - 1)); } catch (Exception e) { - throw new RuntimeException("Invalid home server URI: " + hsUri); + throw new RuntimeException("Invalid home server URI: " + homeServerUri); } } else { - mHomeServerConnectionConfig.mHsUri = hsUri; + mHomeServerConnectionConfig.mHomeServerUri = homeServerUri; } return this; @@ -512,7 +512,7 @@ public Builder withTlsLimitations(boolean tlsLimitations, boolean enableCompatib */ public HomeServerConnectionConfig build() { // Check mandatory parameters - if (mHomeServerConnectionConfig.mHsUri == null) { + if (mHomeServerConnectionConfig.mHomeServerUri == null) { throw new RuntimeException("Home server URI not set"); } From 1ec86e8698e0ed53cb94810aee03ced55c639c34 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 12 Oct 2018 18:22:21 +0200 Subject: [PATCH 35/79] Fix crash reported by the PlayStore --- .../org/matrix/androidsdk/data/RoomState.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java index 16181bbe2..366d18b93 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java @@ -457,7 +457,15 @@ public void onSuccess(List members) { * @return true if it is a call conference room. */ public boolean isConferenceUserRoom() { - return getDataHandler().getStore().getSummary(roomId).isConferenceUserRoom(); + if (getDataHandler() != null + && getDataHandler().getStore() != null + && getDataHandler().getStore().getSummary(roomId) != null) { + return getDataHandler().getStore().getSummary(roomId).isConferenceUserRoom(); + } else { + Log.w(LOG_TAG, "## isConferenceUserRoom(): something is null"); + } + + return false; } /** @@ -466,7 +474,13 @@ public boolean isConferenceUserRoom() { * @param isConferenceUserRoom true when it is an user conference room. */ public void setIsConferenceUserRoom(boolean isConferenceUserRoom) { - getDataHandler().getStore().getSummary(roomId).setIsConferenceUserRoom(isConferenceUserRoom); + if (getDataHandler() != null + && getDataHandler().getStore() != null + && getDataHandler().getStore().getSummary(roomId) != null) { + getDataHandler().getStore().getSummary(roomId).setIsConferenceUserRoom(isConferenceUserRoom); + } else { + Log.w(LOG_TAG, "## setIsConferenceUserRoom(): something is null"); + } } /** From e9e51f1a74977274596354479b042aaed2c12c96 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 15 Oct 2018 10:49:32 +0200 Subject: [PATCH 36/79] Fix strip previous reply when they contain new line (Fixes vector-im/riot-android#2612) --- CHANGES.rst | 2 +- .../org/matrix/androidsdk/data/RoomMediaMessagesSender.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index a6f92a87a..8e7d4c3c8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,7 +8,7 @@ Improvements: - Improve certificate pinning management for HomeServerConnectionConfig. Bugfix: - - + - Fix strip previous reply when they contain new line (vector-im/riot-android#2612) API Change: - diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomMediaMessagesSender.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomMediaMessagesSender.java index 2ff1435ff..7c5b943f6 100755 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomMediaMessagesSender.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomMediaMessagesSender.java @@ -56,6 +56,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.regex.Pattern; /** * Room helper to send media messages in the right order. @@ -87,6 +88,9 @@ class RoomMediaMessagesSender { // encoding creation threads private static android.os.Handler mEncodingHandler = null; + // Pattern to strip previous reply when replying to a message. It also matches multi lines previous reply, when for instance containing blockquote. + private static Pattern sPreviousReplyPattern = Pattern.compile("^.*", Pattern.DOTALL); + /** * Constructor * @@ -514,7 +518,7 @@ private String includeReplyToToFormattedBody(Event replyToEvent, boolean isEmote) { if (stripPreviousReplyTo) { // Strip replyToFormattedBody from previous reply to - replyToFormattedBody = replyToFormattedBody.replaceAll("^.*", ""); + replyToFormattedBody = sPreviousReplyPattern.matcher(replyToFormattedBody).replaceAll(""); } StringBuilder ret = new StringBuilder("
Date: Mon, 15 Oct 2018 16:46:57 +0200 Subject: [PATCH 37/79] Move room name computation to the SDK --- .../java/org/matrix/androidsdk/data/Room.java | 14 +- .../matrix/androidsdk/data/room/RoomName.java | 148 ++++++++++++++++++ matrix-sdk/src/main/res/values-ar/strings.xml | 6 + matrix-sdk/src/main/res/values-bg/strings.xml | 11 ++ matrix-sdk/src/main/res/values-bs/strings.xml | 7 +- matrix-sdk/src/main/res/values-ca/strings.xml | 14 +- matrix-sdk/src/main/res/values-da/strings.xml | 11 ++ matrix-sdk/src/main/res/values-de/strings.xml | 12 ++ .../src/main/res/values-es-rMX/strings.xml | 7 + matrix-sdk/src/main/res/values-es/strings.xml | 12 ++ matrix-sdk/src/main/res/values-eu/strings.xml | 11 ++ matrix-sdk/src/main/res/values-fi/strings.xml | 10 +- matrix-sdk/src/main/res/values-fr/strings.xml | 11 ++ matrix-sdk/src/main/res/values-gl/strings.xml | 3 + matrix-sdk/src/main/res/values-hu/strings.xml | 11 ++ matrix-sdk/src/main/res/values-in/strings.xml | 12 ++ matrix-sdk/src/main/res/values-is/strings.xml | 13 +- matrix-sdk/src/main/res/values-it/strings.xml | 12 ++ matrix-sdk/src/main/res/values-ja/strings.xml | 12 ++ matrix-sdk/src/main/res/values-lv/strings.xml | 12 ++ matrix-sdk/src/main/res/values-nl/strings.xml | 12 ++ matrix-sdk/src/main/res/values-nn/strings.xml | 11 ++ matrix-sdk/src/main/res/values-pl/strings.xml | 14 +- .../src/main/res/values-pt-rBR/strings.xml | 12 ++ matrix-sdk/src/main/res/values-pt/strings.xml | 11 +- matrix-sdk/src/main/res/values-ru/strings.xml | 14 ++ matrix-sdk/src/main/res/values-sk/strings.xml | 13 ++ matrix-sdk/src/main/res/values-te/strings.xml | 9 +- matrix-sdk/src/main/res/values-uk/strings.xml | 9 +- .../src/main/res/values-zh-rCN/strings.xml | 10 +- .../src/main/res/values-zh-rTW/strings.xml | 10 ++ matrix-sdk/src/main/res/values/strings.xml | 14 ++ 32 files changed, 477 insertions(+), 11 deletions(-) create mode 100644 matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java create mode 100644 matrix-sdk/src/main/res/values-in/strings.xml create mode 100644 matrix-sdk/src/main/res/values-ja/strings.xml diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java index c06db2b54..aa18bc214 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java @@ -33,7 +33,6 @@ import android.text.TextUtils; import android.util.Pair; -import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; @@ -43,6 +42,7 @@ import org.matrix.androidsdk.call.MXCallsManager; import org.matrix.androidsdk.crypto.MXCryptoError; import org.matrix.androidsdk.crypto.data.MXEncryptEventContentResult; +import org.matrix.androidsdk.data.room.RoomName; import org.matrix.androidsdk.data.store.IMXStore; import org.matrix.androidsdk.data.timeline.EventTimeline; import org.matrix.androidsdk.data.timeline.EventTimelineFactory; @@ -136,6 +136,9 @@ public class Room { // true when the current room is a left one private boolean mIsLeft; + // Class to compute room name + private final RoomName mRoomName; + /** * Constructor * FIXME All this @NonNull annotation must be also added to the class members and getters @@ -149,6 +152,7 @@ public Room(@NonNull final MXDataHandler dataHandler, @NonNull final IMXStore st mStore = store; mMyUserId = mDataHandler.getUserId(); mTimeline = EventTimelineFactory.liveTimeline(mDataHandler, this, roomId); + mRoomName = new RoomName(this); } /** @@ -542,6 +546,14 @@ public void run() { }); } + /** + * @param context the application context. + * @return the computed room display name + */ + public String getRoomDisplayName(Context context) { + return mRoomName.getRoomName(context); + } + public String getTopic() { return getState().topic; } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java new file mode 100644 index 000000000..5c58c38db --- /dev/null +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java @@ -0,0 +1,148 @@ +/* + * Copyright 2018 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.data.room; + +import android.content.Context; +import android.text.TextUtils; + +import org.matrix.androidsdk.R; +import org.matrix.androidsdk.data.Room; +import org.matrix.androidsdk.data.RoomState; +import org.matrix.androidsdk.rest.model.RoomMember; +import org.matrix.androidsdk.util.Log; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * This class helps to compute a room name + */ +public class RoomName { + + private static final String LOG_TAG = RoomName.class.getSimpleName(); + + private final Room mRoom; + + public RoomName(Room room) { + mRoom = room; + } + + public String getRoomName(Context context) { + try { + // this algorithm is the one defined in + // https://github.com/matrix-org/matrix-js-sdk/blob/develop/lib/models/room.js#L617 + // calculateRoomName(room, userId) + + // For Lazy Loaded room, see algorithm here: + // https://docs.google.com/document/d/11i14UI1cUz-OJ0knD5BFu7fmT6Fo327zvMYqfSAR7xs/edit#heading=h.qif6pkqyjgzn + + RoomState roomState = mRoom.getState(); + + if (!TextUtils.isEmpty(roomState.name)) { + return roomState.name; + } + + if (!TextUtils.isEmpty(roomState.getCanonicalAlias())) { + return roomState.getCanonicalAlias(); + } + + List othersActiveMembers = new ArrayList<>(); + List activeMembers = new ArrayList<>(); + + int nbOfOtherMembers; + + if (mRoom.getDataHandler().isLazyLoadingEnabled() + && mRoom.getRoomSummary() != null) { + List heroes = mRoom.getRoomSummary().getHeroes(); + + for (String id : heroes) { + RoomMember roomMember = roomState.getMember(id); + + if (roomMember != null) { + othersActiveMembers.add(roomMember); + } + } + } else { + Collection members = roomState.getDisplayableLoadedMembers(); + + for (RoomMember member : members) { + if (!TextUtils.equals(member.membership, RoomMember.MEMBERSHIP_LEAVE)) { + if (!TextUtils.equals(member.getUserId(), mRoom.getDataHandler().getUserId())) { + othersActiveMembers.add(member); + } + activeMembers.add(member); + } + } + + Collections.sort(othersActiveMembers, new Comparator() { + @Override + public int compare(RoomMember m1, RoomMember m2) { + long diff = m1.getOriginServerTs() - m2.getOriginServerTs(); + + return (diff == 0) ? 0 : ((diff < 0) ? -1 : +1); + } + }); + } + + nbOfOtherMembers = othersActiveMembers.size(); + + String displayName; + + if (nbOfOtherMembers == 0) { + if (activeMembers.size() == 1) { + RoomMember member = activeMembers.get(0); + + if (TextUtils.equals(member.membership, RoomMember.MEMBERSHIP_INVITE)) { + + if (!TextUtils.isEmpty(member.mSender)) { + // extract who invited us to the room + displayName = context.getString(R.string.room_displayname_invite_from, roomState.getMemberName(member.mSender)); + } else { + displayName = context.getString(R.string.room_displayname_room_invite); + } + } else { + displayName = context.getString(R.string.room_displayname_no_title); + } + } else { + displayName = context.getString(R.string.room_displayname_no_title); + } + } else if (nbOfOtherMembers == 1) { + RoomMember member = othersActiveMembers.get(0); + displayName = roomState.getMemberName(member.getUserId()); + } else if (nbOfOtherMembers == 2) { + RoomMember member1 = othersActiveMembers.get(0); + RoomMember member2 = othersActiveMembers.get(1); + + displayName = context.getString(R.string.room_displayname_two_members, + roomState.getMemberName(member1.getUserId()), roomState.getMemberName(member2.getUserId())); + } else { + RoomMember member = othersActiveMembers.get(0); + displayName = context.getResources().getQuantityString(R.plurals.room_displayname_three_and_more_members, + nbOfOtherMembers - 1, roomState.getMemberName(member.getUserId()), nbOfOtherMembers - 1); + } + + return displayName; + } catch (Exception e) { + Log.e(LOG_TAG, "## getRoomDisplayName() failed " + e.getMessage(), e); + } + + return mRoom.getRoomId(); + } +} diff --git a/matrix-sdk/src/main/res/values-ar/strings.xml b/matrix-sdk/src/main/res/values-ar/strings.xml index 8dd1e074b..192327fba 100644 --- a/matrix-sdk/src/main/res/values-ar/strings.xml +++ b/matrix-sdk/src/main/res/values-ar/strings.xml @@ -73,4 +73,10 @@ أرسل ملف صوت. أرسل ملفًا. + دعوة من ⁨%s⁩ + غرفة فارغة + + ‏⁨%1$s⁩ و ⁨%2$s⁩ + دعوة إلى غرفة + diff --git a/matrix-sdk/src/main/res/values-bg/strings.xml b/matrix-sdk/src/main/res/values-bg/strings.xml index 674b2d627..61956cf9a 100644 --- a/matrix-sdk/src/main/res/values-bg/strings.xml +++ b/matrix-sdk/src/main/res/values-bg/strings.xml @@ -73,4 +73,15 @@ изпрати аудио файл. изпрати файл. + Покана от %s + Покана за стая + %1$s и %2$s + + + %1$s и 1 друг + %1$s и %d други + + + Празна стая + diff --git a/matrix-sdk/src/main/res/values-bs/strings.xml b/matrix-sdk/src/main/res/values-bs/strings.xml index a6b3daec9..3b171475c 100644 --- a/matrix-sdk/src/main/res/values-bs/strings.xml +++ b/matrix-sdk/src/main/res/values-bs/strings.xml @@ -1,2 +1,7 @@ - \ No newline at end of file + + Pozovite iz %s + Poziv u Sobu + %1$s i %2$s + Prazna soba + \ No newline at end of file diff --git a/matrix-sdk/src/main/res/values-ca/strings.xml b/matrix-sdk/src/main/res/values-ca/strings.xml index 95e37d459..bdf4e2f0b 100644 --- a/matrix-sdk/src/main/res/values-ca/strings.xml +++ b/matrix-sdk/src/main/res/values-ca/strings.xml @@ -64,4 +64,16 @@ %1$s a canviat el seu nom visible a %2$s %s ha iniciat una trucada de vídeo. %s ha iniciat una trucada de veu. - + + + Convideu des de %s + Convideu a la sala + %1$s i %2$s + Sala buida + + %1$s i 1 altre + %1$s i %d altres + + + + diff --git a/matrix-sdk/src/main/res/values-da/strings.xml b/matrix-sdk/src/main/res/values-da/strings.xml index 7fb23eca9..76c813eac 100644 --- a/matrix-sdk/src/main/res/values-da/strings.xml +++ b/matrix-sdk/src/main/res/values-da/strings.xml @@ -64,4 +64,15 @@ mailadresse Telefonnummer + Invitation fra %s + Invitation til rum + %1$s og %2$s + + + %1$s og 1 anden + %1$s og %d andre + + + Tomt rum + diff --git a/matrix-sdk/src/main/res/values-de/strings.xml b/matrix-sdk/src/main/res/values-de/strings.xml index bb507f5d1..9e419aa1c 100644 --- a/matrix-sdk/src/main/res/values-de/strings.xml +++ b/matrix-sdk/src/main/res/values-de/strings.xml @@ -83,4 +83,16 @@ sandte eine Audio-Datei. sandte eine Datei. + + Einladung von %s + Raumeinladung + %1$s und %2$s + Leerer Raum + + + %1$s und 1 andere(r) + %1$s und %d andere + + + diff --git a/matrix-sdk/src/main/res/values-es-rMX/strings.xml b/matrix-sdk/src/main/res/values-es-rMX/strings.xml index d0c70d898..142c38e43 100644 --- a/matrix-sdk/src/main/res/values-es-rMX/strings.xml +++ b/matrix-sdk/src/main/res/values-es-rMX/strings.xml @@ -83,4 +83,11 @@ envió un archivo de audio. envió un archivo. + + Invitar de %s + Invitacion de Sala + %1$s y %2$s + Sala vacía + + diff --git a/matrix-sdk/src/main/res/values-es/strings.xml b/matrix-sdk/src/main/res/values-es/strings.xml index 52e88ff43..4453bbc04 100644 --- a/matrix-sdk/src/main/res/values-es/strings.xml +++ b/matrix-sdk/src/main/res/values-es/strings.xml @@ -83,4 +83,16 @@ envió un archivo de audio. envió un archivo. + + Invitación de %s + Invitación a Sala + %1$s y %2$s + Sala vacía + + + %1$s y 1 otro + %1$s y %d otros + + + diff --git a/matrix-sdk/src/main/res/values-eu/strings.xml b/matrix-sdk/src/main/res/values-eu/strings.xml index dc4485ea3..2e663fbd7 100644 --- a/matrix-sdk/src/main/res/values-eu/strings.xml +++ b/matrix-sdk/src/main/res/values-eu/strings.xml @@ -73,4 +73,15 @@ audio fitxategi bat bidali du. fitxategi bat bidali du. + %s gelarako gonbidapena + Gela gonbidapena + %1$s eta %2$s + Gela hutsa + + + %1$s eta beste bat + %1$s eta beste %d + + + diff --git a/matrix-sdk/src/main/res/values-fi/strings.xml b/matrix-sdk/src/main/res/values-fi/strings.xml index 0df62bbff..c1e3e9975 100644 --- a/matrix-sdk/src/main/res/values-fi/strings.xml +++ b/matrix-sdk/src/main/res/values-fi/strings.xml @@ -63,4 +63,12 @@ Takaisinveto epäonnistui %1$s: %2$s "veti takaisin %1$s " - + + + Kutsu käyttäjältä %s + Huonekutsu + %1$s ja %2$s + Tyhjä huone + + + diff --git a/matrix-sdk/src/main/res/values-fr/strings.xml b/matrix-sdk/src/main/res/values-fr/strings.xml index 7be428788..c8d392ff4 100644 --- a/matrix-sdk/src/main/res/values-fr/strings.xml +++ b/matrix-sdk/src/main/res/values-fr/strings.xml @@ -73,4 +73,15 @@ a envoyé un fichier audio. a envoyé un fichier. + Invitation de %s + Invitation au salon + Salon vide + %1$s et %2$s + + + %1$s et 1 autre + %1$s et %d autres + + + diff --git a/matrix-sdk/src/main/res/values-gl/strings.xml b/matrix-sdk/src/main/res/values-gl/strings.xml index 871a28104..8fc750c4d 100644 --- a/matrix-sdk/src/main/res/values-gl/strings.xml +++ b/matrix-sdk/src/main/res/values-gl/strings.xml @@ -71,4 +71,7 @@ enviar un ficheiro de son. enviar un ficheiro. + %1$s e %2$s + + diff --git a/matrix-sdk/src/main/res/values-hu/strings.xml b/matrix-sdk/src/main/res/values-hu/strings.xml index e36cc75b5..d9b8ee959 100644 --- a/matrix-sdk/src/main/res/values-hu/strings.xml +++ b/matrix-sdk/src/main/res/values-hu/strings.xml @@ -72,4 +72,15 @@ hangfájl elküldve. fájl elküldve. + %s meghívott + Meghívó egy szobába + %1$s és %2$s + Üres szoba + + + %1$s és 1 másik + %1$s és %d másik + + + diff --git a/matrix-sdk/src/main/res/values-in/strings.xml b/matrix-sdk/src/main/res/values-in/strings.xml new file mode 100644 index 000000000..b953bd035 --- /dev/null +++ b/matrix-sdk/src/main/res/values-in/strings.xml @@ -0,0 +1,12 @@ + + + Undang dari %s + Undangan Ruang + %1$s dan %2$s + + Ruang kosong + + + %1$s dan %d yang lain + + \ No newline at end of file diff --git a/matrix-sdk/src/main/res/values-is/strings.xml b/matrix-sdk/src/main/res/values-is/strings.xml index eaf6e3f63..8389e525d 100644 --- a/matrix-sdk/src/main/res/values-is/strings.xml +++ b/matrix-sdk/src/main/res/values-is/strings.xml @@ -66,4 +66,15 @@ Gat ekki ritstýrt Ekki er í augnablikinu hægt að taka aftur þátt í spjallrás sem er tóm. - + Boð á spjallrás + %1$s og %2$s + + + %1$s og 1 annar + %1$s og %d aðrir + + + Tóm spjallrás + Boð frá %s + + diff --git a/matrix-sdk/src/main/res/values-it/strings.xml b/matrix-sdk/src/main/res/values-it/strings.xml index cca7c47c4..1871f8d93 100644 --- a/matrix-sdk/src/main/res/values-it/strings.xml +++ b/matrix-sdk/src/main/res/values-it/strings.xml @@ -72,4 +72,16 @@ inviato un file audio. inviato un file. + + Invito da %s + Invito nella stanza + %1$s e %2$s + Stanza vuota + + + %1$s e 1 altro + %1$s e %d altri + + + diff --git a/matrix-sdk/src/main/res/values-ja/strings.xml b/matrix-sdk/src/main/res/values-ja/strings.xml new file mode 100644 index 000000000..234d2567d --- /dev/null +++ b/matrix-sdk/src/main/res/values-ja/strings.xml @@ -0,0 +1,12 @@ + + + %sさんからの招待 + 部屋への招待 + %1$sと%2$s + 空の部屋 + + + %1$sと他%d名 + + + \ No newline at end of file diff --git a/matrix-sdk/src/main/res/values-lv/strings.xml b/matrix-sdk/src/main/res/values-lv/strings.xml index 6cac4f26b..d12bc0bdd 100644 --- a/matrix-sdk/src/main/res/values-lv/strings.xml +++ b/matrix-sdk/src/main/res/values-lv/strings.xml @@ -63,4 +63,16 @@ Epasta adrese Telefona numurs + Uzaicinājums no %s + Uzaicinājums uz istabu + %1$s un %2$s + Tukša istaba + + + %1$s un 1 cits + %1$s un %d citi + %1$s un %d citu + + + diff --git a/matrix-sdk/src/main/res/values-nl/strings.xml b/matrix-sdk/src/main/res/values-nl/strings.xml index 972c5b552..f7a77d5ca 100644 --- a/matrix-sdk/src/main/res/values-nl/strings.xml +++ b/matrix-sdk/src/main/res/values-nl/strings.xml @@ -81,4 +81,16 @@ verstuurde een audiobestand. verstuurde een bestand. + + Uitnodiging van %s + Ruimte uitnodiging + %1$s en %2$s + Lege ruimte + + + %1$s en 1 andere + %1$s en %d anderen + + + diff --git a/matrix-sdk/src/main/res/values-nn/strings.xml b/matrix-sdk/src/main/res/values-nn/strings.xml index cb23e62bb..bd2d8e2e7 100644 --- a/matrix-sdk/src/main/res/values-nn/strings.xml +++ b/matrix-sdk/src/main/res/values-nn/strings.xml @@ -71,4 +71,15 @@ sende ein ljodfil. sende ei fil. + Byd inn frå %s + Rominnbyding + %1$s og %2$s + + + %1$s og 1 til + %1$s og %d til + + + Tomt rom + diff --git a/matrix-sdk/src/main/res/values-pl/strings.xml b/matrix-sdk/src/main/res/values-pl/strings.xml index 7b8109c0b..ff7bc6e67 100644 --- a/matrix-sdk/src/main/res/values-pl/strings.xml +++ b/matrix-sdk/src/main/res/values-pl/strings.xml @@ -40,4 +40,16 @@ %1$s włączył szyfrowanie end-to-end (%2$s) - + Zaproszenie od %s + Zaproszenie do pokoju + %1$s i %2$s + Pusty pokój + + + %1$s i jeden inny + %1$s i kilku innych + %d innych + + + + diff --git a/matrix-sdk/src/main/res/values-pt-rBR/strings.xml b/matrix-sdk/src/main/res/values-pt-rBR/strings.xml index dbaf33612..49ea632c1 100644 --- a/matrix-sdk/src/main/res/values-pt-rBR/strings.xml +++ b/matrix-sdk/src/main/res/values-pt-rBR/strings.xml @@ -84,4 +84,16 @@ enviou um arquivo de áudio. enviou um arquivo. + + Convite de %s + Convite para sala + %1$s e %2$s + Sala vazia + + + %1$s e 1 outra/o + %1$s e %d outras/os + + + diff --git a/matrix-sdk/src/main/res/values-pt/strings.xml b/matrix-sdk/src/main/res/values-pt/strings.xml index 1fa4eeff7..6552a6497 100644 --- a/matrix-sdk/src/main/res/values-pt/strings.xml +++ b/matrix-sdk/src/main/res/values-pt/strings.xml @@ -73,6 +73,13 @@ Endereço de e-mail Número de telefone - - + + + Convite de %s + Convite para sala + %1$s e %2$s + Sala vazia + + + diff --git a/matrix-sdk/src/main/res/values-ru/strings.xml b/matrix-sdk/src/main/res/values-ru/strings.xml index bb7b14e01..0cc118e15 100644 --- a/matrix-sdk/src/main/res/values-ru/strings.xml +++ b/matrix-sdk/src/main/res/values-ru/strings.xml @@ -83,4 +83,18 @@ отправил аудиофайл. отправил файл. + + Приглашение от %s + Приглашение в комнату + %1$s и %2$s + Пустая комната + + + %1$s и 1 другой + %1$s и %d другие + %1$s и %d других + + + + diff --git a/matrix-sdk/src/main/res/values-sk/strings.xml b/matrix-sdk/src/main/res/values-sk/strings.xml index ee532e9d1..c9208fb79 100644 --- a/matrix-sdk/src/main/res/values-sk/strings.xml +++ b/matrix-sdk/src/main/res/values-sk/strings.xml @@ -72,4 +72,17 @@ odoslal zvukový súbor. Odoslal súbor. + Pozvanie od %s + Pozvanie do miestnosti + %1$s a %2$s + Prázdna miestnosť + + + %1$s a 1 ďalší + %1$s a %d ďalší + %1$s a %d ďalších + + + + diff --git a/matrix-sdk/src/main/res/values-te/strings.xml b/matrix-sdk/src/main/res/values-te/strings.xml index c34de973d..eb8b274bc 100644 --- a/matrix-sdk/src/main/res/values-te/strings.xml +++ b/matrix-sdk/src/main/res/values-te/strings.xml @@ -63,4 +63,11 @@ %1$s మిమ్మల్ని ఆహ్వానించారు %1$s చేరారు - + + %s నుండి ఆహ్వానించు + %1$s మరియు %2$s + గదికి ఆహ్వానం + ఖాళీ గది + + + diff --git a/matrix-sdk/src/main/res/values-uk/strings.xml b/matrix-sdk/src/main/res/values-uk/strings.xml index 75a5a7889..fe49cc1f3 100644 --- a/matrix-sdk/src/main/res/values-uk/strings.xml +++ b/matrix-sdk/src/main/res/values-uk/strings.xml @@ -7,4 +7,11 @@ %1$s запросив(ла) %2$s Закодоване повідомлення - + + Запрошення від %s + Запрошення до кімнати + %1$s і %2$s + Порожня кімната + + + diff --git a/matrix-sdk/src/main/res/values-zh-rCN/strings.xml b/matrix-sdk/src/main/res/values-zh-rCN/strings.xml index bf8f9d6ef..b25e02488 100644 --- a/matrix-sdk/src/main/res/values-zh-rCN/strings.xml +++ b/matrix-sdk/src/main/res/values-zh-rCN/strings.xml @@ -72,4 +72,12 @@ 回复 - + 空聊天室 + 来自 %s 的邀请 + 聊天室邀请 + %1$s 和 %2$s + + %1$s 和 与其他 %d 个人 + + + diff --git a/matrix-sdk/src/main/res/values-zh-rTW/strings.xml b/matrix-sdk/src/main/res/values-zh-rTW/strings.xml index 7e247991c..980e4192c 100644 --- a/matrix-sdk/src/main/res/values-zh-rTW/strings.xml +++ b/matrix-sdk/src/main/res/values-zh-rTW/strings.xml @@ -72,4 +72,14 @@ 傳送了音訊檔案。 傳送了檔案。 + 來自%s 的邀請 + 聊天室邀請 + %1$s 和 %2$s + + 空聊天室 + + %1$s 和 和其他 %d 個人 + + + diff --git a/matrix-sdk/src/main/res/values/strings.xml b/matrix-sdk/src/main/res/values/strings.xml index adaca9b40..c4a9a137f 100644 --- a/matrix-sdk/src/main/res/values/strings.xml +++ b/matrix-sdk/src/main/res/values/strings.xml @@ -82,4 +82,18 @@ sent an audio file. sent a file. + + Invite from %s + Room Invite + + + %1$s and %2$s + + + %1$s and 1 other + %1$s and %2$d others + + + Empty room + From 44fb5829408fcd0c60f994daf5f43189f83cd633 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 15 Oct 2018 17:45:36 +0200 Subject: [PATCH 38/79] Fix issue with plurals --- matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java | 2 +- .../main/java/org/matrix/androidsdk/data/room/RoomName.java | 2 +- matrix-sdk/src/main/res/values-bg/strings.xml | 2 +- matrix-sdk/src/main/res/values-ca/strings.xml | 2 +- matrix-sdk/src/main/res/values-da/strings.xml | 2 +- matrix-sdk/src/main/res/values-de/strings.xml | 2 +- matrix-sdk/src/main/res/values-es/strings.xml | 2 +- matrix-sdk/src/main/res/values-eu/strings.xml | 2 +- matrix-sdk/src/main/res/values-fr/strings.xml | 2 +- matrix-sdk/src/main/res/values-hu/strings.xml | 2 +- matrix-sdk/src/main/res/values-in/strings.xml | 2 +- matrix-sdk/src/main/res/values-is/strings.xml | 2 +- matrix-sdk/src/main/res/values-it/strings.xml | 2 +- matrix-sdk/src/main/res/values-ja/strings.xml | 2 +- matrix-sdk/src/main/res/values-lv/strings.xml | 4 ++-- matrix-sdk/src/main/res/values-nl/strings.xml | 2 +- matrix-sdk/src/main/res/values-nn/strings.xml | 2 +- matrix-sdk/src/main/res/values-pl/strings.xml | 2 +- matrix-sdk/src/main/res/values-pt-rBR/strings.xml | 2 +- matrix-sdk/src/main/res/values-ru/strings.xml | 4 ++-- matrix-sdk/src/main/res/values-sk/strings.xml | 4 ++-- matrix-sdk/src/main/res/values-zh-rCN/strings.xml | 2 +- matrix-sdk/src/main/res/values-zh-rTW/strings.xml | 2 +- 23 files changed, 26 insertions(+), 26 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java index aa18bc214..acbe26ec1 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java @@ -551,7 +551,7 @@ public void run() { * @return the computed room display name */ public String getRoomDisplayName(Context context) { - return mRoomName.getRoomName(context); + return mRoomName.getRoomDisplayName(context); } public String getTopic() { diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java index 5c58c38db..e6bf37af0 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java @@ -44,7 +44,7 @@ public RoomName(Room room) { mRoom = room; } - public String getRoomName(Context context) { + public String getRoomDisplayName(Context context) { try { // this algorithm is the one defined in // https://github.com/matrix-org/matrix-js-sdk/blob/develop/lib/models/room.js#L617 diff --git a/matrix-sdk/src/main/res/values-bg/strings.xml b/matrix-sdk/src/main/res/values-bg/strings.xml index 61956cf9a..a8c259425 100644 --- a/matrix-sdk/src/main/res/values-bg/strings.xml +++ b/matrix-sdk/src/main/res/values-bg/strings.xml @@ -79,7 +79,7 @@ %1$s и 1 друг - %1$s и %d други + %1$s и %2$d други Празна стая diff --git a/matrix-sdk/src/main/res/values-ca/strings.xml b/matrix-sdk/src/main/res/values-ca/strings.xml index bdf4e2f0b..36d223c24 100644 --- a/matrix-sdk/src/main/res/values-ca/strings.xml +++ b/matrix-sdk/src/main/res/values-ca/strings.xml @@ -72,7 +72,7 @@ Sala buida %1$s i 1 altre - %1$s i %d altres + %1$s i %2$d altres diff --git a/matrix-sdk/src/main/res/values-da/strings.xml b/matrix-sdk/src/main/res/values-da/strings.xml index 76c813eac..1b19e0a1e 100644 --- a/matrix-sdk/src/main/res/values-da/strings.xml +++ b/matrix-sdk/src/main/res/values-da/strings.xml @@ -70,7 +70,7 @@ %1$s og 1 anden - %1$s og %d andre + %1$s og %2$d andre Tomt rum diff --git a/matrix-sdk/src/main/res/values-de/strings.xml b/matrix-sdk/src/main/res/values-de/strings.xml index 9e419aa1c..040ccc103 100644 --- a/matrix-sdk/src/main/res/values-de/strings.xml +++ b/matrix-sdk/src/main/res/values-de/strings.xml @@ -91,7 +91,7 @@ %1$s und 1 andere(r) - %1$s und %d andere + %1$s und %2$d andere diff --git a/matrix-sdk/src/main/res/values-es/strings.xml b/matrix-sdk/src/main/res/values-es/strings.xml index 4453bbc04..7d2e68a41 100644 --- a/matrix-sdk/src/main/res/values-es/strings.xml +++ b/matrix-sdk/src/main/res/values-es/strings.xml @@ -91,7 +91,7 @@ %1$s y 1 otro - %1$s y %d otros + %1$s y %2$d otros diff --git a/matrix-sdk/src/main/res/values-eu/strings.xml b/matrix-sdk/src/main/res/values-eu/strings.xml index 2e663fbd7..e6eec5c78 100644 --- a/matrix-sdk/src/main/res/values-eu/strings.xml +++ b/matrix-sdk/src/main/res/values-eu/strings.xml @@ -80,7 +80,7 @@ %1$s eta beste bat - %1$s eta beste %d + %1$s eta beste %2$d diff --git a/matrix-sdk/src/main/res/values-fr/strings.xml b/matrix-sdk/src/main/res/values-fr/strings.xml index c8d392ff4..490940e64 100644 --- a/matrix-sdk/src/main/res/values-fr/strings.xml +++ b/matrix-sdk/src/main/res/values-fr/strings.xml @@ -80,7 +80,7 @@ %1$s et 1 autre - %1$s et %d autres + %1$s et %2$d autres diff --git a/matrix-sdk/src/main/res/values-hu/strings.xml b/matrix-sdk/src/main/res/values-hu/strings.xml index d9b8ee959..ad6919e64 100644 --- a/matrix-sdk/src/main/res/values-hu/strings.xml +++ b/matrix-sdk/src/main/res/values-hu/strings.xml @@ -79,7 +79,7 @@ %1$s és 1 másik - %1$s és %d másik + %1$s és %2$d másik diff --git a/matrix-sdk/src/main/res/values-in/strings.xml b/matrix-sdk/src/main/res/values-in/strings.xml index b953bd035..0d44c05ce 100644 --- a/matrix-sdk/src/main/res/values-in/strings.xml +++ b/matrix-sdk/src/main/res/values-in/strings.xml @@ -7,6 +7,6 @@ Ruang kosong - %1$s dan %d yang lain + %1$s dan %2$d yang lain \ No newline at end of file diff --git a/matrix-sdk/src/main/res/values-is/strings.xml b/matrix-sdk/src/main/res/values-is/strings.xml index 8389e525d..b1e0c7bdb 100644 --- a/matrix-sdk/src/main/res/values-is/strings.xml +++ b/matrix-sdk/src/main/res/values-is/strings.xml @@ -71,7 +71,7 @@ %1$s og 1 annar - %1$s og %d aðrir + %1$s og %2$d aðrir Tóm spjallrás diff --git a/matrix-sdk/src/main/res/values-it/strings.xml b/matrix-sdk/src/main/res/values-it/strings.xml index 1871f8d93..986e49056 100644 --- a/matrix-sdk/src/main/res/values-it/strings.xml +++ b/matrix-sdk/src/main/res/values-it/strings.xml @@ -80,7 +80,7 @@ %1$s e 1 altro - %1$s e %d altri + %1$s e %2$d altri diff --git a/matrix-sdk/src/main/res/values-ja/strings.xml b/matrix-sdk/src/main/res/values-ja/strings.xml index 234d2567d..8a3567f0a 100644 --- a/matrix-sdk/src/main/res/values-ja/strings.xml +++ b/matrix-sdk/src/main/res/values-ja/strings.xml @@ -6,7 +6,7 @@ 空の部屋 - %1$sと他%d名 + %1$sと他%2$d名 \ No newline at end of file diff --git a/matrix-sdk/src/main/res/values-lv/strings.xml b/matrix-sdk/src/main/res/values-lv/strings.xml index d12bc0bdd..ecd4056ea 100644 --- a/matrix-sdk/src/main/res/values-lv/strings.xml +++ b/matrix-sdk/src/main/res/values-lv/strings.xml @@ -70,8 +70,8 @@ %1$s un 1 cits - %1$s un %d citi - %1$s un %d citu + %1$s un %2$d citi + %1$s un %2$d citu diff --git a/matrix-sdk/src/main/res/values-nl/strings.xml b/matrix-sdk/src/main/res/values-nl/strings.xml index f7a77d5ca..125d19100 100644 --- a/matrix-sdk/src/main/res/values-nl/strings.xml +++ b/matrix-sdk/src/main/res/values-nl/strings.xml @@ -89,7 +89,7 @@ %1$s en 1 andere - %1$s en %d anderen + %1$s en %2$d anderen diff --git a/matrix-sdk/src/main/res/values-nn/strings.xml b/matrix-sdk/src/main/res/values-nn/strings.xml index bd2d8e2e7..51701e82f 100644 --- a/matrix-sdk/src/main/res/values-nn/strings.xml +++ b/matrix-sdk/src/main/res/values-nn/strings.xml @@ -77,7 +77,7 @@ %1$s og 1 til - %1$s og %d til + %1$s og %2$d til Tomt rom diff --git a/matrix-sdk/src/main/res/values-pl/strings.xml b/matrix-sdk/src/main/res/values-pl/strings.xml index ff7bc6e67..cbfc89adc 100644 --- a/matrix-sdk/src/main/res/values-pl/strings.xml +++ b/matrix-sdk/src/main/res/values-pl/strings.xml @@ -48,7 +48,7 @@ %1$s i jeden inny %1$s i kilku innych - %d innych + %1$s i %2$d innych diff --git a/matrix-sdk/src/main/res/values-pt-rBR/strings.xml b/matrix-sdk/src/main/res/values-pt-rBR/strings.xml index 49ea632c1..dfd7c9cff 100644 --- a/matrix-sdk/src/main/res/values-pt-rBR/strings.xml +++ b/matrix-sdk/src/main/res/values-pt-rBR/strings.xml @@ -92,7 +92,7 @@ %1$s e 1 outra/o - %1$s e %d outras/os + %1$s e %2$d outras/os diff --git a/matrix-sdk/src/main/res/values-ru/strings.xml b/matrix-sdk/src/main/res/values-ru/strings.xml index 0cc118e15..f4004a886 100644 --- a/matrix-sdk/src/main/res/values-ru/strings.xml +++ b/matrix-sdk/src/main/res/values-ru/strings.xml @@ -91,8 +91,8 @@ %1$s и 1 другой - %1$s и %d другие - %1$s и %d других + %1$s и %2$d другие + %1$s и %2$d других diff --git a/matrix-sdk/src/main/res/values-sk/strings.xml b/matrix-sdk/src/main/res/values-sk/strings.xml index c9208fb79..dcaf5e91f 100644 --- a/matrix-sdk/src/main/res/values-sk/strings.xml +++ b/matrix-sdk/src/main/res/values-sk/strings.xml @@ -79,8 +79,8 @@ %1$s a 1 ďalší - %1$s a %d ďalší - %1$s a %d ďalších + %1$s a %2$d ďalší + %1$s a %2$d ďalších diff --git a/matrix-sdk/src/main/res/values-zh-rCN/strings.xml b/matrix-sdk/src/main/res/values-zh-rCN/strings.xml index b25e02488..8bf9a10c9 100644 --- a/matrix-sdk/src/main/res/values-zh-rCN/strings.xml +++ b/matrix-sdk/src/main/res/values-zh-rCN/strings.xml @@ -77,7 +77,7 @@ 聊天室邀请 %1$s 和 %2$s - %1$s 和 与其他 %d 个人 + %1$s 和 与其他 %2$d 个人 diff --git a/matrix-sdk/src/main/res/values-zh-rTW/strings.xml b/matrix-sdk/src/main/res/values-zh-rTW/strings.xml index 980e4192c..a47cd9a1d 100644 --- a/matrix-sdk/src/main/res/values-zh-rTW/strings.xml +++ b/matrix-sdk/src/main/res/values-zh-rTW/strings.xml @@ -78,7 +78,7 @@ 空聊天室 - %1$s 和 和其他 %d 個人 + %1$s 和 和其他 %2$d 個人 From bc35f6d0c0bd02637db5f850c460e364530c4586 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 15 Oct 2018 17:50:21 +0200 Subject: [PATCH 39/79] Use correct number of members --- .../main/java/org/matrix/androidsdk/data/room/RoomName.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java index e6bf37af0..312978851 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java @@ -135,7 +135,9 @@ public int compare(RoomMember m1, RoomMember m2) { } else { RoomMember member = othersActiveMembers.get(0); displayName = context.getResources().getQuantityString(R.plurals.room_displayname_three_and_more_members, - nbOfOtherMembers - 1, roomState.getMemberName(member.getUserId()), nbOfOtherMembers - 1); + mRoom.getRoomSummary().getNumberOfJoinedMembers() - 1, + roomState.getMemberName(member.getUserId()), + mRoom.getRoomSummary().getNumberOfJoinedMembers() - 1); } return displayName; From ef4336fbd9dc9440f5ddd6aab716a50529dfbb3d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 15 Oct 2018 17:53:49 +0200 Subject: [PATCH 40/79] Use first alias as a room name if available --- .../main/java/org/matrix/androidsdk/data/room/RoomName.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java index 312978851..6687985f6 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java @@ -63,6 +63,11 @@ public String getRoomDisplayName(Context context) { return roomState.getCanonicalAlias(); } + // Temporary patch: use the first alias if available + if (roomState.aliases != null && !roomState.aliases.isEmpty()) { + return roomState.aliases.get(0); + } + List othersActiveMembers = new ArrayList<>(); List activeMembers = new ArrayList<>(); From f5b1c2b607c8f2db6643e794ec8676903ffbaf8a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 15 Oct 2018 18:24:17 +0200 Subject: [PATCH 41/79] Add RoomNameTest --- .../androidsdk/data/room/RoomNameTest.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java new file mode 100644 index 000000000..b2c8876a9 --- /dev/null +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java @@ -0,0 +1,85 @@ +/* + * Copyright 2018 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.data.room; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import junit.framework.Assert; + +import org.junit.Test; +import org.matrix.androidsdk.MXDataHandler; +import org.matrix.androidsdk.data.Room; +import org.matrix.androidsdk.data.store.IMXStore; +import org.matrix.androidsdk.data.store.MXMemoryStore; +import org.matrix.androidsdk.rest.model.login.Credentials; + +import java.util.ArrayList; + +public class RoomNameTest { + + @Test + public void RoomName_getRoomDisplayName_emptyRoom() { + Context context = InstrumentationRegistry.getContext(); + Room room = createRoom(context, false); + + Assert.assertEquals("Empty room", room.getRoomDisplayName(context)); + } + + @Test + public void RoomName_getRoomDisplayName_noLL_roomName() { + RoomName_getRoomDisplayName_roomName(false); + } + + @Test + public void RoomName_getRoomDisplayName_LL_roomName() { + RoomName_getRoomDisplayName_roomName(true); + } + + private void RoomName_getRoomDisplayName_roomName(boolean withLazyLoading) { + Context context = InstrumentationRegistry.getContext(); + Room room = createRoom(context, withLazyLoading); + + room.getState().aliases = new ArrayList<>(); + room.getState().aliases.add("Alias"); + Assert.assertEquals("Alias", room.getRoomDisplayName(context)); + + // Canonical alias get priority over alias + room.getState().setCanonicalAlias("Canonical"); + Assert.assertEquals("Canonical", room.getRoomDisplayName(context)); + + // Room name get priority over alias and canonical alias + room.getState().name = "Room Name"; + Assert.assertEquals("Room Name", room.getRoomDisplayName(context)); + } + + /* ========================================================================================== + * Private + * ========================================================================================== */ + + private Room createRoom(Context context, boolean withLazyLoading) { + Credentials credentials = new Credentials(); + IMXStore store = new MXMemoryStore(credentials, context); + + MXDataHandler mxDataHandler = new MXDataHandler(store, credentials); + mxDataHandler.setLazyLoadingEnabled(withLazyLoading); + + Room room = new Room(mxDataHandler, store, "roomId"); + + return room; + } +} From 5990dce8ef943bffa167d0c6c7dab181b6580b41 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 10:32:44 +0200 Subject: [PATCH 42/79] Add RoomNameTest. Fix issue on RoomName class --- .../androidsdk/data/room/RoomNameTest.java | 142 ++++++++++++++++-- .../org/matrix/androidsdk/data/RoomState.java | 4 +- .../matrix/androidsdk/data/room/RoomName.java | 4 +- 3 files changed, 133 insertions(+), 17 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java index b2c8876a9..98c9f9824 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java @@ -21,21 +21,37 @@ import junit.framework.Assert; +import org.junit.FixMethodOrder; import org.junit.Test; +import org.junit.runners.MethodSorters; import org.matrix.androidsdk.MXDataHandler; import org.matrix.androidsdk.data.Room; +import org.matrix.androidsdk.data.RoomState; +import org.matrix.androidsdk.data.RoomSummary; import org.matrix.androidsdk.data.store.IMXStore; import org.matrix.androidsdk.data.store.MXMemoryStore; +import org.matrix.androidsdk.rest.model.RoomMember; import org.matrix.androidsdk.rest.model.login.Credentials; +import org.matrix.androidsdk.rest.model.sync.RoomSyncSummary; import java.util.ArrayList; +@FixMethodOrder(MethodSorters.JVM) public class RoomNameTest { @Test - public void RoomName_getRoomDisplayName_emptyRoom() { + public void RoomName_getRoomDisplayName_LL_emptyRoom() { + RoomName_getRoomDisplayName_emptyRoom(true); + } + + @Test + public void RoomName_getRoomDisplayName_noLL_emptyRoom() { + RoomName_getRoomDisplayName_emptyRoom(false); + } + + private void RoomName_getRoomDisplayName_emptyRoom(boolean withLazyLoading) { Context context = InstrumentationRegistry.getContext(); - Room room = createRoom(context, false); + Room room = createRoom(context, withLazyLoading, 0); Assert.assertEquals("Empty room", room.getRoomDisplayName(context)); } @@ -52,34 +68,132 @@ public void RoomName_getRoomDisplayName_LL_roomName() { private void RoomName_getRoomDisplayName_roomName(boolean withLazyLoading) { Context context = InstrumentationRegistry.getContext(); - Room room = createRoom(context, withLazyLoading); - room.getState().aliases = new ArrayList<>(); - room.getState().aliases.add("Alias"); - Assert.assertEquals("Alias", room.getRoomDisplayName(context)); + // It does not depend on the number of users + for (int i = 0; i < 10; i++) { + Room room = createRoom(context, withLazyLoading, i); + + room.getState().aliases = new ArrayList<>(); + room.getState().aliases.add("Alias"); + Assert.assertEquals("Alias", room.getRoomDisplayName(context)); + + // Canonical alias get priority over alias + room.getState().setCanonicalAlias("Canonical"); + Assert.assertEquals("Canonical", room.getRoomDisplayName(context)); + + // Room name get priority over alias and canonical alias + room.getState().name = "Room Name"; + Assert.assertEquals("Room Name", room.getRoomDisplayName(context)); + } + } + + @Test + public void RoomName_getRoomDisplayName_noLL_user() { + RoomName_getRoomDisplayName_user(false); + } + + @Test + public void RoomName_getRoomDisplayName_LL_user() { + RoomName_getRoomDisplayName_user(true); + } + + private void RoomName_getRoomDisplayName_user(boolean withLazyLoading) { + Context context = InstrumentationRegistry.getContext(); + + Room room; + + room = createRoom(context, withLazyLoading, 1); + Assert.assertEquals(getUserName(1), room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 2); + Assert.assertEquals(getUserName(1) + " and " + getUserName(2), room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 3); + Assert.assertEquals(getUserName(1) + " and 2 others", room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 4); + Assert.assertEquals(getUserName(1) + " and 3 others", room.getRoomDisplayName(context)); - // Canonical alias get priority over alias - room.getState().setCanonicalAlias("Canonical"); - Assert.assertEquals("Canonical", room.getRoomDisplayName(context)); + room = createRoom(context, withLazyLoading, 5); + Assert.assertEquals(getUserName(1) + " and 4 others", room.getRoomDisplayName(context)); - // Room name get priority over alias and canonical alias - room.getState().name = "Room Name"; - Assert.assertEquals("Room Name", room.getRoomDisplayName(context)); + room = createRoom(context, withLazyLoading, 10); + Assert.assertEquals(getUserName(1) + " and 9 others", room.getRoomDisplayName(context)); } + // TODO Test with me as a member + // TODO Test with invitation + /* ========================================================================================== * Private * ========================================================================================== */ - private Room createRoom(Context context, boolean withLazyLoading) { + private Room createRoom(Context context, boolean withLazyLoading, int nbOfMembers) { Credentials credentials = new Credentials(); IMXStore store = new MXMemoryStore(credentials, context); MXDataHandler mxDataHandler = new MXDataHandler(store, credentials); mxDataHandler.setLazyLoadingEnabled(withLazyLoading); - Room room = new Room(mxDataHandler, store, "roomId"); + Room room = new Room(mxDataHandler, store, getRoomId()); + + store.storeRoom(room); + + if (withLazyLoading) { + // We need a room summary + RoomSummary roomSummary = new RoomSummary(); + roomSummary.setRoomId(getRoomId()); + + RoomSyncSummary roomSyncSummary = new RoomSyncSummary(); + + roomSyncSummary.joinedMembersCount = nbOfMembers; + roomSyncSummary.invitedMembersCount = 0; + + // heroes + if (nbOfMembers > 0) { + roomSyncSummary.heroes = new ArrayList<>(); + for (int i = 1; i <= Math.min(5, nbOfMembers); i++) { + roomSyncSummary.heroes.add(getUserId(i)); + } + } + + roomSummary.setRoomSyncSummary(roomSyncSummary); + + store.storeSummary(roomSummary); + } + + initMembers(room.getState(), nbOfMembers); return room; } + + private void initMembers(RoomState roomState, int nbOfMembers) { + for (int i = 1; i <= nbOfMembers; i++) { + roomState.setMember(getUserId(i), createRoomMember(i)); + } + } + + private RoomMember createRoomMember(int i) { + RoomMember roomMember = new RoomMember(); + + roomMember.setUserId(getUserId(i)); + roomMember.displayname = getUserName(i); + roomMember.membership = RoomMember.MEMBERSHIP_JOIN; + // Add a TS because they will be ordered + roomMember.setOriginServerTs(i); + + return roomMember; + } + + private String getRoomId() { + return "!RoomId"; + } + + private String getUserId(int i) { + return "UserId_" + i; + } + + private String getUserName(int i) { + return "UserName_" + i; + } } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java index 16181bbe2..28a2ca675 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java @@ -19,6 +19,7 @@ package org.matrix.androidsdk.data; import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import com.google.gson.JsonObject; @@ -475,7 +476,8 @@ public void setIsConferenceUserRoom(boolean isConferenceUserRoom) { * @param userId the user id. * @param member the new member value. */ - private void setMember(String userId, RoomMember member) { + @VisibleForTesting + public void setMember(String userId, RoomMember member) { // Populate a basic user object if there is none if (member.getUserId() == null) { member.setUserId(userId); diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java index 6687985f6..117e2c25a 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java @@ -140,9 +140,9 @@ public int compare(RoomMember m1, RoomMember m2) { } else { RoomMember member = othersActiveMembers.get(0); displayName = context.getResources().getQuantityString(R.plurals.room_displayname_three_and_more_members, - mRoom.getRoomSummary().getNumberOfJoinedMembers() - 1, + mRoom.getNumberOfJoinedMembers() - 1, roomState.getMemberName(member.getUserId()), - mRoom.getRoomSummary().getNumberOfJoinedMembers() - 1); + mRoom.getNumberOfJoinedMembers() - 1); } return displayName; From 0781e6c76a3a599a2a51c795d7e7a67718ae0c6d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 11:30:42 +0200 Subject: [PATCH 43/79] Test invitation --- .../androidsdk/data/room/RoomNameTest.java | 118 ++++++++++++++---- 1 file changed, 92 insertions(+), 26 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java index 98c9f9824..4a5978317 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java @@ -51,7 +51,7 @@ public void RoomName_getRoomDisplayName_noLL_emptyRoom() { private void RoomName_getRoomDisplayName_emptyRoom(boolean withLazyLoading) { Context context = InstrumentationRegistry.getContext(); - Room room = createRoom(context, withLazyLoading, 0); + Room room = createRoom(context, withLazyLoading, 0, false); Assert.assertEquals("Empty room", room.getRoomDisplayName(context)); } @@ -71,7 +71,7 @@ private void RoomName_getRoomDisplayName_roomName(boolean withLazyLoading) { // It does not depend on the number of users for (int i = 0; i < 10; i++) { - Room room = createRoom(context, withLazyLoading, i); + Room room = createRoom(context, withLazyLoading, i, false); room.getState().aliases = new ArrayList<>(); room.getState().aliases.add("Alias"); @@ -102,34 +102,82 @@ private void RoomName_getRoomDisplayName_user(boolean withLazyLoading) { Room room; - room = createRoom(context, withLazyLoading, 1); - Assert.assertEquals(getUserName(1), room.getRoomDisplayName(context)); + // Only me in the room + room = createRoom(context, withLazyLoading, 1, false); + Assert.assertEquals("Empty room", room.getRoomDisplayName(context)); + + // One other user in the room + room = createRoom(context, withLazyLoading, 2, false); + Assert.assertEquals(getUserName(2), room.getRoomDisplayName(context)); + + // 2 other users in the room + room = createRoom(context, withLazyLoading, 3, false); + Assert.assertEquals(getUserName(2) + " and " + getUserName(3), room.getRoomDisplayName(context)); - room = createRoom(context, withLazyLoading, 2); - Assert.assertEquals(getUserName(1) + " and " + getUserName(2), room.getRoomDisplayName(context)); + room = createRoom(context, withLazyLoading, 4, false); + Assert.assertEquals(getUserName(2) + " and 3 others", room.getRoomDisplayName(context)); - room = createRoom(context, withLazyLoading, 3); - Assert.assertEquals(getUserName(1) + " and 2 others", room.getRoomDisplayName(context)); + room = createRoom(context, withLazyLoading, 5, false); + Assert.assertEquals(getUserName(2) + " and 4 others", room.getRoomDisplayName(context)); - room = createRoom(context, withLazyLoading, 4); - Assert.assertEquals(getUserName(1) + " and 3 others", room.getRoomDisplayName(context)); + room = createRoom(context, withLazyLoading, 10, false); + Assert.assertEquals(getUserName(2) + " and 9 others", room.getRoomDisplayName(context)); + } - room = createRoom(context, withLazyLoading, 5); - Assert.assertEquals(getUserName(1) + " and 4 others", room.getRoomDisplayName(context)); + @Test + public void RoomName_getRoomDisplayName_noLL_invitation() { + RoomName_getRoomDisplayName_invitation(false); + } - room = createRoom(context, withLazyLoading, 10); - Assert.assertEquals(getUserName(1) + " and 9 others", room.getRoomDisplayName(context)); + @Test + public void RoomName_getRoomDisplayName_LL_invitation() { + RoomName_getRoomDisplayName_invitation(true); } - // TODO Test with me as a member - // TODO Test with invitation + private void RoomName_getRoomDisplayName_invitation(boolean withLazyLoading) { + Context context = InstrumentationRegistry.getContext(); + + Room room; + + // Only me in the room + room = createRoom(context, withLazyLoading, 1, true); + Assert.assertEquals("Room Invite", room.getRoomDisplayName(context)); + + // One other user in the room + room = createRoom(context, withLazyLoading, 2, true); + Assert.assertEquals(getUserName(2), room.getRoomDisplayName(context)); + + // 2 other users in the room + room = createRoom(context, withLazyLoading, 3, true); + Assert.assertEquals(getUserName(2) + " and " + getUserName(3), room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 4, true); + Assert.assertEquals(getUserName(2) + " and 2 others", room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 5, true); + Assert.assertEquals(getUserName(2) + " and 3 others", room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 10, true); + Assert.assertEquals(getUserName(2) + " and 8 others", room.getRoomDisplayName(context)); + } /* ========================================================================================== * Private * ========================================================================================== */ - private Room createRoom(Context context, boolean withLazyLoading, int nbOfMembers) { + /** + * Create a room, with or without lazy loading and with x number of room members + * First room member will always be the current user + * + * @param context + * @param withLazyLoading + * @param nbOfMembers + * @param amIInvited + * @return + */ + private Room createRoom(Context context, boolean withLazyLoading, int nbOfMembers, boolean amIInvited) { Credentials credentials = new Credentials(); + credentials.userId = getMyUserId(); IMXStore store = new MXMemoryStore(credentials, context); MXDataHandler mxDataHandler = new MXDataHandler(store, credentials); @@ -146,13 +194,19 @@ private Room createRoom(Context context, boolean withLazyLoading, int nbOfMember RoomSyncSummary roomSyncSummary = new RoomSyncSummary(); - roomSyncSummary.joinedMembersCount = nbOfMembers; - roomSyncSummary.invitedMembersCount = 0; + if (amIInvited) { + roomSyncSummary.joinedMembersCount = nbOfMembers - 1; + roomSyncSummary.invitedMembersCount = 1; + } else { + roomSyncSummary.joinedMembersCount = nbOfMembers; + roomSyncSummary.invitedMembersCount = 0; + } // heroes - if (nbOfMembers > 0) { + // Heroes does not include current user + if (nbOfMembers >= 2) { roomSyncSummary.heroes = new ArrayList<>(); - for (int i = 1; i <= Math.min(5, nbOfMembers); i++) { + for (int i = 2; i <= Math.min(6, nbOfMembers); i++) { roomSyncSummary.heroes.add(getUserId(i)); } } @@ -162,34 +216,46 @@ private Room createRoom(Context context, boolean withLazyLoading, int nbOfMember store.storeSummary(roomSummary); } - initMembers(room.getState(), nbOfMembers); + initMembers(room.getState(), nbOfMembers, amIInvited); return room; } - private void initMembers(RoomState roomState, int nbOfMembers) { + private void initMembers(RoomState roomState, int nbOfMembers, boolean amIInvited) { for (int i = 1; i <= nbOfMembers; i++) { - roomState.setMember(getUserId(i), createRoomMember(i)); + roomState.setMember(getUserId(i), createRoomMember(i, amIInvited)); } } - private RoomMember createRoomMember(int i) { + private RoomMember createRoomMember(int i, boolean amIInvited) { RoomMember roomMember = new RoomMember(); roomMember.setUserId(getUserId(i)); roomMember.displayname = getUserName(i); - roomMember.membership = RoomMember.MEMBERSHIP_JOIN; + if (i == 1 && amIInvited) { + roomMember.membership = RoomMember.MEMBERSHIP_INVITE; + } else { + roomMember.membership = RoomMember.MEMBERSHIP_JOIN; + } // Add a TS because they will be ordered roomMember.setOriginServerTs(i); return roomMember; } + private String getMyUserId() { + return "@MyUserId"; + } + private String getRoomId() { return "!RoomId"; } private String getUserId(int i) { + if (i == 1) { + return getMyUserId(); + } + return "UserId_" + i; } From 408caad2bc88b689aeeda6d964898291b8371d37 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 11:35:04 +0200 Subject: [PATCH 44/79] HardCode result for clarity --- .../androidsdk/data/room/RoomNameTest.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java index 4a5978317..7931f63c7 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java @@ -108,20 +108,20 @@ private void RoomName_getRoomDisplayName_user(boolean withLazyLoading) { // One other user in the room room = createRoom(context, withLazyLoading, 2, false); - Assert.assertEquals(getUserName(2), room.getRoomDisplayName(context)); + Assert.assertEquals("UserName_2", room.getRoomDisplayName(context)); // 2 other users in the room room = createRoom(context, withLazyLoading, 3, false); - Assert.assertEquals(getUserName(2) + " and " + getUserName(3), room.getRoomDisplayName(context)); + Assert.assertEquals("UserName_2 and UserName_3", room.getRoomDisplayName(context)); room = createRoom(context, withLazyLoading, 4, false); - Assert.assertEquals(getUserName(2) + " and 3 others", room.getRoomDisplayName(context)); + Assert.assertEquals("UserName_2 and 3 others", room.getRoomDisplayName(context)); room = createRoom(context, withLazyLoading, 5, false); - Assert.assertEquals(getUserName(2) + " and 4 others", room.getRoomDisplayName(context)); + Assert.assertEquals("UserName_2 and 4 others", room.getRoomDisplayName(context)); room = createRoom(context, withLazyLoading, 10, false); - Assert.assertEquals(getUserName(2) + " and 9 others", room.getRoomDisplayName(context)); + Assert.assertEquals("UserName_2 and 9 others", room.getRoomDisplayName(context)); } @Test @@ -145,20 +145,20 @@ private void RoomName_getRoomDisplayName_invitation(boolean withLazyLoading) { // One other user in the room room = createRoom(context, withLazyLoading, 2, true); - Assert.assertEquals(getUserName(2), room.getRoomDisplayName(context)); + Assert.assertEquals("UserName_2", room.getRoomDisplayName(context)); // 2 other users in the room room = createRoom(context, withLazyLoading, 3, true); - Assert.assertEquals(getUserName(2) + " and " + getUserName(3), room.getRoomDisplayName(context)); + Assert.assertEquals("UserName_2 and UserName_3", room.getRoomDisplayName(context)); room = createRoom(context, withLazyLoading, 4, true); - Assert.assertEquals(getUserName(2) + " and 2 others", room.getRoomDisplayName(context)); + Assert.assertEquals("UserName_2 and 2 others", room.getRoomDisplayName(context)); room = createRoom(context, withLazyLoading, 5, true); - Assert.assertEquals(getUserName(2) + " and 3 others", room.getRoomDisplayName(context)); + Assert.assertEquals("UserName_2 and 3 others", room.getRoomDisplayName(context)); room = createRoom(context, withLazyLoading, 10, true); - Assert.assertEquals(getUserName(2) + " and 8 others", room.getRoomDisplayName(context)); + Assert.assertEquals("UserName_2 and 8 others", room.getRoomDisplayName(context)); } /* ========================================================================================== @@ -247,6 +247,10 @@ private String getMyUserId() { return "@MyUserId"; } + private String getMyUserName() { + return "MyUserName"; + } + private String getRoomId() { return "!RoomId"; } @@ -260,6 +264,10 @@ private String getUserId(int i) { } private String getUserName(int i) { + if (i == 1) { + return getMyUserName(); + } + return "UserName_" + i; } } From bb053902b813ee494db7a5f6f67e06481c634164 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 13:34:48 +0200 Subject: [PATCH 45/79] Rename string resource and fix issue on invited room when lazy loading is enabled --- .../androidsdk/data/room/RoomNameTest.java | 48 +++++++++++-------- .../matrix/androidsdk/data/room/RoomName.java | 43 +++++++++-------- matrix-sdk/src/main/res/values-ar/strings.xml | 2 +- matrix-sdk/src/main/res/values-bg/strings.xml | 2 +- matrix-sdk/src/main/res/values-bs/strings.xml | 2 +- matrix-sdk/src/main/res/values-ca/strings.xml | 2 +- matrix-sdk/src/main/res/values-da/strings.xml | 2 +- matrix-sdk/src/main/res/values-de/strings.xml | 2 +- .../src/main/res/values-es-rMX/strings.xml | 2 +- matrix-sdk/src/main/res/values-es/strings.xml | 2 +- matrix-sdk/src/main/res/values-eu/strings.xml | 2 +- matrix-sdk/src/main/res/values-fi/strings.xml | 2 +- matrix-sdk/src/main/res/values-fr/strings.xml | 2 +- matrix-sdk/src/main/res/values-hu/strings.xml | 2 +- matrix-sdk/src/main/res/values-in/strings.xml | 2 +- matrix-sdk/src/main/res/values-is/strings.xml | 2 +- matrix-sdk/src/main/res/values-it/strings.xml | 2 +- matrix-sdk/src/main/res/values-ja/strings.xml | 2 +- matrix-sdk/src/main/res/values-lv/strings.xml | 2 +- matrix-sdk/src/main/res/values-nl/strings.xml | 2 +- matrix-sdk/src/main/res/values-nn/strings.xml | 2 +- matrix-sdk/src/main/res/values-pl/strings.xml | 2 +- .../src/main/res/values-pt-rBR/strings.xml | 2 +- matrix-sdk/src/main/res/values-pt/strings.xml | 2 +- matrix-sdk/src/main/res/values-ru/strings.xml | 2 +- matrix-sdk/src/main/res/values-sk/strings.xml | 2 +- matrix-sdk/src/main/res/values-te/strings.xml | 2 +- matrix-sdk/src/main/res/values-uk/strings.xml | 2 +- .../src/main/res/values-zh-rCN/strings.xml | 2 +- .../src/main/res/values-zh-rTW/strings.xml | 2 +- matrix-sdk/src/main/res/values/strings.xml | 2 +- 31 files changed, 82 insertions(+), 67 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java index 7931f63c7..63cf327fa 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java @@ -145,20 +145,20 @@ private void RoomName_getRoomDisplayName_invitation(boolean withLazyLoading) { // One other user in the room room = createRoom(context, withLazyLoading, 2, true); - Assert.assertEquals("UserName_2", room.getRoomDisplayName(context)); + Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); // 2 other users in the room room = createRoom(context, withLazyLoading, 3, true); - Assert.assertEquals("UserName_2 and UserName_3", room.getRoomDisplayName(context)); + Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); room = createRoom(context, withLazyLoading, 4, true); - Assert.assertEquals("UserName_2 and 2 others", room.getRoomDisplayName(context)); + Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); room = createRoom(context, withLazyLoading, 5, true); - Assert.assertEquals("UserName_2 and 3 others", room.getRoomDisplayName(context)); + Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); room = createRoom(context, withLazyLoading, 10, true); - Assert.assertEquals("UserName_2 and 8 others", room.getRoomDisplayName(context)); + Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); } /* ========================================================================================== @@ -187,20 +187,22 @@ private Room createRoom(Context context, boolean withLazyLoading, int nbOfMember store.storeRoom(room); - if (withLazyLoading) { - // We need a room summary - RoomSummary roomSummary = new RoomSummary(); - roomSummary.setRoomId(getRoomId()); + RoomSummary roomSummary = new RoomSummary(); + roomSummary.setRoomId(getRoomId()); + store.storeSummary(roomSummary); + if (amIInvited) { + roomSummary.setIsInvited(); + } else { + roomSummary.setIsJoined(); + } + + if (withLazyLoading && !amIInvited) { + // Populate room summary RoomSyncSummary roomSyncSummary = new RoomSyncSummary(); - if (amIInvited) { - roomSyncSummary.joinedMembersCount = nbOfMembers - 1; - roomSyncSummary.invitedMembersCount = 1; - } else { - roomSyncSummary.joinedMembersCount = nbOfMembers; - roomSyncSummary.invitedMembersCount = 0; - } + roomSyncSummary.joinedMembersCount = nbOfMembers; + roomSyncSummary.invitedMembersCount = 0; // heroes // Heroes does not include current user @@ -212,11 +214,19 @@ private Room createRoom(Context context, boolean withLazyLoading, int nbOfMember } roomSummary.setRoomSyncSummary(roomSyncSummary); - - store.storeSummary(roomSummary); } - initMembers(room.getState(), nbOfMembers, amIInvited); + if (amIInvited) { + // Maximum 2 members will be sent by the sync + initMembers(room.getState(), Math.min(2, nbOfMembers), true); + + // Pass the sender name (the inviter id) + if (nbOfMembers >= 2) { + room.getMember(getMyUserId()).mSender = getUserId(2); + } + } else { + initMembers(room.getState(), nbOfMembers, false); + } return room; } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java index 117e2c25a..fe11a8202 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java @@ -74,6 +74,7 @@ public String getRoomDisplayName(Context context) { int nbOfOtherMembers; if (mRoom.getDataHandler().isLazyLoadingEnabled() + && mRoom.isJoined() && mRoom.getRoomSummary() != null) { List heroes = mRoom.getRoomSummary().getHeroes(); @@ -110,12 +111,12 @@ public int compare(RoomMember m1, RoomMember m2) { String displayName; - if (nbOfOtherMembers == 0) { - if (activeMembers.size() == 1) { + if (mRoom.isInvited()) { + if (othersActiveMembers.size() == 1) { + // this is current user RoomMember member = activeMembers.get(0); if (TextUtils.equals(member.membership, RoomMember.MEMBERSHIP_INVITE)) { - if (!TextUtils.isEmpty(member.mSender)) { // extract who invited us to the room displayName = context.getString(R.string.room_displayname_invite_from, roomState.getMemberName(member.mSender)); @@ -123,26 +124,30 @@ public int compare(RoomMember m1, RoomMember m2) { displayName = context.getString(R.string.room_displayname_room_invite); } } else { - displayName = context.getString(R.string.room_displayname_no_title); + displayName = context.getString(R.string.room_displayname_room_invite); } } else { - displayName = context.getString(R.string.room_displayname_no_title); + displayName = context.getString(R.string.room_displayname_room_invite); } - } else if (nbOfOtherMembers == 1) { - RoomMember member = othersActiveMembers.get(0); - displayName = roomState.getMemberName(member.getUserId()); - } else if (nbOfOtherMembers == 2) { - RoomMember member1 = othersActiveMembers.get(0); - RoomMember member2 = othersActiveMembers.get(1); - - displayName = context.getString(R.string.room_displayname_two_members, - roomState.getMemberName(member1.getUserId()), roomState.getMemberName(member2.getUserId())); } else { - RoomMember member = othersActiveMembers.get(0); - displayName = context.getResources().getQuantityString(R.plurals.room_displayname_three_and_more_members, - mRoom.getNumberOfJoinedMembers() - 1, - roomState.getMemberName(member.getUserId()), - mRoom.getNumberOfJoinedMembers() - 1); + if (nbOfOtherMembers == 0) { + displayName = context.getString(R.string.room_displayname_empty_room); + } else if (nbOfOtherMembers == 1) { + RoomMember member = othersActiveMembers.get(0); + displayName = roomState.getMemberName(member.getUserId()); + } else if (nbOfOtherMembers == 2) { + RoomMember member1 = othersActiveMembers.get(0); + RoomMember member2 = othersActiveMembers.get(1); + + displayName = context.getString(R.string.room_displayname_two_members, + roomState.getMemberName(member1.getUserId()), roomState.getMemberName(member2.getUserId())); + } else { + RoomMember member = othersActiveMembers.get(0); + displayName = context.getResources().getQuantityString(R.plurals.room_displayname_three_and_more_members, + mRoom.getNumberOfJoinedMembers() - 1, + roomState.getMemberName(member.getUserId()), + mRoom.getNumberOfJoinedMembers() - 1); + } } return displayName; diff --git a/matrix-sdk/src/main/res/values-ar/strings.xml b/matrix-sdk/src/main/res/values-ar/strings.xml index 192327fba..5ec5ec785 100644 --- a/matrix-sdk/src/main/res/values-ar/strings.xml +++ b/matrix-sdk/src/main/res/values-ar/strings.xml @@ -74,7 +74,7 @@ أرسل ملفًا. دعوة من ⁨%s⁩ - غرفة فارغة + غرفة فارغة ‏⁨%1$s⁩ و ⁨%2$s⁩ دعوة إلى غرفة diff --git a/matrix-sdk/src/main/res/values-bg/strings.xml b/matrix-sdk/src/main/res/values-bg/strings.xml index a8c259425..8955f5888 100644 --- a/matrix-sdk/src/main/res/values-bg/strings.xml +++ b/matrix-sdk/src/main/res/values-bg/strings.xml @@ -82,6 +82,6 @@ %1$s и %2$d други - Празна стая + Празна стая diff --git a/matrix-sdk/src/main/res/values-bs/strings.xml b/matrix-sdk/src/main/res/values-bs/strings.xml index 3b171475c..6a6ee46d3 100644 --- a/matrix-sdk/src/main/res/values-bs/strings.xml +++ b/matrix-sdk/src/main/res/values-bs/strings.xml @@ -3,5 +3,5 @@ Pozovite iz %s Poziv u Sobu %1$s i %2$s - Prazna soba + Prazna soba \ No newline at end of file diff --git a/matrix-sdk/src/main/res/values-ca/strings.xml b/matrix-sdk/src/main/res/values-ca/strings.xml index 36d223c24..0ab98c0ab 100644 --- a/matrix-sdk/src/main/res/values-ca/strings.xml +++ b/matrix-sdk/src/main/res/values-ca/strings.xml @@ -69,7 +69,7 @@ Convideu des de %s Convideu a la sala %1$s i %2$s - Sala buida + Sala buida %1$s i 1 altre %1$s i %2$d altres diff --git a/matrix-sdk/src/main/res/values-da/strings.xml b/matrix-sdk/src/main/res/values-da/strings.xml index 1b19e0a1e..acef386ed 100644 --- a/matrix-sdk/src/main/res/values-da/strings.xml +++ b/matrix-sdk/src/main/res/values-da/strings.xml @@ -73,6 +73,6 @@ %1$s og %2$d andre - Tomt rum + Tomt rum diff --git a/matrix-sdk/src/main/res/values-de/strings.xml b/matrix-sdk/src/main/res/values-de/strings.xml index 040ccc103..f225b8442 100644 --- a/matrix-sdk/src/main/res/values-de/strings.xml +++ b/matrix-sdk/src/main/res/values-de/strings.xml @@ -87,7 +87,7 @@ Einladung von %s Raumeinladung %1$s und %2$s - Leerer Raum + Leerer Raum %1$s und 1 andere(r) diff --git a/matrix-sdk/src/main/res/values-es-rMX/strings.xml b/matrix-sdk/src/main/res/values-es-rMX/strings.xml index 142c38e43..3d80aa993 100644 --- a/matrix-sdk/src/main/res/values-es-rMX/strings.xml +++ b/matrix-sdk/src/main/res/values-es-rMX/strings.xml @@ -87,7 +87,7 @@ Invitar de %s Invitacion de Sala %1$s y %2$s - Sala vacía + Sala vacía diff --git a/matrix-sdk/src/main/res/values-es/strings.xml b/matrix-sdk/src/main/res/values-es/strings.xml index 7d2e68a41..4be6ac721 100644 --- a/matrix-sdk/src/main/res/values-es/strings.xml +++ b/matrix-sdk/src/main/res/values-es/strings.xml @@ -87,7 +87,7 @@ Invitación de %s Invitación a Sala %1$s y %2$s - Sala vacía + Sala vacía %1$s y 1 otro diff --git a/matrix-sdk/src/main/res/values-eu/strings.xml b/matrix-sdk/src/main/res/values-eu/strings.xml index e6eec5c78..4f4a27acf 100644 --- a/matrix-sdk/src/main/res/values-eu/strings.xml +++ b/matrix-sdk/src/main/res/values-eu/strings.xml @@ -76,7 +76,7 @@ %s gelarako gonbidapena Gela gonbidapena %1$s eta %2$s - Gela hutsa + Gela hutsa %1$s eta beste bat diff --git a/matrix-sdk/src/main/res/values-fi/strings.xml b/matrix-sdk/src/main/res/values-fi/strings.xml index c1e3e9975..2694a33d6 100644 --- a/matrix-sdk/src/main/res/values-fi/strings.xml +++ b/matrix-sdk/src/main/res/values-fi/strings.xml @@ -68,7 +68,7 @@ Kutsu käyttäjältä %s Huonekutsu %1$s ja %2$s - Tyhjä huone + Tyhjä huone diff --git a/matrix-sdk/src/main/res/values-fr/strings.xml b/matrix-sdk/src/main/res/values-fr/strings.xml index 490940e64..e860c6662 100644 --- a/matrix-sdk/src/main/res/values-fr/strings.xml +++ b/matrix-sdk/src/main/res/values-fr/strings.xml @@ -75,7 +75,7 @@ Invitation de %s Invitation au salon - Salon vide + Salon vide %1$s et %2$s diff --git a/matrix-sdk/src/main/res/values-hu/strings.xml b/matrix-sdk/src/main/res/values-hu/strings.xml index ad6919e64..1f544b77b 100644 --- a/matrix-sdk/src/main/res/values-hu/strings.xml +++ b/matrix-sdk/src/main/res/values-hu/strings.xml @@ -75,7 +75,7 @@ %s meghívott Meghívó egy szobába %1$s és %2$s - Üres szoba + Üres szoba %1$s és 1 másik diff --git a/matrix-sdk/src/main/res/values-in/strings.xml b/matrix-sdk/src/main/res/values-in/strings.xml index 0d44c05ce..157b23d40 100644 --- a/matrix-sdk/src/main/res/values-in/strings.xml +++ b/matrix-sdk/src/main/res/values-in/strings.xml @@ -4,7 +4,7 @@ Undangan Ruang %1$s dan %2$s - Ruang kosong + Ruang kosong %1$s dan %2$d yang lain diff --git a/matrix-sdk/src/main/res/values-is/strings.xml b/matrix-sdk/src/main/res/values-is/strings.xml index b1e0c7bdb..f84bfb7bb 100644 --- a/matrix-sdk/src/main/res/values-is/strings.xml +++ b/matrix-sdk/src/main/res/values-is/strings.xml @@ -74,7 +74,7 @@ %1$s og %2$d aðrir - Tóm spjallrás + Tóm spjallrás Boð frá %s diff --git a/matrix-sdk/src/main/res/values-it/strings.xml b/matrix-sdk/src/main/res/values-it/strings.xml index 986e49056..ce6280b59 100644 --- a/matrix-sdk/src/main/res/values-it/strings.xml +++ b/matrix-sdk/src/main/res/values-it/strings.xml @@ -76,7 +76,7 @@ Invito da %s Invito nella stanza %1$s e %2$s - Stanza vuota + Stanza vuota %1$s e 1 altro diff --git a/matrix-sdk/src/main/res/values-ja/strings.xml b/matrix-sdk/src/main/res/values-ja/strings.xml index 8a3567f0a..16d50db28 100644 --- a/matrix-sdk/src/main/res/values-ja/strings.xml +++ b/matrix-sdk/src/main/res/values-ja/strings.xml @@ -3,7 +3,7 @@ %sさんからの招待 部屋への招待 %1$sと%2$s - 空の部屋 + 空の部屋 %1$sと他%2$d名 diff --git a/matrix-sdk/src/main/res/values-lv/strings.xml b/matrix-sdk/src/main/res/values-lv/strings.xml index ecd4056ea..1347f5633 100644 --- a/matrix-sdk/src/main/res/values-lv/strings.xml +++ b/matrix-sdk/src/main/res/values-lv/strings.xml @@ -66,7 +66,7 @@ Uzaicinājums no %s Uzaicinājums uz istabu %1$s un %2$s - Tukša istaba + Tukša istaba %1$s un 1 cits diff --git a/matrix-sdk/src/main/res/values-nl/strings.xml b/matrix-sdk/src/main/res/values-nl/strings.xml index 125d19100..8b04aab88 100644 --- a/matrix-sdk/src/main/res/values-nl/strings.xml +++ b/matrix-sdk/src/main/res/values-nl/strings.xml @@ -85,7 +85,7 @@ Uitnodiging van %s Ruimte uitnodiging %1$s en %2$s - Lege ruimte + Lege ruimte %1$s en 1 andere diff --git a/matrix-sdk/src/main/res/values-nn/strings.xml b/matrix-sdk/src/main/res/values-nn/strings.xml index 51701e82f..8f6810e1b 100644 --- a/matrix-sdk/src/main/res/values-nn/strings.xml +++ b/matrix-sdk/src/main/res/values-nn/strings.xml @@ -80,6 +80,6 @@ %1$s og %2$d til - Tomt rom + Tomt rom diff --git a/matrix-sdk/src/main/res/values-pl/strings.xml b/matrix-sdk/src/main/res/values-pl/strings.xml index cbfc89adc..4f5357383 100644 --- a/matrix-sdk/src/main/res/values-pl/strings.xml +++ b/matrix-sdk/src/main/res/values-pl/strings.xml @@ -43,7 +43,7 @@ Zaproszenie od %s Zaproszenie do pokoju %1$s i %2$s - Pusty pokój + Pusty pokój %1$s i jeden inny diff --git a/matrix-sdk/src/main/res/values-pt-rBR/strings.xml b/matrix-sdk/src/main/res/values-pt-rBR/strings.xml index dfd7c9cff..3cee21226 100644 --- a/matrix-sdk/src/main/res/values-pt-rBR/strings.xml +++ b/matrix-sdk/src/main/res/values-pt-rBR/strings.xml @@ -88,7 +88,7 @@ Convite de %s Convite para sala %1$s e %2$s - Sala vazia + Sala vazia %1$s e 1 outra/o diff --git a/matrix-sdk/src/main/res/values-pt/strings.xml b/matrix-sdk/src/main/res/values-pt/strings.xml index 6552a6497..5478df56d 100644 --- a/matrix-sdk/src/main/res/values-pt/strings.xml +++ b/matrix-sdk/src/main/res/values-pt/strings.xml @@ -78,7 +78,7 @@ Convite de %s Convite para sala %1$s e %2$s - Sala vazia + Sala vazia diff --git a/matrix-sdk/src/main/res/values-ru/strings.xml b/matrix-sdk/src/main/res/values-ru/strings.xml index f4004a886..d71ce25be 100644 --- a/matrix-sdk/src/main/res/values-ru/strings.xml +++ b/matrix-sdk/src/main/res/values-ru/strings.xml @@ -87,7 +87,7 @@ Приглашение от %s Приглашение в комнату %1$s и %2$s - Пустая комната + Пустая комната %1$s и 1 другой diff --git a/matrix-sdk/src/main/res/values-sk/strings.xml b/matrix-sdk/src/main/res/values-sk/strings.xml index dcaf5e91f..2e3307eaa 100644 --- a/matrix-sdk/src/main/res/values-sk/strings.xml +++ b/matrix-sdk/src/main/res/values-sk/strings.xml @@ -75,7 +75,7 @@ Pozvanie od %s Pozvanie do miestnosti %1$s a %2$s - Prázdna miestnosť + Prázdna miestnosť %1$s a 1 ďalší diff --git a/matrix-sdk/src/main/res/values-te/strings.xml b/matrix-sdk/src/main/res/values-te/strings.xml index eb8b274bc..57527ea63 100644 --- a/matrix-sdk/src/main/res/values-te/strings.xml +++ b/matrix-sdk/src/main/res/values-te/strings.xml @@ -67,7 +67,7 @@ %s నుండి ఆహ్వానించు %1$s మరియు %2$s గదికి ఆహ్వానం - ఖాళీ గది + ఖాళీ గది diff --git a/matrix-sdk/src/main/res/values-uk/strings.xml b/matrix-sdk/src/main/res/values-uk/strings.xml index fe49cc1f3..18d89e4f3 100644 --- a/matrix-sdk/src/main/res/values-uk/strings.xml +++ b/matrix-sdk/src/main/res/values-uk/strings.xml @@ -11,7 +11,7 @@ Запрошення від %s Запрошення до кімнати %1$s і %2$s - Порожня кімната + Порожня кімната diff --git a/matrix-sdk/src/main/res/values-zh-rCN/strings.xml b/matrix-sdk/src/main/res/values-zh-rCN/strings.xml index 8bf9a10c9..b0befebab 100644 --- a/matrix-sdk/src/main/res/values-zh-rCN/strings.xml +++ b/matrix-sdk/src/main/res/values-zh-rCN/strings.xml @@ -72,7 +72,7 @@ 回复 - 空聊天室 + 空聊天室 来自 %s 的邀请 聊天室邀请 %1$s 和 %2$s diff --git a/matrix-sdk/src/main/res/values-zh-rTW/strings.xml b/matrix-sdk/src/main/res/values-zh-rTW/strings.xml index a47cd9a1d..38b497598 100644 --- a/matrix-sdk/src/main/res/values-zh-rTW/strings.xml +++ b/matrix-sdk/src/main/res/values-zh-rTW/strings.xml @@ -76,7 +76,7 @@ 聊天室邀請 %1$s 和 %2$s - 空聊天室 + 空聊天室 %1$s 和 和其他 %2$d 個人 diff --git a/matrix-sdk/src/main/res/values/strings.xml b/matrix-sdk/src/main/res/values/strings.xml index c4a9a137f..1098d54e5 100644 --- a/matrix-sdk/src/main/res/values/strings.xml +++ b/matrix-sdk/src/main/res/values/strings.xml @@ -94,6 +94,6 @@ %1$s and %2$d others - Empty room + Empty room From c4d2cb150912a141fb0727ceab18101c83806ab0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 13:36:14 +0200 Subject: [PATCH 46/79] Room display name is now computed by the Matrix SDK --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index a6f92a87a..6ec2a9dcb 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,6 +6,7 @@ Features: Improvements: - Improve certificate pinning management for HomeServerConnectionConfig. + - Room display name is now computed by the Matrix SDK Bugfix: - From bb24eecad422d15809e204cc58122f9813de5cfd Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 13:45:26 +0200 Subject: [PATCH 47/79] Rename class --- ...NameTest.java => RoomDisplayNameHandlerTest.java} | 2 +- .../main/java/org/matrix/androidsdk/data/Room.java | 8 ++++---- .../{RoomName.java => RoomDisplayNameHandler.java} | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) rename matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/{RoomNameTest.java => RoomDisplayNameHandlerTest.java} (99%) rename matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/{RoomName.java => RoomDisplayNameHandler.java} (94%) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandlerTest.java similarity index 99% rename from matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java rename to matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandlerTest.java index 63cf327fa..b2ca3fb1b 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomNameTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandlerTest.java @@ -37,7 +37,7 @@ import java.util.ArrayList; @FixMethodOrder(MethodSorters.JVM) -public class RoomNameTest { +public class RoomDisplayNameHandlerTest { @Test public void RoomName_getRoomDisplayName_LL_emptyRoom() { diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java index acbe26ec1..38917b9fc 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java @@ -42,7 +42,7 @@ import org.matrix.androidsdk.call.MXCallsManager; import org.matrix.androidsdk.crypto.MXCryptoError; import org.matrix.androidsdk.crypto.data.MXEncryptEventContentResult; -import org.matrix.androidsdk.data.room.RoomName; +import org.matrix.androidsdk.data.room.RoomDisplayNameHandler; import org.matrix.androidsdk.data.store.IMXStore; import org.matrix.androidsdk.data.timeline.EventTimeline; import org.matrix.androidsdk.data.timeline.EventTimelineFactory; @@ -137,7 +137,7 @@ public class Room { private boolean mIsLeft; // Class to compute room name - private final RoomName mRoomName; + private final RoomDisplayNameHandler mRoomDisplayNameHandler; /** * Constructor @@ -152,7 +152,7 @@ public Room(@NonNull final MXDataHandler dataHandler, @NonNull final IMXStore st mStore = store; mMyUserId = mDataHandler.getUserId(); mTimeline = EventTimelineFactory.liveTimeline(mDataHandler, this, roomId); - mRoomName = new RoomName(this); + mRoomDisplayNameHandler = new RoomDisplayNameHandler(this); } /** @@ -551,7 +551,7 @@ public void run() { * @return the computed room display name */ public String getRoomDisplayName(Context context) { - return mRoomName.getRoomDisplayName(context); + return mRoomDisplayNameHandler.handle(context); } public String getTopic() { diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java similarity index 94% rename from matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java rename to matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java index fe11a8202..8a4794e54 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomName.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java @@ -32,19 +32,19 @@ import java.util.List; /** - * This class helps to compute a room name + * This class helps to compute a room display name */ -public class RoomName { +public class RoomDisplayNameHandler { - private static final String LOG_TAG = RoomName.class.getSimpleName(); + private static final String LOG_TAG = RoomDisplayNameHandler.class.getSimpleName(); private final Room mRoom; - public RoomName(Room room) { + public RoomDisplayNameHandler(Room room) { mRoom = room; } - public String getRoomDisplayName(Context context) { + public String handle(Context context) { try { // this algorithm is the one defined in // https://github.com/matrix-org/matrix-js-sdk/blob/develop/lib/models/room.js#L617 @@ -152,7 +152,7 @@ public int compare(RoomMember m1, RoomMember m2) { return displayName; } catch (Exception e) { - Log.e(LOG_TAG, "## getRoomDisplayName() failed " + e.getMessage(), e); + Log.e(LOG_TAG, "## Computing room display name failed " + e.getMessage(), e); } return mRoom.getRoomId(); From bda01e9b051ec0aa74da935df388cbb3ef3a9778 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 13:55:17 +0200 Subject: [PATCH 48/79] Search the current user in case of room invitation --- .../data/room/RoomDisplayNameHandler.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java index 8a4794e54..19ea5de1f 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java @@ -113,13 +113,20 @@ public int compare(RoomMember m1, RoomMember m2) { if (mRoom.isInvited()) { if (othersActiveMembers.size() == 1) { - // this is current user - RoomMember member = activeMembers.get(0); + // Search the current user + RoomMember currentUser = activeMembers.get(0); - if (TextUtils.equals(member.membership, RoomMember.MEMBERSHIP_INVITE)) { - if (!TextUtils.isEmpty(member.mSender)) { + for (RoomMember roomMember : activeMembers) { + if (roomMember.getUserId().equals(mRoom.getDataHandler().getUserId())) { + currentUser = roomMember; + break; + } + } + + if (TextUtils.equals(currentUser.membership, RoomMember.MEMBERSHIP_INVITE)) { + if (!TextUtils.isEmpty(currentUser.mSender)) { // extract who invited us to the room - displayName = context.getString(R.string.room_displayname_invite_from, roomState.getMemberName(member.mSender)); + displayName = context.getString(R.string.room_displayname_invite_from, roomState.getMemberName(currentUser.mSender)); } else { displayName = context.getString(R.string.room_displayname_room_invite); } From c233e9ca4aab7c61cbdcecae2fb06cc6df782be1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 16:51:45 +0200 Subject: [PATCH 49/79] Add EventDisplayTest with 2 simple tests and a problematic one --- .../androidsdk/util/EventDisplayTest.java | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java new file mode 100644 index 000000000..e99e5e08e --- /dev/null +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java @@ -0,0 +1,113 @@ +/* + * Copyright 2018 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.util; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.text.SpannableStringBuilder; + +import com.google.gson.JsonObject; + +import org.junit.Assert; +import org.junit.Test; +import org.matrix.androidsdk.rest.model.Event; +import org.matrix.androidsdk.rest.model.message.Message; + +public class EventDisplayTest { + + @Test + public void EventDisplay_message_Simple_text() { + Context context = InstrumentationRegistry.getContext(); + + Event event = new Event(); + event.type = Event.EVENT_TYPE_MESSAGE; + + event.content = new JsonObject(); + ((JsonObject) event.content).addProperty("body", "message"); + + EventDisplay eventDisplay = new EventDisplay(context, event, null); + + CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + + Assert.assertTrue(textualDisplay instanceof String); + Assert.assertEquals("message", eventDisplay.getTextualDisplay()); + } + + @Test + public void EventDisplay_formattedMessage_Simple_text() { + EventDisplay eventDisplay = createEventDisplayWithFormattedBody("message"); + + CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + + Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); + Assert.assertEquals("message", textualDisplay.toString()); + } + + @Test + public void EventDisplay_formattedMessage_italic_text() { + EventDisplay eventDisplay = createEventDisplayWithFormattedBody("italic"); + + CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + + Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); + Assert.assertEquals("italic", textualDisplay.toString()); + } + + @Test + public void EventDisplay_formattedMessage_bold_text() { + EventDisplay eventDisplay = createEventDisplayWithFormattedBody("bold"); + + CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + + Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); + Assert.assertEquals("bold", textualDisplay.toString()); + } + + /** + * This test check a strange behavior we have: current result is "lis" + */ + @Test + public void EventDisplay_formattedMessage_li_text() { + EventDisplay eventDisplay = createEventDisplayWithFormattedBody("
  1. list
"); + + CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + + Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); + + Assert.assertEquals("list", textualDisplay.toString()); + } + + /* ========================================================================================== + * Private + * ========================================================================================== */ + + private EventDisplay createEventDisplayWithFormattedBody(String formattedBody) { + Context context = InstrumentationRegistry.getContext(); + + Event event = new Event(); + event.type = Event.EVENT_TYPE_MESSAGE; + + event.content = new JsonObject(); + ((JsonObject) event.content).addProperty("format", Message.FORMAT_MATRIX_HTML); + ((JsonObject) event.content).addProperty("formatted_body", formattedBody); + + EventDisplay eventDisplay = new EventDisplay(context, event, null); + + return eventDisplay; + } + +} From ffeeccc087907d0f2f1adc1010cb0374f28e5bb1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 20:55:52 +0200 Subject: [PATCH 50/79] Fix issue of character that disappear --- .../java/org/matrix/androidsdk/util/EventDisplayTest.java | 4 +++- .../main/java/org/matrix/androidsdk/util/EventDisplay.java | 5 ++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java index e99e5e08e..0e4385676 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java @@ -24,6 +24,7 @@ import org.junit.Assert; import org.junit.Test; +import org.matrix.androidsdk.interfaces.HtmlToolbox; import org.matrix.androidsdk.rest.model.Event; import org.matrix.androidsdk.rest.model.message.Message; @@ -78,7 +79,8 @@ public void EventDisplay_formattedMessage_bold_text() { } /** - * This test check a strange behavior we have: current result is "lis" + * This test check list item. It also check the trimming which has been added at the end of + * {@link EventDisplay#getFormattedMessage(Context, JsonObject, HtmlToolbox)} */ @Test public void EventDisplay_formattedMessage_li_text() { diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java index 49c425546..0be5d41ee 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java @@ -610,11 +610,10 @@ private CharSequence getFormattedMessage(@NonNull final Context context, // fromHtml formats quotes (> character) with two newlines at the end // remove any newlines at the end of the CharSequence while (text.charAt(text.length() - 1) == '\n') { - text = text.subSequence(0, text.length() - 2); + text = text.subSequence(0, text.length() - 1); } } } return text; } - -} \ No newline at end of file +} From 368eeacbadbadf37f3953cc4ce9b4d6e55113f58 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 21:10:35 +0200 Subject: [PATCH 51/79] Add test for blockquotes --- .../androidsdk/util/EventDisplayTest.java | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java index 0e4385676..d19490de5 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java @@ -93,6 +93,37 @@ public void EventDisplay_formattedMessage_li_text() { Assert.assertEquals("list", textualDisplay.toString()); } + /** + * Test blockquote. It also check the trimming which has been added at the end of + * {@link EventDisplay#getFormattedMessage(Context, JsonObject, HtmlToolbox)} + */ + @Test + public void EventDisplay_formattedMessage_blockquote_text() { + EventDisplay eventDisplay = createEventDisplayWithFormattedBody("
blockquote
"); + + CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + + Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); + + Assert.assertEquals("blockquote", textualDisplay.toString()); + } + + /** + * Test blockquote with text + */ + @Test + public void EventDisplay_formattedMessage_blockquoteWithText_text() { + EventDisplay eventDisplay = createEventDisplayWithFormattedBody("
blockquote
message"); + + CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + + Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); + + Assert.assertEquals("blockquote\n\nmessage", textualDisplay.toString()); + } + + // TODO Test other message type + /* ========================================================================================== * Private * ========================================================================================== */ @@ -107,9 +138,7 @@ private EventDisplay createEventDisplayWithFormattedBody(String formattedBody) { ((JsonObject) event.content).addProperty("format", Message.FORMAT_MATRIX_HTML); ((JsonObject) event.content).addProperty("formatted_body", formattedBody); - EventDisplay eventDisplay = new EventDisplay(context, event, null); - - return eventDisplay; + return new EventDisplay(context, event, null); } } From 8d7dcf183f427f62932ab03123f7507159f93854 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 22:45:41 +0200 Subject: [PATCH 52/79] Add test for list with several items --- .../matrix/androidsdk/util/EventDisplayTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java index d19490de5..1e6b38e0e 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java @@ -93,6 +93,20 @@ public void EventDisplay_formattedMessage_li_text() { Assert.assertEquals("list", textualDisplay.toString()); } + /** + * This test check list with several items + */ + @Test + public void EventDisplay_formattedMessage_lili_text() { + EventDisplay eventDisplay = createEventDisplayWithFormattedBody("
  1. list
  2. item
"); + + CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + + Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); + + Assert.assertEquals("list\nitem", textualDisplay.toString()); + } + /** * Test blockquote. It also check the trimming which has been added at the end of * {@link EventDisplay#getFormattedMessage(Context, JsonObject, HtmlToolbox)} From 493e9e58afdf2451707f4e7c82314f9788023f4f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 09:48:33 +0200 Subject: [PATCH 53/79] Refactor algorithm after Giom Review --- .../data/room/RoomDisplayNameHandler.java | 36 ++++++------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java index 19ea5de1f..50319c247 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java @@ -32,7 +32,7 @@ import java.util.List; /** - * This class helps to compute a room display name + * This class computes room display name */ public class RoomDisplayNameHandler { @@ -68,8 +68,9 @@ public String handle(Context context) { return roomState.aliases.get(0); } + // List of active members, current user excluded List othersActiveMembers = new ArrayList<>(); - List activeMembers = new ArrayList<>(); + RoomMember currentUser = null; int nbOfOtherMembers; @@ -90,10 +91,11 @@ public String handle(Context context) { for (RoomMember member : members) { if (!TextUtils.equals(member.membership, RoomMember.MEMBERSHIP_LEAVE)) { - if (!TextUtils.equals(member.getUserId(), mRoom.getDataHandler().getUserId())) { + if (TextUtils.equals(member.getUserId(), mRoom.getDataHandler().getUserId())) { + currentUser = member; + } else { othersActiveMembers.add(member); } - activeMembers.add(member); } } @@ -112,27 +114,11 @@ public int compare(RoomMember m1, RoomMember m2) { String displayName; if (mRoom.isInvited()) { - if (othersActiveMembers.size() == 1) { - // Search the current user - RoomMember currentUser = activeMembers.get(0); - - for (RoomMember roomMember : activeMembers) { - if (roomMember.getUserId().equals(mRoom.getDataHandler().getUserId())) { - currentUser = roomMember; - break; - } - } - - if (TextUtils.equals(currentUser.membership, RoomMember.MEMBERSHIP_INVITE)) { - if (!TextUtils.isEmpty(currentUser.mSender)) { - // extract who invited us to the room - displayName = context.getString(R.string.room_displayname_invite_from, roomState.getMemberName(currentUser.mSender)); - } else { - displayName = context.getString(R.string.room_displayname_room_invite); - } - } else { - displayName = context.getString(R.string.room_displayname_room_invite); - } + if (currentUser != null + && !othersActiveMembers.isEmpty() + && !TextUtils.isEmpty(currentUser.mSender)) { + // extract who invited us to the room + displayName = context.getString(R.string.room_displayname_invite_from, roomState.getMemberName(currentUser.mSender)); } else { displayName = context.getString(R.string.room_displayname_room_invite); } From 0b17402f0c19ffae84ebdec03d5cbcc061ee04bf Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 09:49:27 +0200 Subject: [PATCH 54/79] Avoid creating comparators --- .../androidsdk/data/comparator/Comparators.java | 8 ++++++-- .../androidsdk/data/room/RoomDisplayNameHandler.java | 11 ++--------- .../org/matrix/androidsdk/rest/model/RoomMember.java | 8 +++++++- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/comparator/Comparators.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/comparator/Comparators.java index 19c306c14..cf61e943d 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/comparator/Comparators.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/comparator/Comparators.java @@ -22,7 +22,9 @@ public class Comparators { - // comparator to sort from the oldest to the latest. + /** + * Comparator to sort DatedObjects from the oldest to the latest. + */ public static final Comparator ascComparator = new Comparator() { @Override public int compare(DatedObject datedObject1, DatedObject datedObject2) { @@ -30,7 +32,9 @@ public int compare(DatedObject datedObject1, DatedObject datedObject2) { } }; - // comparator to sort from the latest to the oldest. + /** + * Comparator to sort DatedObjects from the latest to the oldest. + */ public static final Comparator descComparator = new Comparator() { @Override public int compare(DatedObject datedObject1, DatedObject datedObject2) { diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java index 50319c247..5069f7de0 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java @@ -22,13 +22,13 @@ import org.matrix.androidsdk.R; import org.matrix.androidsdk.data.Room; import org.matrix.androidsdk.data.RoomState; +import org.matrix.androidsdk.data.comparator.Comparators; import org.matrix.androidsdk.rest.model.RoomMember; import org.matrix.androidsdk.util.Log; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.List; /** @@ -99,14 +99,7 @@ public String handle(Context context) { } } - Collections.sort(othersActiveMembers, new Comparator() { - @Override - public int compare(RoomMember m1, RoomMember m2) { - long diff = m1.getOriginServerTs() - m2.getOriginServerTs(); - - return (diff == 0) ? 0 : ((diff < 0) ? -1 : +1); - } - }); + Collections.sort(othersActiveMembers, Comparators.ascComparator); } nbOfOtherMembers = othersActiveMembers.size(); diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomMember.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomMember.java index f6c2f7f91..792b3b1a8 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomMember.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomMember.java @@ -21,6 +21,7 @@ import com.google.gson.annotations.SerializedName; +import org.matrix.androidsdk.interfaces.DatedObject; import org.matrix.androidsdk.util.ContentManager; import org.matrix.androidsdk.util.Log; @@ -33,7 +34,7 @@ /** * Class representing a room member: a user with membership information. */ -public class RoomMember implements Externalizable { +public class RoomMember implements Externalizable, DatedObject { private static final String LOG_TAG = RoomMember.class.getSimpleName(); public static final String MEMBERSHIP_JOIN = "join"; @@ -67,6 +68,11 @@ public class RoomMember implements Externalizable { // user which banned or kicked this member public String mSender; + @Override + public long getDate() { + return mOriginServerTs; + } + @Override public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException { if (input.readBoolean()) { From fff718328edce5f18b72b8c70634fa9a1e8152dc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 10:06:54 +0200 Subject: [PATCH 55/79] Better names --- ...rTest.java => RoomDisplayNameResolverTest.java} | 2 +- .../main/java/org/matrix/androidsdk/data/Room.java | 10 +++++----- ...meHandler.java => RoomDisplayNameResolver.java} | 14 ++++++++++---- 3 files changed, 16 insertions(+), 10 deletions(-) rename matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/{RoomDisplayNameHandlerTest.java => RoomDisplayNameResolverTest.java} (99%) rename matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/{RoomDisplayNameHandler.java => RoomDisplayNameResolver.java} (94%) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandlerTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java similarity index 99% rename from matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandlerTest.java rename to matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java index b2ca3fb1b..e95f8d426 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandlerTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java @@ -37,7 +37,7 @@ import java.util.ArrayList; @FixMethodOrder(MethodSorters.JVM) -public class RoomDisplayNameHandlerTest { +public class RoomDisplayNameResolverTest { @Test public void RoomName_getRoomDisplayName_LL_emptyRoom() { diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java index 38917b9fc..a52bd7459 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java @@ -42,7 +42,7 @@ import org.matrix.androidsdk.call.MXCallsManager; import org.matrix.androidsdk.crypto.MXCryptoError; import org.matrix.androidsdk.crypto.data.MXEncryptEventContentResult; -import org.matrix.androidsdk.data.room.RoomDisplayNameHandler; +import org.matrix.androidsdk.data.room.RoomDisplayNameResolver; import org.matrix.androidsdk.data.store.IMXStore; import org.matrix.androidsdk.data.timeline.EventTimeline; import org.matrix.androidsdk.data.timeline.EventTimelineFactory; @@ -136,8 +136,8 @@ public class Room { // true when the current room is a left one private boolean mIsLeft; - // Class to compute room name - private final RoomDisplayNameHandler mRoomDisplayNameHandler; + // Class to compute room display name + private final RoomDisplayNameResolver mRoomDisplayNameResolver; /** * Constructor @@ -152,7 +152,7 @@ public Room(@NonNull final MXDataHandler dataHandler, @NonNull final IMXStore st mStore = store; mMyUserId = mDataHandler.getUserId(); mTimeline = EventTimelineFactory.liveTimeline(mDataHandler, this, roomId); - mRoomDisplayNameHandler = new RoomDisplayNameHandler(this); + mRoomDisplayNameResolver = new RoomDisplayNameResolver(this); } /** @@ -551,7 +551,7 @@ public void run() { * @return the computed room display name */ public String getRoomDisplayName(Context context) { - return mRoomDisplayNameHandler.handle(context); + return mRoomDisplayNameResolver.resolve(context); } public String getTopic() { diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolver.java similarity index 94% rename from matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java rename to matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolver.java index 5069f7de0..394614beb 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameHandler.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolver.java @@ -34,17 +34,23 @@ /** * This class computes room display name */ -public class RoomDisplayNameHandler { +public class RoomDisplayNameResolver { - private static final String LOG_TAG = RoomDisplayNameHandler.class.getSimpleName(); + private static final String LOG_TAG = RoomDisplayNameResolver.class.getSimpleName(); private final Room mRoom; - public RoomDisplayNameHandler(Room room) { + public RoomDisplayNameResolver(Room room) { mRoom = room; } - public String handle(Context context) { + /** + * Compute the room display name + * + * @param context + * @return the room display name + */ + public String resolve(Context context) { try { // this algorithm is the one defined in // https://github.com/matrix-org/matrix-js-sdk/blob/develop/lib/models/room.js#L617 From 62099f54177fd9c2ecb8615884363a2ee3200a00 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 10:59:44 +0200 Subject: [PATCH 56/79] Fix Exception if text is empty --- .../src/main/java/org/matrix/androidsdk/util/EventDisplay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java index 0be5d41ee..03341faae 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java @@ -609,7 +609,7 @@ private CharSequence getFormattedMessage(@NonNull final Context context, } // fromHtml formats quotes (> character) with two newlines at the end // remove any newlines at the end of the CharSequence - while (text.charAt(text.length() - 1) == '\n') { + while (text.length() > 0 && text.charAt(text.length() - 1) == '\n') { text = text.subSequence(0, text.length() - 1); } } From 951ea35b54b4324e815c911d7aff6d05d9796ce6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 14:44:05 +0200 Subject: [PATCH 57/79] Move method to compute room avatar to a dedicated class and add unit test --- .../data/room/RoomAvatarResolverTest.java | 259 ++++++++++++++++++ .../java/org/matrix/androidsdk/data/Room.java | 25 +- .../data/room/RoomAvatarResolver.java | 59 ++++ 3 files changed, 326 insertions(+), 17 deletions(-) create mode 100644 matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java create mode 100644 matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java new file mode 100644 index 000000000..54bb660da --- /dev/null +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java @@ -0,0 +1,259 @@ +/* + * Copyright 2018 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.data.room; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import junit.framework.Assert; + +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; +import org.matrix.androidsdk.MXDataHandler; +import org.matrix.androidsdk.data.Room; +import org.matrix.androidsdk.data.RoomState; +import org.matrix.androidsdk.data.RoomSummary; +import org.matrix.androidsdk.data.store.IMXStore; +import org.matrix.androidsdk.data.store.MXMemoryStore; +import org.matrix.androidsdk.rest.model.RoomMember; +import org.matrix.androidsdk.rest.model.login.Credentials; +import org.matrix.androidsdk.rest.model.sync.RoomSyncSummary; + +import java.util.ArrayList; + +@FixMethodOrder(MethodSorters.JVM) +public class RoomAvatarResolverTest { + + @Test + public void RoomName_getRoomAvatar_LL_avatar() { + RoomName_getRoomAvatar_avatar(true); + } + + @Test + public void RoomName_getRoomAvatar_noLL_avatar() { + RoomName_getRoomAvatar_avatar(false); + } + + private void RoomName_getRoomAvatar_avatar(boolean withLazyLoading) { + Context context = InstrumentationRegistry.getContext(); + + // It does not depend on the number of users + for (int i = 0; i < 10; i++) { + Room room = createRoom(context, withLazyLoading, i, false); + + room.getState().avatar_url = "mxc://avatar_url"; + Assert.assertEquals("mxc://avatar_url", room.getAvatarUrl()); + } + } + + /* + @Test + public void RoomName_getRoomDisplayName_noLL_user() { + RoomName_getRoomDisplayName_user(false); + } + + @Test + public void RoomName_getRoomDisplayName_LL_user() { + RoomName_getRoomDisplayName_user(true); + } + + private void RoomName_getRoomDisplayName_user(boolean withLazyLoading) { + Context context = InstrumentationRegistry.getContext(); + + Room room; + + // Only me in the room + room = createRoom(context, withLazyLoading, 1, false); + Assert.assertEquals("Empty room", room.getRoomDisplayName(context)); + + // One other user in the room + room = createRoom(context, withLazyLoading, 2, false); + Assert.assertEquals("UserName_2", room.getRoomDisplayName(context)); + + // 2 other users in the room + room = createRoom(context, withLazyLoading, 3, false); + Assert.assertEquals("UserName_2 and UserName_3", room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 4, false); + Assert.assertEquals("UserName_2 and 3 others", room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 5, false); + Assert.assertEquals("UserName_2 and 4 others", room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 10, false); + Assert.assertEquals("UserName_2 and 9 others", room.getRoomDisplayName(context)); + } + + @Test + public void RoomName_getRoomDisplayName_noLL_invitation() { + RoomName_getRoomDisplayName_invitation(false); + } + + @Test + public void RoomName_getRoomDisplayName_LL_invitation() { + RoomName_getRoomDisplayName_invitation(true); + } + + private void RoomName_getRoomDisplayName_invitation(boolean withLazyLoading) { + Context context = InstrumentationRegistry.getContext(); + + Room room; + + // Only me in the room + room = createRoom(context, withLazyLoading, 1, true); + Assert.assertEquals("Room Invite", room.getRoomDisplayName(context)); + + // One other user in the room + room = createRoom(context, withLazyLoading, 2, true); + Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); + + // 2 other users in the room + room = createRoom(context, withLazyLoading, 3, true); + Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 4, true); + Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 5, true); + Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); + + room = createRoom(context, withLazyLoading, 10, true); + Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); + } +*/ + + /* ========================================================================================== + * Private + * ========================================================================================== */ + + /** + * Create a room, with or without lazy loading and with x number of room members + * First room member will always be the current user + * + * @param context + * @param withLazyLoading + * @param nbOfMembers + * @param amIInvited + * @return + */ + private Room createRoom(Context context, boolean withLazyLoading, int nbOfMembers, boolean amIInvited) { + Credentials credentials = new Credentials(); + credentials.userId = getMyUserId(); + IMXStore store = new MXMemoryStore(credentials, context); + + MXDataHandler mxDataHandler = new MXDataHandler(store, credentials); + mxDataHandler.setLazyLoadingEnabled(withLazyLoading); + + Room room = new Room(mxDataHandler, store, getRoomId()); + + store.storeRoom(room); + + RoomSummary roomSummary = new RoomSummary(); + roomSummary.setRoomId(getRoomId()); + store.storeSummary(roomSummary); + + if (amIInvited) { + roomSummary.setIsInvited(); + } else { + roomSummary.setIsJoined(); + } + + if (withLazyLoading && !amIInvited) { + // Populate room summary + RoomSyncSummary roomSyncSummary = new RoomSyncSummary(); + + roomSyncSummary.joinedMembersCount = nbOfMembers; + roomSyncSummary.invitedMembersCount = 0; + + // heroes + // Heroes does not include current user + if (nbOfMembers >= 2) { + roomSyncSummary.heroes = new ArrayList<>(); + for (int i = 2; i <= Math.min(6, nbOfMembers); i++) { + roomSyncSummary.heroes.add(getUserId(i)); + } + } + + roomSummary.setRoomSyncSummary(roomSyncSummary); + } + + if (amIInvited) { + // Maximum 2 members will be sent by the sync + initMembers(room.getState(), Math.min(2, nbOfMembers), true); + + // Pass the sender name (the inviter id) + if (nbOfMembers >= 2) { + room.getMember(getMyUserId()).mSender = getUserId(2); + } + } else { + initMembers(room.getState(), nbOfMembers, false); + } + + return room; + } + + private void initMembers(RoomState roomState, int nbOfMembers, boolean amIInvited) { + for (int i = 1; i <= nbOfMembers; i++) { + roomState.setMember(getUserId(i), createRoomMember(i, amIInvited)); + } + } + + private RoomMember createRoomMember(int i, boolean amIInvited) { + RoomMember roomMember = new RoomMember(); + + roomMember.setUserId(getUserId(i)); + roomMember.displayname = getUserName(i); + if (i == 1 && amIInvited) { + roomMember.membership = RoomMember.MEMBERSHIP_INVITE; + } else { + roomMember.membership = RoomMember.MEMBERSHIP_JOIN; + } + // Add a TS because they will be ordered + roomMember.setOriginServerTs(i); + + return roomMember; + } + + private String getMyUserId() { + return "@MyUserId"; + } + + private String getMyUserName() { + return "MyUserName"; + } + + private String getRoomId() { + return "!RoomId"; + } + + private String getUserId(int i) { + if (i == 1) { + return getMyUserId(); + } + + return "UserId_" + i; + } + + private String getUserName(int i) { + if (i == 1) { + return getMyUserName(); + } + + return "UserName_" + i; + } +} diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java index a52bd7459..70688ddab 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/Room.java @@ -42,6 +42,7 @@ import org.matrix.androidsdk.call.MXCallsManager; import org.matrix.androidsdk.crypto.MXCryptoError; import org.matrix.androidsdk.crypto.data.MXEncryptEventContentResult; +import org.matrix.androidsdk.data.room.RoomAvatarResolver; import org.matrix.androidsdk.data.room.RoomDisplayNameResolver; import org.matrix.androidsdk.data.store.IMXStore; import org.matrix.androidsdk.data.timeline.EventTimeline; @@ -139,6 +140,9 @@ public class Room { // Class to compute room display name private final RoomDisplayNameResolver mRoomDisplayNameResolver; + // Class to compute room avatar + private final RoomAvatarResolver mRoomAvatarResolver; + /** * Constructor * FIXME All this @NonNull annotation must be also added to the class members and getters @@ -153,6 +157,7 @@ public Room(@NonNull final MXDataHandler dataHandler, @NonNull final IMXStore st mMyUserId = mDataHandler.getUserId(); mTimeline = EventTimelineFactory.liveTimeline(mDataHandler, this, roomId); mRoomDisplayNameResolver = new RoomDisplayNameResolver(this); + mRoomAvatarResolver = new RoomAvatarResolver(this); } /** @@ -987,26 +992,12 @@ public void onSuccess(Void info) { */ @Nullable public String getAvatarUrl() { - String res = getState().getAvatarUrl(); - - // detect if it is a room with no more than 2 members (i.e. an alone or a 1:1 chat) - if (null == res) { - if (getNumberOfMembers() == 1 && !getState().getLoadedMembers().isEmpty()) { - res = getState().getLoadedMembers().get(0).getAvatarUrl(); - } else if (getNumberOfMembers() == 2 && getState().getLoadedMembers().size() > 1) { - RoomMember m1 = getState().getLoadedMembers().get(0); - RoomMember m2 = getState().getLoadedMembers().get(1); - - res = TextUtils.equals(m1.getUserId(), mMyUserId) ? m2.getAvatarUrl() : m1.getAvatarUrl(); - } - } - - return res; + return mRoomAvatarResolver.resolve(); } /** - * The call avatar is the same as the room avatar except there are only 2 JOINED members. - * In this case, it returns the avtar of the other joined member. + * The call avatar is the same as the room avatar except when there are only 2 JOINED members. + * In this case, it returns the avatar of the other joined member. * * @return the call avatar URL. */ diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java new file mode 100644 index 000000000..de2a12ff9 --- /dev/null +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java @@ -0,0 +1,59 @@ +/* + * Copyright 2018 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.data.room; + +import android.text.TextUtils; + +import org.matrix.androidsdk.data.Room; +import org.matrix.androidsdk.rest.model.RoomMember; + +/** + * This class computes room avatar + */ +public class RoomAvatarResolver { + + private static final String LOG_TAG = RoomAvatarResolver.class.getSimpleName(); + + private final Room mRoom; + + public RoomAvatarResolver(Room room) { + mRoom = room; + } + + /** + * Compute the room avatar url + * + * @return the room avatar url + */ + public String resolve() { + String res = mRoom.getState().getAvatarUrl(); + + // detect if it is a room with no more than 2 members (i.e. an alone or a 1:1 chat) + if (res == null) { + if (mRoom.getNumberOfMembers() == 1 && !mRoom.getState().getLoadedMembers().isEmpty()) { + res = mRoom.getState().getLoadedMembers().get(0).getAvatarUrl(); + } else if (mRoom.getNumberOfMembers() == 2 && mRoom.getState().getLoadedMembers().size() > 1) { + RoomMember m1 = mRoom.getState().getLoadedMembers().get(0); + RoomMember m2 = mRoom.getState().getLoadedMembers().get(1); + + res = TextUtils.equals(m1.getUserId(), mRoom.getDataHandler().getUserId()) ? m2.getAvatarUrl() : m1.getAvatarUrl(); + } + } + + return res; + } +} From 87eb962b7c3b26c862c38ad2f7a7c1f3436ede5e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 14:50:11 +0200 Subject: [PATCH 58/79] Create helper to factorize code --- .../data/room/RoomAvatarResolverTest.java | 134 +-------------- .../room/RoomDisplayNameResolverTest.java | 158 ++---------------- .../androidsdk/data/room/RoomTestHelper.java | 149 +++++++++++++++++ 3 files changed, 168 insertions(+), 273 deletions(-) create mode 100644 matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomTestHelper.java diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java index 54bb660da..6ae2f6e10 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java @@ -24,21 +24,13 @@ import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; -import org.matrix.androidsdk.MXDataHandler; import org.matrix.androidsdk.data.Room; -import org.matrix.androidsdk.data.RoomState; -import org.matrix.androidsdk.data.RoomSummary; -import org.matrix.androidsdk.data.store.IMXStore; -import org.matrix.androidsdk.data.store.MXMemoryStore; -import org.matrix.androidsdk.rest.model.RoomMember; -import org.matrix.androidsdk.rest.model.login.Credentials; -import org.matrix.androidsdk.rest.model.sync.RoomSyncSummary; - -import java.util.ArrayList; @FixMethodOrder(MethodSorters.JVM) public class RoomAvatarResolverTest { + private RoomTestHelper mRoomTestHelper = new RoomTestHelper(); + @Test public void RoomName_getRoomAvatar_LL_avatar() { RoomName_getRoomAvatar_avatar(true); @@ -54,7 +46,7 @@ private void RoomName_getRoomAvatar_avatar(boolean withLazyLoading) { // It does not depend on the number of users for (int i = 0; i < 10; i++) { - Room room = createRoom(context, withLazyLoading, i, false); + Room room = mRoomTestHelper.createRoom(context, withLazyLoading, i, false); room.getState().avatar_url = "mxc://avatar_url"; Assert.assertEquals("mxc://avatar_url", room.getAvatarUrl()); @@ -136,124 +128,4 @@ private void RoomName_getRoomDisplayName_invitation(boolean withLazyLoading) { Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); } */ - - /* ========================================================================================== - * Private - * ========================================================================================== */ - - /** - * Create a room, with or without lazy loading and with x number of room members - * First room member will always be the current user - * - * @param context - * @param withLazyLoading - * @param nbOfMembers - * @param amIInvited - * @return - */ - private Room createRoom(Context context, boolean withLazyLoading, int nbOfMembers, boolean amIInvited) { - Credentials credentials = new Credentials(); - credentials.userId = getMyUserId(); - IMXStore store = new MXMemoryStore(credentials, context); - - MXDataHandler mxDataHandler = new MXDataHandler(store, credentials); - mxDataHandler.setLazyLoadingEnabled(withLazyLoading); - - Room room = new Room(mxDataHandler, store, getRoomId()); - - store.storeRoom(room); - - RoomSummary roomSummary = new RoomSummary(); - roomSummary.setRoomId(getRoomId()); - store.storeSummary(roomSummary); - - if (amIInvited) { - roomSummary.setIsInvited(); - } else { - roomSummary.setIsJoined(); - } - - if (withLazyLoading && !amIInvited) { - // Populate room summary - RoomSyncSummary roomSyncSummary = new RoomSyncSummary(); - - roomSyncSummary.joinedMembersCount = nbOfMembers; - roomSyncSummary.invitedMembersCount = 0; - - // heroes - // Heroes does not include current user - if (nbOfMembers >= 2) { - roomSyncSummary.heroes = new ArrayList<>(); - for (int i = 2; i <= Math.min(6, nbOfMembers); i++) { - roomSyncSummary.heroes.add(getUserId(i)); - } - } - - roomSummary.setRoomSyncSummary(roomSyncSummary); - } - - if (amIInvited) { - // Maximum 2 members will be sent by the sync - initMembers(room.getState(), Math.min(2, nbOfMembers), true); - - // Pass the sender name (the inviter id) - if (nbOfMembers >= 2) { - room.getMember(getMyUserId()).mSender = getUserId(2); - } - } else { - initMembers(room.getState(), nbOfMembers, false); - } - - return room; - } - - private void initMembers(RoomState roomState, int nbOfMembers, boolean amIInvited) { - for (int i = 1; i <= nbOfMembers; i++) { - roomState.setMember(getUserId(i), createRoomMember(i, amIInvited)); - } - } - - private RoomMember createRoomMember(int i, boolean amIInvited) { - RoomMember roomMember = new RoomMember(); - - roomMember.setUserId(getUserId(i)); - roomMember.displayname = getUserName(i); - if (i == 1 && amIInvited) { - roomMember.membership = RoomMember.MEMBERSHIP_INVITE; - } else { - roomMember.membership = RoomMember.MEMBERSHIP_JOIN; - } - // Add a TS because they will be ordered - roomMember.setOriginServerTs(i); - - return roomMember; - } - - private String getMyUserId() { - return "@MyUserId"; - } - - private String getMyUserName() { - return "MyUserName"; - } - - private String getRoomId() { - return "!RoomId"; - } - - private String getUserId(int i) { - if (i == 1) { - return getMyUserId(); - } - - return "UserId_" + i; - } - - private String getUserName(int i) { - if (i == 1) { - return getMyUserName(); - } - - return "UserName_" + i; - } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java index e95f8d426..35e48ea09 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java @@ -24,21 +24,15 @@ import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; -import org.matrix.androidsdk.MXDataHandler; import org.matrix.androidsdk.data.Room; -import org.matrix.androidsdk.data.RoomState; -import org.matrix.androidsdk.data.RoomSummary; -import org.matrix.androidsdk.data.store.IMXStore; -import org.matrix.androidsdk.data.store.MXMemoryStore; -import org.matrix.androidsdk.rest.model.RoomMember; -import org.matrix.androidsdk.rest.model.login.Credentials; -import org.matrix.androidsdk.rest.model.sync.RoomSyncSummary; import java.util.ArrayList; @FixMethodOrder(MethodSorters.JVM) public class RoomDisplayNameResolverTest { + private RoomTestHelper mRoomTestHelper = new RoomTestHelper(); + @Test public void RoomName_getRoomDisplayName_LL_emptyRoom() { RoomName_getRoomDisplayName_emptyRoom(true); @@ -51,7 +45,7 @@ public void RoomName_getRoomDisplayName_noLL_emptyRoom() { private void RoomName_getRoomDisplayName_emptyRoom(boolean withLazyLoading) { Context context = InstrumentationRegistry.getContext(); - Room room = createRoom(context, withLazyLoading, 0, false); + Room room = mRoomTestHelper.createRoom(context, withLazyLoading, 0, false); Assert.assertEquals("Empty room", room.getRoomDisplayName(context)); } @@ -71,7 +65,7 @@ private void RoomName_getRoomDisplayName_roomName(boolean withLazyLoading) { // It does not depend on the number of users for (int i = 0; i < 10; i++) { - Room room = createRoom(context, withLazyLoading, i, false); + Room room = mRoomTestHelper.createRoom(context, withLazyLoading, i, false); room.getState().aliases = new ArrayList<>(); room.getState().aliases.add("Alias"); @@ -103,24 +97,24 @@ private void RoomName_getRoomDisplayName_user(boolean withLazyLoading) { Room room; // Only me in the room - room = createRoom(context, withLazyLoading, 1, false); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 1, false); Assert.assertEquals("Empty room", room.getRoomDisplayName(context)); // One other user in the room - room = createRoom(context, withLazyLoading, 2, false); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 2, false); Assert.assertEquals("UserName_2", room.getRoomDisplayName(context)); // 2 other users in the room - room = createRoom(context, withLazyLoading, 3, false); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 3, false); Assert.assertEquals("UserName_2 and UserName_3", room.getRoomDisplayName(context)); - room = createRoom(context, withLazyLoading, 4, false); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 4, false); Assert.assertEquals("UserName_2 and 3 others", room.getRoomDisplayName(context)); - room = createRoom(context, withLazyLoading, 5, false); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 5, false); Assert.assertEquals("UserName_2 and 4 others", room.getRoomDisplayName(context)); - room = createRoom(context, withLazyLoading, 10, false); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 10, false); Assert.assertEquals("UserName_2 and 9 others", room.getRoomDisplayName(context)); } @@ -140,144 +134,24 @@ private void RoomName_getRoomDisplayName_invitation(boolean withLazyLoading) { Room room; // Only me in the room - room = createRoom(context, withLazyLoading, 1, true); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 1, true); Assert.assertEquals("Room Invite", room.getRoomDisplayName(context)); // One other user in the room - room = createRoom(context, withLazyLoading, 2, true); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 2, true); Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); // 2 other users in the room - room = createRoom(context, withLazyLoading, 3, true); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 3, true); Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); - room = createRoom(context, withLazyLoading, 4, true); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 4, true); Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); - room = createRoom(context, withLazyLoading, 5, true); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 5, true); Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); - room = createRoom(context, withLazyLoading, 10, true); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 10, true); Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); } - - /* ========================================================================================== - * Private - * ========================================================================================== */ - - /** - * Create a room, with or without lazy loading and with x number of room members - * First room member will always be the current user - * - * @param context - * @param withLazyLoading - * @param nbOfMembers - * @param amIInvited - * @return - */ - private Room createRoom(Context context, boolean withLazyLoading, int nbOfMembers, boolean amIInvited) { - Credentials credentials = new Credentials(); - credentials.userId = getMyUserId(); - IMXStore store = new MXMemoryStore(credentials, context); - - MXDataHandler mxDataHandler = new MXDataHandler(store, credentials); - mxDataHandler.setLazyLoadingEnabled(withLazyLoading); - - Room room = new Room(mxDataHandler, store, getRoomId()); - - store.storeRoom(room); - - RoomSummary roomSummary = new RoomSummary(); - roomSummary.setRoomId(getRoomId()); - store.storeSummary(roomSummary); - - if (amIInvited) { - roomSummary.setIsInvited(); - } else { - roomSummary.setIsJoined(); - } - - if (withLazyLoading && !amIInvited) { - // Populate room summary - RoomSyncSummary roomSyncSummary = new RoomSyncSummary(); - - roomSyncSummary.joinedMembersCount = nbOfMembers; - roomSyncSummary.invitedMembersCount = 0; - - // heroes - // Heroes does not include current user - if (nbOfMembers >= 2) { - roomSyncSummary.heroes = new ArrayList<>(); - for (int i = 2; i <= Math.min(6, nbOfMembers); i++) { - roomSyncSummary.heroes.add(getUserId(i)); - } - } - - roomSummary.setRoomSyncSummary(roomSyncSummary); - } - - if (amIInvited) { - // Maximum 2 members will be sent by the sync - initMembers(room.getState(), Math.min(2, nbOfMembers), true); - - // Pass the sender name (the inviter id) - if (nbOfMembers >= 2) { - room.getMember(getMyUserId()).mSender = getUserId(2); - } - } else { - initMembers(room.getState(), nbOfMembers, false); - } - - return room; - } - - private void initMembers(RoomState roomState, int nbOfMembers, boolean amIInvited) { - for (int i = 1; i <= nbOfMembers; i++) { - roomState.setMember(getUserId(i), createRoomMember(i, amIInvited)); - } - } - - private RoomMember createRoomMember(int i, boolean amIInvited) { - RoomMember roomMember = new RoomMember(); - - roomMember.setUserId(getUserId(i)); - roomMember.displayname = getUserName(i); - if (i == 1 && amIInvited) { - roomMember.membership = RoomMember.MEMBERSHIP_INVITE; - } else { - roomMember.membership = RoomMember.MEMBERSHIP_JOIN; - } - // Add a TS because they will be ordered - roomMember.setOriginServerTs(i); - - return roomMember; - } - - private String getMyUserId() { - return "@MyUserId"; - } - - private String getMyUserName() { - return "MyUserName"; - } - - private String getRoomId() { - return "!RoomId"; - } - - private String getUserId(int i) { - if (i == 1) { - return getMyUserId(); - } - - return "UserId_" + i; - } - - private String getUserName(int i) { - if (i == 1) { - return getMyUserName(); - } - - return "UserName_" + i; - } } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomTestHelper.java new file mode 100644 index 000000000..494d9caad --- /dev/null +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomTestHelper.java @@ -0,0 +1,149 @@ +/* + * Copyright 2018 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.data.room; + +import android.content.Context; + +import org.matrix.androidsdk.MXDataHandler; +import org.matrix.androidsdk.data.Room; +import org.matrix.androidsdk.data.RoomState; +import org.matrix.androidsdk.data.RoomSummary; +import org.matrix.androidsdk.data.store.IMXStore; +import org.matrix.androidsdk.data.store.MXMemoryStore; +import org.matrix.androidsdk.rest.model.RoomMember; +import org.matrix.androidsdk.rest.model.login.Credentials; +import org.matrix.androidsdk.rest.model.sync.RoomSyncSummary; + +import java.util.ArrayList; + +public class RoomTestHelper { + /** + * Create a room, with or without lazy loading and with x number of room members + * First room member will always be the current user + * + * @param context + * @param withLazyLoading + * @param nbOfMembers + * @param amIInvited + * @return + */ + public Room createRoom(Context context, boolean withLazyLoading, int nbOfMembers, boolean amIInvited) { + Credentials credentials = new Credentials(); + credentials.userId = getMyUserId(); + IMXStore store = new MXMemoryStore(credentials, context); + + MXDataHandler mxDataHandler = new MXDataHandler(store, credentials); + mxDataHandler.setLazyLoadingEnabled(withLazyLoading); + + Room room = new Room(mxDataHandler, store, getRoomId()); + + store.storeRoom(room); + + RoomSummary roomSummary = new RoomSummary(); + roomSummary.setRoomId(getRoomId()); + store.storeSummary(roomSummary); + + if (amIInvited) { + roomSummary.setIsInvited(); + } else { + roomSummary.setIsJoined(); + } + + if (withLazyLoading && !amIInvited) { + // Populate room summary + RoomSyncSummary roomSyncSummary = new RoomSyncSummary(); + + roomSyncSummary.joinedMembersCount = nbOfMembers; + roomSyncSummary.invitedMembersCount = 0; + + // heroes + // Heroes does not include current user + if (nbOfMembers >= 2) { + roomSyncSummary.heroes = new ArrayList<>(); + for (int i = 2; i <= Math.min(6, nbOfMembers); i++) { + roomSyncSummary.heroes.add(getUserId(i)); + } + } + + roomSummary.setRoomSyncSummary(roomSyncSummary); + } + + if (amIInvited) { + // Maximum 2 members will be sent by the sync + initMembers(room.getState(), Math.min(2, nbOfMembers), true); + + // Pass the sender name (the inviter id) + if (nbOfMembers >= 2) { + room.getMember(getMyUserId()).mSender = getUserId(2); + } + } else { + initMembers(room.getState(), nbOfMembers, false); + } + + return room; + } + + private void initMembers(RoomState roomState, int nbOfMembers, boolean amIInvited) { + for (int i = 1; i <= nbOfMembers; i++) { + roomState.setMember(getUserId(i), createRoomMember(i, amIInvited)); + } + } + + private RoomMember createRoomMember(int i, boolean amIInvited) { + RoomMember roomMember = new RoomMember(); + + roomMember.setUserId(getUserId(i)); + roomMember.displayname = getUserName(i); + if (i == 1 && amIInvited) { + roomMember.membership = RoomMember.MEMBERSHIP_INVITE; + } else { + roomMember.membership = RoomMember.MEMBERSHIP_JOIN; + } + // Add a TS because they will be ordered + roomMember.setOriginServerTs(i); + + return roomMember; + } + + private String getMyUserId() { + return "@MyUserId"; + } + + private String getMyUserName() { + return "MyUserName"; + } + + private String getRoomId() { + return "!RoomId"; + } + + private String getUserId(int i) { + if (i == 1) { + return getMyUserId(); + } + + return "UserId_" + i; + } + + private String getUserName(int i) { + if (i == 1) { + return getMyUserName(); + } + + return "UserName_" + i; + } +} From f70853361811385dc6f6c68fa13dad6dd6bca182 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 15:34:30 +0200 Subject: [PATCH 59/79] Fix tests --- .../data/room/RoomAvatarResolverTest.java | 104 ++++++++++-------- .../room/RoomDisplayNameResolverTest.java | 8 +- .../androidsdk/data/room/RoomTestHelper.java | 4 +- 3 files changed, 67 insertions(+), 49 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java index 6ae2f6e10..a75366eaf 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java @@ -32,16 +32,16 @@ public class RoomAvatarResolverTest { private RoomTestHelper mRoomTestHelper = new RoomTestHelper(); @Test - public void RoomName_getRoomAvatar_LL_avatar() { - RoomName_getRoomAvatar_avatar(true); + public void RoomAvatar_getAvatar_noLL_avatar() { + RoomAvatar_getAvatar_avatar(false); } @Test - public void RoomName_getRoomAvatar_noLL_avatar() { - RoomName_getRoomAvatar_avatar(false); + public void RoomAvatar_getAvatar_LL_avatar() { + RoomAvatar_getAvatar_avatar(true); } - private void RoomName_getRoomAvatar_avatar(boolean withLazyLoading) { + private void RoomAvatar_getAvatar_avatar(boolean withLazyLoading) { Context context = InstrumentationRegistry.getContext(); // It does not depend on the number of users @@ -53,79 +53,97 @@ private void RoomName_getRoomAvatar_avatar(boolean withLazyLoading) { } } - /* @Test - public void RoomName_getRoomDisplayName_noLL_user() { - RoomName_getRoomDisplayName_user(false); + public void RoomAvatar_getAvatar_noLL_noAvatar() { + RoomAvatar_getAvatar_noAvatar(false); } @Test - public void RoomName_getRoomDisplayName_LL_user() { - RoomName_getRoomDisplayName_user(true); + public void RoomAvatar_getAvatar_LL_noAvatar() { + RoomAvatar_getAvatar_noAvatar(true); } - private void RoomName_getRoomDisplayName_user(boolean withLazyLoading) { + private void RoomAvatar_getAvatar_noAvatar(boolean withLazyLoading) { Context context = InstrumentationRegistry.getContext(); Room room; // Only me in the room - room = createRoom(context, withLazyLoading, 1, false); - Assert.assertEquals("Empty room", room.getRoomDisplayName(context)); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 1, false); + Assert.assertNull(room.getAvatarUrl()); + + // I have an avatar + room.getMember(mRoomTestHelper.getMyUserId()).avatarUrl = "mxc://my_avatar_url"; + + Assert.assertEquals("mxc://my_avatar_url", room.getAvatarUrl()); // One other user in the room - room = createRoom(context, withLazyLoading, 2, false); - Assert.assertEquals("UserName_2", room.getRoomDisplayName(context)); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 2, false); + Assert.assertNull(room.getAvatarUrl()); - // 2 other users in the room - room = createRoom(context, withLazyLoading, 3, false); - Assert.assertEquals("UserName_2 and UserName_3", room.getRoomDisplayName(context)); + // I have an avatar + room.getMember(mRoomTestHelper.getMyUserId()).avatarUrl = "mxc://my_avatar_url"; + Assert.assertNull(room.getAvatarUrl()); - room = createRoom(context, withLazyLoading, 4, false); - Assert.assertEquals("UserName_2 and 3 others", room.getRoomDisplayName(context)); + // Other user has an avatar + room.getMember(mRoomTestHelper.getUserId(2)).avatarUrl = "mxc://other_user_avatar_url"; + Assert.assertEquals("mxc://other_user_avatar_url", room.getAvatarUrl()); + + // 2 other users in the room + room = mRoomTestHelper.createRoom(context, withLazyLoading, 3, false); - room = createRoom(context, withLazyLoading, 5, false); - Assert.assertEquals("UserName_2 and 4 others", room.getRoomDisplayName(context)); + // I have an avatar + room.getMember(mRoomTestHelper.getMyUserId()).avatarUrl = "mxc://my_avatar_url"; + // Other user has an avatar + room.getMember(mRoomTestHelper.getUserId(2)).avatarUrl = "mxc://other_user_avatar_url"; - room = createRoom(context, withLazyLoading, 10, false); - Assert.assertEquals("UserName_2 and 9 others", room.getRoomDisplayName(context)); + Assert.assertNull(room.getAvatarUrl()); } @Test - public void RoomName_getRoomDisplayName_noLL_invitation() { - RoomName_getRoomDisplayName_invitation(false); + public void RoomAvatar_getAvatar_noLL_invitation() { + RoomAvatar_getAvatar_invitation(false); } @Test - public void RoomName_getRoomDisplayName_LL_invitation() { - RoomName_getRoomDisplayName_invitation(true); + public void RoomAvatar_getAvatar_LL_invitation() { + RoomAvatar_getAvatar_invitation(true); } - private void RoomName_getRoomDisplayName_invitation(boolean withLazyLoading) { + private void RoomAvatar_getAvatar_invitation(boolean withLazyLoading) { Context context = InstrumentationRegistry.getContext(); Room room; // Only me in the room - room = createRoom(context, withLazyLoading, 1, true); - Assert.assertEquals("Room Invite", room.getRoomDisplayName(context)); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 1, true); + Assert.assertNull(room.getAvatarUrl()); + + // I have an avatar + room.getMember(mRoomTestHelper.getMyUserId()).avatarUrl = "mxc://my_avatar_url"; + + Assert.assertEquals("mxc://my_avatar_url", room.getAvatarUrl()); // One other user in the room - room = createRoom(context, withLazyLoading, 2, true); - Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); + room = mRoomTestHelper.createRoom(context, withLazyLoading, 2, true); + Assert.assertNull(room.getAvatarUrl()); - // 2 other users in the room - room = createRoom(context, withLazyLoading, 3, true); - Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); + // I have an avatar + room.getMember(mRoomTestHelper.getMyUserId()).avatarUrl = "mxc://my_avatar_url"; + Assert.assertNull(room.getAvatarUrl()); - room = createRoom(context, withLazyLoading, 4, true); - Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); + // Other user has an avatar + room.getMember(mRoomTestHelper.getUserId(2)).avatarUrl = "mxc://other_user_avatar_url"; + Assert.assertEquals("mxc://other_user_avatar_url", room.getAvatarUrl()); + + // 2 other users in the room + room = mRoomTestHelper.createRoom(context, withLazyLoading, 3, true); - room = createRoom(context, withLazyLoading, 5, true); - Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); + // I have an avatar + room.getMember(mRoomTestHelper.getMyUserId()).avatarUrl = "mxc://my_avatar_url"; + // Other user has an avatar + room.getMember(mRoomTestHelper.getUserId(2)).avatarUrl = "mxc://other_user_avatar_url"; - room = createRoom(context, withLazyLoading, 10, true); - Assert.assertEquals("Invite from UserName_2", room.getRoomDisplayName(context)); + Assert.assertNull(room.getAvatarUrl()); } -*/ } diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java index 35e48ea09..a9b9cf078 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomDisplayNameResolverTest.java @@ -34,13 +34,13 @@ public class RoomDisplayNameResolverTest { private RoomTestHelper mRoomTestHelper = new RoomTestHelper(); @Test - public void RoomName_getRoomDisplayName_LL_emptyRoom() { - RoomName_getRoomDisplayName_emptyRoom(true); + public void RoomName_getRoomDisplayName_noLL_emptyRoom() { + RoomName_getRoomDisplayName_emptyRoom(false); } @Test - public void RoomName_getRoomDisplayName_noLL_emptyRoom() { - RoomName_getRoomDisplayName_emptyRoom(false); + public void RoomName_getRoomDisplayName_LL_emptyRoom() { + RoomName_getRoomDisplayName_emptyRoom(true); } private void RoomName_getRoomDisplayName_emptyRoom(boolean withLazyLoading) { diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomTestHelper.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomTestHelper.java index 494d9caad..6cfc75252 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomTestHelper.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomTestHelper.java @@ -119,7 +119,7 @@ private RoomMember createRoomMember(int i, boolean amIInvited) { return roomMember; } - private String getMyUserId() { + public String getMyUserId() { return "@MyUserId"; } @@ -131,7 +131,7 @@ private String getRoomId() { return "!RoomId"; } - private String getUserId(int i) { + public String getUserId(int i) { if (i == 1) { return getMyUserId(); } From 89c1faf7b2129025304a5544b906f9b3afba8f25 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 16:14:07 +0200 Subject: [PATCH 60/79] Fix issue of missing avatar for room the user is invited too when LL is on --- .../data/room/RoomAvatarResolverTest.java | 6 ++--- .../data/room/RoomAvatarResolver.java | 26 ++++++++++++++----- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java index a75366eaf..bb46034cf 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/data/room/RoomAvatarResolverTest.java @@ -74,7 +74,6 @@ private void RoomAvatar_getAvatar_noAvatar(boolean withLazyLoading) { // I have an avatar room.getMember(mRoomTestHelper.getMyUserId()).avatarUrl = "mxc://my_avatar_url"; - Assert.assertEquals("mxc://my_avatar_url", room.getAvatarUrl()); // One other user in the room @@ -121,7 +120,6 @@ private void RoomAvatar_getAvatar_invitation(boolean withLazyLoading) { // I have an avatar room.getMember(mRoomTestHelper.getMyUserId()).avatarUrl = "mxc://my_avatar_url"; - Assert.assertEquals("mxc://my_avatar_url", room.getAvatarUrl()); // One other user in the room @@ -132,7 +130,7 @@ private void RoomAvatar_getAvatar_invitation(boolean withLazyLoading) { room.getMember(mRoomTestHelper.getMyUserId()).avatarUrl = "mxc://my_avatar_url"; Assert.assertNull(room.getAvatarUrl()); - // Other user has an avatar + // Inviter has an avatar room.getMember(mRoomTestHelper.getUserId(2)).avatarUrl = "mxc://other_user_avatar_url"; Assert.assertEquals("mxc://other_user_avatar_url", room.getAvatarUrl()); @@ -144,6 +142,6 @@ private void RoomAvatar_getAvatar_invitation(boolean withLazyLoading) { // Other user has an avatar room.getMember(mRoomTestHelper.getUserId(2)).avatarUrl = "mxc://other_user_avatar_url"; - Assert.assertNull(room.getAvatarUrl()); + Assert.assertEquals("mxc://other_user_avatar_url", room.getAvatarUrl()); } } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java index de2a12ff9..e601338e3 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java @@ -42,15 +42,27 @@ public RoomAvatarResolver(Room room) { public String resolve() { String res = mRoom.getState().getAvatarUrl(); - // detect if it is a room with no more than 2 members (i.e. an alone or a 1:1 chat) if (res == null) { - if (mRoom.getNumberOfMembers() == 1 && !mRoom.getState().getLoadedMembers().isEmpty()) { - res = mRoom.getState().getLoadedMembers().get(0).getAvatarUrl(); - } else if (mRoom.getNumberOfMembers() == 2 && mRoom.getState().getLoadedMembers().size() > 1) { - RoomMember m1 = mRoom.getState().getLoadedMembers().get(0); - RoomMember m2 = mRoom.getState().getLoadedMembers().get(1); + if (mRoom.isInvited()) { + // In this case, if LazyLoading is ON, we cannot rely of mRoom.getNumberOfMembers() (it will return 0) + if (mRoom.getState().getLoadedMembers().size() == 1) { + res = mRoom.getState().getLoadedMembers().get(0).getAvatarUrl(); + } else if (mRoom.getState().getLoadedMembers().size() > 1) { + RoomMember m1 = mRoom.getState().getLoadedMembers().get(0); + RoomMember m2 = mRoom.getState().getLoadedMembers().get(1); - res = TextUtils.equals(m1.getUserId(), mRoom.getDataHandler().getUserId()) ? m2.getAvatarUrl() : m1.getAvatarUrl(); + res = TextUtils.equals(m1.getUserId(), mRoom.getDataHandler().getUserId()) ? m2.getAvatarUrl() : m1.getAvatarUrl(); + } + } else { + // detect if it is a room with no more than 2 members (i.e. an alone or a 1:1 chat) + if (mRoom.getNumberOfMembers() == 1 && !mRoom.getState().getLoadedMembers().isEmpty()) { + res = mRoom.getState().getLoadedMembers().get(0).getAvatarUrl(); + } else if (mRoom.getNumberOfMembers() == 2 && mRoom.getState().getLoadedMembers().size() > 1) { + RoomMember m1 = mRoom.getState().getLoadedMembers().get(0); + RoomMember m2 = mRoom.getState().getLoadedMembers().get(1); + + res = TextUtils.equals(m1.getUserId(), mRoom.getDataHandler().getUserId()) ? m2.getAvatarUrl() : m1.getAvatarUrl(); + } } } From bcfd0851ae4d7a8ec0a927df042d50ba83d59c3f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 8 Oct 2018 16:23:33 +0200 Subject: [PATCH 61/79] WIP --- .../androidsdk/adapters/MessageRow.java | 78 +++++++++++++++++-- .../org/matrix/androidsdk/data/RoomState.java | 2 +- .../timeline/TimelineLiveEventHandler.java | 4 +- .../fragments/MatrixMessageListFragment.java | 4 +- .../matrix/androidsdk/util/EventDisplay.java | 51 ++++++------ 5 files changed, 99 insertions(+), 40 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java index 8985a7580..4ce964255 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java @@ -1,12 +1,12 @@ -/* +/* * Copyright 2014 OpenMarket 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. @@ -15,17 +15,35 @@ */ package org.matrix.androidsdk.adapters; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.style.ParagraphStyle; +import android.text.style.QuoteSpan; + import org.matrix.androidsdk.data.RoomState; import org.matrix.androidsdk.rest.model.Event; +import org.matrix.androidsdk.rest.model.RoomCreateContent; +import org.matrix.androidsdk.rest.model.RoomMember; +import org.matrix.androidsdk.util.EventDisplay; // this class defines a MessagesAdapter Item. public class MessageRow { + private final boolean mHasPredecessor; // the linked event private Event mEvent; // the room state private final RoomState mRoomState; + // Cache of the user display name + private final String mUserDisplayName; + + // Cache of the computed text + private SpannableString mText; + private RoomCreateContent mRoomCreateContent; + + private final RoomMember mSender; + /** * Constructor * @@ -35,8 +53,12 @@ public class MessageRow { public MessageRow(Event event, RoomState roomState) { mEvent = event; mRoomState = roomState; - } + mUserDisplayName = (null == roomState) ? event.getSender() : roomState.getMemberName(event.getSender()); + mRoomCreateContent = (null == roomState) ? null : roomState.getRoomCreateContent(); + mSender = roomState.getMember(event.getSender()); + mHasPredecessor = roomState.hasPredecessor(); + } /** * @return the event. @@ -50,14 +72,54 @@ public Event getEvent() { * * @param event the event. */ + // TODO When is is called? public void updateEvent(Event event) { mEvent = event; } + public Spannable getText(ParagraphStyle style, EventDisplay display) { + if (mText == null) { + CharSequence textualDisplay = display.getTextualDisplay(mEvent, mRoomState); + + mText = new SpannableString((null == textualDisplay) ? "" : textualDisplay); + + // Change to BlockQuote Spannable to customize it + replaceQuoteSpans(mText, style); + + } + + return mText; + } + /** - * @return the room state. + * Replace all QuoteSpan instances by instances of VectorQuoteSpan + * + * @param spannable */ - public RoomState getRoomState() { - return mRoomState; + private void replaceQuoteSpans(Spannable spannable, ParagraphStyle style) { + QuoteSpan[] quoteSpans = spannable.getSpans(0, spannable.length(), QuoteSpan.class); + for (QuoteSpan quoteSpan : quoteSpans) { + int start = spannable.getSpanStart(quoteSpan); + int end = spannable.getSpanEnd(quoteSpan); + int flags = spannable.getSpanFlags(quoteSpan); + spannable.removeSpan(quoteSpan); + spannable.setSpan(style, start, end, flags); + } + } + + public String getUserDisplayName() { + return mUserDisplayName; + } + + public RoomCreateContent getRoomCreateContent() { + return mRoomCreateContent; + } + + public RoomMember getSender() { + return mSender; + } + + public boolean hasPredecessor() { + return mHasPredecessor; } } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java index bea01a908..53051b64e 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java @@ -962,7 +962,7 @@ public boolean applyState(IMXStore store, Event event, EventTimeline.Direction d // duplicated message ? if (member.equals(currentMember)) { Log.e(LOG_TAG, "## applyState() : seems being a duplicated event for " + userId + " in room " + roomId); - return false; + // return false; } // when a member leaves a room, his avatar / display name is not anymore provided diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineLiveEventHandler.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineLiveEventHandler.java index 1e2a15fc7..221ec5ce9 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineLiveEventHandler.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineLiveEventHandler.java @@ -236,9 +236,9 @@ private void storeLiveRoomEvent(@NonNull final MXDataHandler dataHandler, } } final RoomState state = mTimelineStateHolder.getState(); - final EventDisplay eventDisplay = new EventDisplay(store.getContext(), indexedEvent, state); + final EventDisplay eventDisplay = new EventDisplay(store.getContext()); // ensure that message can be displayed - if (!TextUtils.isEmpty(eventDisplay.getTextualDisplay())) { + if (!TextUtils.isEmpty(eventDisplay.getTextualDisplay(indexedEvent, state))) { event = indexedEvent; break; } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/fragments/MatrixMessageListFragment.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/fragments/MatrixMessageListFragment.java index 575490de7..2670365d1 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/fragments/MatrixMessageListFragment.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/fragments/MatrixMessageListFragment.java @@ -1791,8 +1791,8 @@ public void onEvent(final Event event, final EventTimeline.Direction direction, // test if the event is displayable // GA issue : the activity can be null if (!hasToRemoved && (null != getActivity())) { - EventDisplay eventDisplay = new EventDisplay(getActivity(), prunedEvent, roomState); - hasToRemoved = TextUtils.isEmpty(eventDisplay.getTextualDisplay()); + EventDisplay eventDisplay = new EventDisplay(getActivity()); + hasToRemoved = TextUtils.isEmpty(eventDisplay.getTextualDisplay(prunedEvent, roomState)); } // event is removed if it has no more content. diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java index 03341faae..62aa025b3 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java @@ -36,6 +36,7 @@ import org.matrix.androidsdk.R; import org.matrix.androidsdk.call.MXCallsManager; import org.matrix.androidsdk.crypto.MXCryptoError; +import org.matrix.androidsdk.data.Room; import org.matrix.androidsdk.data.RoomState; import org.matrix.androidsdk.interfaces.HtmlToolbox; import org.matrix.androidsdk.rest.model.Event; @@ -55,9 +56,7 @@ public class EventDisplay { private static final String MESSAGE_IN_REPLY_TO_LAST_PART = "
"; // members - protected final Event mEvent; protected final Context mContext; - protected final RoomState mRoomState; @Nullable protected final HtmlToolbox mHtmlToolbox; @@ -68,15 +67,13 @@ public class EventDisplay { public static final boolean mDisplayRedactedEvents = false; // constructor - public EventDisplay(Context context, Event event, RoomState roomState) { - this(context, event, roomState, null); + public EventDisplay(Context context) { + this(context, null); } // constructor - public EventDisplay(Context context, Event event, RoomState roomState, @Nullable HtmlToolbox htmlToolbox) { + public EventDisplay(Context context, @Nullable HtmlToolbox htmlToolbox) { mContext = context.getApplicationContext(); - mEvent = event; - mRoomState = roomState; mHtmlToolbox = htmlToolbox; } @@ -111,8 +108,8 @@ protected static String getUserDisplayName(String userId, RoomState roomState) { * * @return The text or null if it isn't possible. */ - public CharSequence getTextualDisplay() { - return getTextualDisplay(null); + public CharSequence getTextualDisplay(Event event, RoomState roomState) { + return getTextualDisplay(null, event, roomState); } /** @@ -121,16 +118,16 @@ public CharSequence getTextualDisplay() { * @param displayNameColor the display name highlighted color. * @return The text or null if it isn't possible. */ - public CharSequence getTextualDisplay(Integer displayNameColor) { + public CharSequence getTextualDisplay(Integer displayNameColor, Event event, RoomState roomState) { CharSequence text = null; try { - JsonObject jsonEventContent = mEvent.getContentAsJsonObject(); + JsonObject jsonEventContent = event.getContentAsJsonObject(); - String userDisplayName = getUserDisplayName(mEvent.getSender(), mRoomState); - String eventType = mEvent.getType(); + String userDisplayName = getUserDisplayName(event.getSender(), roomState); + String eventType = event.getType(); - if (mEvent.isCallEvent()) { + if (event.isCallEvent()) { if (Event.EVENT_TYPE_CALL_INVITE.equals(eventType)) { boolean isVideo = false; // detect call type from the sdp @@ -211,11 +208,11 @@ public CharSequence getTextualDisplay(Integer displayNameColor) { } } else if (Event.EVENT_TYPE_MESSAGE_ENCRYPTION.equals(eventType)) { - text = mContext.getString(R.string.notice_end_to_end, userDisplayName, mEvent.getWireEventContent().algorithm); + text = mContext.getString(R.string.notice_end_to_end, userDisplayName, event.getWireEventContent().algorithm); } else if (Event.EVENT_TYPE_MESSAGE_ENCRYPTED.equals(eventType)) { // don't display - if (mEvent.isRedacted()) { - String redactedInfo = EventDisplay.getRedactionMessage(mContext, mEvent, mRoomState); + if (event.isRedacted()) { + String redactedInfo = EventDisplay.getRedactionMessage(mContext, event, roomState); if (TextUtils.isEmpty(redactedInfo)) { return null; @@ -226,10 +223,10 @@ public CharSequence getTextualDisplay(Integer displayNameColor) { String message = null; - if (null != mEvent.getCryptoError()) { + if (null != event.getCryptoError()) { String errorDescription; - MXCryptoError error = mEvent.getCryptoError(); + MXCryptoError error = event.getCryptoError(); if (TextUtils.equals(error.errcode, MXCryptoError.UNKNOWN_INBOUND_SESSION_ID_ERROR_CODE)) { errorDescription = mContext.getResources().getString(R.string.notice_crypto_error_unkwown_inbound_session_id); @@ -251,8 +248,8 @@ public CharSequence getTextualDisplay(Integer displayNameColor) { } else if (Event.EVENT_TYPE_STATE_ROOM_TOPIC.equals(eventType)) { String topic = jsonEventContent.getAsJsonPrimitive("topic").getAsString(); - if (mEvent.isRedacted()) { - String redactedInfo = EventDisplay.getRedactionMessage(mContext, mEvent, mRoomState); + if (event.isRedacted()) { + String redactedInfo = EventDisplay.getRedactionMessage(mContext, event, roomState); if (TextUtils.isEmpty(redactedInfo)) { return null; @@ -270,8 +267,8 @@ public CharSequence getTextualDisplay(Integer displayNameColor) { JsonPrimitive nameAsJson = jsonEventContent.getAsJsonPrimitive("name"); String roomName = (null == nameAsJson) ? null : nameAsJson.getAsString(); - if (mEvent.isRedacted()) { - String redactedInfo = EventDisplay.getRedactionMessage(mContext, mEvent, mRoomState); + if (event.isRedacted()) { + String redactedInfo = EventDisplay.getRedactionMessage(mContext, event, roomState); if (TextUtils.isEmpty(redactedInfo)) { return null; @@ -286,11 +283,11 @@ public CharSequence getTextualDisplay(Integer displayNameColor) { text = mContext.getString(R.string.notice_room_name_removed, userDisplayName); } } else if (Event.EVENT_TYPE_STATE_ROOM_THIRD_PARTY_INVITE.equals(eventType)) { - RoomThirdPartyInvite invite = JsonUtils.toRoomThirdPartyInvite(mEvent.getContent()); + RoomThirdPartyInvite invite = JsonUtils.toRoomThirdPartyInvite(event.getContent()); String displayName = invite.display_name; - if (mEvent.isRedacted()) { - String redactedInfo = EventDisplay.getRedactionMessage(mContext, mEvent, mRoomState); + if (event.isRedacted()) { + String redactedInfo = EventDisplay.getRedactionMessage(mContext, event, roomState); if (TextUtils.isEmpty(redactedInfo)) { return null; @@ -301,7 +298,7 @@ public CharSequence getTextualDisplay(Integer displayNameColor) { text = mContext.getString(R.string.notice_room_third_party_invite, userDisplayName, displayName); } else if (Event.EVENT_TYPE_STATE_ROOM_MEMBER.equals(eventType)) { - text = getMembershipNotice(mContext, mEvent, mRoomState); + text = getMembershipNotice(mContext, event, roomState); } } catch (Exception e) { Log.e(LOG_TAG, "getTextualDisplay() " + e.getMessage(), e); From 34eae052a61261fb89fa9c27febd8cb090b5cf62 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 15 Oct 2018 15:47:53 +0200 Subject: [PATCH 62/79] Back paginating in a room with LL makes some avatars to vanish (Fixes vector-im/riot-android#2639) --- CHANGES.rst | 1 + .../org/matrix/androidsdk/MXDataHandler.java | 2 +- .../androidsdk/data/RoomPreviewData.java | 2 +- .../org/matrix/androidsdk/data/RoomState.java | 23 +++++++++++-------- .../data/timeline/MXEventTimeline.java | 19 ++++++++------- .../timeline/StateEventRedactionChecker.java | 2 +- .../timeline/TimelineJoinRoomSyncHandler.java | 2 +- .../timeline/TimelineLiveEventHandler.java | 2 +- .../data/timeline/TimelineStateHolder.java | 22 ++++++++++++------ 9 files changed, 46 insertions(+), 29 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2d8ff98f4..3000903db 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -11,6 +11,7 @@ Improvements: Bugfix: - Fix strip previous reply when they contain new line (vector-im/riot-android#2612) - Enable CLEARTEXT communication for http endpoints (vector-im/riot-android#2495) + - Back paginating in a room with LL makes some avatars to vanish (vector-im/riot-android#2639) API Change: - diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java index 770d34c31..833262873 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java @@ -924,7 +924,7 @@ public void onSuccess(ChunkEvents info) { if (info.chunk != null) { for (Event event : info.chunk) { - room.getState().applyState(getStore(), event, EventTimeline.Direction.FORWARDS); + room.getState().applyState(getStore(), event, true); } } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomPreviewData.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomPreviewData.java index 23377af38..39d2596c8 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomPreviewData.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomPreviewData.java @@ -210,7 +210,7 @@ protected Void doInBackground(Void... params) { mRoomState.roomId = mRoomId; for (Event event : roomResponse.state) { - mRoomState.applyState(null, event, EventTimeline.Direction.FORWARDS); + mRoomState.applyState(null, event, true); } // TODO LazyLoading handle case where room has no name diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java index 53051b64e..a4947437e 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java @@ -27,7 +27,6 @@ import org.matrix.androidsdk.MXDataHandler; import org.matrix.androidsdk.call.MXCallsManager; import org.matrix.androidsdk.data.store.IMXStore; -import org.matrix.androidsdk.data.timeline.EventTimeline; import org.matrix.androidsdk.rest.callback.ApiCallback; import org.matrix.androidsdk.rest.callback.SimpleApiCallback; import org.matrix.androidsdk.rest.model.Event; @@ -874,17 +873,23 @@ public String encryptionAlgorithm() { /** * Apply the given event (relevant for state changes) to our state. * - * @param store the store to use - * @param event the event - * @param direction how the event should affect the state: Forwards for applying, backwards for un-applying (applying the previous state) + * @param store the store to use + * @param event the event + * @param considerNewContent how the event should affect the state: true for applying, false for un-applying (applying the previous state) * @return true if the event is managed */ - public boolean applyState(IMXStore store, Event event, EventTimeline.Direction direction) { + public boolean applyState(IMXStore store, Event event, boolean considerNewContent) { if (event.stateKey == null) { return false; } - JsonObject contentToConsider = (direction == EventTimeline.Direction.FORWARDS) ? event.getContentAsJsonObject() : event.getPrevContentAsJsonObject(); + JsonObject contentToConsider; + if (considerNewContent) { + contentToConsider = event.getContentAsJsonObject(); + } else { + contentToConsider = event.getPrevContentAsJsonObject(); + } + String eventType = event.getType(); try { @@ -952,7 +957,7 @@ public boolean applyState(IMXStore store, Event event, EventTimeline.Direction d member.setOriginalEventId(event.eventId); member.mSender = event.getSender(); - if ((null != store) && (direction == EventTimeline.Direction.FORWARDS)) { + if ((null != store) && considerNewContent) { store.storeRoomStateEvent(roomId, event); } @@ -991,7 +996,7 @@ public boolean applyState(IMXStore store, Event event, EventTimeline.Direction d } } - if ((direction == EventTimeline.Direction.FORWARDS) && (null != store)) { + if (considerNewContent && (null != store)) { store.updateUserWithRoomMemberEvent(member); } @@ -1013,7 +1018,7 @@ public boolean applyState(IMXStore store, Event event, EventTimeline.Direction d thirdPartyInvite.token = event.stateKey; - if ((direction == EventTimeline.Direction.FORWARDS) && (null != store)) { + if (considerNewContent && (null != store)) { store.storeRoomStateEvent(roomId, event); } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/MXEventTimeline.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/MXEventTimeline.java index a5f1fad5a..bc26c7603 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/MXEventTimeline.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/MXEventTimeline.java @@ -319,12 +319,13 @@ private void deepCopyState(Direction direction) { /** * Process a state event to keep the internal live and back states up to date. * - * @param event the state event - * @param direction the direction; ie. forwards for live state, backwards for back state + * @param event the state event + * @param direction the direction; ie. forwards for live state, backwards for back state + * @param considerNewContent how the event should affect the state: true for applying, false for un-applying (applying the previous state) * @return true if the event has been processed. */ - private boolean processStateEvent(Event event, Direction direction) { - return mStateHolder.processStateEvent(event, direction); + private boolean processStateEvent(Event event, Direction direction, boolean considerNewContent) { + return mStateHolder.processStateEvent(event, direction, considerNewContent); } /** @@ -470,10 +471,10 @@ private void addPaginationEvents(List events, for (Event stateEvent : stateEvents) { if (direction == Direction.BACKWARDS) { // Enrich the timeline root state with the additional state events observed during back pagination - processStateEvent(stateEvent, Direction.FORWARDS); + processStateEvent(stateEvent, Direction.FORWARDS, true); } - processStateEvent(stateEvent, direction); + processStateEvent(stateEvent, Direction.BACKWARDS, true); } } @@ -482,8 +483,10 @@ private void addPaginationEvents(List events, boolean processedEvent = true; if (event.stateKey != null) { + boolean considerNewContent = direction == Direction.FORWARDS; + deepCopyState(direction); - processedEvent = processStateEvent(event, direction); + processedEvent = processStateEvent(event, direction, considerNewContent); } // Decrypt event if necessary @@ -877,7 +880,7 @@ public void onSuccess(final EventContext eventContext) { protected Void doInBackground(Void... params) { // the state is the one after the latest event of the chunk i.e. the last message of eventContext.eventsAfter for (Event event : eventContext.state) { - processStateEvent(event, Direction.FORWARDS); + processStateEvent(event, Direction.FORWARDS, true); } // init the room states diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/StateEventRedactionChecker.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/StateEventRedactionChecker.java index f4a077805..edc3fab3b 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/StateEventRedactionChecker.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/StateEventRedactionChecker.java @@ -81,7 +81,7 @@ public void onSuccess(List stateEvents) { stateEvent.prune(redactionEvent); stateEvents.set(index, stateEvent); // digest the updated state - mTimelineStateHolder.processStateEvent(stateEvent, EventTimeline.Direction.FORWARDS); + mTimelineStateHolder.processStateEvent(stateEvent, EventTimeline.Direction.FORWARDS, true); isFound = true; break; } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineJoinRoomSyncHandler.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineJoinRoomSyncHandler.java index cfc01bdce..e51cb3420 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineJoinRoomSyncHandler.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineJoinRoomSyncHandler.java @@ -98,7 +98,7 @@ private void handleRoomSyncState(@NonNull final Room room, if (room.getDataHandler().isAlive()) { for (Event event : mRoomSync.state.events) { try { - mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS); + mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS, true); } catch (Exception e) { Log.e(LOG_TAG, "processStateEvent failed " + e.getMessage(), e); } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineLiveEventHandler.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineLiveEventHandler.java index 221ec5ce9..d8574ec1e 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineLiveEventHandler.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineLiveEventHandler.java @@ -167,7 +167,7 @@ public void handleLiveEvent(@NonNull final Event event, // copy the live state before applying any update mTimelineStateHolder.deepCopyState(EventTimeline.Direction.FORWARDS); // check if the event has been processed - if (!mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS)) { + if (!mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS, true)) { // not processed -> do not warn the application // assume that the event is a duplicated one. return; diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java index 6f26c1e2e..0731c19ce 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java @@ -108,17 +108,27 @@ public void deepCopyState(final EventTimeline.Direction direction) { /** * Process a state event to keep the internal live and back states up to date. * - * @param event the state event - * @param direction the direction; ie. forwards for live state, backwards for back state + * @param event the state event + * @param direction the direction; ie. forwards for live state, backwards for back state + * @param considerNewContent how the event should affect the state: true for applying, false for un-applying (applying the previous state) * @return true if the event has been processed. */ public boolean processStateEvent(@NonNull final Event event, - @NonNull final EventTimeline.Direction direction) { - final RoomState affectedState = direction == EventTimeline.Direction.FORWARDS ? mState : mBackState; - final boolean isProcessed = affectedState.applyState(mStore, event, direction); + @NonNull final EventTimeline.Direction direction, + final boolean considerNewContent) { + final RoomState affectedState; + if (direction == EventTimeline.Direction.FORWARDS) { + affectedState = mState; + } else { + affectedState = mBackState; + } + + final boolean isProcessed = affectedState.applyState(mStore, event, considerNewContent); + if (isProcessed && direction == EventTimeline.Direction.FORWARDS) { mStore.storeLiveStateForRoom(mRoomId); } + return isProcessed; } @@ -144,6 +154,4 @@ private void initStates() { mState.setDataHandler(mDataHandler); mState.roomId = mRoomId; } - - } From 395ec0fd4eb06b1f029c1882a018839585f7f6c9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 15 Oct 2018 15:50:10 +0200 Subject: [PATCH 63/79] Cleanup --- .../main/java/org/matrix/androidsdk/adapters/MessageRow.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java index 4ce964255..f19e4282a 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java @@ -1,5 +1,6 @@ /* * Copyright 2014 OpenMarket Ltd + * Copyright 2018 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. @@ -72,7 +73,6 @@ public Event getEvent() { * * @param event the event. */ - // TODO When is is called? public void updateEvent(Event event) { mEvent = event; } From a67f6e247c2ec1d4600e5b77dc2d69915348fd1f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 16 Oct 2018 14:22:02 +0200 Subject: [PATCH 64/79] Change after Giom review --- .../androidsdk/adapters/MessageRow.java | 42 +++++++++++++++---- .../org/matrix/androidsdk/data/RoomState.java | 2 +- .../data/timeline/MXEventTimeline.java | 2 +- .../matrix/androidsdk/util/EventDisplay.java | 11 +++-- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java index f19e4282a..7176bc90a 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java @@ -16,6 +16,8 @@ */ package org.matrix.androidsdk.adapters; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.text.Spannable; import android.text.SpannableString; import android.text.style.ParagraphStyle; @@ -27,13 +29,19 @@ import org.matrix.androidsdk.rest.model.RoomMember; import org.matrix.androidsdk.util.EventDisplay; -// this class defines a MessagesAdapter Item. +/** + * this class defines a MessagesAdapter Item. + */ public class MessageRow { private final boolean mHasPredecessor; + // the linked event + @NonNull private Event mEvent; + // the room state + @Nullable private final RoomState mRoomState; // Cache of the user display name @@ -41,8 +49,11 @@ public class MessageRow { // Cache of the computed text private SpannableString mText; + + @Nullable private RoomCreateContent mRoomCreateContent; + @Nullable private final RoomMember mSender; /** @@ -51,19 +62,27 @@ public class MessageRow { * @param event the event. * @param roomState the room state */ - public MessageRow(Event event, RoomState roomState) { + public MessageRow(@NonNull Event event, @Nullable RoomState roomState) { mEvent = event; mRoomState = roomState; - mUserDisplayName = (null == roomState) ? event.getSender() : roomState.getMemberName(event.getSender()); - mRoomCreateContent = (null == roomState) ? null : roomState.getRoomCreateContent(); - mSender = roomState.getMember(event.getSender()); - mHasPredecessor = roomState.hasPredecessor(); + if (roomState == null) { + mUserDisplayName = event.getSender(); + mRoomCreateContent = null; + mSender = null; + mHasPredecessor = false; + } else { + mUserDisplayName = roomState.getMemberName(event.getSender()); + mRoomCreateContent = roomState.getRoomCreateContent(); + mSender = roomState.getMember(event.getSender()); + mHasPredecessor = roomState.hasPredecessor(); + } } /** * @return the event. */ + @NonNull public Event getEvent() { return mEvent; } @@ -73,10 +92,17 @@ public Event getEvent() { * * @param event the event. */ - public void updateEvent(Event event) { + public void updateEvent(@NonNull Event event) { mEvent = event; } + /** + * Get the text of the event + * + * @param style + * @param display + * @return + */ public Spannable getText(ParagraphStyle style, EventDisplay display) { if (mText == null) { CharSequence textualDisplay = display.getTextualDisplay(mEvent, mRoomState); @@ -111,10 +137,12 @@ public String getUserDisplayName() { return mUserDisplayName; } + @Nullable public RoomCreateContent getRoomCreateContent() { return mRoomCreateContent; } + @Nullable public RoomMember getSender() { return mSender; } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java index a4947437e..5705f4d57 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java @@ -967,7 +967,7 @@ public boolean applyState(IMXStore store, Event event, boolean considerNewConten // duplicated message ? if (member.equals(currentMember)) { Log.e(LOG_TAG, "## applyState() : seems being a duplicated event for " + userId + " in room " + roomId); - // return false; + return false; } // when a member leaves a room, his avatar / display name is not anymore provided diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/MXEventTimeline.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/MXEventTimeline.java index bc26c7603..47e4af8b3 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/MXEventTimeline.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/MXEventTimeline.java @@ -474,7 +474,7 @@ private void addPaginationEvents(List events, processStateEvent(stateEvent, Direction.FORWARDS, true); } - processStateEvent(stateEvent, Direction.BACKWARDS, true); + processStateEvent(stateEvent, direction, true); } } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java index 62aa025b3..ea94fe035 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/util/EventDisplay.java @@ -36,7 +36,6 @@ import org.matrix.androidsdk.R; import org.matrix.androidsdk.call.MXCallsManager; import org.matrix.androidsdk.crypto.MXCryptoError; -import org.matrix.androidsdk.data.Room; import org.matrix.androidsdk.data.RoomState; import org.matrix.androidsdk.interfaces.HtmlToolbox; import org.matrix.androidsdk.rest.model.Event; @@ -212,7 +211,7 @@ public CharSequence getTextualDisplay(Integer displayNameColor, Event event, Roo } else if (Event.EVENT_TYPE_MESSAGE_ENCRYPTED.equals(eventType)) { // don't display if (event.isRedacted()) { - String redactedInfo = EventDisplay.getRedactionMessage(mContext, event, roomState); + String redactedInfo = getRedactionMessage(mContext, event, roomState); if (TextUtils.isEmpty(redactedInfo)) { return null; @@ -249,7 +248,7 @@ public CharSequence getTextualDisplay(Integer displayNameColor, Event event, Roo String topic = jsonEventContent.getAsJsonPrimitive("topic").getAsString(); if (event.isRedacted()) { - String redactedInfo = EventDisplay.getRedactionMessage(mContext, event, roomState); + String redactedInfo = getRedactionMessage(mContext, event, roomState); if (TextUtils.isEmpty(redactedInfo)) { return null; @@ -268,7 +267,7 @@ public CharSequence getTextualDisplay(Integer displayNameColor, Event event, Roo String roomName = (null == nameAsJson) ? null : nameAsJson.getAsString(); if (event.isRedacted()) { - String redactedInfo = EventDisplay.getRedactionMessage(mContext, event, roomState); + String redactedInfo = getRedactionMessage(mContext, event, roomState); if (TextUtils.isEmpty(redactedInfo)) { return null; @@ -287,7 +286,7 @@ public CharSequence getTextualDisplay(Integer displayNameColor, Event event, Roo String displayName = invite.display_name; if (event.isRedacted()) { - String redactedInfo = EventDisplay.getRedactionMessage(mContext, event, roomState); + String redactedInfo = getRedactionMessage(mContext, event, roomState); if (TextUtils.isEmpty(redactedInfo)) { return null; @@ -431,7 +430,7 @@ public static String getMembershipNotice(Context context, Event event, RoomState // Check whether the sender has updated his profile (the membership is then unchanged) if (TextUtils.equals(prevMembership, eventContent.membership)) { - String redactedInfo = EventDisplay.getRedactionMessage(context, event, roomState); + String redactedInfo = getRedactionMessage(context, event, roomState); // Is redacted event? if (event.isRedacted()) { From 1c0e77aff2a40752f736c189e667d62a48d3289a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 11:38:52 +0200 Subject: [PATCH 65/79] Test compilation --- .../data/timeline/TimelineStateHolderTest.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java b/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java index 27e07643c..67b9edc17 100644 --- a/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java +++ b/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java @@ -38,7 +38,7 @@ public void processStateEvent_WhenDirectionIsForward__ShouldStoreLiveState() { event.roomId = ROOM_ID; event.stateKey = Event.EVENT_TYPE_STATE_ROOM_NAME; event.type = Event.EVENT_TYPE_STATE_ROOM_NAME; - mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS); + mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS, true); Mockito.verify(mIMXStore, Mockito.times(1)).storeLiveStateForRoom(Mockito.anyString()); } @@ -47,7 +47,7 @@ public void processStateEvent_WhenNoStateKeyIsGiven__ShouldNotBeProcessed() { final Event event = new Event(); event.roomId = ROOM_ID; event.type = Event.EVENT_TYPE_STATE_ROOM_NAME; - Assert.assertFalse(mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS)); + Assert.assertFalse(mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS, true)); } @Test @@ -56,7 +56,7 @@ public void processStateEvent_WithConformingEvent__ShouldBeProcessed() { event.roomId = ROOM_ID; event.type = Event.EVENT_TYPE_STATE_ROOM_NAME; event.stateKey = Event.EVENT_TYPE_STATE_ROOM_NAME; - Assert.assertTrue(mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS)); + Assert.assertTrue(mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS, true)); } @Test @@ -67,8 +67,8 @@ public void processStateEvent_WhenDirectionIsForward__ShouldUseState() { event.type = Event.EVENT_TYPE_STATE_ROOM_NAME; final RoomState state = Mockito.spy(mTimelineStateHolder.getState()); mTimelineStateHolder.setState(state); - mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS); - Mockito.verify(state).applyState(mIMXStore, event, EventTimeline.Direction.FORWARDS); + mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS, true); + Mockito.verify(state).applyState(mIMXStore, event, true); } @Test @@ -79,8 +79,8 @@ public void processStateEvent_WhenDirectionIsBackward__ShouldUseBackState() { event.type = Event.EVENT_TYPE_STATE_ROOM_NAME; final RoomState backState = Mockito.spy(mTimelineStateHolder.getBackState()); mTimelineStateHolder.setBackState(backState); - mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.BACKWARDS); - Mockito.verify(backState).applyState(mIMXStore, event, EventTimeline.Direction.BACKWARDS); + mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.BACKWARDS, false); + Mockito.verify(backState).applyState(mIMXStore, event, false); } @Test @@ -104,6 +104,4 @@ public void deepCopyState_WhenDirectionIsBackward__ShouldCopyBackState() { Mockito.verify(backState).deepCopy(); Mockito.verify(state, Mockito.never()).deepCopy(); } - - } From cbc53275abc175ce62ffc154d1c221acad9bbd60 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 11:44:42 +0200 Subject: [PATCH 66/79] Rename method, member and improve comment --- .../org/matrix/androidsdk/adapters/MessageRow.java | 13 +++++++------ .../java/org/matrix/androidsdk/data/RoomState.java | 3 ++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java index 7176bc90a..39d666765 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java @@ -44,8 +44,8 @@ public class MessageRow { @Nullable private final RoomState mRoomState; - // Cache of the user display name - private final String mUserDisplayName; + // Cache of the sender display name + private final String mSenderDisplayName; // Cache of the computed text private SpannableString mText; @@ -67,12 +67,13 @@ public MessageRow(@NonNull Event event, @Nullable RoomState roomState) { mRoomState = roomState; if (roomState == null) { - mUserDisplayName = event.getSender(); + // Use the id of the sender as display name + mSenderDisplayName = event.getSender(); mRoomCreateContent = null; mSender = null; mHasPredecessor = false; } else { - mUserDisplayName = roomState.getMemberName(event.getSender()); + mSenderDisplayName = roomState.getMemberName(event.getSender()); mRoomCreateContent = roomState.getRoomCreateContent(); mSender = roomState.getMember(event.getSender()); mHasPredecessor = roomState.hasPredecessor(); @@ -133,8 +134,8 @@ private void replaceQuoteSpans(Spannable spannable, ParagraphStyle style) { } } - public String getUserDisplayName() { - return mUserDisplayName; + public String getSenderDisplayName() { + return mSenderDisplayName; } @Nullable diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java index 5705f4d57..42bffb9f6 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java @@ -875,7 +875,8 @@ public String encryptionAlgorithm() { * * @param store the store to use * @param event the event - * @param considerNewContent how the event should affect the state: true for applying, false for un-applying (applying the previous state) + * @param considerNewContent how the event should affect the state: true for applying (consider the content of the event), + * false for un-applying (consider the previous content of the event) * @return true if the event is managed */ public boolean applyState(IMXStore store, Event event, boolean considerNewContent) { From 82f7acce4232541becbe58e94ed49610b7bcda48 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 11:45:34 +0200 Subject: [PATCH 67/79] Add unused data --- .../org/matrix/androidsdk/rest/model/RoomCreateContent.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomCreateContent.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomCreateContent.java index 94d3090bd..24e42fa1d 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomCreateContent.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomCreateContent.java @@ -26,6 +26,11 @@ public class RoomCreateContent implements Serializable { public String creator; + + // Not used for the moment + // @SerializedName("room_version") + // public String roomVersion; + public Predecessor predecessor; public RoomCreateContent deepCopy() { From 228cf6a02450aca98f8018e3bdf7603cd342fcfc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 12:07:35 +0200 Subject: [PATCH 68/79] Simplify code for room creation handling --- .../androidsdk/adapters/MessageRow.java | 20 +++++++------------ .../org/matrix/androidsdk/data/RoomState.java | 7 ------- .../rest/model/RoomCreateContent.java | 4 ---- 3 files changed, 7 insertions(+), 24 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java index 39d666765..a32221eb4 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java @@ -34,8 +34,6 @@ */ public class MessageRow { - private final boolean mHasPredecessor; - // the linked event @NonNull private Event mEvent; @@ -51,7 +49,7 @@ public class MessageRow { private SpannableString mText; @Nullable - private RoomCreateContent mRoomCreateContent; + private RoomCreateContent.Predecessor mRoomCreateContentPredecessor; @Nullable private final RoomMember mSender; @@ -69,14 +67,14 @@ public MessageRow(@NonNull Event event, @Nullable RoomState roomState) { if (roomState == null) { // Use the id of the sender as display name mSenderDisplayName = event.getSender(); - mRoomCreateContent = null; + mRoomCreateContentPredecessor = null; mSender = null; - mHasPredecessor = false; } else { mSenderDisplayName = roomState.getMemberName(event.getSender()); - mRoomCreateContent = roomState.getRoomCreateContent(); + if (roomState.getRoomCreateContent() != null) { + mRoomCreateContentPredecessor = roomState.getRoomCreateContent().predecessor; + } mSender = roomState.getMember(event.getSender()); - mHasPredecessor = roomState.hasPredecessor(); } } @@ -139,16 +137,12 @@ public String getSenderDisplayName() { } @Nullable - public RoomCreateContent getRoomCreateContent() { - return mRoomCreateContent; + public RoomCreateContent.Predecessor getRoomCreateContentPredecessor() { + return mRoomCreateContentPredecessor; } @Nullable public RoomMember getSender() { return mSender; } - - public boolean hasPredecessor() { - return mHasPredecessor; - } } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java index 42bffb9f6..e07446f2d 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java @@ -841,13 +841,6 @@ public RoomTombstoneContent getRoomTombstoneContent() { return mRoomTombstoneContent; } - /** - * @return true if the room has a predecessor - */ - public boolean hasPredecessor() { - return mRoomCreateContent != null && mRoomCreateContent.hasPredecessor(); - } - /** * @return the room create content */ diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomCreateContent.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomCreateContent.java index 24e42fa1d..6fae65aac 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomCreateContent.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/rest/model/RoomCreateContent.java @@ -40,10 +40,6 @@ public RoomCreateContent deepCopy() { return copy; } - public boolean hasPredecessor() { - return predecessor != null; - } - /** * A link to an old room in case of room versioning */ From 12725588feb86eb030a2f475940373f493aaeca1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 14:06:21 +0200 Subject: [PATCH 69/79] Do not persist state event and User in case of back pagination --- .../java/org/matrix/androidsdk/MXDataHandler.java | 3 +-- .../matrix/androidsdk/data/RoomPreviewData.java | 3 +-- .../org/matrix/androidsdk/data/RoomState.java | 15 +++++++++------ .../data/timeline/TimelineStateHolder.java | 6 +++++- .../data/timeline/TimelineStateHolderTest.java | 4 ++-- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java index 833262873..bf31aa261 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/MXDataHandler.java @@ -39,7 +39,6 @@ import org.matrix.androidsdk.data.metrics.MetricsListener; import org.matrix.androidsdk.data.store.IMXStore; import org.matrix.androidsdk.data.store.MXMemoryStore; -import org.matrix.androidsdk.data.timeline.EventTimeline; import org.matrix.androidsdk.db.MXMediasCache; import org.matrix.androidsdk.groups.GroupsManager; import org.matrix.androidsdk.listeners.IMXEventListener; @@ -924,7 +923,7 @@ public void onSuccess(ChunkEvents info) { if (info.chunk != null) { for (Event event : info.chunk) { - room.getState().applyState(getStore(), event, true); + room.getState().applyState(event, true, getStore()); } } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomPreviewData.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomPreviewData.java index 39d2596c8..8de1049ba 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomPreviewData.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomPreviewData.java @@ -22,7 +22,6 @@ import android.text.TextUtils; import org.matrix.androidsdk.MXSession; -import org.matrix.androidsdk.data.timeline.EventTimeline; import org.matrix.androidsdk.rest.callback.ApiCallback; import org.matrix.androidsdk.rest.model.Event; import org.matrix.androidsdk.rest.model.MatrixError; @@ -210,7 +209,7 @@ protected Void doInBackground(Void... params) { mRoomState.roomId = mRoomId; for (Event event : roomResponse.state) { - mRoomState.applyState(null, event, true); + mRoomState.applyState(event, true, null); } // TODO LazyLoading handle case where room has no name diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java index e07446f2d..77816f763 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/RoomState.java @@ -18,6 +18,7 @@ package org.matrix.androidsdk.data; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.text.TextUtils; @@ -866,13 +867,15 @@ public String encryptionAlgorithm() { /** * Apply the given event (relevant for state changes) to our state. * - * @param store the store to use - * @param event the event + * @param event the state event * @param considerNewContent how the event should affect the state: true for applying (consider the content of the event), * false for un-applying (consider the previous content of the event) + * @param store the store to use to store the event and the User. Can be null * @return true if the event is managed */ - public boolean applyState(IMXStore store, Event event, boolean considerNewContent) { + public boolean applyState(@NonNull Event event, + boolean considerNewContent, + @Nullable IMXStore store) { if (event.stateKey == null) { return false; } @@ -951,7 +954,7 @@ public boolean applyState(IMXStore store, Event event, boolean considerNewConten member.setOriginalEventId(event.eventId); member.mSender = event.getSender(); - if ((null != store) && considerNewContent) { + if (store != null) { store.storeRoomStateEvent(roomId, event); } @@ -990,7 +993,7 @@ public boolean applyState(IMXStore store, Event event, boolean considerNewConten } } - if (considerNewContent && (null != store)) { + if (store != null) { store.updateUserWithRoomMemberEvent(member); } @@ -1012,7 +1015,7 @@ public boolean applyState(IMXStore store, Event event, boolean considerNewConten thirdPartyInvite.token = event.stateKey; - if (considerNewContent && (null != store)) { + if (store != null) { store.storeRoomStateEvent(roomId, event); } diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java index 0731c19ce..53bd0da39 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/timeline/TimelineStateHolder.java @@ -117,13 +117,17 @@ public boolean processStateEvent(@NonNull final Event event, @NonNull final EventTimeline.Direction direction, final boolean considerNewContent) { final RoomState affectedState; + final IMXStore store; if (direction == EventTimeline.Direction.FORWARDS) { affectedState = mState; + store = mStore; } else { affectedState = mBackState; + // In the case of backward pagination, we do not want to persist the state event + store = null; } - final boolean isProcessed = affectedState.applyState(mStore, event, considerNewContent); + final boolean isProcessed = affectedState.applyState(event, considerNewContent, store); if (isProcessed && direction == EventTimeline.Direction.FORWARDS) { mStore.storeLiveStateForRoom(mRoomId); diff --git a/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java b/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java index 67b9edc17..a8bb27dd1 100644 --- a/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java +++ b/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java @@ -68,7 +68,7 @@ public void processStateEvent_WhenDirectionIsForward__ShouldUseState() { final RoomState state = Mockito.spy(mTimelineStateHolder.getState()); mTimelineStateHolder.setState(state); mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.FORWARDS, true); - Mockito.verify(state).applyState(mIMXStore, event, true); + Mockito.verify(state).applyState(event, true, mIMXStore); } @Test @@ -80,7 +80,7 @@ public void processStateEvent_WhenDirectionIsBackward__ShouldUseBackState() { final RoomState backState = Mockito.spy(mTimelineStateHolder.getBackState()); mTimelineStateHolder.setBackState(backState); mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.BACKWARDS, false); - Mockito.verify(backState).applyState(mIMXStore, event, false); + Mockito.verify(backState).applyState(event, false, mIMXStore); } @Test From 2f293acfcd7b21e18258f9c7f17bb2a2336b0579 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 14:16:26 +0200 Subject: [PATCH 70/79] Invalidate cache when event is updated --- .../main/java/org/matrix/androidsdk/adapters/MessageRow.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java index a32221eb4..85ab58b5a 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java @@ -93,6 +93,9 @@ public Event getEvent() { */ public void updateEvent(@NonNull Event event) { mEvent = event; + + // invalidate our cache + mText = null; } /** @@ -110,7 +113,6 @@ public Spannable getText(ParagraphStyle style, EventDisplay display) { // Change to BlockQuote Spannable to customize it replaceQuoteSpans(mText, style); - } return mText; From 72eb9e06360ae1b7e28f25285cc0b6198162a4a2 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 14:17:23 +0200 Subject: [PATCH 71/79] Move method --- .../androidsdk/adapters/MessageRow.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java index 85ab58b5a..06225476f 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/adapters/MessageRow.java @@ -118,6 +118,24 @@ public Spannable getText(ParagraphStyle style, EventDisplay display) { return mText; } + public String getSenderDisplayName() { + return mSenderDisplayName; + } + + @Nullable + public RoomCreateContent.Predecessor getRoomCreateContentPredecessor() { + return mRoomCreateContentPredecessor; + } + + @Nullable + public RoomMember getSender() { + return mSender; + } + + /* ========================================================================================== + * Private + * ========================================================================================== */ + /** * Replace all QuoteSpan instances by instances of VectorQuoteSpan * @@ -133,18 +151,4 @@ private void replaceQuoteSpans(Spannable spannable, ParagraphStyle style) { spannable.setSpan(style, start, end, flags); } } - - public String getSenderDisplayName() { - return mSenderDisplayName; - } - - @Nullable - public RoomCreateContent.Predecessor getRoomCreateContentPredecessor() { - return mRoomCreateContentPredecessor; - } - - @Nullable - public RoomMember getSender() { - return mSender; - } } From 50b3ae4b8a02885d04cf7b159dbe30fd5df4bb93 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 17:10:38 +0200 Subject: [PATCH 72/79] Giom review --- .../androidsdk/data/timeline/TimelineStateHolderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java b/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java index a8bb27dd1..5506c9c3c 100644 --- a/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java +++ b/matrix-sdk/src/test/java/org/matrix/androidsdk/data/timeline/TimelineStateHolderTest.java @@ -80,7 +80,7 @@ public void processStateEvent_WhenDirectionIsBackward__ShouldUseBackState() { final RoomState backState = Mockito.spy(mTimelineStateHolder.getBackState()); mTimelineStateHolder.setBackState(backState); mTimelineStateHolder.processStateEvent(event, EventTimeline.Direction.BACKWARDS, false); - Mockito.verify(backState).applyState(event, false, mIMXStore); + Mockito.verify(backState).applyState(event, false, null); } @Test From 15c19b5700b3ede30b90ab60fcb106b54000589f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Oct 2018 17:28:45 +0200 Subject: [PATCH 73/79] Add @Nullable --- .../org/matrix/androidsdk/data/room/RoomAvatarResolver.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java index e601338e3..2e2816a6f 100644 --- a/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java +++ b/matrix-sdk/src/main/java/org/matrix/androidsdk/data/room/RoomAvatarResolver.java @@ -16,6 +16,7 @@ package org.matrix.androidsdk.data.room; +import android.support.annotation.Nullable; import android.text.TextUtils; import org.matrix.androidsdk.data.Room; @@ -37,8 +38,9 @@ public RoomAvatarResolver(Room room) { /** * Compute the room avatar url * - * @return the room avatar url + * @return the room avatar url, can be a fallback to a room member avatar or null */ + @Nullable public String resolve() { String res = mRoom.getState().getAvatarUrl(); From 8af69db9f69718e7514f4319697589b48364c5a8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 18 Oct 2018 11:12:08 +0200 Subject: [PATCH 74/79] gitflow-feature-stash: indonesian --- .travis.yml | 2 ++ matrix-sdk/src/main/res/values-id/strings.xml | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 matrix-sdk/src/main/res/values-id/strings.xml diff --git a/.travis.yml b/.travis.yml index d892221f1..8684fcdac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,3 +43,5 @@ script: - ./gradlew clean lintRelease test assembleRelease assembleAndroidTest --stacktrace - ./tools/check/check_code_quality.sh - ./tools/travis/check_pr.sh + # Check that indonesian files are identical. Due to Android issue, the resource folder must be value-in/, and Weblate export data into value-id/. + - diff ./matrix-sdk/src/main/res/values-id/strings.xml ./matrix-sdk/src/main/res/values-in/strings.xml diff --git a/matrix-sdk/src/main/res/values-id/strings.xml b/matrix-sdk/src/main/res/values-id/strings.xml new file mode 100644 index 000000000..157b23d40 --- /dev/null +++ b/matrix-sdk/src/main/res/values-id/strings.xml @@ -0,0 +1,12 @@ + + + Undang dari %s + Undangan Ruang + %1$s dan %2$s + + Ruang kosong + + + %1$s dan %2$d yang lain + + \ No newline at end of file From ed49bfd0b8fe4286cbcbe6a76e82bc67557b33f5 Mon Sep 17 00:00:00 2001 From: toriko Date: Fri, 12 Oct 2018 03:59:46 +0000 Subject: [PATCH 75/79] Translated using Weblate (Japanese) Currently translated at 40.6% (24 of 59 strings) Translation: Riot Android/matrix-android-sdk Translate-URL: https://translate.riot.im/projects/riot-android/matrix-android-sdk/ja/ --- matrix-sdk/src/main/res/values-ja/strings.xml | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/matrix-sdk/src/main/res/values-ja/strings.xml b/matrix-sdk/src/main/res/values-ja/strings.xml index a6b3daec9..995902a12 100644 --- a/matrix-sdk/src/main/res/values-ja/strings.xml +++ b/matrix-sdk/src/main/res/values-ja/strings.xml @@ -1,2 +1,28 @@ - - \ No newline at end of file + +Matrix Android SDK + + %1$s: %2$s + %1$sが画像を送信しました。 + %1$sがスタンプを送信しました。 + + %sの招待 + %1$sが%2$sを招待しました + %1$sがあなたを招待しました + %1$sが参加しました + %1$sが退出しました + %1$sが招待を断りました + %1$sが%2$sとの接続を切断しました + %1$sが%2$sのブロックを解除しました + %14sが%2$sをブロックしました + %14sが%2$sの招待を撤回しました + %1$sがアバターを変更しました + %1$sが表示名を%2$sに設定しました + %1$sが表示名を%2$sから%3$sに変更しました + %1$sが表示名 (%2$s) を削除しました + %1$sがテーマを%2$sに変更しました + %1$sが部屋名を%2$sに変更しました + %sがビデオ通話を開始しました。 + %sが音声通話を開始しました。 + %sが電話に出ました。 + %sが通話を終了しました。 + From 1b8cc735b9a22a5e1ca0ad602eb906bc2ff461b1 Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Sat, 13 Oct 2018 06:58:00 +0000 Subject: [PATCH 76/79] Translated using Weblate (Polish) Currently translated at 62.7% (37 of 59 strings) Translation: Riot Android/matrix-android-sdk Translate-URL: https://translate.riot.im/projects/riot-android/matrix-android-sdk/pl/ --- matrix-sdk/src/main/res/values-pl/strings.xml | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/matrix-sdk/src/main/res/values-pl/strings.xml b/matrix-sdk/src/main/res/values-pl/strings.xml index 9cdc88bd1..28999b14d 100644 --- a/matrix-sdk/src/main/res/values-pl/strings.xml +++ b/matrix-sdk/src/main/res/values-pl/strings.xml @@ -2,22 +2,22 @@ Matrix Android SDK %1$s: %2$s - %1$s wysłał zdjęcie. + %1$s wysłał(a) zdjęcie. Zaproszenie od %s - %1$s zaprosił %2$s - %1$s zaprosił Cię - %1$s dołączył - %1$s wyszedł - %1$s odrzucił zaproszenie - %1$s wyrzucił %2$s - %1$s odblokował %2$s - %1$s zablokował %2$s - %1$s zmienił awatar - %1$s zmienił wyświetlaną nazwę na %2$s - %1$s zmienił wyświetlaną nazwę z %2$s na %3$s - %1$s usunął swoją wyświetlaną nazwę (%2$s) - %1$s zmienił temat na: %2$s + %1$s zaprosił(a) %2$s + %1$s zaprosił(a) Cię + %1$s dołączył(a) + %1$s wyszedł(-ła) + %1$s odrzucił(a) zaproszenie + %1$s wyrzucił(a) %2$s + %1$s odblokował(a) %2$s + %1$s zablokował(a) %2$s + %1$s zmienił(a) awatar + %1$s zmienił(a) wyświetlaną nazwę na %2$s + %1$s zmienił(a) wyświetlaną nazwę z %2$s na %3$s + %1$s usunął(-ęła) swoją wyświetlaną nazwę (%2$s) + %1$s zmienił(a) temat na: %2$s Nie udało się wysłać wiadomości Nie udało się wysłać zdjęcia @@ -32,13 +32,18 @@ wszyscy członkowie pokoju. wszyscy. - %1$s zmienił znawę pokoju na: %2$s - %s zakończył rozmowę. - %1$s usunął nazwę pokoju - %1$s usunął temat pokoju + %1$s zmienił(a) znawę pokoju na: %2$s + %s zakończył(a) rozmowę. + %1$s usunął(-ęła) nazwę pokoju + %1$s usunął(-ęła) temat pokoju " [powód: %1$s]" - %1$s wysłał naklejkę. + %1$s wysłał(a) naklejkę. - %1$s włączył szyfrowanie end-to-end (%2$s) + %1$s włączył(a) szyfrowanie end-to-end (%2$s) + + %1$s wycofał(a) zaproszenie %2$s + %s odebrał(a) połączenie. + (awatar też został zmieniony) + W odpowiedzi do From 881014bbe7b058439e87394248731d5794c9eee5 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 18 Oct 2018 15:02:30 +0200 Subject: [PATCH 77/79] Fix Jenkins build --- matrix-sdk/src/main/res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix-sdk/src/main/res/values-ja/strings.xml b/matrix-sdk/src/main/res/values-ja/strings.xml index 876551f08..b61f22037 100644 --- a/matrix-sdk/src/main/res/values-ja/strings.xml +++ b/matrix-sdk/src/main/res/values-ja/strings.xml @@ -1,5 +1,5 @@ -Matrix Android SDK + %1$s: %2$s %1$sが画像を送信しました。 From 75770980ee285721bf8319cbd0880324bd05e38d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 18 Oct 2018 15:33:02 +0200 Subject: [PATCH 78/79] Fix unit test compilation after several PR merged --- .../androidsdk/util/EventDisplayTest.java | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java index 1e6b38e0e..c402d9f23 100644 --- a/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java +++ b/matrix-sdk/src/androidTest/java/org/matrix/androidsdk/util/EventDisplayTest.java @@ -40,19 +40,20 @@ public void EventDisplay_message_Simple_text() { event.content = new JsonObject(); ((JsonObject) event.content).addProperty("body", "message"); - EventDisplay eventDisplay = new EventDisplay(context, event, null); + EventDisplay eventDisplay = new EventDisplay(context); - CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + CharSequence textualDisplay = eventDisplay.getTextualDisplay(event, null); Assert.assertTrue(textualDisplay instanceof String); - Assert.assertEquals("message", eventDisplay.getTextualDisplay()); + Assert.assertEquals("message", textualDisplay); } @Test public void EventDisplay_formattedMessage_Simple_text() { - EventDisplay eventDisplay = createEventDisplayWithFormattedBody("message"); + EventDisplay eventDisplay = new EventDisplay(InstrumentationRegistry.getContext()); + Event event = createEventWithFormattedBody("message"); - CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + CharSequence textualDisplay = eventDisplay.getTextualDisplay(event, null); Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); Assert.assertEquals("message", textualDisplay.toString()); @@ -60,9 +61,10 @@ public void EventDisplay_formattedMessage_Simple_text() { @Test public void EventDisplay_formattedMessage_italic_text() { - EventDisplay eventDisplay = createEventDisplayWithFormattedBody("italic"); + EventDisplay eventDisplay = new EventDisplay(InstrumentationRegistry.getContext()); + Event event = createEventWithFormattedBody("italic"); - CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + CharSequence textualDisplay = eventDisplay.getTextualDisplay(event, null); Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); Assert.assertEquals("italic", textualDisplay.toString()); @@ -70,9 +72,10 @@ public void EventDisplay_formattedMessage_italic_text() { @Test public void EventDisplay_formattedMessage_bold_text() { - EventDisplay eventDisplay = createEventDisplayWithFormattedBody("bold"); + EventDisplay eventDisplay = new EventDisplay(InstrumentationRegistry.getContext()); + Event event = createEventWithFormattedBody("bold"); - CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + CharSequence textualDisplay = eventDisplay.getTextualDisplay(event, null); Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); Assert.assertEquals("bold", textualDisplay.toString()); @@ -84,12 +87,12 @@ public void EventDisplay_formattedMessage_bold_text() { */ @Test public void EventDisplay_formattedMessage_li_text() { - EventDisplay eventDisplay = createEventDisplayWithFormattedBody("
  1. list
"); + EventDisplay eventDisplay = new EventDisplay(InstrumentationRegistry.getContext()); + Event event = createEventWithFormattedBody("
  1. list
"); - CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + CharSequence textualDisplay = eventDisplay.getTextualDisplay(event, null); Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); - Assert.assertEquals("list", textualDisplay.toString()); } @@ -98,12 +101,12 @@ public void EventDisplay_formattedMessage_li_text() { */ @Test public void EventDisplay_formattedMessage_lili_text() { - EventDisplay eventDisplay = createEventDisplayWithFormattedBody("
  1. list
  2. item
"); + EventDisplay eventDisplay = new EventDisplay(InstrumentationRegistry.getContext()); + Event event = createEventWithFormattedBody("
  1. list
  2. item
"); - CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + CharSequence textualDisplay = eventDisplay.getTextualDisplay(event, null); Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); - Assert.assertEquals("list\nitem", textualDisplay.toString()); } @@ -113,12 +116,12 @@ public void EventDisplay_formattedMessage_lili_text() { */ @Test public void EventDisplay_formattedMessage_blockquote_text() { - EventDisplay eventDisplay = createEventDisplayWithFormattedBody("
blockquote
"); + EventDisplay eventDisplay = new EventDisplay(InstrumentationRegistry.getContext()); + Event event = createEventWithFormattedBody("
blockquote
"); - CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + CharSequence textualDisplay = eventDisplay.getTextualDisplay(event, null); Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); - Assert.assertEquals("blockquote", textualDisplay.toString()); } @@ -127,12 +130,12 @@ public void EventDisplay_formattedMessage_blockquote_text() { */ @Test public void EventDisplay_formattedMessage_blockquoteWithText_text() { - EventDisplay eventDisplay = createEventDisplayWithFormattedBody("
blockquote
message"); + EventDisplay eventDisplay = new EventDisplay(InstrumentationRegistry.getContext()); + Event event = createEventWithFormattedBody("
blockquote
message"); - CharSequence textualDisplay = eventDisplay.getTextualDisplay(); + CharSequence textualDisplay = eventDisplay.getTextualDisplay(event, null); Assert.assertTrue(textualDisplay instanceof SpannableStringBuilder); - Assert.assertEquals("blockquote\n\nmessage", textualDisplay.toString()); } @@ -142,9 +145,7 @@ public void EventDisplay_formattedMessage_blockquoteWithText_text() { * Private * ========================================================================================== */ - private EventDisplay createEventDisplayWithFormattedBody(String formattedBody) { - Context context = InstrumentationRegistry.getContext(); - + private Event createEventWithFormattedBody(String formattedBody) { Event event = new Event(); event.type = Event.EVENT_TYPE_MESSAGE; @@ -152,7 +153,6 @@ private EventDisplay createEventDisplayWithFormattedBody(String formattedBody) { ((JsonObject) event.content).addProperty("format", Message.FORMAT_MATRIX_HTML); ((JsonObject) event.content).addProperty("formatted_body", formattedBody); - return new EventDisplay(context, event, null); + return event; } - } From 63e093dd46a9e776e07049b22d35f1915a83ab4d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 18 Oct 2018 15:41:36 +0200 Subject: [PATCH 79/79] Prepare release --- CHANGES.rst | 20 +------------------- matrix-sdk/build.gradle | 2 +- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 3000903db..c0d78adcf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,9 +1,6 @@ -Changes to Matrix Android SDK in 0.9.12 (2018-XX-XX) +Changes to Matrix Android SDK in 0.9.12 (2018-10-18) ======================================================= -Features: - - - Improvements: - Improve certificate pinning management for HomeServerConnectionConfig. - Room display name is now computed by the Matrix SDK @@ -13,21 +10,6 @@ Bugfix: - Enable CLEARTEXT communication for http endpoints (vector-im/riot-android#2495) - Back paginating in a room with LL makes some avatars to vanish (vector-im/riot-android#2639) -API Change: - - - -Translations: - - - -Others: - - - -Build: - - - -Test: - - - Changes to Matrix Android SDK in 0.9.11 (2018-10-10) ======================================================= diff --git a/matrix-sdk/build.gradle b/matrix-sdk/build.gradle index ac73596fa..ce7936a1c 100644 --- a/matrix-sdk/build.gradle +++ b/matrix-sdk/build.gradle @@ -15,7 +15,7 @@ android { minSdkVersion 16 targetSdkVersion 26 versionCode 912 - versionName "0.9.12-dev" + versionName "0.9.12" resValue "string", "flavor_description", "SDKApp" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }