mirror of
https://github.com/vector-im/element-android.git
synced 2024-11-15 01:35:07 +08:00
Merge branch 'develop' into feature/bma/room_settings_ux
This commit is contained in:
commit
ca09feb2e5
16
CHANGES.md
16
CHANGES.md
@ -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 ✨:
|
||||
|
@ -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()
|
||||
|
@ -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.
|
@ -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.
|
||||
|
@ -25,7 +25,6 @@ data class Widget(
|
||||
val widgetId: String,
|
||||
val senderInfo: SenderInfo?,
|
||||
val isAddedByMe: Boolean,
|
||||
val computedUrl: String?,
|
||||
val type: WidgetType
|
||||
) {
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
@ -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 "##################################################"
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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),
|
||||
|
@ -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?
|
||||
)
|
||||
|
@ -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"]
|
||||
)
|
||||
}
|
||||
}
|
@ -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,22 +166,39 @@ class VectorJitsiActivity : VectorBaseActivity<ActivityJitsiBinding>(), JitsiMee
|
||||
JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
||||
}
|
||||
|
||||
override fun onConferenceTerminated(p0: MutableMap<String, Any>?) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
private fun unregisterForBroadcastMessages() {
|
||||
tryOrNull("Unable to unregister receiver") {
|
||||
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
|
||||
}
|
||||
}
|
||||
|
||||
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 (p0?.get("error") == null) {
|
||||
if (data["error"] == null) {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onConferenceJoined(p0: MutableMap<String, Any>?) {
|
||||
Timber.v("JitsiMeetViewListener.onConferenceJoined()")
|
||||
}
|
||||
|
||||
override fun onConferenceWillJoin(p0: MutableMap<String, Any>?) {
|
||||
Timber.v("JitsiMeetViewListener.onConferenceWillJoin()")
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun newIntent(context: Context, roomId: String, widgetId: String, enableVideo: Boolean): Intent {
|
||||
return Intent(context, VectorJitsiActivity::class.java).apply {
|
||||
|
@ -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 {
|
||||
awaitCallback<Unit> {
|
||||
session.cryptoService().crossSigningService().initializeCrossSigning(
|
||||
object : UserInteractiveAuthInterceptor {
|
||||
override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation<UIABaseAuth>) {
|
||||
@ -235,13 +235,13 @@ class HomeActivityViewModel @AssistedInject constructor(
|
||||
callback = it
|
||||
)
|
||||
Timber.d("Initialize cross signing SUCCESS")
|
||||
}
|
||||
} catch (failure: Throwable) {
|
||||
Timber.e(failure, "Failed to initialize cross signing")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun handle(action: HomeActivityViewActions) {
|
||||
when (action) {
|
||||
|
@ -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(
|
||||
|
@ -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!!)
|
||||
|
@ -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) {
|
||||
// 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))
|
||||
|
@ -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)
|
||||
}
|
@ -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"
|
||||
|
@ -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) {
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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.
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 l’envoi − 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.
|
||||
|
@ -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>
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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.
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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">** S’u 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.
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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">一个新设备正在请求加密密钥。
|
||||
|
@ -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">有新工作階段正在要求加密金鑰。
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user