Merge branch 'develop' into feature/bma/room_settings_ux

This commit is contained in:
Benoit Marty 2021-02-11 22:00:58 +01:00 committed by GitHub
commit ca09feb2e5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
51 changed files with 249 additions and 127 deletions

View file

@ -1,4 +1,4 @@
Changes in Element 1.0.18 (2020-XX-XX)
Changes in Element 1.0.18 (2021-XX-XX)
===================================================
Features ✨:
@ -7,9 +7,11 @@ Features ✨:
Improvements 🙌:
- VoIP : new tiles in timeline
- Improve room profile UX
- Upgrade Jitsi library from 2.9.3 to 3.1.0
Bugfix 🐛:
- VoIP : fix audio devices output
- Fix crash after initial sync on Dendrite
Translations 🗣:
-
@ -24,9 +26,9 @@ Test:
-
Other changes:
-
- Fix typos in CHANGES.md (#2811)
Changes in Element 1.0.17 (2020-02-09)
Changes in Element 1.0.17 (2021-02-09)
===================================================
Improvements 🙌:
@ -48,13 +50,13 @@ Build 🧱:
Other changes:
- Change app name from "Element (Riot.im)" to "Element"
Changes in Element 1.0.16 (2020-02-04)
Changes in Element 1.0.16 (2021-02-04)
===================================================
Bugfix 🐛:
- Fix crash on API < 30 and light theme (#2774)
Changes in Element 1.0.15 (2020-02-03)
Changes in Element 1.0.15 (2021-02-03)
===================================================
Features ✨:
@ -85,7 +87,7 @@ Build 🧱:
Other changes:
- Update Dagger to 2.31 version so we can use the embedded AssistedInject feature
Changes in Element 1.0.14 (2020-01-15)
Changes in Element 1.0.14 (2021-01-15)
===================================================
Features ✨:
@ -1197,7 +1199,7 @@ Mode details here: https://medium.com/@RiotChat/introducing-the-riotx-beta-for-a
=======================================================
Changes in Element 1.X.X (2020-XX-XX)
Changes in Element 1.X.X (2021-XX-XX)
===================================================
Features ✨:

View file

@ -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()

View file

@ -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.
- Update the file `/CHANGES.md` to notify about the library upgrade, and create a regular PR for project Element Android.

View file

@ -56,6 +56,11 @@ interface WidgetService {
excludedTypes: Set<String>? = null
): List<Widget>
/**
* 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.

View file

@ -25,7 +25,6 @@ data class Widget(
val widgetId: String,
val senderInfo: SenderInfo?,
val isAddedByMe: Boolean,
val computedUrl: String?,
val type: WidgetType
) {

View file

@ -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,

View file

@ -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,

View file

@ -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<Event>.mapEventsToWidgets(widgetTypes: Set<String>? = null,
excludedTypes: Set<String>? = null): List<Widget> {
val widgetEvents = this

View file

@ -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"
}
}

View file

@ -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 "##################################################"

View file

@ -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

View file

@ -36,6 +36,9 @@
android:name="android.permission.WRITE_CALENDAR"
tools:node="remove" />
<!-- Jitsi SDK is now API23+ -->
<uses-sdk tools:overrideLibrary="org.jitsi.meet.sdk,com.oney.WebRTCModule,com.learnium.RNDeviceInfo,com.reactnativecommunity.asyncstorage,com.ocetnik.timer,com.calendarevents,com.reactnativecommunity.netinfo,com.kevinresol.react_native_default_preference,com.rnimmersive,com.corbt.keepawake,com.BV.LinearGradient,com.horcrux.svg"/>
<!-- Adding CAMERA permission prevents Chromebooks to see the application on the PlayStore -->
<!-- Tell that the Camera is not mandatory to install the application -->
<uses-feature

View file

@ -24,7 +24,7 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import dagger.assisted.AssistedFactory
import im.vector.app.core.platform.VectorViewModel
import im.vector.app.core.resources.StringProvider
import im.vector.app.features.themes.ThemeProvider
import org.jitsi.meet.sdk.JitsiMeetUserInfo
import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session
@ -37,7 +37,8 @@ class JitsiCallViewModel @AssistedInject constructor(
@Assisted initialState: JitsiCallViewState,
@Assisted val args: VectorJitsiActivity.Args,
private val session: Session,
private val stringProvider: StringProvider
private val jitsiMeetPropertiesFactory: JitsiWidgetPropertiesFactory,
private val themeProvider: ThemeProvider
) : VectorViewModel<JitsiCallViewState, JitsiCallViewActions, JitsiCallViewEvents>(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),

View file

@ -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<String, String?> 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?
)

View file

@ -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"]
)
}
}

View file

@ -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<ActivityJitsiBinding>(), JitsiMeetActivityInterface, JitsiMeetViewListener {
class VectorJitsiActivity : VectorBaseActivity<ActivityJitsiBinding>(), JitsiMeetActivityInterface {
@Parcelize
data class Args(
@ -63,12 +66,21 @@ class VectorJitsiActivity : VectorBaseActivity<ActivityJitsiBinding>(), 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<ActivityJitsiBinding>(), 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<ActivityJitsiBinding>(), JitsiMee
override fun onDestroy() {
JitsiMeetActivityDelegate.onHostDestroy(this)
unregisterForBroadcastMessages()
super.onDestroy()
}
@ -154,20 +166,37 @@ class VectorJitsiActivity : VectorBaseActivity<ActivityJitsiBinding>(), JitsiMee
JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
override fun onConferenceTerminated(p0: MutableMap<String, Any>?) {
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<String, Any>?) {
Timber.v("JitsiMeetViewListener.onConferenceJoined()")
private fun unregisterForBroadcastMessages() {
tryOrNull("Unable to unregister receiver") {
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
}
}
override fun onConferenceWillJoin(p0: MutableMap<String, Any>?) {
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<String, Any>) {
Timber.v("JitsiMeetViewListener.onConferenceTerminated()")
// Do not finish if there is an error
if (data["error"] == null) {
finish()
}
}
companion object {

View file

@ -32,20 +32,20 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.auth.UIABaseAuth
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
import org.matrix.android.sdk.api.auth.UserPasswordAuth
import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
import org.matrix.android.sdk.api.auth.registration.nextUncompletedStage
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.pushrules.RuleIds
import org.matrix.android.sdk.api.session.InitialSyncProgressService
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
import org.matrix.android.sdk.api.util.toMatrixItem
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
import org.matrix.android.sdk.api.auth.registration.nextUncompletedStage
import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo
import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap
import org.matrix.android.sdk.api.auth.UIABaseAuth
import org.matrix.android.sdk.api.auth.UserPasswordAuth
import org.matrix.android.sdk.internal.util.awaitCallback
import org.matrix.android.sdk.rx.asObservable
import org.matrix.android.sdk.rx.rx
@ -211,8 +211,8 @@ class HomeActivityViewModel @AssistedInject constructor(
} else {
// Try to initialize cross signing in background if possible
Timber.d("Initialize cross signing...")
awaitCallback<Unit> {
try {
try {
awaitCallback<Unit> {
session.cryptoService().crossSigningService().initializeCrossSigning(
object : UserInteractiveAuthInterceptor {
override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation<UIABaseAuth>) {
@ -235,9 +235,9 @@ class HomeActivityViewModel @AssistedInject constructor(
callback = it
)
Timber.d("Initialize cross signing SUCCESS")
} catch (failure: Throwable) {
Timber.e(failure, "Failed to initialize cross signing")
}
} catch (failure: Throwable) {
Timber.e(failure, "Failed to initialize cross signing")
}
}
}

View file

@ -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(

View file

@ -43,7 +43,7 @@ abstract class RoomWidgetItem : EpoxyModelWithHolder<RoomWidgetItem.Holder>() {
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!!)

View file

@ -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<String, Any>?) {
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))

View file

@ -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)
}

View file

@ -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"

View file

@ -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) {

View file

@ -1103,7 +1103,7 @@
<string name="notification_new_invitation">Нова покана</string>
<string name="notification_sender_me">Аз</string>
<string name="notification_inline_reply_failed">** Неуспешно изпращане - моля, отворете стаята</string>
<string name="error_jitsi_not_supported_on_old_device">Извиняваме се, но конферентни разговори с Jitsi не се поддържат на стари устройства (устройства с Android OS под 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Извиняваме се, но конферентни разговори с Jitsi не се поддържат на стари устройства (устройства с Android OS под 6.0)</string>
<string name="title_activity_verify_device">Удостоверяване на устройство</string>
<string name="auth_login_sso">Влез с единично вписване</string>
<string name="encryption_information_unknown_ip">неизвестен IP адрес</string>

View file

@ -1026,7 +1026,7 @@
<item quantity="other">%d টা সক্রিয় উইজেট</item>
</plurals>
<string name="error_jitsi_not_supported_on_old_device">দুঃখিত, জিটসির সাথে কনফারেন্স কলগুলি পুরোনো ডিভাইসগুলিতে সমর্থিত নয় (. এর নীচে এন্ড্রোইড অপারেটিং সিস্টেম সহ ডিভাইসগুলি)</string>
<string name="error_jitsi_not_supported_on_old_device">দুঃখিত, জিটসির সাথে কনফারেন্স কলগুলি পুরোনো ডিভাইসগুলিতে সমর্থিত নয় (. এর নীচে এন্ড্রোইড অপারেটিং সিস্টেম সহ ডিভাইসগুলি)</string>
<string name="widget_integration_unable_to_create">উইজেট তৈরি করতে অক্ষম।</string>
<string name="widget_integration_failed_to_send_request">অনুরোধ পাঠাতে ব্যর্থ।</string>

View file

@ -1164,7 +1164,7 @@
<string name="notification_new_invitation">Nova invitació</string>
<string name="notification_sender_me">Jo</string>
<string name="notification_inline_reply_failed">** No s\'ha pogut enviar - si us plau, obre la sala</string>
<string name="error_jitsi_not_supported_on_old_device">Ho sentim, les videoconferències amb Jitsi no són compatibles amb dispositius antics (dispositius amb Android inferior a 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Ho sentim, les videoconferències amb Jitsi no són compatibles amb dispositius antics (dispositius amb Android inferior a 6.0)</string>
<string name="integration_manager_not_configured">No has configurat cap gestor d\'integracions.</string>
<string name="you_added_a_new_device_with_info">Una nova sessió està sol·licitant claus de xifrat.
\nNom de la sessió: %1$s

View file

@ -975,7 +975,7 @@
<string name="room_widget_permission_theme">Váš motiv</string>
<string name="room_widget_permission_widget_id">ID widgetu</string>
<string name="room_widget_permission_room_id">ID místnosti</string>
<string name="error_jitsi_not_supported_on_old_device">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)</string>
<string name="error_jitsi_not_supported_on_old_device">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)</string>
<string name="room_widget_resource_permission_title">Widget si žádá použití následujících zdrojů:</string>
<string name="room_widget_resource_grant_permission">Povolit</string>
<string name="room_widget_resource_decline_permission">Zamítnout vše</string>

View file

@ -1155,7 +1155,7 @@
<string name="notification_new_invitation">Neue Einladung</string>
<string name="notification_sender_me">Ich</string>
<string name="notification_inline_reply_failed">** Fehler beim Senden - bitte Raum öffnen</string>
<string name="error_jitsi_not_supported_on_old_device">Entschuldigung, Konferenzanrufe mit Jitsi werden auf älteren Geräten (mit älteren Android-Versionen als 5.0) nicht unterstützt</string>
<string name="error_jitsi_not_supported_on_old_device">Entschuldigung, Konferenzanrufe mit Jitsi werden auf älteren Geräten (mit älteren Android-Versionen als 6.0) nicht unterstützt</string>
<string name="title_activity_verify_device">Sitzung verifizieren</string>
<string name="encryption_information_unknown_ip">Unbekannte IP-Adresse</string>
<string name="you_added_a_new_device_with_info">Eine neue Sitzung fordert Verschlüsselungsschlüssel an.

View file

@ -1212,7 +1212,7 @@
<string name="room_widget_resource_decline_permission">Ĉion bloki</string>
<string name="room_widget_resource_grant_permission">Permesi</string>
<string name="room_widget_resource_permission_title">Ĉi tiu fenestraĵo volas uzi la jenajn rimedojn:</string>
<string name="error_jitsi_not_supported_on_old_device">Pardonu, grupaj vokoj ne estas subtenataj sur malnovaj aparatoj (Android je versio sub 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Pardonu, grupaj vokoj ne estas subtenataj sur malnovaj aparatoj (Android je versio sub 6.0)</string>
<string name="room_widget_permission_room_id">Identigilo de ĉambro</string>
<string name="room_widget_permission_widget_id">Identigilo de fenestraĵo</string>
<string name="room_widget_permission_theme">Via haŭto</string>

View file

@ -1040,7 +1040,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
<string name="notification_new_invitation">Nueva invitación</string>
<string name="notification_sender_me">Yo</string>
<string name="notification_inline_reply_failed">** Error al enviar - por favor abra la sala</string>
<string name="error_jitsi_not_supported_on_old_device">Lo sentimos, las llamadas de grupo con Jitsi no están soportadas en dispositivos antiguos (dispositivos con Android inferior a 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Lo sentimos, las llamadas de grupo con Jitsi no están soportadas en dispositivos antiguos (dispositivos con Android inferior a 6.0)</string>
<string name="settings_labs_native_camera_summary">Iniciar la cámara del sistema en lugar de la pantalla de cámara personalizada.</string>
<string name="settings_labs_enable_send_voice_summary">Esta opción requiere una aplicación de terceros para grabar los mensajes.</string>
<string name="command_problem_with_parameters">El comando \"%s\" necesita mas parámetros o algunos parámetros son incorrectos.</string>

View file

@ -1020,7 +1020,7 @@
<string name="notification_ticker_text_dm">%1$s: %2$s</string>
<string name="notification_ticker_text_group">%1$s: %2$s %3$s</string>
<string name="historical_placeholder">Otsi ajaloost</string>
<string name="error_jitsi_not_supported_on_old_device">Vabandust, aga rühmakõned Jitsi vahendusel ei ole vanades seadmetes toetatud (Androidi versioon alla 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Vabandust, aga rühmakõned Jitsi vahendusel ei ole vanades seadmetes toetatud (Androidi versioon alla 6.0)</string>
<string name="room_widget_resource_permission_title">See vidin soovib kasutada järgmisi andmeid:</string>
<string name="room_widget_resource_grant_permission">Luba</string>
<string name="room_widget_resource_decline_permission">Ära luba mitte midagi</string>

View file

@ -1338,7 +1338,7 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.</string>
<string name="notification_sender_me">Ni</string>
<string name="notification_inline_reply_failed">** Bidalketak huts egin du, ireki gela</string>
<string name="error_jitsi_not_supported_on_old_device">Sentitzen dugu, gailu zaharretan ezin dira Jitsi bidezko konferentzia deiak egin (Android OS 5.0 baino zaharragoak)</string>
<string name="error_jitsi_not_supported_on_old_device">Sentitzen dugu, gailu zaharretan ezin dira Jitsi bidezko konferentzia deiak egin (Android OS 6.0 baino zaharragoak)</string>
<string name="title_activity_verify_device">Egiaztatu saioa</string>

View file

@ -1171,7 +1171,7 @@
<string name="notification_new_invitation">Uusi kutsu</string>
<string name="notification_sender_me">Minä</string>
<string name="notification_inline_reply_failed">** Lähetys epäonnistui — avaathan huoneen</string>
<string name="error_jitsi_not_supported_on_old_device">Valitettavasti konferenssipuhelut Jitsin kanssa eivät toimi vanhoissa laitteissa (laitteet, joissa on Android 5.0 tai vanhempi)</string>
<string name="error_jitsi_not_supported_on_old_device">Valitettavasti konferenssipuhelut Jitsin kanssa eivät toimi vanhoissa laitteissa (laitteet, joissa on Android 6.0 tai vanhempi)</string>
<string name="encryption_information_unknown_ip">tuntematon IP-osoite</string>
<string name="you_added_a_new_device_with_info">Uusi istunto pyytää salausavaimia.
\nIstunnon nimi: %1$s

View file

@ -1103,7 +1103,7 @@
<string name="notification_new_invitation">Nouvelle invitation</string>
<string name="notification_sender_me">Moi</string>
<string name="notification_inline_reply_failed">** Échec de lenvoi veuillez ouvrir le salon</string>
<string name="error_jitsi_not_supported_on_old_device">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)</string>
<string name="error_jitsi_not_supported_on_old_device">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)</string>
<string name="title_activity_verify_device">Vérifier la session</string>
<string name="encryption_information_unknown_ip">adresse IP inconnue</string>
<string name="you_added_a_new_device_with_info">Une nouvelle session demande les clés de chiffrement.

View file

@ -1386,7 +1386,7 @@
<string name="room_widget_permission_room_id">Identitet sobe</string>
<string name="error_jitsi_not_supported_on_old_device">Nažalost konferencijski pozivi kroz Jitsi nisu podržani na starim uređajima (uređaji s Androidom inačice manje od 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Nažalost konferencijski pozivi kroz Jitsi nisu podržani na starim uređajima (uređaji s Androidom inačice manje od 6.0)</string>
<string name="command_description_clear_scalar_token">Za popravak upravljanja aplikacijama unutar Matrixa</string>
<string name="group_details_home">Početna</string>

View file

@ -1101,7 +1101,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
<string name="notification_new_invitation">Új meghívók</string>
<string name="notification_sender_me">Én</string>
<string name="notification_inline_reply_failed">** A küldés nem sikerült - kérlek nyisd meg a szobát</string>
<string name="error_jitsi_not_supported_on_old_device">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</string>
<string name="error_jitsi_not_supported_on_old_device">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</string>
<string name="title_activity_verify_device">Munkamenet ellenőrzése</string>
<string name="encryption_information_unknown_ip">ismeretlen ip</string>
<string name="you_added_a_new_device_with_info">Új munkamenet kér titkosítási kulcsokat.

View file

@ -1161,7 +1161,7 @@
<string name="notification_new_invitation">Nuovo invito</string>
<string name="notification_sender_me">Io</string>
<string name="notification_inline_reply_failed">** Invio fallito - per favore apri la stanza</string>
<string name="error_jitsi_not_supported_on_old_device">Purtroppo i vecchi dispositivi (quelli con Android precedenti al 5.0) non supportano le conferenze con Jitsi</string>
<string name="error_jitsi_not_supported_on_old_device">Purtroppo i vecchi dispositivi (quelli con Android precedenti al 6.0) non supportano le conferenze con Jitsi</string>
<string name="title_activity_verify_device">Verifica sessione</string>
<string name="encryption_information_unknown_ip">IP sconosciuto</string>
<string name="you_added_a_new_device_with_info">Una nuova sessione sta chiedendo le chiavi crittografiche.

View file

@ -1360,7 +1360,7 @@
<item quantity="one">1 uwiǧit i yettwaremden</item>
<item quantity="other">%d n yiwiǧiten i yettwaremden</item>
</plurals>
<string name="error_jitsi_not_supported_on_old_device">Nesḥassef, asarag s usiwel s Jitsi ur yettusefrak ara ɣef yibenkan iqburen (ibenkan s Android OS ddaw 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Nesḥassef, asarag s usiwel s Jitsi ur yettusefrak ara ɣef yibenkan iqburen (ibenkan s Android OS ddaw 6.0)</string>
<string name="room_widget_resource_permission_title">Iwiǧit-a yebɣa ad isseqdec tiɣbula-a:</string>
<string name="room_widget_webview_access_camera">Seqdec takamiṛat</string>
<string name="room_widget_webview_access_microphone">Seqdec asawaḍ</string>

View file

@ -993,7 +993,7 @@
<item quantity="other">%d개의 활성 위젯</item>
</plurals>
<string name="error_jitsi_not_supported_on_old_device">죄송합니다, Jitsi로 회의 전화는 오래된 기기에서 지원하지 않습니다 (안드로이드 OS가 5.0 이하인 기기)</string>
<string name="error_jitsi_not_supported_on_old_device">죄송합니다, Jitsi로 회의 전화는 오래된 기기에서 지원하지 않습니다 (안드로이드 OS가 6.0 이하인 기기)</string>
<string name="widget_integration_unable_to_create">위젯을 만들 수 없습니다.</string>
<string name="widget_integration_failed_to_send_request">요청을 보낼 수 없습니다.</string>

View file

@ -1159,7 +1159,7 @@
<string name="autodiscover_well_known_autofill_dialog_message">Element heeft een aangepaste serverconfiguratie gedetecteerd voor uw gebruikers-ID-domein %1$s:
\n%2$s</string>
<string name="autodiscover_well_known_autofill_confirm">Configuratie gebruiken</string>
<string name="error_jitsi_not_supported_on_old_device">Sorry, vergadergesprekken met Jitsi worden nog niet ondersteund op oudere apparaten (met een Android-versie lager dan 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Sorry, vergadergesprekken met Jitsi worden nog niet ondersteund op oudere apparaten (met een Android-versie lager dan 6.0)</string>
<string name="title_activity_verify_device">Sessie verifiëren</string>
<string name="encryption_information_unknown_ip">onbekend IP-adres</string>
<string name="you_added_a_new_device_with_info">Een nieuwe sessie vraagt versleutelingssleutels aan.

View file

@ -1241,7 +1241,7 @@ Spróbuj uruchomić ponownie aplikację.</string>
<string name="room_widget_permission_avatar_url">Adres URL awatara</string>
<string name="room_widget_permission_user_id">Twój ID użytkownika</string>
<string name="room_widget_permission_widget_id">ID Widżetu</string>
<string name="error_jitsi_not_supported_on_old_device">Przepraszamy, połączenia konferencyjne za pomocą Jitsi nie są wspierane na starszych urządzeniach (urządzenia z systemem Android poniżej wersji 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Przepraszamy, połączenia konferencyjne za pomocą Jitsi nie są wspierane na starszych urządzeniach (urządzenia z systemem Android poniżej wersji 6.0)</string>
<string name="room_widget_resource_permission_title">Widżet chce użyć następujących zasobów:</string>
<string name="room_widget_resource_decline_permission">Zablokuj wszystko</string>
<string name="room_widget_webview_access_camera">Użyj aparatu</string>

View file

@ -1176,7 +1176,7 @@
<string name="room_widget_permission_theme">Seu tema</string>
<string name="room_widget_permission_widget_id">ID do widget</string>
<string name="room_widget_permission_room_id">ID da sala</string>
<string name="error_jitsi_not_supported_on_old_device">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)</string>
<string name="error_jitsi_not_supported_on_old_device">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)</string>
<string name="room_widget_resource_permission_title">Este wigdet deseja utilizar os seguintes recursos:</string>
<string name="room_widget_resource_grant_permission">Permitir</string>
<string name="room_widget_resource_decline_permission">Bloquear Tudo</string>

View file

@ -1193,7 +1193,7 @@
<string name="settings_play_shutter_sound">Воспроизвести звук затвора</string>
<string name="encryption_information_unknown_ip">неизвестный IP</string>
<string name="notification_inline_reply_failed">** Отправить не удалось - пожалуйста откройте комнату</string>
<string name="error_jitsi_not_supported_on_old_device">К сожалению, конференц-звонки с Jitsi не поддерживаются на старых устройствах (ниже Android OS - 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">К сожалению, конференц-звонки с Jitsi не поддерживаются на старых устройствах (ниже Android OS - 6.0)</string>
<string name="you_added_a_new_device_with_info">Новая сессия запрашивает ключи шифрования.
\nИмя сессии: %1$s
\nПоследний раз в сети: %2$s

View file

@ -1396,7 +1396,7 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
<string name="room_widget_permission_room_id">ID miestnosti</string>
<string name="error_jitsi_not_supported_on_old_device">Prepáčte, konferenčné hovory Jitsi nie sú podporované na starších zariadeniach (starší systém než Android 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Prepáčte, konferenčné hovory Jitsi nie sú podporované na starších zariadeniach (starší systém než Android 6.0)</string>
<string name="room_widget_resource_permission_title">Tento widget žiada o nasledujúce zdroje:</string>
<string name="room_widget_resource_grant_permission">Povoliť</string>
<string name="room_widget_resource_decline_permission">Zablokovať všetko</string>

View file

@ -1094,7 +1094,7 @@
<string name="notification_new_invitation">Ftesë e Re</string>
<string name="notification_sender_me">Unë</string>
<string name="notification_inline_reply_failed">** Su arrit të dërgohej - ju lutemi, hapni dhomë</string>
<string name="error_jitsi_not_supported_on_old_device">Na ndjeni, thirrjet konferencë me Jitsi-n nuk mbulohen në pajisje të vjetra (pajisje me Android OS nën 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Na ndjeni, thirrjet konferencë me Jitsi-n nuk mbulohen në pajisje të vjetra (pajisje me Android OS nën 6.0)</string>
<string name="title_activity_verify_device">Verifiko sesion</string>
<string name="encryption_information_unknown_ip">ip e panjohur</string>
<string name="you_added_a_new_device_with_info">Një sesion i ri po kërkon emër kyçe fshehtëzimi.

View file

@ -1487,7 +1487,7 @@
<string name="room_widget_permission_user_id">Ditt användar-ID</string>
<string name="room_widget_permission_widget_id">Widget-ID</string>
<string name="room_widget_permission_room_id">Rums-ID</string>
<string name="error_jitsi_not_supported_on_old_device">Tyvärr, gruppsamtal med Jitsi stöds inte på gamla enheter (enheter med Android äldre än 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Tyvärr, gruppsamtal med Jitsi stöds inte på gamla enheter (enheter med Android äldre än 6.0)</string>
<string name="room_widget_resource_permission_title">Den här widgeten vill använda följande resurser:</string>
<string name="room_widget_resource_grant_permission">Tillåt</string>
<string name="room_widget_resource_decline_permission">Blockera alla</string>

View file

@ -1148,7 +1148,7 @@
<string name="room_widget_permission_theme">Teman</string>
<string name="room_widget_permission_widget_id">Widget kimliği</string>
<string name="room_widget_permission_room_id">Oda kimliği</string>
<string name="error_jitsi_not_supported_on_old_device">Üzgünüz, jitsi konferans aramaları eski cihazlarda desteklenmiyor (Android 5.0 altı)</string>
<string name="error_jitsi_not_supported_on_old_device">Üzgünüz, jitsi konferans aramaları eski cihazlarda desteklenmiyor (Android 6.0 altı)</string>
<string name="room_widget_resource_permission_title">Bu widget şu kaynakları kullanmak istiyor:</string>
<string name="room_widget_resource_grant_permission">İzin ver</string>
<string name="room_widget_resource_decline_permission">Hepsini reddet</string>

View file

@ -1218,7 +1218,7 @@
<string name="room_widget_resource_decline_permission">Заблокувати все</string>
<string name="room_widget_resource_grant_permission">Дозволити</string>
<string name="room_widget_resource_permission_title">Цей віджет хоче використовувати такі ресурси:</string>
<string name="error_jitsi_not_supported_on_old_device">На жаль, конференц-дзвінки з Jitsi не підтримуються на старих пристроях (пристрої з ОС Android нижче 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">На жаль, конференц-дзвінки з Jitsi не підтримуються на старих пристроях (пристрої з ОС Android нижче 6.0)</string>
<string name="room_widget_permission_room_id">Ідентифікатор кімнати</string>
<string name="room_widget_permission_widget_id">Ідентифікатор віджета</string>
<string name="room_widget_permission_theme">Ваша тема</string>

View file

@ -1085,7 +1085,7 @@
<string name="notification_new_invitation">新邀请</string>
<string name="notification_sender_me"></string>
<string name="notification_inline_reply_failed">** 发送失败 - 请打开聊天室</string>
<string name="error_jitsi_not_supported_on_old_device">抱歉旧设备Android 系统版本低于 5.0)不支持使用 Jitsi 创建电话会议</string>
<string name="error_jitsi_not_supported_on_old_device">抱歉旧设备Android 系统版本低于 6.0)不支持使用 Jitsi 创建电话会议</string>
<string name="title_activity_verify_device">验证会话</string>
<string name="encryption_information_unknown_ip">未知 IP</string>
<string name="you_added_a_new_device_with_info">一个新设备正在请求加密密钥。

View file

@ -1077,7 +1077,7 @@
<string name="notification_new_invitation">新邀請</string>
<string name="notification_sender_me"></string>
<string name="notification_inline_reply_failed">** 傳送失敗 - 請開啟聊天室</string>
<string name="error_jitsi_not_supported_on_old_device">抱歉,使用 Jitsi 建立會議通話在舊裝置上並不支援Android 系統版本小於 5.0 的裝置)</string>
<string name="error_jitsi_not_supported_on_old_device">抱歉,使用 Jitsi 建立會議通話在舊裝置上並不支援Android 系統版本小於 6.0 的裝置)</string>
<string name="title_activity_verify_device">驗證工作階段</string>
<string name="encryption_information_unknown_ip">未知的 IP</string>
<string name="you_added_a_new_device_with_info">有新工作階段正在要求加密金鑰。

View file

@ -1314,7 +1314,7 @@
<string name="room_widget_permission_room_id">Room ID</string>
<string name="error_jitsi_not_supported_on_old_device">Sorry, conference calls with Jitsi are not supported on old devices (devices with Android OS below 5.0)</string>
<string name="error_jitsi_not_supported_on_old_device">Sorry, conference calls with Jitsi are not supported on old devices (devices with Android OS below 6.0)</string>
<string name="room_widget_resource_permission_title">This widget wants to use the following resources:</string>
<string name="room_widget_resource_grant_permission">Allow</string>
<string name="room_widget_resource_decline_permission">Block All</string>