Merge pull request #6195 from vector-im/feature/bma/jitsi_5_1_0
Upgrade Jitsi SDK to 6.2.2
|
@ -96,9 +96,9 @@ allprojects {
|
||||||
}
|
}
|
||||||
// Jitsi repo
|
// Jitsi repo
|
||||||
maven {
|
maven {
|
||||||
url "https://github.com/vector-im/jitsi_libre_maven/raw/main/android-sdk-5.0.2"
|
url "https://github.com/vector-im/jitsi_libre_maven/raw/main/android-sdk-6.2.2"
|
||||||
// Note: to test Jitsi release you can use a local file like this:
|
// Note: to test Jitsi release you can use a local file like this:
|
||||||
// url "file:///Users/bmarty/workspaces/jitsi_libre_maven/android-sdk-3.10.0"
|
// url "file:///Users/bmarty/workspaces/jitsi_libre_maven/android-sdk-6.2.2"
|
||||||
content {
|
content {
|
||||||
groups.jitsi.regex.each { includeGroupByRegex it }
|
groups.jitsi.regex.each { includeGroupByRegex it }
|
||||||
groups.jitsi.group.each { includeGroup it }
|
groups.jitsi.group.each { includeGroup it }
|
||||||
|
|
1
changelog.d/6195.misc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Upgrade Jitsi SDK to 6.2.2 and WebRtc to 1.106.1-jitsi-12039821.
|
|
@ -93,4 +93,4 @@ url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-3.10.
|
||||||
|
|
||||||
- Build the project and perform the sanity tests again.
|
- Build the project and perform the sanity tests again.
|
||||||
|
|
||||||
- Update the file `/CHANGES.md` to notify about the library upgrade, and create a regular PR for project Element Android.
|
- Create a PR for project Element Android and add a changelog file `<PR_NUMBER>.misc` to notify about the library upgrade.
|
||||||
|
|
|
@ -25,12 +25,8 @@ export LIBRE_BUILD=true
|
||||||
|
|
||||||
cd jitsi-meet
|
cd jitsi-meet
|
||||||
|
|
||||||
# This is commit after version 2.2.2, which does not compile
|
# Get the latest version from the changelog: https://github.com/jitsi/jitsi-meet-release-notes/blob/master/CHANGELOG-MOBILE-SDKS.md
|
||||||
# git checkout 5a934c071a5cbe64de275a25d0ed62d8193cdd03
|
git checkout android-sdk-6.2.2
|
||||||
|
|
||||||
# Changelog: https://github.com/jitsi/jitsi-meet-release-notes/blob/master/CHANGELOG-MOBILE-SDKS.md
|
|
||||||
|
|
||||||
git checkout android-sdk-5.0.2
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "##################################################"
|
echo "##################################################"
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
<application>
|
<application>
|
||||||
<activity android:name="im.vector.app.features.debug.TestLinkifyActivity" />
|
<activity android:name="im.vector.app.features.debug.TestLinkifyActivity" />
|
||||||
<activity android:name="im.vector.app.features.debug.DebugPermissionActivity" />
|
<activity android:name="im.vector.app.features.debug.DebugPermissionActivity" />
|
||||||
|
<activity android:name="im.vector.app.features.debug.jitsi.DebugJitsiActivity" />
|
||||||
<activity android:name="im.vector.app.features.debug.analytics.DebugAnalyticsActivity" />
|
<activity android:name="im.vector.app.features.debug.analytics.DebugAnalyticsActivity" />
|
||||||
<activity android:name="im.vector.app.features.debug.settings.DebugPrivateSettingsActivity" />
|
<activity android:name="im.vector.app.features.debug.settings.DebugPrivateSettingsActivity" />
|
||||||
<activity android:name="im.vector.app.features.debug.sas.DebugSasEmojiActivity" />
|
<activity android:name="im.vector.app.features.debug.sas.DebugSasEmojiActivity" />
|
||||||
|
|
|
@ -35,6 +35,7 @@ import im.vector.app.core.utils.registerForPermissionsResult
|
||||||
import im.vector.app.core.utils.toast
|
import im.vector.app.core.utils.toast
|
||||||
import im.vector.app.features.debug.analytics.DebugAnalyticsActivity
|
import im.vector.app.features.debug.analytics.DebugAnalyticsActivity
|
||||||
import im.vector.app.features.debug.features.DebugFeaturesSettingsActivity
|
import im.vector.app.features.debug.features.DebugFeaturesSettingsActivity
|
||||||
|
import im.vector.app.features.debug.jitsi.DebugJitsiActivity
|
||||||
import im.vector.app.features.debug.leak.DebugMemoryLeaksActivity
|
import im.vector.app.features.debug.leak.DebugMemoryLeaksActivity
|
||||||
import im.vector.app.features.debug.sas.DebugSasEmojiActivity
|
import im.vector.app.features.debug.sas.DebugSasEmojiActivity
|
||||||
import im.vector.app.features.debug.settings.DebugPrivateSettingsActivity
|
import im.vector.app.features.debug.settings.DebugPrivateSettingsActivity
|
||||||
|
@ -121,6 +122,9 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
|
||||||
views.debugPermission.setOnClickListener {
|
views.debugPermission.setOnClickListener {
|
||||||
startActivity(Intent(this, DebugPermissionActivity::class.java))
|
startActivity(Intent(this, DebugPermissionActivity::class.java))
|
||||||
}
|
}
|
||||||
|
views.debugJitsi.setOnClickListener {
|
||||||
|
startActivity(Intent(this, DebugJitsiActivity::class.java))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun openPrivateSettings() {
|
private fun openPrivateSettings() {
|
||||||
|
@ -175,7 +179,7 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
|
||||||
.setContentText("Content")
|
.setContentText("Content")
|
||||||
// No effect because it's a group summary notif
|
// No effect because it's a group summary notif
|
||||||
.setNumber(33)
|
.setNumber(33)
|
||||||
.setSmallIcon(R.drawable.ic_status_bar)
|
.setSmallIcon(R.drawable.ic_notification)
|
||||||
// This provocate the badge issue: no badge for group notification
|
// This provocate the badge issue: no badge for group notification
|
||||||
.setGroup("GroupKey")
|
.setGroup("GroupKey")
|
||||||
.setGroupSummary(true)
|
.setGroupSummary(true)
|
||||||
|
@ -208,7 +212,7 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
|
||||||
// For shortcut on long press on launcher icon
|
// For shortcut on long press on launcher icon
|
||||||
.setBadgeIconType(NotificationCompat.BADGE_ICON_NONE)
|
.setBadgeIconType(NotificationCompat.BADGE_ICON_NONE)
|
||||||
.setStyle(messagingStyle1)
|
.setStyle(messagingStyle1)
|
||||||
.setSmallIcon(R.drawable.ic_status_bar)
|
.setSmallIcon(R.drawable.ic_notification)
|
||||||
.setGroup("GroupKey")
|
.setGroup("GroupKey")
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
|
@ -220,7 +224,7 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
|
||||||
.setContentTitle("Title 2")
|
.setContentTitle("Title 2")
|
||||||
.setContentText("Content 2")
|
.setContentText("Content 2")
|
||||||
.setStyle(messagingStyle2)
|
.setStyle(messagingStyle2)
|
||||||
.setSmallIcon(R.drawable.ic_status_bar)
|
.setSmallIcon(R.drawable.ic_notification)
|
||||||
.setGroup("GroupKey")
|
.setGroup("GroupKey")
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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.debug.jitsi
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import im.vector.app.core.platform.VectorBaseActivity
|
||||||
|
import im.vector.application.databinding.ActivityDebugJitsiBinding
|
||||||
|
import org.jitsi.meet.sdk.JitsiMeet
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class DebugJitsiActivity : VectorBaseActivity<ActivityDebugJitsiBinding>() {
|
||||||
|
|
||||||
|
override fun getBinding() = ActivityDebugJitsiBinding.inflate(layoutInflater)
|
||||||
|
|
||||||
|
override fun getCoordinatorLayout() = views.coordinatorLayout
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
override fun initUiAndData() {
|
||||||
|
val isCrashReportingDisabled = JitsiMeet.isCrashReportingDisabled(this)
|
||||||
|
views.status.text = "Jitsi crash reporting is disabled: $isCrashReportingDisabled"
|
||||||
|
|
||||||
|
views.splash.setOnClickListener {
|
||||||
|
JitsiMeet.showSplashScreen(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
views.dev.setOnClickListener {
|
||||||
|
JitsiMeet.showDevOptions()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
47
vector-app/src/debug/res/layout/activity_debug_jitsi.xml
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/coordinatorLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context="im.vector.app.features.debug.jitsi.DebugJitsiActivity"
|
||||||
|
tools:ignore="HardcodedText">
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:divider="@drawable/linear_divider"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="@dimen/layout_horizontal_margin"
|
||||||
|
android:showDividers="middle">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/status"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
tools:text="Status" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/splash"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Splash"
|
||||||
|
android:textAllCaps="false" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/dev"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Dev options"
|
||||||
|
android:textAllCaps="false" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
@ -186,6 +186,12 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Permissions" />
|
android:text="Permissions" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/debug_jitsi"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Jitsi" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
|
@ -246,10 +246,10 @@ dependencies {
|
||||||
// WebRTC
|
// WebRTC
|
||||||
// org.webrtc:google-webrtc is for development purposes only
|
// org.webrtc:google-webrtc is for development purposes only
|
||||||
// implementation 'org.webrtc:google-webrtc:1.0.+'
|
// implementation 'org.webrtc:google-webrtc:1.0.+'
|
||||||
implementation('com.facebook.react:react-native-webrtc:1.94.2-jitsi-10227332@aar')
|
implementation('com.facebook.react:react-native-webrtc:1.106.1-jitsi-12039821@aar')
|
||||||
|
|
||||||
// Jitsi
|
// Jitsi
|
||||||
api('org.jitsi.react:jitsi-meet-sdk:5.0.2') {
|
// Note: version is 6.2.0, but built from the tag `android-sdk-6.2.2`.
|
||||||
|
api('org.jitsi.react:jitsi-meet-sdk:6.2.0') {
|
||||||
exclude group: 'com.google.firebase'
|
exclude group: 'com.google.firebase'
|
||||||
exclude group: 'com.google.android.gms'
|
exclude group: 'com.google.android.gms'
|
||||||
exclude group: 'com.android.installreferrer'
|
exclude group: 'com.android.installreferrer'
|
||||||
|
@ -305,6 +305,11 @@ dependencies {
|
||||||
exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines-debug"
|
exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines-debug"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fix issue with Jitsi. Inspired from https://github.com/android/android-test/issues/861#issuecomment-872067868
|
||||||
|
// Error was lots of `Duplicate class org.checkerframework.common.reflection.qual.MethodVal found in modules jetified-checker-3.1 (org.checkerframework:checker:3.1.1) and jetified-checker-qual-3.12.0 (org.checkerframework:checker-qual:3.12.0)
|
||||||
|
//noinspection GradleDependency Cannot use latest 3.15.0 since it required min API 26.
|
||||||
|
implementation "org.checkerframework:checker:3.11.0"
|
||||||
|
|
||||||
androidTestImplementation libs.androidx.testCore
|
androidTestImplementation libs.androidx.testCore
|
||||||
androidTestImplementation libs.androidx.testRunner
|
androidTestImplementation libs.androidx.testRunner
|
||||||
androidTestImplementation libs.androidx.testRules
|
androidTestImplementation libs.androidx.testRules
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
|
||||||
<!-- Jitsi SDK is now API23+ -->
|
<!-- 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,com.oblador.performance,com.reactnativecommunity.slider,com.brentvatne.react,com.reactnativecommunity.clipboard,com.swmansion.gesturehandler.react,org.linusu,org.reactnative.maskedview,com.reactnativepagerview,com.swmansion.reanimated,com.th3rdwave.safeareacontext,com.swmansion.rnscreens,org.devio.rn.splashscreen,com.reactnativecommunity.webview" />
|
<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,com.oblador.performance,com.reactnativecommunity.slider,com.brentvatne.react,com.reactnativecommunity.clipboard,com.swmansion.gesturehandler.react,org.linusu,org.reactnative.maskedview,com.reactnativepagerview,com.swmansion.reanimated,com.th3rdwave.safeareacontext,com.swmansion.rnscreens,org.devio.rn.splashscreen,com.reactnativecommunity.webview,org.wonday.orientation" />
|
||||||
|
|
||||||
<!-- Adding CAMERA permission prevents Chromebooks to see the application on the PlayStore -->
|
<!-- Adding CAMERA permission prevents Chromebooks to see the application on the PlayStore -->
|
||||||
<!-- Tell that the Camera is not mandatory to install the application -->
|
<!-- Tell that the Camera is not mandatory to install the application -->
|
||||||
|
|
|
@ -24,6 +24,7 @@ import androidx.lifecycle.DefaultLifecycleObserver
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||||
import com.facebook.react.bridge.JavaOnlyMap
|
import com.facebook.react.bridge.JavaOnlyMap
|
||||||
|
import im.vector.app.config.Config
|
||||||
import org.jitsi.meet.sdk.BroadcastEmitter
|
import org.jitsi.meet.sdk.BroadcastEmitter
|
||||||
import org.jitsi.meet.sdk.BroadcastEvent
|
import org.jitsi.meet.sdk.BroadcastEvent
|
||||||
import org.jitsi.meet.sdk.JitsiMeet
|
import org.jitsi.meet.sdk.JitsiMeet
|
||||||
|
@ -35,6 +36,7 @@ sealed class ConferenceEvent(open val data: Map<String, Any>) {
|
||||||
data class Terminated(override val data: Map<String, Any>) : ConferenceEvent(data)
|
data class Terminated(override val data: Map<String, Any>) : ConferenceEvent(data)
|
||||||
data class WillJoin(override val data: Map<String, Any>) : ConferenceEvent(data)
|
data class WillJoin(override val data: Map<String, Any>) : ConferenceEvent(data)
|
||||||
data class Joined(override val data: Map<String, Any>) : ConferenceEvent(data)
|
data class Joined(override val data: Map<String, Any>) : ConferenceEvent(data)
|
||||||
|
object ReadyToClose : ConferenceEvent(emptyMap())
|
||||||
|
|
||||||
fun extractConferenceUrl(): String? {
|
fun extractConferenceUrl(): String? {
|
||||||
return data[CONFERENCE_URL_DATA_KEY] as? String
|
return data[CONFERENCE_URL_DATA_KEY] as? String
|
||||||
|
@ -84,14 +86,24 @@ class ConferenceEventObserver(
|
||||||
|
|
||||||
private fun onBroadcastReceived(intent: Intent) {
|
private fun onBroadcastReceived(intent: Intent) {
|
||||||
val event = BroadcastEvent(intent)
|
val event = BroadcastEvent(intent)
|
||||||
|
safeLog("onBroadcastReceived: Event received (type ${event.type})", event.data)
|
||||||
val conferenceEvent = when (event.type) {
|
val conferenceEvent = when (event.type) {
|
||||||
BroadcastEvent.Type.CONFERENCE_JOINED -> ConferenceEvent.Joined(event.data)
|
BroadcastEvent.Type.CONFERENCE_JOINED -> ConferenceEvent.Joined(event.data)
|
||||||
BroadcastEvent.Type.CONFERENCE_TERMINATED -> ConferenceEvent.Terminated(event.data)
|
BroadcastEvent.Type.CONFERENCE_TERMINATED -> ConferenceEvent.Terminated(event.data)
|
||||||
BroadcastEvent.Type.CONFERENCE_WILL_JOIN -> ConferenceEvent.WillJoin(event.data)
|
BroadcastEvent.Type.CONFERENCE_WILL_JOIN -> ConferenceEvent.WillJoin(event.data)
|
||||||
|
BroadcastEvent.Type.READY_TO_CLOSE -> ConferenceEvent.ReadyToClose
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
if (conferenceEvent != null) {
|
if (conferenceEvent != null) {
|
||||||
onBroadcastEvent(conferenceEvent)
|
onBroadcastEvent(conferenceEvent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun safeLog(message: String, sensitiveData: Any?) {
|
||||||
|
if (Config.LOW_PRIVACY_LOG_ENABLE) {
|
||||||
|
Timber.v("$message: $sensitiveData")
|
||||||
|
} else {
|
||||||
|
Timber.v(message)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ package im.vector.app.features.call.conference
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
import android.content.res.Configuration
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
|
@ -28,6 +29,7 @@ import androidx.core.app.PictureInPictureModeChangedInfo
|
||||||
import androidx.core.util.Consumer
|
import androidx.core.util.Consumer
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||||
import com.airbnb.mvrx.Fail
|
import com.airbnb.mvrx.Fail
|
||||||
import com.airbnb.mvrx.Mavericks
|
import com.airbnb.mvrx.Mavericks
|
||||||
import com.airbnb.mvrx.Success
|
import com.airbnb.mvrx.Success
|
||||||
|
@ -40,10 +42,12 @@ import im.vector.app.core.platform.VectorBaseActivity
|
||||||
import im.vector.app.databinding.ActivityJitsiBinding
|
import im.vector.app.databinding.ActivityJitsiBinding
|
||||||
import im.vector.lib.core.utils.compat.getParcelableExtraCompat
|
import im.vector.lib.core.utils.compat.getParcelableExtraCompat
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
|
import org.jitsi.meet.sdk.BroadcastIntentHelper
|
||||||
import org.jitsi.meet.sdk.JitsiMeet
|
import org.jitsi.meet.sdk.JitsiMeet
|
||||||
import org.jitsi.meet.sdk.JitsiMeetActivityDelegate
|
import org.jitsi.meet.sdk.JitsiMeetActivityDelegate
|
||||||
import org.jitsi.meet.sdk.JitsiMeetActivityInterface
|
import org.jitsi.meet.sdk.JitsiMeetActivityInterface
|
||||||
import org.jitsi.meet.sdk.JitsiMeetConferenceOptions
|
import org.jitsi.meet.sdk.JitsiMeetConferenceOptions
|
||||||
|
import org.jitsi.meet.sdk.JitsiMeetOngoingConferenceService
|
||||||
import org.jitsi.meet.sdk.JitsiMeetView
|
import org.jitsi.meet.sdk.JitsiMeetView
|
||||||
import org.matrix.android.sdk.api.extensions.tryOrNull
|
import org.matrix.android.sdk.api.extensions.tryOrNull
|
||||||
import org.matrix.android.sdk.api.util.JsonDict
|
import org.matrix.android.sdk.api.util.JsonDict
|
||||||
|
@ -66,6 +70,13 @@ class VectorJitsiActivity : VectorBaseActivity<ActivityJitsiBinding>(), JitsiMee
|
||||||
|
|
||||||
private val jitsiViewModel: JitsiCallViewModel by viewModel()
|
private val jitsiViewModel: JitsiCallViewModel by viewModel()
|
||||||
|
|
||||||
|
override fun onConfigurationChanged(newConfig: Configuration) {
|
||||||
|
super.onConfigurationChanged(newConfig)
|
||||||
|
val intent = Intent("onConfigurationChanged")
|
||||||
|
intent.putExtra("newConfig", newConfig)
|
||||||
|
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
addOnPictureInPictureModeChangedListener(pictureInPictureModeChangedInfoConsumer)
|
addOnPictureInPictureModeChangedListener(pictureInPictureModeChangedInfoConsumer)
|
||||||
|
@ -105,17 +116,26 @@ class VectorJitsiActivity : VectorBaseActivity<ActivityJitsiBinding>(), JitsiMee
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
val currentConf = JitsiMeet.getCurrentConference()
|
val currentConf = JitsiMeet.getCurrentConference()
|
||||||
jitsiMeetView?.leave()
|
handleLeaveConference()
|
||||||
jitsiMeetView?.dispose()
|
jitsiMeetView?.dispose()
|
||||||
// Fake emitting CONFERENCE_TERMINATED event when currentConf is not null (probably when closing the PiP screen).
|
// Fake emitting CONFERENCE_TERMINATED event when currentConf is not null (probably when closing the PiP screen).
|
||||||
if (currentConf != null) {
|
if (currentConf != null) {
|
||||||
ConferenceEventEmitter(this).emitConferenceEnded()
|
ConferenceEventEmitter(this).emitConferenceEnded()
|
||||||
}
|
}
|
||||||
|
JitsiMeetOngoingConferenceService.abort(this)
|
||||||
JitsiMeetActivityDelegate.onHostDestroy(this)
|
JitsiMeetActivityDelegate.onHostDestroy(this)
|
||||||
removeOnPictureInPictureModeChangedListener(pictureInPictureModeChangedInfoConsumer)
|
removeOnPictureInPictureModeChangedListener(pictureInPictureModeChangedInfoConsumer)
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Activity lifecycle methods
|
||||||
|
//
|
||||||
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
super.onActivityResult(requestCode, resultCode, data)
|
||||||
|
JitsiMeetActivityDelegate.onActivityResult(this, requestCode, resultCode, data)
|
||||||
|
}
|
||||||
|
|
||||||
override fun onBackPressed() {
|
override fun onBackPressed() {
|
||||||
JitsiMeetActivityDelegate.onBackPressed()
|
JitsiMeetActivityDelegate.onBackPressed()
|
||||||
}
|
}
|
||||||
|
@ -128,7 +148,8 @@ class VectorJitsiActivity : VectorBaseActivity<ActivityJitsiBinding>(), JitsiMee
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleLeaveConference() {
|
private fun handleLeaveConference() {
|
||||||
jitsiMeetView?.leave()
|
val leaveBroadcastIntent = BroadcastIntentHelper.buildHangUpIntent()
|
||||||
|
LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(leaveBroadcastIntent)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleConfirmSwitching(action: JitsiCallViewEvents.ConfirmSwitchingConference) {
|
private fun handleConfirmSwitching(action: JitsiCallViewEvents.ConfirmSwitchingConference) {
|
||||||
|
@ -222,10 +243,17 @@ class VectorJitsiActivity : VectorBaseActivity<ActivityJitsiBinding>(), JitsiMee
|
||||||
Timber.v("Broadcast received: $event")
|
Timber.v("Broadcast received: $event")
|
||||||
when (event) {
|
when (event) {
|
||||||
is ConferenceEvent.Terminated -> onConferenceTerminated(event.data)
|
is ConferenceEvent.Terminated -> onConferenceTerminated(event.data)
|
||||||
else -> Unit
|
is ConferenceEvent.Joined -> onConferenceJoined(event.data)
|
||||||
|
is ConferenceEvent.ReadyToClose -> onReadyToClose()
|
||||||
|
is ConferenceEvent.WillJoin -> Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun onConferenceJoined(extraData: Map<String, Any>) {
|
||||||
|
// Launch the service for the ongoing notification.
|
||||||
|
JitsiMeetOngoingConferenceService.launch(this, HashMap(extraData))
|
||||||
|
}
|
||||||
|
|
||||||
private fun onConferenceTerminated(data: JsonDict) {
|
private fun onConferenceTerminated(data: JsonDict) {
|
||||||
Timber.v("JitsiMeetViewListener.onConferenceTerminated()")
|
Timber.v("JitsiMeetViewListener.onConferenceTerminated()")
|
||||||
// Do not finish if there is an error
|
// Do not finish if there is an error
|
||||||
|
@ -234,6 +262,11 @@ class VectorJitsiActivity : VectorBaseActivity<ActivityJitsiBinding>(), JitsiMee
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun onReadyToClose() {
|
||||||
|
Timber.v("SDK is ready to close")
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun newIntent(context: Context, roomId: String, widgetId: String, enableVideo: Boolean): Intent {
|
fun newIntent(context: Context, roomId: String, widgetId: String, enableVideo: Boolean): Intent {
|
||||||
return Intent(context, VectorJitsiActivity::class.java).apply {
|
return Intent(context, VectorJitsiActivity::class.java).apply {
|
||||||
|
|
|
@ -582,7 +582,7 @@ class NotificationUtils @Inject constructor(
|
||||||
val accentColor = ContextCompat.getColor(context, R.color.notification_accent_color)
|
val accentColor = ContextCompat.getColor(context, R.color.notification_accent_color)
|
||||||
// Build the pending intent for when the notification is clicked
|
// Build the pending intent for when the notification is clicked
|
||||||
val openRoomIntent = buildOpenRoomIntent(roomInfo.roomId)
|
val openRoomIntent = buildOpenRoomIntent(roomInfo.roomId)
|
||||||
val smallIcon = R.drawable.ic_status_bar
|
val smallIcon = R.drawable.ic_notification
|
||||||
|
|
||||||
val channelID = if (roomInfo.shouldBing) NOISY_NOTIFICATION_CHANNEL_ID else SILENT_NOTIFICATION_CHANNEL_ID
|
val channelID = if (roomInfo.shouldBing) NOISY_NOTIFICATION_CHANNEL_ID else SILENT_NOTIFICATION_CHANNEL_ID
|
||||||
return NotificationCompat.Builder(context, channelID)
|
return NotificationCompat.Builder(context, channelID)
|
||||||
|
@ -695,7 +695,7 @@ class NotificationUtils @Inject constructor(
|
||||||
): Notification {
|
): Notification {
|
||||||
val accentColor = ContextCompat.getColor(context, R.color.notification_accent_color)
|
val accentColor = ContextCompat.getColor(context, R.color.notification_accent_color)
|
||||||
// Build the pending intent for when the notification is clicked
|
// Build the pending intent for when the notification is clicked
|
||||||
val smallIcon = R.drawable.ic_status_bar
|
val smallIcon = R.drawable.ic_notification
|
||||||
|
|
||||||
val channelID = if (inviteNotifiableEvent.noisy) NOISY_NOTIFICATION_CHANNEL_ID else SILENT_NOTIFICATION_CHANNEL_ID
|
val channelID = if (inviteNotifiableEvent.noisy) NOISY_NOTIFICATION_CHANNEL_ID else SILENT_NOTIFICATION_CHANNEL_ID
|
||||||
|
|
||||||
|
@ -775,7 +775,7 @@ class NotificationUtils @Inject constructor(
|
||||||
): Notification {
|
): Notification {
|
||||||
val accentColor = ContextCompat.getColor(context, R.color.notification_accent_color)
|
val accentColor = ContextCompat.getColor(context, R.color.notification_accent_color)
|
||||||
// Build the pending intent for when the notification is clicked
|
// Build the pending intent for when the notification is clicked
|
||||||
val smallIcon = R.drawable.ic_status_bar
|
val smallIcon = R.drawable.ic_notification
|
||||||
|
|
||||||
val channelID = if (simpleNotifiableEvent.noisy) NOISY_NOTIFICATION_CHANNEL_ID else SILENT_NOTIFICATION_CHANNEL_ID
|
val channelID = if (simpleNotifiableEvent.noisy) NOISY_NOTIFICATION_CHANNEL_ID else SILENT_NOTIFICATION_CHANNEL_ID
|
||||||
|
|
||||||
|
@ -890,7 +890,7 @@ class NotificationUtils @Inject constructor(
|
||||||
lastMessageTimestamp: Long
|
lastMessageTimestamp: Long
|
||||||
): Notification {
|
): Notification {
|
||||||
val accentColor = ContextCompat.getColor(context, R.color.notification_accent_color)
|
val accentColor = ContextCompat.getColor(context, R.color.notification_accent_color)
|
||||||
val smallIcon = R.drawable.ic_status_bar
|
val smallIcon = R.drawable.ic_notification
|
||||||
|
|
||||||
return NotificationCompat.Builder(context, if (noisy) NOISY_NOTIFICATION_CHANNEL_ID else SILENT_NOTIFICATION_CHANNEL_ID)
|
return NotificationCompat.Builder(context, if (noisy) NOISY_NOTIFICATION_CHANNEL_ID else SILENT_NOTIFICATION_CHANNEL_ID)
|
||||||
.setOnlyAlertOnce(true)
|
.setOnlyAlertOnce(true)
|
||||||
|
@ -980,7 +980,7 @@ class NotificationUtils @Inject constructor(
|
||||||
NotificationCompat.Builder(context, NOISY_NOTIFICATION_CHANNEL_ID)
|
NotificationCompat.Builder(context, NOISY_NOTIFICATION_CHANNEL_ID)
|
||||||
.setContentTitle(stringProvider.getString(R.string.app_name))
|
.setContentTitle(stringProvider.getString(R.string.app_name))
|
||||||
.setContentText(stringProvider.getString(R.string.settings_troubleshoot_test_push_notification_content))
|
.setContentText(stringProvider.getString(R.string.settings_troubleshoot_test_push_notification_content))
|
||||||
.setSmallIcon(R.drawable.ic_status_bar)
|
.setSmallIcon(R.drawable.ic_notification)
|
||||||
.setLargeIcon(getBitmap(context, R.drawable.element_logo_green))
|
.setLargeIcon(getBitmap(context, R.drawable.element_logo_green))
|
||||||
.setColor(ContextCompat.getColor(context, R.color.notification_accent_color))
|
.setColor(ContextCompat.getColor(context, R.color.notification_accent_color))
|
||||||
.setPriority(NotificationCompat.PRIORITY_MAX)
|
.setPriority(NotificationCompat.PRIORITY_MAX)
|
||||||
|
|
Before Width: | Height: | Size: 707 B After Width: | Height: | Size: 707 B |
Before Width: | Height: | Size: 433 B After Width: | Height: | Size: 433 B |
Before Width: | Height: | Size: 910 B After Width: | Height: | Size: 910 B |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |