diff --git a/CHANGES.md b/CHANGES.md index 46a83b881c..bfea6c4742 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,10 +5,11 @@ Features ✨: - Improvements 🙌: - - + - "Add Matrix app" menu is now always visible (#1495) Bugfix 🐛: - - + - Fix dark theme issue on login screen (#1097) + - Incomplete predicate in RealmCryptoStore#getOutgoingRoomKeyRequest (#1519) Translations 🗣: - @@ -18,6 +19,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/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/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/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/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/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 d930a335d3..3977a4c474 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 @@ -32,6 +32,9 @@ private val DEFINED_TYPES by lazy { ) } +/** + * 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") 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/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 } } diff --git a/resources/img/f-droid-badge.png b/resources/img/f-droid-badge.png new file mode 100644 index 0000000000..0fcd0eb5f8 Binary files /dev/null and b/resources/img/f-droid-badge.png differ diff --git a/resources/img/google-play-badge.png b/resources/img/google-play-badge.png new file mode 100644 index 0000000000..9499b2dca0 Binary files /dev/null and b/resources/img/google-play-badge.png differ 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." } 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 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 e402433cef..c890ce212b 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 @@ -315,7 +315,7 @@ class RoomDetailFragment @Inject constructor( is RoomDetailViewEvents.SendMessageResult -> renderSendMessageResult(it) RoomDetailViewEvents.DisplayPromptForIntegrationManager -> displayPromptForIntegrationManager() is RoomDetailViewEvents.OpenStickerPicker -> openStickerPicker(it) - is RoomDetailViewEvents.DisplayEnableIntegrationsWarning -> displayEnableIntegrationsWarning() + is RoomDetailViewEvents.DisplayEnableIntegrationsWarning -> displayDisabledIntegrationDialog() is RoomDetailViewEvents.OpenIntegrationManager -> openIntegrationManager() }.exhaustive } @@ -354,17 +354,6 @@ class RoomDetailFragment @Inject constructor( .show() } - private fun displayEnableIntegrationsWarning() { - AlertDialog.Builder(requireContext()) - .setTitle(R.string.integration_manager_not_enabled_title) - .setMessage(R.string.integration_manager_not_enabled_msg) - .setPositiveButton(R.string.open_settings) { _, _ -> - navigator.openSettings(requireContext(), VectorSettingsActivity.EXTRA_DIRECT_ACCESS_GENERAL) - } - .setNegativeButton(R.string.cancel, null) - .show() - } - private fun handleJoinedToAnotherRoom(action: RoomDetailViewEvents.JoinRoomCommandSuccess) { updateComposerText("") lockSendButton = false @@ -496,6 +485,17 @@ class RoomDetailFragment @Inject constructor( } } + 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/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/settings/VectorSettingsActivity.kt b/vector/src/main/java/im/vector/riotx/features/settings/VectorSettingsActivity.kt index 3a41318619..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,7 +59,7 @@ class VectorSettingsActivity : VectorBaseActivity(), if (isFirstCreation()) { // display the fragment when (intent.getIntExtra(EXTRA_DIRECT_ACCESS, EXTRA_DIRECT_ACCESS_ROOT)) { - EXTRA_DIRECT_ACCESS_GENERAL -> + 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) 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) 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) } } 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/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/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" /> - + tools:visibility="visible"> + + + + \ No newline at end of file diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 8b5f996f37..a4afce0ac5 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 @@ -1162,8 +1165,6 @@ Read DRM protected Media - Integrations are disabled - Enable integrations in settings to allow this action. Unable to create widget. Failed to send request. 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 @@ + + + + + + + + + + - - - - - - - - - -