From 9c34187391a7fee20614c03c9ba2a6613d1b3260 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 9 Jun 2020 12:22:47 +0200 Subject: [PATCH 01/11] Move "integration" setting above "advanced" section --- .../main/res/xml/vector_settings_general.xml | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/vector/src/main/res/xml/vector_settings_general.xml b/vector/src/main/res/xml/vector_settings_general.xml index 846380465e..7248280e37 100644 --- a/vector/src/main/res/xml/vector_settings_general.xml +++ b/vector/src/main/res/xml/vector_settings_general.xml @@ -68,6 +68,26 @@ + + + + + + + + + + - - - - - - - - - - Date: Wed, 17 Jun 2020 15:30:56 +0200 Subject: [PATCH 02/11] Add airplane mode icon --- .../main/res/drawable/ic_airplane_16dp.xml | 13 ++++++++++++ .../src/main/res/layout/view_sync_state.xml | 21 ++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 vector/src/main/res/drawable/ic_airplane_16dp.xml diff --git a/vector/src/main/res/drawable/ic_airplane_16dp.xml b/vector/src/main/res/drawable/ic_airplane_16dp.xml new file mode 100644 index 0000000000..fa2387ebf0 --- /dev/null +++ b/vector/src/main/res/drawable/ic_airplane_16dp.xml @@ -0,0 +1,13 @@ + + + diff --git a/vector/src/main/res/layout/view_sync_state.xml b/vector/src/main/res/layout/view_sync_state.xml index 0e7ddabc21..49b3bb3857 100644 --- a/vector/src/main/res/layout/view_sync_state.xml +++ b/vector/src/main/res/layout/view_sync_state.xml @@ -1,5 +1,6 @@ - + tools:visibility="visible"> + + + + \ No newline at end of file From fa204eca3b7ad644818190bebf832a5d9e390818 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Jun 2020 15:37:35 +0200 Subject: [PATCH 03/11] Add link to Widget doc --- .../matrix/android/api/session/widgets/model/WidgetContent.kt | 3 +++ .../matrix/android/api/session/widgets/model/WidgetType.kt | 3 +++ 2 files changed, 6 insertions(+) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/widgets/model/WidgetContent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/widgets/model/WidgetContent.kt index 7e045f25c7..af70400622 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/widgets/model/WidgetContent.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/widgets/model/WidgetContent.kt @@ -21,6 +21,9 @@ import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import im.vector.matrix.android.api.util.JsonDict +/** + * Ref: https://github.com/matrix-org/matrix-doc/issues/1236 + */ @JsonClass(generateAdapter = true) data class WidgetContent( @Json(name = "creatorUserId") val creatorUserId: String? = null, diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/widgets/model/WidgetType.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/widgets/model/WidgetType.kt index 4a265d71b7..a8ef77cdc3 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/widgets/model/WidgetType.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/widgets/model/WidgetType.kt @@ -16,6 +16,9 @@ package im.vector.matrix.android.api.session.widgets.model +/** + * Ref: https://github.com/matrix-org/matrix-doc/issues/1236 + */ sealed class WidgetType(open val preferred: String, open val legacy: String = preferred) { object Jitsi : WidgetType("m.jitsi", "jitsi") object TradingView : WidgetType("m.tradingview") From 1df3b4e18fa2492be872030d342ae07fc31bce76 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Jun 2020 15:52:31 +0200 Subject: [PATCH 04/11] Fix dark theme issue on login screen (#1097) --- CHANGES.md | 2 +- vector/src/main/res/drawable/bg_login_server.xml | 2 +- vector/src/main/res/drawable/bg_login_server_checked.xml | 2 +- vector/src/main/res/layout/fragment_login.xml | 1 + vector/src/main/res/layout/fragment_login_server_selection.xml | 2 ++ vector/src/main/res/layout/fragment_login_server_url_form.xml | 3 ++- .../main/res/layout/fragment_login_signup_signin_selection.xml | 1 + 7 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 46a83b881c..abac591140 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,7 +8,7 @@ Improvements 🙌: - Bugfix 🐛: - - + - Fix dark theme issue on login screen (#1097) Translations 🗣: - diff --git a/vector/src/main/res/drawable/bg_login_server.xml b/vector/src/main/res/drawable/bg_login_server.xml index 5aecd26292..a2ca14f02e 100644 --- a/vector/src/main/res/drawable/bg_login_server.xml +++ b/vector/src/main/res/drawable/bg_login_server.xml @@ -7,6 +7,6 @@ android:width="1.2dp" android:color="#E7E7E7" /> - + \ No newline at end of file diff --git a/vector/src/main/res/drawable/bg_login_server_checked.xml b/vector/src/main/res/drawable/bg_login_server_checked.xml index 1aea622462..f120e62884 100644 --- a/vector/src/main/res/drawable/bg_login_server_checked.xml +++ b/vector/src/main/res/drawable/bg_login_server_checked.xml @@ -7,6 +7,6 @@ android:width="1.2dp" android:color="@color/riotx_accent" /> - + \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_login.xml b/vector/src/main/res/layout/fragment_login.xml index 894a7598c8..a35a60104d 100644 --- a/vector/src/main/res/layout/fragment_login.xml +++ b/vector/src/main/res/layout/fragment_login.xml @@ -25,6 +25,7 @@ android:id="@+id/loginServerIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:tint="?riotx_text_primary" tools:src="@drawable/ic_logo_matrix_org" /> + android:src="@drawable/ic_logo_modular" + android:tint="?riotx_text_primary" /> Date: Wed, 17 Jun 2020 18:13:09 +0200 Subject: [PATCH 05/11] "Add Matrix app" menu is now always visible (#1495) --- CHANGES.md | 2 +- .../home/room/detail/RoomDetailFragment.kt | 18 +++++++++++++++++- .../home/room/detail/RoomDetailViewModel.kt | 2 +- .../settings/VectorSettingsActivity.kt | 3 +++ vector/src/main/res/values/strings.xml | 3 +++ 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index abac591140..897d6cbcde 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,7 +5,7 @@ Features ✨: - Improvements 🙌: - - + - "Add Matrix app" menu is now always visible (#1495) Bugfix 🐛: - Fix dark theme issue on login screen (#1097) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt index dbb26377f6..bf386d15a2 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt @@ -159,6 +159,7 @@ import im.vector.riotx.features.permalink.NavigationInterceptor import im.vector.riotx.features.permalink.PermalinkHandler import im.vector.riotx.features.reactions.EmojiReactionPickerActivity import im.vector.riotx.features.settings.VectorPreferences +import im.vector.riotx.features.settings.VectorSettingsActivity import im.vector.riotx.features.share.SharedData import im.vector.riotx.features.themes.ThemeUtils import im.vector.riotx.features.widgets.WidgetActivity @@ -469,13 +470,28 @@ class RoomDetailFragment @Inject constructor( true } R.id.open_matrix_apps -> { - navigator.openIntegrationManager(requireContext(), roomDetailArgs.roomId, null, null) + if (session.integrationManagerService().isIntegrationEnabled()) { + navigator.openIntegrationManager(requireContext(), roomDetailArgs.roomId, null, null) + } else { + displayDisabledIntegrationDialog() + } true } else -> super.onOptionsItemSelected(item) } } + private fun displayDisabledIntegrationDialog() { + AlertDialog.Builder(requireActivity()) + .setTitle(R.string.disabled_integration_dialog_title) + .setMessage(R.string.disabled_integration_dialog_content) + .setPositiveButton(R.string.settings) { _, _ -> + navigator.openSettings(requireActivity(), VectorSettingsActivity.EXTRA_DIRECT_ACCESS_GENERAL) + } + .setNegativeButton(R.string.cancel, null) + .show() + } + private fun renderRegularMode(text: String) { autoCompleter.exitSpecialMode() composerLayout.collapse() diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt index 69a6429efb..1785151af5 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailViewModel.kt @@ -371,7 +371,7 @@ class RoomDetailViewModel @AssistedInject constructor( timeline.pendingEventCount() > 0 && vectorPreferences.developerMode() R.id.resend_all -> timeline.failedToDeliverEventCount() > 0 R.id.clear_all -> timeline.failedToDeliverEventCount() > 0 - R.id.open_matrix_apps -> session.integrationManagerService().isIntegrationEnabled() + R.id.open_matrix_apps -> true else -> false } diff --git a/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsActivity.kt b/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsActivity.kt index 0c73c0f5d3..bbe6358bd9 100755 --- a/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsActivity.kt @@ -59,6 +59,8 @@ class VectorSettingsActivity : VectorBaseActivity(), if (isFirstCreation()) { // display the fragment when (intent.getIntExtra(EXTRA_DIRECT_ACCESS, EXTRA_DIRECT_ACCESS_ROOT)) { + EXTRA_DIRECT_ACCESS_GENERAL -> + replaceFragment(R.id.vector_settings_page, VectorSettingsGeneralFragment::class.java, null, FRAGMENT_TAG) EXTRA_DIRECT_ACCESS_ADVANCED_SETTINGS -> replaceFragment(R.id.vector_settings_page, VectorSettingsAdvancedSettingsFragment::class.java, null, FRAGMENT_TAG) EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY -> @@ -137,6 +139,7 @@ class VectorSettingsActivity : VectorBaseActivity(), const val EXTRA_DIRECT_ACCESS_ADVANCED_SETTINGS = 1 const val EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY = 2 const val EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY_MANAGE_SESSIONS = 3 + const val EXTRA_DIRECT_ACCESS_GENERAL = 4 private const val FRAGMENT_TAG = "VectorSettingsPreferencesFragment" } diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 19afc120cb..931a7896eb 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -862,6 +862,9 @@ Allow integrations Integration Manager + Integrations are disabled + "Enable 'Allow integrations' in Settings to do this." + User interface Language Choose language From af81a527464f47c3b81748de63311d5377810a76 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Jun 2020 19:04:35 +0200 Subject: [PATCH 06/11] Use CustomChromeTab to open T&C --- .../vector/riotx/features/login/terms/LoginTermsFragment.kt | 6 +++--- .../im/vector/riotx/features/terms/ReviewTermsFragment.kt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/login/terms/LoginTermsFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/terms/LoginTermsFragment.kt index 88f4fc2f5f..49abc9ba81 100755 --- a/vector/src/main/java/im/vector/riotx/features/login/terms/LoginTermsFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/terms/LoginTermsFragment.kt @@ -21,17 +21,17 @@ import android.os.Parcelable import android.view.View import butterknife.OnClick import com.airbnb.mvrx.args +import im.vector.matrix.android.internal.auth.registration.LocalizedFlowDataLoginTerms import im.vector.riotx.R import im.vector.riotx.core.extensions.cleanup import im.vector.riotx.core.extensions.configureWith import im.vector.riotx.core.extensions.toReducedUrl -import im.vector.riotx.core.utils.openUrlInExternalBrowser +import im.vector.riotx.core.utils.openUrlInChromeCustomTab import im.vector.riotx.features.login.AbstractLoginFragment import im.vector.riotx.features.login.LoginAction import im.vector.riotx.features.login.LoginViewState import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_login_terms.* -import im.vector.matrix.android.internal.auth.registration.LocalizedFlowDataLoginTerms import javax.inject.Inject @Parcelize @@ -95,7 +95,7 @@ class LoginTermsFragment @Inject constructor( localizedFlowDataLoginTerms.localizedUrl ?.takeIf { it.isNotBlank() } ?.let { - openUrlInExternalBrowser(requireContext(), it) + openUrlInChromeCustomTab(requireContext(), null, it) } } diff --git a/vector/src/main/java/im/vector/riotx/features/terms/ReviewTermsFragment.kt b/vector/src/main/java/im/vector/riotx/features/terms/ReviewTermsFragment.kt index ecf5818300..0adfa049fe 100644 --- a/vector/src/main/java/im/vector/riotx/features/terms/ReviewTermsFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/terms/ReviewTermsFragment.kt @@ -30,7 +30,7 @@ import im.vector.riotx.core.extensions.configureWith import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.core.platform.VectorBaseFragment -import im.vector.riotx.core.utils.openUrlInExternalBrowser +import im.vector.riotx.core.utils.openUrlInChromeCustomTab import kotlinx.android.synthetic.main.fragment_review_terms.* import javax.inject.Inject @@ -106,6 +106,6 @@ class ReviewTermsFragment @Inject constructor( } override fun review(term: Term) { - openUrlInExternalBrowser(requireContext(), term.url) + openUrlInChromeCustomTab(requireContext(), null, term.url) } } From f532d28fb34d7329ad5d0a72fccd785984089c13 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 18 Jun 2020 14:18:40 +0200 Subject: [PATCH 07/11] Min SDK level set to 21 (#405) --- CHANGES.md | 1 + matrix-sdk-android-rx/build.gradle | 2 +- matrix-sdk-android/build.gradle | 2 +- vector/build.gradle | 5 ++--- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 46a83b881c..cf14de4834 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -18,6 +18,7 @@ SDK API changes ⚠️: Build 🧱: - Enable code optimization (Proguard) + - SDK is now API level 21 minimum, and so RiotX (#405) Other changes: - diff --git a/matrix-sdk-android-rx/build.gradle b/matrix-sdk-android-rx/build.gradle index 734ff0c130..c67d10d810 100644 --- a/matrix-sdk-android-rx/build.gradle +++ b/matrix-sdk-android-rx/build.gradle @@ -6,7 +6,7 @@ android { compileSdkVersion 29 defaultConfig { - minSdkVersion 16 + minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle index 436d3b6319..e4251a733c 100644 --- a/matrix-sdk-android/build.gradle +++ b/matrix-sdk-android/build.gradle @@ -23,7 +23,7 @@ android { testOptions.unitTests.includeAndroidResources = true defaultConfig { - minSdkVersion 16 + minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "0.0.1" diff --git a/vector/build.gradle b/vector/build.gradle index e198344424..5830b38559 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -107,9 +107,8 @@ android { compileSdkVersion 29 defaultConfig { applicationId "im.vector.riotx" - // Set to API 19 because motionLayout is min API 18. - // In the future we may consider using an alternative of MotionLayout to support API 16. But for security reason, maybe not. - minSdkVersion 19 + // Set to API 21: see #405 + minSdkVersion 21 targetSdkVersion 29 multiDexEnabled true From 4a454f08176e20596c9e110c6f6fe952deb8064b Mon Sep 17 00:00:00 2001 From: fabianu Date: Sat, 20 Jun 2020 16:40:36 +0200 Subject: [PATCH 08/11] Added ANDROID_STUDIO as optional variable to specify android studio location. --- CONTRIBUTING.md | 6 +++++- tools/templates/configure.sh | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b36843adee..c647a46da9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,7 +19,11 @@ An Android Studio template has been added to the project to help creating all fi To install the template (to be done only once): - Go to folder `./tools/template`. -- Run the script `./configure.sh`. +- Mac OSX: Run the script `./configure.sh`. + + Linux: Run `ANDROID_STUDIO=/path/to/android-studio ./configure` + - e.g. `ANDROID_STUDIO=/usr/local/android-studio ./configure` + - Restart Android Studio. To create a new screen: diff --git a/tools/templates/configure.sh b/tools/templates/configure.sh index eb2aa0dbec..de7fe7da81 100755 --- a/tools/templates/configure.sh +++ b/tools/templates/configure.sh @@ -17,8 +17,9 @@ # echo "Configure RiotX Template..." +if [ -z ${ANDROID_STUDIO+x} ]; then ANDROID_STUDIO="/Applications/Android Studio.app/Contents"; fi { -ln -s $(pwd)/RiotXFeature /Applications/Android\ Studio.app/Contents/plugins/android/lib/templates/other +ln -s $(pwd)/RiotXFeature "${ANDROID_STUDIO%/}/plugins/android/lib/templates/other" } && { echo "Please restart Android Studio." } From 409b6b807e58c0c6e71405b38bf4deefe7ec16c3 Mon Sep 17 00:00:00 2001 From: "Sergio E. Nemirowski" Date: Sat, 20 Jun 2020 19:37:20 +0300 Subject: [PATCH 09/11] put F-Droid and GPlay badges locally this adds images for F-Droid and GPlay buttons for README.md Signed-off-by: Sergio E. Nemirowski --- README.md | 4 ++-- resources/img/f-droid-badge.png | Bin 0 -> 20220 bytes resources/img/google-play-badge.png | Bin 0 -> 17842 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 resources/img/f-droid-badge.png create mode 100644 resources/img/google-play-badge.png diff --git a/README.md b/README.md index b43bcf643c..251ee3e236 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ RiotX is an Android Matrix Client currently in beta but in active development. It is a total rewrite of [Riot-Android](https://github.com/vector-im/riot-android) with a new user experience. RiotX will become the official replacement as soon as all features are implemented. -[Get it on Google Play](https://play.google.com/store/apps/details?id=im.vector.riotx) -[Get it on F-Droid](https://f-droid.org/app/im.vector.riotx) +[Get it on Google Play](https://play.google.com/store/apps/details?id=im.vector.riotx) +[Get it on F-Droid](https://f-droid.org/app/im.vector.riotx) Nightly build: [![Buildkite](https://badge.buildkite.com/657d3db27364448d69d54f66c690f7788bc6aa80a7628e37f3.svg?branch=develop)](https://buildkite.com/matrix-dot-org/riotx-android/builds?branch=develop) diff --git a/resources/img/f-droid-badge.png b/resources/img/f-droid-badge.png new file mode 100644 index 0000000000000000000000000000000000000000..0fcd0eb5f8db9cdfd452bf22cc31efc51999bc3c GIT binary patch literal 20220 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 literal 0 HcmV?d00001 From af8ab57e60ecc09befd9d3231f2be5c22b5cbcb5 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 22 Jun 2020 09:14:59 +0200 Subject: [PATCH 10/11] Rename methods and variables for code clarity --- .../internal/crypto/gossiping/KeyShareTests.kt | 18 +++++++++--------- .../api/session/crypto/CryptoService.kt | 6 ++++-- .../internal/crypto/DefaultCryptoService.kt | 4 ++-- .../devtools/GossipingEventsEpoxyController.kt | 2 +- .../devtools/KeyRequestEpoxyController.kt | 2 +- .../devtools/KeyRequestListViewModel.kt | 8 ++++---- 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/internal/crypto/gossiping/KeyShareTests.kt b/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/internal/crypto/gossiping/KeyShareTests.kt index 57ab4aaf33..afcb8b1cbd 100644 --- a/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/internal/crypto/gossiping/KeyShareTests.kt +++ b/matrix-sdk-android/src/androidTest/java/im/vector/matrix/android/internal/crypto/gossiping/KeyShareTests.kt @@ -90,7 +90,7 @@ class KeyShareTests : InstrumentedTest { } catch (failure: Throwable) { } - val outgoingRequestBefore = aliceSession2.cryptoService().getOutgoingRoomKeyRequest() + val outgoingRequestsBefore = aliceSession2.cryptoService().getOutgoingRoomKeyRequests() // Try to request aliceSession2.cryptoService().requestRoomKeyForEvent(receivedEvent.root) @@ -100,10 +100,10 @@ class KeyShareTests : InstrumentedTest { var outGoingRequestId: String? = null mTestHelper.retryPeriodicallyWithLatch(waitLatch) { - aliceSession2.cryptoService().getOutgoingRoomKeyRequest() + aliceSession2.cryptoService().getOutgoingRoomKeyRequests() .filter { req -> // filter out request that was known before - !outgoingRequestBefore.any { req.requestId == it.requestId } + !outgoingRequestsBefore.any { req.requestId == it.requestId } } .let { val outgoing = it.firstOrNull { it.sessionId == eventMegolmSessionId } @@ -115,10 +115,10 @@ class KeyShareTests : InstrumentedTest { Log.v("TEST", "=======> Outgoing requet Id is $outGoingRequestId") - val outgoingRequestAfter = aliceSession2.cryptoService().getOutgoingRoomKeyRequest() + val outgoingRequestAfter = aliceSession2.cryptoService().getOutgoingRoomKeyRequests() // We should have a new request - Assert.assertTrue(outgoingRequestAfter.size > outgoingRequestBefore.size) + Assert.assertTrue(outgoingRequestAfter.size > outgoingRequestsBefore.size) Assert.assertNotNull(outgoingRequestAfter.first { it.sessionId == eventMegolmSessionId }) // The first session should see an incoming request @@ -126,7 +126,7 @@ class KeyShareTests : InstrumentedTest { mTestHelper.waitWithLatch { latch -> mTestHelper.retryPeriodicallyWithLatch(latch) { // DEBUG LOGS - aliceSession.cryptoService().getIncomingRoomKeyRequest().let { + aliceSession.cryptoService().getIncomingRoomKeyRequests().let { Log.v("TEST", "Incoming request Session 1 (looking for $outGoingRequestId)") Log.v("TEST", "=========================") it.forEach { keyRequest -> @@ -135,7 +135,7 @@ class KeyShareTests : InstrumentedTest { Log.v("TEST", "=========================") } - val incoming = aliceSession.cryptoService().getIncomingRoomKeyRequest().firstOrNull { it.requestId == outGoingRequestId } + val incoming = aliceSession.cryptoService().getIncomingRoomKeyRequests().firstOrNull { it.requestId == outGoingRequestId } incoming?.state == GossipingRequestState.REJECTED } } @@ -155,7 +155,7 @@ class KeyShareTests : InstrumentedTest { mTestHelper.waitWithLatch { latch -> mTestHelper.retryPeriodicallyWithLatch(latch) { - aliceSession.cryptoService().getIncomingRoomKeyRequest().let { + aliceSession.cryptoService().getIncomingRoomKeyRequests().let { Log.v("TEST", "Incoming request Session 1") Log.v("TEST", "=========================") it.forEach { @@ -171,7 +171,7 @@ class KeyShareTests : InstrumentedTest { Thread.sleep(6_000) mTestHelper.waitWithLatch { latch -> mTestHelper.retryPeriodicallyWithLatch(latch) { - aliceSession2.cryptoService().getOutgoingRoomKeyRequest().let { + aliceSession2.cryptoService().getOutgoingRoomKeyRequests().let { it.any { it.requestBody?.sessionId == eventMegolmSessionId && it.state == OutgoingGossipingRequestState.CANCELLED } } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/CryptoService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/CryptoService.kt index 2c96465313..69fc332453 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/CryptoService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/CryptoService.kt @@ -138,7 +138,9 @@ interface CryptoService { fun removeSessionListener(listener: NewSessionListener) - fun getOutgoingRoomKeyRequest(): List - fun getIncomingRoomKeyRequest(): List + fun getOutgoingRoomKeyRequests(): List + + fun getIncomingRoomKeyRequests(): List + fun getGossipingEventsTrail(): List } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt index 7badb26d8a..7b3a253287 100755 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt @@ -1262,11 +1262,11 @@ internal class DefaultCryptoService @Inject constructor( return "DefaultCryptoService of $userId ($deviceId)" } - override fun getOutgoingRoomKeyRequest(): List { + override fun getOutgoingRoomKeyRequests(): List { return cryptoStore.getOutgoingRoomKeyRequests() } - override fun getIncomingRoomKeyRequest(): List { + override fun getIncomingRoomKeyRequests(): List { return cryptoStore.getIncomingRoomKeyRequests() } diff --git a/vector/src/main/java/im/vector/riotx/features/settings/devtools/GossipingEventsEpoxyController.kt b/vector/src/main/java/im/vector/riotx/features/settings/devtools/GossipingEventsEpoxyController.kt index 8760f9ebb2..722115adf3 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/devtools/GossipingEventsEpoxyController.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/devtools/GossipingEventsEpoxyController.kt @@ -179,7 +179,7 @@ class GossipingEventsEpoxyController @Inject constructor( } private fun buildOutgoing(data: KeyRequestListViewState?) { - data?.outgoingRoomKeyRequest?.let { async -> + data?.outgoingRoomKeyRequests?.let { async -> when (async) { is Uninitialized, is Loading -> { diff --git a/vector/src/main/java/im/vector/riotx/features/settings/devtools/KeyRequestEpoxyController.kt b/vector/src/main/java/im/vector/riotx/features/settings/devtools/KeyRequestEpoxyController.kt index b5e1303d89..7721b67118 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/devtools/KeyRequestEpoxyController.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/devtools/KeyRequestEpoxyController.kt @@ -107,7 +107,7 @@ class KeyRequestEpoxyController @Inject constructor( } private fun buildOutgoing(data: KeyRequestListViewState?) { - data?.outgoingRoomKeyRequest?.let { async -> + data?.outgoingRoomKeyRequests?.let { async -> when (async) { is Uninitialized, is Loading -> { diff --git a/vector/src/main/java/im/vector/riotx/features/settings/devtools/KeyRequestListViewModel.kt b/vector/src/main/java/im/vector/riotx/features/settings/devtools/KeyRequestListViewModel.kt index 06d9ffcf7d..db4b4f7d60 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/devtools/KeyRequestListViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/devtools/KeyRequestListViewModel.kt @@ -36,7 +36,7 @@ import kotlinx.coroutines.launch data class KeyRequestListViewState( val incomingRequests: Async> = Uninitialized, - val outgoingRoomKeyRequest: Async> = Uninitialized + val outgoingRoomKeyRequests: Async> = Uninitialized ) : MvRxState class KeyRequestListViewModel @AssistedInject constructor(@Assisted initialState: KeyRequestListViewState, @@ -49,14 +49,14 @@ class KeyRequestListViewModel @AssistedInject constructor(@Assisted initialState fun refresh() { viewModelScope.launch { - session.cryptoService().getOutgoingRoomKeyRequest().let { + session.cryptoService().getOutgoingRoomKeyRequests().let { setState { copy( - outgoingRoomKeyRequest = Success(it) + outgoingRoomKeyRequests = Success(it) ) } } - session.cryptoService().getIncomingRoomKeyRequest().let { + session.cryptoService().getIncomingRoomKeyRequests().let { setState { copy( incomingRequests = Success(it) From 057c21f7d0a9ba3b3fd4514e1c87075c5630eca8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 22 Jun 2020 09:17:37 +0200 Subject: [PATCH 11/11] Incomplete predicate in RealmCryptoStore#getOutgoingRoomKeyRequest (#1519) --- CHANGES.md | 1 + .../android/internal/crypto/store/db/RealmCryptoStore.kt | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5a5b919087..bfea6c4742 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ Improvements 🙌: Bugfix 🐛: - Fix dark theme issue on login screen (#1097) + - Incomplete predicate in RealmCryptoStore#getOutgoingRoomKeyRequest (#1519) Translations 🗣: - diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt index 6af96f886d..a78ab70b72 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt @@ -897,9 +897,9 @@ internal class RealmCryptoStore @Inject constructor( it.toOutgoingGossipingRequest() as? OutgoingRoomKeyRequest }.firstOrNull { it.requestBody?.algorithm == requestBody.algorithm - it.requestBody?.roomId == requestBody.roomId - it.requestBody?.senderKey == requestBody.senderKey - it.requestBody?.sessionId == requestBody.sessionId + && it.requestBody?.roomId == requestBody.roomId + && it.requestBody?.senderKey == requestBody.senderKey + && it.requestBody?.sessionId == requestBody.sessionId } } @@ -1266,7 +1266,7 @@ internal class RealmCryptoStore @Inject constructor( deviceInfoEntity.trustLevelEntity = it } } else { - locallyVerified?.let { trustEntity.locallyVerified = it } + locallyVerified?.let { trustEntity.locallyVerified = it } trustEntity.crossSignedVerified = crossSignedVerified } }