diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml
index eada664216..20b7c4908a 100644
--- a/vector/src/main/AndroidManifest.xml
+++ b/vector/src/main/AndroidManifest.xml
@@ -375,6 +375,12 @@
android:exported="false"
android:foregroundServiceType="location" />
+
+
(), CallContro
private val screenSharingPermissionActivityResultLauncher = registerStartForActivityResult { activityResult ->
if (activityResult.resultCode == Activity.RESULT_OK) {
callViewModel.handle(VectorCallViewActions.StartScreenSharing)
+ // We need to start a foreground service with a sticky notification during screen sharing
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ ContextCompat.startForegroundService(
+ this,
+ Intent(this, ScreenCaptureService::class.java)
+ )
+ }
}
}
diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureService.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureService.kt
new file mode 100644
index 0000000000..7626e8178c
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureService.kt
@@ -0,0 +1,53 @@
+/*
+ * 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.call.webrtc
+
+import android.content.Intent
+import android.os.Binder
+import android.os.IBinder
+import dagger.hilt.android.AndroidEntryPoint
+import im.vector.app.core.services.VectorService
+import im.vector.app.features.notifications.NotificationUtils
+import javax.inject.Inject
+
+@AndroidEntryPoint
+class ScreenCaptureService : VectorService() {
+
+ @Inject lateinit var notificationUtils: NotificationUtils
+ private val binder = LocalBinder()
+
+ override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+ // Show a sticky notification
+ val notificationId = System.currentTimeMillis().toInt()
+ val notification = notificationUtils.buildScreenSharingNotification()
+ startForeground(notificationId, notification)
+
+ return START_STICKY
+ }
+
+ override fun onBind(intent: Intent?): IBinder {
+ return binder
+ }
+
+ fun stopService() {
+ stopSelf()
+ }
+
+ inner class LocalBinder : Binder() {
+ fun getService(): ScreenCaptureService = this@ScreenCaptureService
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt
index 161b58d53d..e44f42d5cd 100755
--- a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt
+++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt
@@ -535,6 +535,20 @@ class NotificationUtils @Inject constructor(private val context: Context,
.build()
}
+ /**
+ * Creates a notification that indicates the application is capturing the screen.
+ */
+ fun buildScreenSharingNotification(): Notification {
+ return NotificationCompat.Builder(context, SILENT_NOTIFICATION_CHANNEL_ID)
+ .setContentTitle(stringProvider.getString(R.string.screen_sharing_notification_title))
+ .setContentText(stringProvider.getString(R.string.screen_sharing_notification_description))
+ .setSmallIcon(R.drawable.ic_share_screen)
+ .setColor(ThemeUtils.getColor(context, android.R.attr.colorPrimary))
+ .setCategory(NotificationCompat.CATEGORY_SERVICE)
+ .setContentIntent(buildOpenHomePendingIntentForSummary())
+ .build()
+ }
+
fun buildDownloadFileNotification(uri: Uri, fileName: String, mimeType: String): Notification {
return NotificationCompat.Builder(context, SILENT_NOTIFICATION_CHANNEL_ID)
.setGroup(stringProvider.getString(R.string.app_name))
diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml
index 42f85832d4..4b8009d10b 100644
--- a/vector/src/main/res/values/strings.xml
+++ b/vector/src/main/res/values/strings.xml
@@ -3024,4 +3024,8 @@
Notify the whole room
Users
Room notification
+
+
+ ${app_name} Screen Sharing
+ Screen sharing is in progress