diff --git a/CHANGES.md b/CHANGES.md index e15b271a20..e5c0a9727e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ Features ✨: Improvements 🙌: - VoIP : new tiles in timeline + - Upgrade Jitsi library from 2.9.3 to 3.1.0 Bugfix 🐛: - VoIP : fix audio devices output diff --git a/build.gradle b/build.gradle index 625ed348be..3da87093ec 100644 --- a/build.gradle +++ b/build.gradle @@ -58,9 +58,9 @@ allprojects { maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } // Jitsi repo maven { - url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-2.9.3" + url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-3.1.0" // Note: to test Jitsi release you can use a local file like this: - // url "file:///Users/bmarty/workspaces/jitsi_libre_maven/android-sdk-2.9.3" + // url "file:///Users/bmarty/workspaces/jitsi_libre_maven/android-sdk-3.1.0" } google() jcenter() diff --git a/docs/jitsi.md b/docs/jitsi.md index 071470b040..389e7d71ec 100644 --- a/docs/jitsi.md +++ b/docs/jitsi.md @@ -18,7 +18,7 @@ The generated maven repository is then host in the project https://github.com/ve Update the script `./tools/jitsi/build_jisti_libs.sh` with the tag of the project `https://github.com/jitsi/jitsi-meet`. -Currently we are building the version with the tag `android-sdk-2.9.3`. +Currently we are building the version with the tag `android-sdk-3.1.0`. ### Run the build script @@ -35,21 +35,21 @@ It will build the Jitsi Meet Android library and put every generated files in th - Update the file `./build.gradle` to use the previously created local Maven repository. Currently we have this line: ```groovy -url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-2.9.3" +url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-3.1.0" ``` You can uncomment and update the line starting with `// url "file://...` and comment the line starting with `url`, to test the library using the locally generated Maven repository. -- Update the dependency of the WebRTC library in the file `./matrix-sdk-android/build.gradle`. Currently we have this line: - -```groovy -implementation('com.facebook.react:react-native-webrtc:1.84.0-jitsi-5112273@aar') -``` - - Update the dependency of the Jitsi Meet library in the file `./vector/build.gradle`. Currently we have this line: ```groovy -implementation('org.jitsi.react:jitsi-meet-sdk:2.9.3') { transitive = true } +implementation('org.jitsi.react:jitsi-meet-sdk:3.1.0') +``` + +- Update the dependency of the WebRTC library in the file `./vector/build.gradle`. Currently we have this line: + +```groovy +implementation('com.facebook.react:react-native-webrtc:1.87.3-jitsi-6624067@aar') ``` - Perform a gradle sync and build the project @@ -74,9 +74,9 @@ If all the tests are passed, you can export the generated Jitsi library to our M - Update the file `./build.gradle` to use the previously created Maven repository. Currently we have this line: ```groovy -url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-2.9.3" +url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-3.1.0" ``` - Build the project and perform the sanity tests again. -- Update the file `/CANGES.md` to notify about the library upgrade, and create a regular PR for project Element Android. \ No newline at end of file +- Update the file `/CHANGES.md` to notify about the library upgrade, and create a regular PR for project Element Android. \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/WidgetService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/WidgetService.kt index 0310a3d001..bf3ff8959d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/WidgetService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/WidgetService.kt @@ -56,6 +56,11 @@ interface WidgetService { excludedTypes: Set? = null ): List + /** + * Return the computed URL of a widget + */ + fun getWidgetComputedUrl(widget: Widget, isLightTheme: Boolean): String? + /** * Returns the live room widgets so you can listen to them. * Some widgets can be deactivated, so be sure to check for isActive. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/model/Widget.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/model/Widget.kt index c8465d4d2e..86aaba7f6f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/model/Widget.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/model/Widget.kt @@ -25,7 +25,6 @@ data class Widget( val widgetId: String, val senderInfo: SenderInfo?, val isAddedByMe: Boolean, - val computedUrl: String?, val type: WidgetType ) { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt index ebd57ce657..19a87103f4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt @@ -37,7 +37,6 @@ import org.matrix.android.sdk.internal.session.user.accountdata.AccountDataDataS import org.matrix.android.sdk.internal.session.user.accountdata.UpdateUserAccountDataTask import org.matrix.android.sdk.internal.session.widgets.helper.WidgetFactory import org.matrix.android.sdk.internal.session.widgets.helper.extractWidgetSequence -import org.matrix.android.sdk.internal.task.TaskExecutor import timber.log.Timber import javax.inject.Inject @@ -55,7 +54,6 @@ import javax.inject.Inject */ @SessionScope internal class IntegrationManager @Inject constructor(matrixConfiguration: MatrixConfiguration, - private val taskExecutor: TaskExecutor, @SessionDatabase private val monarchy: Monarchy, private val updateUserAccountDataTask: UpdateUserAccountDataTask, private val accountDataDataSource: AccountDataDataSource, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt index 3e4e430e3b..9f5a9360ee 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt @@ -50,6 +50,10 @@ internal class DefaultWidgetService @Inject constructor(private val widgetManage return widgetManager.getRoomWidgets(roomId, widgetId, widgetTypes, excludedTypes) } + override fun getWidgetComputedUrl(widget: Widget, isLightTheme: Boolean): String? { + return widgetManager.getWidgetComputedUrl(widget, isLightTheme) + } + override fun getRoomWidgetsLive( roomId: String, widgetId: QueryStringValue, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt index 329903f15b..f841a2a245 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt @@ -104,6 +104,10 @@ internal class WidgetManager @Inject constructor(private val integrationManager: return widgetEvents.mapEventsToWidgets(widgetTypes, excludedTypes) } + fun getWidgetComputedUrl(widget: Widget, isLightTheme: Boolean): String? { + return widgetFactory.computeURL(widget, isLightTheme) + } + private fun List.mapEventsToWidgets(widgetTypes: Set? = null, excludedTypes: Set? = null): List { val widgetEvents = this diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt index 702e424218..a469a9fe97 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt @@ -16,6 +16,7 @@ package org.matrix.android.sdk.internal.session.widgets.helper +import org.matrix.android.sdk.api.session.content.ContentUrlResolver import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.sender.SenderInfo @@ -31,6 +32,7 @@ import javax.inject.Inject internal class WidgetFactory @Inject constructor(private val userDataSource: UserDataSource, private val realmSessionProvider: RealmSessionProvider, + private val urlResolver: ContentUrlResolver, @UserId private val userId: String) { fun create(widgetEvent: Event): Widget? { @@ -53,30 +55,29 @@ internal class WidgetFactory @Inject constructor(private val userDataSource: Use } } val isAddedByMe = widgetEvent.senderId == userId - val computedUrl = widgetContent.computeURL(widgetEvent.roomId, widgetId) return Widget( widgetContent = widgetContent, event = widgetEvent, widgetId = widgetId, senderInfo = senderInfo, isAddedByMe = isAddedByMe, - computedUrl = computedUrl, type = WidgetType.fromString(type) ) } // Ref: https://github.com/matrix-org/matrix-widget-api/blob/master/src/templating/url-template.ts#L29-L33 - private fun WidgetContent.computeURL(roomId: String?, widgetId: String): String? { - var computedUrl = url ?: return null + fun computeURL(widget: Widget, isLightTheme: Boolean): String? { + var computedUrl = widget.widgetContent.url ?: return null val myUser = userDataSource.getUser(userId) - val keyValue = data.mapKeys { "\$${it.key}" }.toMutableMap() + val keyValue = widget.widgetContent.data.mapKeys { "\$${it.key}" }.toMutableMap() keyValue[WIDGET_PATTERN_MATRIX_USER_ID] = userId keyValue[WIDGET_PATTERN_MATRIX_DISPLAY_NAME] = myUser?.getBestName() ?: userId - keyValue[WIDGET_PATTERN_MATRIX_AVATAR_URL] = myUser?.avatarUrl ?: "" - keyValue[WIDGET_PATTERN_MATRIX_WIDGET_ID] = widgetId - keyValue[WIDGET_PATTERN_MATRIX_ROOM_ID] = roomId ?: "" + keyValue[WIDGET_PATTERN_MATRIX_AVATAR_URL] = urlResolver.resolveFullSize(myUser?.avatarUrl) ?: "" + keyValue[WIDGET_PATTERN_MATRIX_WIDGET_ID] = widget.widgetId + keyValue[WIDGET_PATTERN_MATRIX_ROOM_ID] = widget.event.roomId ?: "" + keyValue[WIDGET_PATTERN_THEME] = getTheme(isLightTheme) for ((key, value) in keyValue) { computedUrl = computedUrl.replace(key, URLEncoder.encode(value.toString(), "utf-8")) @@ -84,6 +85,10 @@ internal class WidgetFactory @Inject constructor(private val userDataSource: Use return computedUrl } + private fun getTheme(isLightTheme: Boolean): String { + return if (isLightTheme) "light" else "dark" + } + companion object { // Value to be replaced in URLS const val WIDGET_PATTERN_MATRIX_USER_ID = "\$matrix_user_id" @@ -91,5 +96,6 @@ internal class WidgetFactory @Inject constructor(private val userDataSource: Use const val WIDGET_PATTERN_MATRIX_AVATAR_URL = "\$matrix_avatar_url" const val WIDGET_PATTERN_MATRIX_WIDGET_ID = "\$matrix_widget_id" const val WIDGET_PATTERN_MATRIX_ROOM_ID = "\$matrix_room_id" + const val WIDGET_PATTERN_THEME = "\$theme" } } diff --git a/tools/jitsi/build_jisti_libs.sh b/tools/jitsi/build_jisti_libs.sh index 1341a87d10..34051d463c 100755 --- a/tools/jitsi/build_jisti_libs.sh +++ b/tools/jitsi/build_jisti_libs.sh @@ -25,8 +25,8 @@ cd jitsi-meet # This is commit after version 2.2.2, which does not compile # git checkout 5a934c071a5cbe64de275a25d0ed62d8193cdd03 -# Version android-sdk-2.9.3, commit abcbbbea12e3ef88012b14723bb8cd42dbefc988 -git checkout android-sdk-2.9.3 +# Version android-sdk-3.1.0, commit 7a64bf006ea027b77564d8847570e1ac46ff0ec0 +git checkout android-sdk-3.1.0 echo echo "##################################################" diff --git a/vector/build.gradle b/vector/build.gradle index 770bd728d7..cc4efb4590 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -435,7 +435,10 @@ dependencies { // WebRTC // org.webrtc:google-webrtc is for development purposes only // implementation 'org.webrtc:google-webrtc:1.0.+' - implementation('org.jitsi.react:jitsi-meet-sdk:2.9.3') { transitive = true } + implementation('com.facebook.react:react-native-webrtc:1.87.3-jitsi-6624067@aar') + + // Jitsi + implementation('org.jitsi.react:jitsi-meet-sdk:3.1.0') // QR-code // Stick to 3.3.3 because of https://github.com/zxing/zxing/issues/1170 diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml index c14eb1045c..6af3ea6733 100644 --- a/vector/src/main/AndroidManifest.xml +++ b/vector/src/main/AndroidManifest.xml @@ -36,6 +36,9 @@ android:name="android.permission.WRITE_CALENDAR" tools:node="remove" /> + + + (initialState) { @AssistedFactory @@ -45,6 +46,8 @@ class JitsiCallViewModel @AssistedInject constructor( fun create(initialState: JitsiCallViewState, args: VectorJitsiActivity.Args): JitsiCallViewModel } + private val widgetService = session.widgetService() + init { val me = session.getRoomMember(session.myUserId, args.roomId)?.toMatrixItem() val userInfo = JitsiMeetUserInfo().apply { @@ -57,13 +60,14 @@ class JitsiCallViewModel @AssistedInject constructor( copy(userInfo = userInfo) } - session.widgetService().getRoomWidgetsLive(args.roomId, QueryStringValue.Equals(args.widgetId), WidgetType.Jitsi.values()) + widgetService.getRoomWidgetsLive(args.roomId, QueryStringValue.Equals(args.widgetId), WidgetType.Jitsi.values()) .asObservable() .distinctUntilChanged() .subscribe { val jitsiWidget = it.firstOrNull() if (jitsiWidget != null) { - val ppt = jitsiWidget.computedUrl?.let { url -> JitsiWidgetProperties(url, stringProvider) } + val ppt = widgetService.getWidgetComputedUrl(jitsiWidget, themeProvider.isLightTheme()) + ?.let { url -> jitsiMeetPropertiesFactory.create(url) } setState { copy( widget = Success(jitsiWidget), diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiWidgetProperties.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiWidgetProperties.kt index 46e2e68dd6..ed63f723c8 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/JitsiWidgetProperties.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiWidgetProperties.kt @@ -16,25 +16,9 @@ package im.vector.app.features.call.conference -import android.net.Uri -import im.vector.app.R -import im.vector.app.core.resources.StringProvider -import java.net.URLDecoder - -class JitsiWidgetProperties(private val uriString: String, val stringProvider: StringProvider) { - val domain: String by lazy { configs["conferenceDomain"] ?: stringProvider.getString(R.string.preferred_jitsi_domain) } - val confId: String? by lazy { configs["conferenceId"] } - val displayName: String? by lazy { configs["displayName"] } - val avatarUrl: String? by lazy { configs["avatarUrl"] } - - private val configString: String? by lazy { Uri.parse(uriString).fragment } - - private val configs: Map by lazy { - configString?.split("&") - ?.map { it.split("=") } - ?.filter { it.size == 2 } - ?.map { (key, value) -> key to URLDecoder.decode(value, "UTF-8") } - ?.toMap() - .orEmpty() - } -} +data class JitsiWidgetProperties( + val domain: String, + val confId: String?, + val displayName: String?, + val avatarUrl: String? +) diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiWidgetPropertiesFactory.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiWidgetPropertiesFactory.kt new file mode 100644 index 0000000000..8014e01fb2 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiWidgetPropertiesFactory.kt @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2021 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 im.vector.app.features.call.conference + +import android.net.Uri +import im.vector.app.R +import im.vector.app.core.resources.StringProvider +import org.matrix.android.sdk.api.extensions.tryOrNull +import java.net.URLDecoder +import javax.inject.Inject + +class JitsiWidgetPropertiesFactory @Inject constructor( + private val stringProvider: StringProvider +) { + fun create(url: String): JitsiWidgetProperties { + val configString = tryOrNull { Uri.parse(url) }?.fragment + + val configs = configString?.split("&") + ?.map { it.split("=") } + ?.filter { it.size == 2 } + ?.map { (key, value) -> key to URLDecoder.decode(value, "UTF-8") } + ?.toMap() + .orEmpty() + + return JitsiWidgetProperties( + domain = configs["conferenceDomain"] ?: stringProvider.getString(R.string.preferred_jitsi_domain), + confId = configs["conferenceId"], + displayName = configs["displayName"], + avatarUrl = configs["avatarUrl"] + ) + } +} diff --git a/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt b/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt index 4851afaed0..caece858aa 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt @@ -16,12 +16,15 @@ package im.vector.app.features.call.conference +import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.content.IntentFilter import android.os.Bundle import android.os.Parcelable import android.widget.FrameLayout import androidx.core.view.isVisible +import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.airbnb.mvrx.Fail import com.airbnb.mvrx.MvRx import com.airbnb.mvrx.Success @@ -31,17 +34,17 @@ import im.vector.app.core.di.ScreenComponent import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.databinding.ActivityJitsiBinding import kotlinx.parcelize.Parcelize +import org.jitsi.meet.sdk.BroadcastEvent import org.jitsi.meet.sdk.JitsiMeetActivityDelegate import org.jitsi.meet.sdk.JitsiMeetActivityInterface import org.jitsi.meet.sdk.JitsiMeetConferenceOptions import org.jitsi.meet.sdk.JitsiMeetView -import org.jitsi.meet.sdk.JitsiMeetViewListener import org.matrix.android.sdk.api.extensions.tryOrNull import timber.log.Timber import java.net.URL import javax.inject.Inject -class VectorJitsiActivity : VectorBaseActivity(), JitsiMeetActivityInterface, JitsiMeetViewListener { +class VectorJitsiActivity : VectorBaseActivity(), JitsiMeetActivityInterface { @Parcelize data class Args( @@ -63,12 +66,21 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee injector.inject(this) } + // See https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-android-sdk#listening-for-broadcasted-events + private val broadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + intent?.let { onBroadcastReceived(it) } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) jitsiViewModel.subscribe(this) { renderState(it) } + + registerForBroadcastMessages() } override fun initUiAndData() { @@ -76,7 +88,6 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee jitsiMeetView = JitsiMeetView(this) val params = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) views.jitsiLayout.addView(jitsiMeetView, params) - jitsiMeetView?.listener = this } private fun renderState(viewState: JitsiCallViewState) { @@ -132,6 +143,7 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee override fun onDestroy() { JitsiMeetActivityDelegate.onHostDestroy(this) + unregisterForBroadcastMessages() super.onDestroy() } @@ -154,20 +166,37 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults) } - override fun onConferenceTerminated(p0: MutableMap?) { - Timber.v("JitsiMeetViewListener.onConferenceTerminated()") - // Do not finish if there is an error - if (p0?.get("error") == null) { - finish() + private fun registerForBroadcastMessages() { + val intentFilter = IntentFilter() + for (type in BroadcastEvent.Type.values()) { + intentFilter.addAction(type.action) + } + tryOrNull("Unable to register receiver") { + LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter) } } - override fun onConferenceJoined(p0: MutableMap?) { - Timber.v("JitsiMeetViewListener.onConferenceJoined()") + private fun unregisterForBroadcastMessages() { + tryOrNull("Unable to unregister receiver") { + LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver) + } } - override fun onConferenceWillJoin(p0: MutableMap?) { - Timber.v("JitsiMeetViewListener.onConferenceWillJoin()") + private fun onBroadcastReceived(intent: Intent) { + val event = BroadcastEvent(intent) + Timber.v("Broadcast received: ${event.type}") + when (event.type) { + BroadcastEvent.Type.CONFERENCE_TERMINATED -> onConferenceTerminated(event.data) + else -> Unit + } + } + + private fun onConferenceTerminated(data: Map) { + Timber.v("JitsiMeetViewListener.onConferenceTerminated()") + // Do not finish if there is an error + if (data["error"] == null) { + finish() + } } companion object { diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt index 40b4e7469d..c72d7c8a76 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt @@ -476,7 +476,6 @@ class WebRtcCall(val mxCall: MxCall, if (camera != null) { val videoCapturer = cameraIterator.createCapturer(camera.name, object : CameraEventsHandlerAdapter() { - override fun onFirstFrameAvailable() { super.onFirstFrameAvailable() videoCapturerIsInError = false @@ -490,7 +489,6 @@ class WebRtcCall(val mxCall: MxCall, videoCapturerIsInError = true val cameraManager = context.getSystemService() cameraAvailabilityCallback = object : CameraManager.AvailabilityCallback() { - override fun onCameraUnavailable(cameraId: String) { super.onCameraUnavailable(cameraId) Timber.v("On camera unavailable: $cameraId") diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/sticker/StickerPickerActionHandler.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/sticker/StickerPickerActionHandler.kt index d24b41ffb0..5039459c0c 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/sticker/StickerPickerActionHandler.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/sticker/StickerPickerActionHandler.kt @@ -32,7 +32,7 @@ class StickerPickerActionHandler @Inject constructor(private val session: Sessio return@withContext RoomDetailViewEvents.DisplayEnableIntegrationsWarning } val stickerWidget = session.widgetService().getUserWidgets(WidgetType.StickerPicker.values()).firstOrNull { it.isActive } - if (stickerWidget == null || stickerWidget.computedUrl.isNullOrBlank()) { + if (stickerWidget == null || stickerWidget.widgetContent.url.isNullOrBlank()) { RoomDetailViewEvents.DisplayPromptForIntegrationManager } else { RoomDetailViewEvents.OpenStickerPicker( diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetItem.kt index 33a6f627a1..662f11e7c2 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetItem.kt @@ -43,7 +43,7 @@ abstract class RoomWidgetItem : EpoxyModelWithHolder() { override fun bind(holder: Holder) { super.bind(holder) holder.widgetName.text = widget.name - holder.widgetUrl.text = tryOrNull { URL(widget.computedUrl) }?.host ?: widget.computedUrl + holder.widgetUrl.text = tryOrNull { URL(widget.widgetContent.url) }?.host ?: widget.widgetContent.url if (iconRes != null) { holder.iconImage.isVisible = true holder.iconImage.setImageResource(iconRes!!) diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt index 159bb1eead..d130512611 100644 --- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt +++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt @@ -19,9 +19,11 @@ package im.vector.app.features.navigation import android.app.Activity import android.content.Context import android.content.Intent +import android.os.Build import android.view.View import android.view.Window import androidx.activity.result.ActivityResultLauncher +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityOptionsCompat import androidx.core.app.TaskStackBuilder @@ -298,8 +300,17 @@ class DefaultNavigator @Inject constructor( override fun openRoomWidget(context: Context, roomId: String, widget: Widget, options: Map?) { if (widget.type is WidgetType.Jitsi) { - val enableVideo = options?.get(JitsiCallViewModel.ENABLE_VIDEO_OPTION) == true - context.startActivity(VectorJitsiActivity.newIntent(context, roomId = roomId, widgetId = widget.widgetId, enableVideo = enableVideo)) + // Jitsi SDK is now for API 23+ + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + AlertDialog.Builder(context) + .setTitle(R.string.dialog_title_error) + .setMessage(R.string.error_jitsi_not_supported_on_old_device) + .setPositiveButton(R.string.ok, null) + .show() + } else { + val enableVideo = options?.get(JitsiCallViewModel.ENABLE_VIDEO_OPTION) == true + context.startActivity(VectorJitsiActivity.newIntent(context, roomId = roomId, widgetId = widget.widgetId, enableVideo = enableVideo)) + } } else { val widgetArgs = widgetArgsBuilder.buildRoomWidgetArgs(roomId, widget) context.startActivity(WidgetActivity.newIntent(context, widgetArgs)) diff --git a/vector/src/main/java/im/vector/app/features/themes/ThemeProvider.kt b/vector/src/main/java/im/vector/app/features/themes/ThemeProvider.kt new file mode 100644 index 0000000000..77245dc4a0 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/themes/ThemeProvider.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 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 im.vector.app.features.themes + +import android.content.Context +import javax.inject.Inject + +/** + * Injectable class to encapsulate ThemeUtils call... + */ +class ThemeProvider @Inject constructor( + private val context: Context +) { + fun isLightTheme() = ThemeUtils.isLightTheme(context) +} diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetArgsBuilder.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetArgsBuilder.kt index 7c7424df8c..38914478e3 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/WidgetArgsBuilder.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetArgsBuilder.kt @@ -16,15 +16,14 @@ package im.vector.app.features.widgets -import android.content.Context import im.vector.app.core.di.ActiveSessionHolder -import im.vector.app.features.themes.ThemeUtils +import im.vector.app.features.themes.ThemeProvider import org.matrix.android.sdk.api.session.widgets.model.Widget import javax.inject.Inject class WidgetArgsBuilder @Inject constructor( private val sessionHolder: ActiveSessionHolder, - private val context: Context + private val themeProvider: ThemeProvider ) { @Suppress("UNCHECKED_CAST") @@ -52,7 +51,8 @@ class WidgetArgsBuilder @Inject constructor( @Suppress("UNCHECKED_CAST") fun buildStickerPickerArgs(roomId: String, widget: Widget): WidgetArgs { val widgetId = widget.widgetId - val baseUrl = widget.computedUrl ?: throw IllegalStateException() + val baseUrl = sessionHolder.getActiveSession().widgetService() + .getWidgetComputedUrl(widget, themeProvider.isLightTheme()) ?: throw IllegalStateException() return WidgetArgs( baseUrl = baseUrl, kind = WidgetKind.STICKER_PICKER, @@ -68,15 +68,13 @@ class WidgetArgsBuilder @Inject constructor( fun buildRoomWidgetArgs(roomId: String, widget: Widget): WidgetArgs { val widgetId = widget.widgetId - val baseUrl = widget.computedUrl ?: throw IllegalStateException() + val baseUrl = sessionHolder.getActiveSession().widgetService() + .getWidgetComputedUrl(widget, themeProvider.isLightTheme()) ?: throw IllegalStateException() return WidgetArgs( baseUrl = baseUrl, kind = WidgetKind.ROOM, roomId = roomId, - widgetId = widgetId, - urlParams = mapOf( - "theme" to getTheme() - ).filterNotNull() + widgetId = widgetId ) } @@ -86,7 +84,7 @@ class WidgetArgsBuilder @Inject constructor( } private fun getTheme(): String { - return if (ThemeUtils.isLightTheme(context)) { + return if (themeProvider.isLightTheme()) { "light" } else { "dark" diff --git a/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt b/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt index 3accc56680..844a6619b4 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt @@ -27,6 +27,7 @@ import im.vector.app.R import im.vector.app.core.platform.VectorViewModel import kotlinx.coroutines.launch import org.matrix.android.sdk.api.extensions.orFalse +import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.widgets.model.WidgetType @@ -52,11 +53,7 @@ class RoomWidgetPermissionViewModel @AssistedInject constructor(@Assisted val in .filter { it.isNotEmpty() } .map { val widget = it.first() - val domain = try { - URL(widget.computedUrl).host - } catch (e: Throwable) { - null - } + val domain = tryOrNull { URL(widget.widgetContent.url) }?.host // TODO check from widget urls the perms that should be shown? // For now put all if (widget.type == WidgetType.Jitsi) { diff --git a/vector/src/main/res/values-bg/strings.xml b/vector/src/main/res/values-bg/strings.xml index bd2d0abf88..78cc743989 100644 --- a/vector/src/main/res/values-bg/strings.xml +++ b/vector/src/main/res/values-bg/strings.xml @@ -1103,7 +1103,7 @@ Нова покана Аз ** Неуспешно изпращане - моля, отворете стаята - Извиняваме се, но конферентни разговори с Jitsi не се поддържат на стари устройства (устройства с Android OS под 5.0) + Извиняваме се, но конферентни разговори с Jitsi не се поддържат на стари устройства (устройства с Android OS под 6.0) Удостоверяване на устройство Влез с единично вписване неизвестен IP адрес diff --git a/vector/src/main/res/values-bn-rIN/strings.xml b/vector/src/main/res/values-bn-rIN/strings.xml index a32b20bada..afb13b26f0 100644 --- a/vector/src/main/res/values-bn-rIN/strings.xml +++ b/vector/src/main/res/values-bn-rIN/strings.xml @@ -1026,7 +1026,7 @@ %d টা সক্রিয় উইজেট - দুঃখিত, জিটসির সাথে কনফারেন্স কলগুলি পুরোনো ডিভাইসগুলিতে সমর্থিত নয় (৫.০ এর নীচে এন্ড্রোইড অপারেটিং সিস্টেম সহ ডিভাইসগুলি) + দুঃখিত, জিটসির সাথে কনফারেন্স কলগুলি পুরোনো ডিভাইসগুলিতে সমর্থিত নয় (৬.০ এর নীচে এন্ড্রোইড অপারেটিং সিস্টেম সহ ডিভাইসগুলি) উইজেট তৈরি করতে অক্ষম। অনুরোধ পাঠাতে ব্যর্থ। diff --git a/vector/src/main/res/values-ca/strings.xml b/vector/src/main/res/values-ca/strings.xml index c7600d0cb1..12c3eaada7 100644 --- a/vector/src/main/res/values-ca/strings.xml +++ b/vector/src/main/res/values-ca/strings.xml @@ -1164,7 +1164,7 @@ Nova invitació Jo ** No s\'ha pogut enviar - si us plau, obre la sala - Ho sentim, les videoconferències amb Jitsi no són compatibles amb dispositius antics (dispositius amb Android inferior a 5.0) + Ho sentim, les videoconferències amb Jitsi no són compatibles amb dispositius antics (dispositius amb Android inferior a 6.0) No has configurat cap gestor d\'integracions. Una nova sessió està sol·licitant claus de xifrat. \nNom de la sessió: %1$s diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index 1b467817c8..37abcd51a0 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -975,7 +975,7 @@ Váš motiv ID widgetu ID místnosti - Promiňte, konferenční hovory s Jitsi nejsou podporovány na starších zařízeních (zařízení s Androidem nižším než 5.0) + Promiňte, konferenční hovory s Jitsi nejsou podporovány na starších zařízeních (zařízení s Androidem nižším než 6.0) Widget si žádá použití následujících zdrojů: Povolit Zamítnout vše diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml index 662dbab4fd..018cb068ca 100644 --- a/vector/src/main/res/values-de/strings.xml +++ b/vector/src/main/res/values-de/strings.xml @@ -1155,7 +1155,7 @@ Neue Einladung Ich ** Fehler beim Senden - bitte Raum öffnen - Entschuldigung, Konferenzanrufe mit Jitsi werden auf älteren Geräten (mit älteren Android-Versionen als 5.0) nicht unterstützt + Entschuldigung, Konferenzanrufe mit Jitsi werden auf älteren Geräten (mit älteren Android-Versionen als 6.0) nicht unterstützt Sitzung verifizieren Unbekannte IP-Adresse Eine neue Sitzung fordert Verschlüsselungsschlüssel an. diff --git a/vector/src/main/res/values-eo/strings.xml b/vector/src/main/res/values-eo/strings.xml index 4037664fc3..776dbdf076 100644 --- a/vector/src/main/res/values-eo/strings.xml +++ b/vector/src/main/res/values-eo/strings.xml @@ -1212,7 +1212,7 @@ Ĉion bloki Permesi Ĉi tiu fenestraĵo volas uzi la jenajn rimedojn: - Pardonu, grupaj vokoj ne estas subtenataj sur malnovaj aparatoj (Android je versio sub 5.0) + Pardonu, grupaj vokoj ne estas subtenataj sur malnovaj aparatoj (Android je versio sub 6.0) Identigilo de ĉambro Identigilo de fenestraĵo Via haŭto diff --git a/vector/src/main/res/values-es/strings.xml b/vector/src/main/res/values-es/strings.xml index 2743a71664..1b378c8187 100644 --- a/vector/src/main/res/values-es/strings.xml +++ b/vector/src/main/res/values-es/strings.xml @@ -1040,7 +1040,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Nueva invitación Yo ** Error al enviar - por favor abra la sala - Lo sentimos, las llamadas de grupo con Jitsi no están soportadas en dispositivos antiguos (dispositivos con Android inferior a 5.0) + Lo sentimos, las llamadas de grupo con Jitsi no están soportadas en dispositivos antiguos (dispositivos con Android inferior a 6.0) Iniciar la cámara del sistema en lugar de la pantalla de cámara personalizada. Esta opción requiere una aplicación de terceros para grabar los mensajes. El comando \"%s\" necesita mas parámetros o algunos parámetros son incorrectos. diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml index b350f22f23..c5e8b3d550 100644 --- a/vector/src/main/res/values-et/strings.xml +++ b/vector/src/main/res/values-et/strings.xml @@ -1020,7 +1020,7 @@ %1$s: %2$s %1$s: %2$s %3$s Otsi ajaloost - Vabandust, aga rühmakõned Jitsi vahendusel ei ole vanades seadmetes toetatud (Androidi versioon alla 5.0) + Vabandust, aga rühmakõned Jitsi vahendusel ei ole vanades seadmetes toetatud (Androidi versioon alla 6.0) See vidin soovib kasutada järgmisi andmeid: Luba Ära luba mitte midagi diff --git a/vector/src/main/res/values-eu/strings.xml b/vector/src/main/res/values-eu/strings.xml index f77ea9dc37..cf14fee03f 100644 --- a/vector/src/main/res/values-eu/strings.xml +++ b/vector/src/main/res/values-eu/strings.xml @@ -1338,7 +1338,7 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. Ni ** Bidalketak huts egin du, ireki gela - Sentitzen dugu, gailu zaharretan ezin dira Jitsi bidezko konferentzia deiak egin (Android OS 5.0 baino zaharragoak) + Sentitzen dugu, gailu zaharretan ezin dira Jitsi bidezko konferentzia deiak egin (Android OS 6.0 baino zaharragoak) Egiaztatu saioa diff --git a/vector/src/main/res/values-fi/strings.xml b/vector/src/main/res/values-fi/strings.xml index 97b66322c9..3b945069f7 100644 --- a/vector/src/main/res/values-fi/strings.xml +++ b/vector/src/main/res/values-fi/strings.xml @@ -1171,7 +1171,7 @@ Uusi kutsu Minä ** Lähetys epäonnistui — avaathan huoneen - Valitettavasti konferenssipuhelut Jitsin kanssa eivät toimi vanhoissa laitteissa (laitteet, joissa on Android 5.0 tai vanhempi) + Valitettavasti konferenssipuhelut Jitsin kanssa eivät toimi vanhoissa laitteissa (laitteet, joissa on Android 6.0 tai vanhempi) tuntematon IP-osoite Uusi istunto pyytää salausavaimia. \nIstunnon nimi: %1$s diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 32507dc979..2d11932681 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -1103,7 +1103,7 @@ Nouvelle invitation Moi ** Échec de l’envoi − veuillez ouvrir le salon - Désolé, les appels en visioconférence avec Jitsi ne sont pas pris en charge sur les vieux appareils (avec une version d\'Android antérieure à 5.0) + Désolé, les appels en visioconférence avec Jitsi ne sont pas pris en charge sur les vieux appareils (avec une version d\'Android antérieure à 6.0) Vérifier la session adresse IP inconnue Une nouvelle session demande les clés de chiffrement. diff --git a/vector/src/main/res/values-hr/strings.xml b/vector/src/main/res/values-hr/strings.xml index f27774a02c..9013b8fd65 100644 --- a/vector/src/main/res/values-hr/strings.xml +++ b/vector/src/main/res/values-hr/strings.xml @@ -1386,7 +1386,7 @@ Identitet sobe - Nažalost konferencijski pozivi kroz Jitsi nisu podržani na starim uređajima (uređaji s Androidom inačice manje od 5.0) + Nažalost konferencijski pozivi kroz Jitsi nisu podržani na starim uređajima (uređaji s Androidom inačice manje od 6.0) Za popravak upravljanja aplikacijama unutar Matrixa Početna diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 075a470b09..e25626c2e6 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -1101,7 +1101,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Új meghívók Én ** A küldés nem sikerült - kérlek nyisd meg a szobát - Elnézést, Jitsi konferencia hívások a régi eszközökön (Android OS 5.0-nál régebbi) nem támogatottak + Elnézést, Jitsi konferencia hívások a régi eszközökön (Android OS 6.0-nál régebbi) nem támogatottak Munkamenet ellenőrzése ismeretlen ip Új munkamenet kér titkosítási kulcsokat. diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index a6891788ac..c5db349d35 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -1161,7 +1161,7 @@ Nuovo invito Io ** Invio fallito - per favore apri la stanza - Purtroppo i vecchi dispositivi (quelli con Android precedenti al 5.0) non supportano le conferenze con Jitsi + Purtroppo i vecchi dispositivi (quelli con Android precedenti al 6.0) non supportano le conferenze con Jitsi Verifica sessione IP sconosciuto Una nuova sessione sta chiedendo le chiavi crittografiche. diff --git a/vector/src/main/res/values-kab/strings.xml b/vector/src/main/res/values-kab/strings.xml index e7a2fd4bfc..74075318d4 100644 --- a/vector/src/main/res/values-kab/strings.xml +++ b/vector/src/main/res/values-kab/strings.xml @@ -1360,7 +1360,7 @@ 1 uwiǧit i yettwaremden %d n yiwiǧiten i yettwaremden - Nesḥassef, asarag s usiwel s Jitsi ur yettusefrak ara ɣef yibenkan iqburen (ibenkan s Android OS ddaw 5.0) + Nesḥassef, asarag s usiwel s Jitsi ur yettusefrak ara ɣef yibenkan iqburen (ibenkan s Android OS ddaw 6.0) Iwiǧit-a yebɣa ad isseqdec tiɣbula-a: Seqdec takamiṛat Seqdec asawaḍ diff --git a/vector/src/main/res/values-ko/strings.xml b/vector/src/main/res/values-ko/strings.xml index da06ae6ca6..c14f0466fa 100644 --- a/vector/src/main/res/values-ko/strings.xml +++ b/vector/src/main/res/values-ko/strings.xml @@ -993,7 +993,7 @@ %d개의 활성 위젯 - 죄송합니다, Jitsi로 회의 전화는 오래된 기기에서 지원하지 않습니다 (안드로이드 OS가 5.0 이하인 기기) + 죄송합니다, Jitsi로 회의 전화는 오래된 기기에서 지원하지 않습니다 (안드로이드 OS가 6.0 이하인 기기) 위젯을 만들 수 없습니다. 요청을 보낼 수 없습니다. diff --git a/vector/src/main/res/values-nl/strings.xml b/vector/src/main/res/values-nl/strings.xml index 7e946511f4..d15f7870a4 100644 --- a/vector/src/main/res/values-nl/strings.xml +++ b/vector/src/main/res/values-nl/strings.xml @@ -1159,7 +1159,7 @@ Element heeft een aangepaste serverconfiguratie gedetecteerd voor uw gebruikers-ID-domein ‘%1$s’: \n%2$s Configuratie gebruiken - Sorry, vergadergesprekken met Jitsi worden nog niet ondersteund op oudere apparaten (met een Android-versie lager dan 5.0) + Sorry, vergadergesprekken met Jitsi worden nog niet ondersteund op oudere apparaten (met een Android-versie lager dan 6.0) Sessie verifiëren onbekend IP-adres Een nieuwe sessie vraagt versleutelingssleutels aan. diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index 820add2ce2..c336c9882c 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -1241,7 +1241,7 @@ Spróbuj uruchomić ponownie aplikację. Adres URL awatara Twój ID użytkownika ID Widżetu - Przepraszamy, połączenia konferencyjne za pomocą Jitsi nie są wspierane na starszych urządzeniach (urządzenia z systemem Android poniżej wersji 5.0) + Przepraszamy, połączenia konferencyjne za pomocą Jitsi nie są wspierane na starszych urządzeniach (urządzenia z systemem Android poniżej wersji 6.0) Widżet chce użyć następujących zasobów: Zablokuj wszystko Użyj aparatu diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index cdb52f26de..12375d25a6 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -1176,7 +1176,7 @@ Seu tema ID do widget ID da sala - Desculpe, as chamadas em grupo com o Jitsi não são suportadas em aparelhos antigos (com versões do Android anteriores a 5.0) + Desculpe, as chamadas em grupo com o Jitsi não são suportadas em aparelhos antigos (com versões do Android anteriores a 6.0) Este wigdet deseja utilizar os seguintes recursos: Permitir Bloquear Tudo diff --git a/vector/src/main/res/values-ru/strings.xml b/vector/src/main/res/values-ru/strings.xml index 18b20d0e91..5ea7d0f9ff 100644 --- a/vector/src/main/res/values-ru/strings.xml +++ b/vector/src/main/res/values-ru/strings.xml @@ -1193,7 +1193,7 @@ Воспроизвести звук затвора неизвестный IP ** Отправить не удалось - пожалуйста откройте комнату - К сожалению, конференц-звонки с Jitsi не поддерживаются на старых устройствах (ниже Android OS - 5.0) + К сожалению, конференц-звонки с Jitsi не поддерживаются на старых устройствах (ниже Android OS - 6.0) Новая сессия запрашивает ключи шифрования. \nИмя сессии: %1$s \nПоследний раз в сети: %2$s diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml index 401500270d..1a4418e3a3 100644 --- a/vector/src/main/res/values-sk/strings.xml +++ b/vector/src/main/res/values-sk/strings.xml @@ -1396,7 +1396,7 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí ID miestnosti - Prepáčte, konferenčné hovory Jitsi nie sú podporované na starších zariadeniach (starší systém než Android 5.0) + Prepáčte, konferenčné hovory Jitsi nie sú podporované na starších zariadeniach (starší systém než Android 6.0) Tento widget žiada o nasledujúce zdroje: Povoliť Zablokovať všetko diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml index 6df9939dde..9cc4d6ad7c 100644 --- a/vector/src/main/res/values-sq/strings.xml +++ b/vector/src/main/res/values-sq/strings.xml @@ -1094,7 +1094,7 @@ Ftesë e Re Unë ** S’u arrit të dërgohej - ju lutemi, hapni dhomë - Na ndjeni, thirrjet konferencë me Jitsi-n nuk mbulohen në pajisje të vjetra (pajisje me Android OS nën 5.0) + Na ndjeni, thirrjet konferencë me Jitsi-n nuk mbulohen në pajisje të vjetra (pajisje me Android OS nën 6.0) Verifiko sesion ip e panjohur Një sesion i ri po kërkon emër kyçe fshehtëzimi. diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index e90e930de6..0c5bd2cb74 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -1487,7 +1487,7 @@ Ditt användar-ID Widget-ID Rums-ID - Tyvärr, gruppsamtal med Jitsi stöds inte på gamla enheter (enheter med Android äldre än 5.0) + Tyvärr, gruppsamtal med Jitsi stöds inte på gamla enheter (enheter med Android äldre än 6.0) Den här widgeten vill använda följande resurser: Tillåt Blockera alla diff --git a/vector/src/main/res/values-tr/strings.xml b/vector/src/main/res/values-tr/strings.xml index 4c4154d8f0..2f4c163d6d 100644 --- a/vector/src/main/res/values-tr/strings.xml +++ b/vector/src/main/res/values-tr/strings.xml @@ -1148,7 +1148,7 @@ Teman Widget kimliği Oda kimliği - Üzgünüz, jitsi konferans aramaları eski cihazlarda desteklenmiyor (Android 5.0 altı) + Üzgünüz, jitsi konferans aramaları eski cihazlarda desteklenmiyor (Android 6.0 altı) Bu widget şu kaynakları kullanmak istiyor: İzin ver Hepsini reddet diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 2bf3f8dddd..ac06e1ed0a 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -1218,7 +1218,7 @@ Заблокувати все Дозволити Цей віджет хоче використовувати такі ресурси: - На жаль, конференц-дзвінки з Jitsi не підтримуються на старих пристроях (пристрої з ОС Android нижче 5.0) + На жаль, конференц-дзвінки з Jitsi не підтримуються на старих пристроях (пристрої з ОС Android нижче 6.0) Ідентифікатор кімнати Ідентифікатор віджета Ваша тема diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml index 43eb44ad64..8bffa6e437 100644 --- a/vector/src/main/res/values-zh-rCN/strings.xml +++ b/vector/src/main/res/values-zh-rCN/strings.xml @@ -1085,7 +1085,7 @@ 新邀请 ** 发送失败 - 请打开聊天室 - 抱歉,旧设备(Android 系统版本低于 5.0)不支持使用 Jitsi 创建电话会议 + 抱歉,旧设备(Android 系统版本低于 6.0)不支持使用 Jitsi 创建电话会议 验证会话 未知 IP 一个新设备正在请求加密密钥。 diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index 88bc9da6d6..5c92109895 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -1077,7 +1077,7 @@ 新邀請 ** 傳送失敗 - 請開啟聊天室 - 抱歉,使用 Jitsi 建立會議通話在舊裝置上並不支援(Android 系統版本小於 5.0 的裝置) + 抱歉,使用 Jitsi 建立會議通話在舊裝置上並不支援(Android 系統版本小於 6.0 的裝置) 驗證工作階段 未知的 IP 有新工作階段正在要求加密金鑰。 diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index e7dd51c0b3..3fbd233888 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -1314,7 +1314,7 @@ Room ID - Sorry, conference calls with Jitsi are not supported on old devices (devices with Android OS below 5.0) + Sorry, conference calls with Jitsi are not supported on old devices (devices with Android OS below 6.0) This widget wants to use the following resources: Allow Block All