@@ -10,6 +10,7 @@ import android.media.projection.MediaProjectionManager
10
10
import android.net.Uri
11
11
import android.os.Bundle
12
12
import android.provider.Settings
13
+ import android.view.View
13
14
import android.widget.Toast
14
15
import androidx.activity.ComponentActivity
15
16
import androidx.activity.result.ActivityResultLauncher
@@ -25,35 +26,39 @@ import com.glia.widgets.UiTheme
25
26
import com.glia.widgets.call.CallActivity
26
27
import com.glia.widgets.call.Configuration
27
28
import com.glia.widgets.callvisualizer.controller.CallVisualizerController
29
+ import com.glia.widgets.chat.ChatView
28
30
import com.glia.widgets.core.dialog.Dialog
29
31
import com.glia.widgets.core.dialog.DialogController
30
32
import com.glia.widgets.core.dialog.model.DialogState
31
33
import com.glia.widgets.core.notification.device.NotificationManager
32
34
import com.glia.widgets.core.screensharing.ScreenSharingController
33
35
import com.glia.widgets.core.screensharing.data.GliaScreenSharingRepository.SKIP_ASKING_SCREEN_SHARING_PERMISSION_RESULT_CODE
34
36
import com.glia.widgets.di.Dependencies
37
+ import com.glia.widgets.filepreview.ui.FilePreviewView
35
38
import com.glia.widgets.helper.Logger
36
39
import com.glia.widgets.helper.Utils
37
40
import com.glia.widgets.view.Dialogs
41
+ import com.glia.widgets.view.head.controller.ServiceChatHeadController
38
42
import com.google.android.material.theme.overlay.MaterialThemeOverlay
39
43
import java.lang.ref.WeakReference
40
44
41
- class ActivityWatcherForDialogs (
45
+ class ActivityWatcherForCallVisualizer (
42
46
private val callVisualizerController : CallVisualizerController ,
43
47
private val screenSharingController : ScreenSharingController ,
44
48
private val dialogController : DialogController ,
49
+ private var serviceChatHeadController : ServiceChatHeadController ,
45
50
) : Application.ActivityLifecycleCallbacks {
46
51
47
52
companion object {
48
- private val TAG = ActivityWatcherForDialogs ::class .java.simpleName
53
+ private val TAG = ActivityWatcherForCallVisualizer ::class .java.simpleName
49
54
}
50
55
51
56
@VisibleForTesting
52
57
var dialogCallback: DialogController .Callback ? = null
53
58
private var screenSharingViewCallback: ScreenSharingController .ViewCallback ? = null
54
59
55
60
@VisibleForTesting
56
- var startMediaProjection : ActivityResultLauncher <Intent >? = null
61
+ val startMediaProjectionLaunchers = mutableMapOf< String , ActivityResultLauncher <Intent >? > ()
57
62
58
63
@VisibleForTesting
59
64
var alertDialog: AlertDialog ? = null
@@ -68,39 +73,51 @@ class ActivityWatcherForDialogs(
68
73
override fun onActivityPreCreated (activity : Activity , savedInstanceState : Bundle ? ) {
69
74
if (callVisualizerController.isCallOrChatScreenActiveUseCase(activity)) {
70
75
// Call and Chat screens process screen sharing requests on their own
71
- startMediaProjection = null
76
+ startMediaProjectionLaunchers.remove(activity:: class .simpleName)
72
77
return
73
78
}
74
79
registerForMediaProjectionPermissionResult(activity)
75
80
super .onActivityPreCreated(activity, savedInstanceState)
76
81
}
77
82
78
83
override fun onActivityCreated (activity : Activity , savedInstanceState : Bundle ? ) {}
79
- override fun onActivityDestroyed (activity : Activity ) {}
80
84
85
+ override fun onActivityDestroyed (activity : Activity ) {
86
+ if (activity.isFinishing) serviceChatHeadController.onDestroy()
87
+ }
81
88
82
89
override fun onActivityResumed (activity : Activity ) {
83
90
resumedActivity = WeakReference (activity)
84
91
addDialogCallback(resumedActivity)
85
92
addScreenSharingCallback(resumedActivity)
93
+ val gliaOrRootView: View ? = getGliaViewOrRootView(activity)
94
+ serviceChatHeadController.onResume(gliaOrRootView)
95
+ }
96
+
97
+ @VisibleForTesting
98
+ fun getGliaViewOrRootView (activity : Activity ): View ? {
99
+ return activity.findViewById(R .id.call_view)
100
+ ? : activity.findViewById<FilePreviewView >(R .id.file_preview_view)
101
+ ? : activity.findViewById<ChatView >(R .id.chat_view)
102
+ ? : activity.findViewById<EndScreenSharingView >(R .id.screen_sharing_screen_view)
103
+ ? : activity.findViewById(android.R .id.content)
104
+ ? : activity.window.decorView.findViewById(android.R .id.content)
86
105
}
87
106
88
107
override fun onActivityPaused (activity : Activity ) {
89
108
resumedActivity.clear()
90
109
removeDialogCallback()
91
110
removeScreenSharingCallback()
111
+ val gliaOrRootView: View ? = getGliaViewOrRootView(activity)
112
+ serviceChatHeadController.onPause(gliaOrRootView)
92
113
}
93
114
94
115
95
116
override fun onActivityStarted (activity : Activity ) {}
96
117
override fun onActivityStopped (activity : Activity ) {}
97
118
override fun onActivitySaveInstanceState (activity : Activity , outState : Bundle ) {}
98
119
99
- override fun onActivityPreDestroyed (activity : Activity ) {
100
- super .onActivityPreDestroyed(activity)
101
- startMediaProjection = null
102
- }
103
-
120
+ @Suppress(" RedundantNullableReturnType" )
104
121
@VisibleForTesting
105
122
fun registerForMediaProjectionPermissionResult (activity : Activity ) {
106
123
// Request a token that grants the app the ability to capture the display contents
@@ -111,11 +128,11 @@ class ActivityWatcherForDialogs(
111
128
TAG , " Activity does not support ActivityResultRegistry APIs, " +
112
129
" legacy onActivityResult() will be used to acquire a media projection token"
113
130
)
114
- startMediaProjection = null
131
+ startMediaProjectionLaunchers.remove(activity:: class .simpleName)
115
132
return
116
133
}
117
134
118
- startMediaProjection = componentActivity.registerForActivityResult(
135
+ val launcher : ActivityResultLauncher < Intent > ? = componentActivity.registerForActivityResult(
119
136
ActivityResultContracts .StartActivityForResult ()
120
137
) { result ->
121
138
Logger .d(TAG , " Acquire a media projection token: result received" )
@@ -133,6 +150,7 @@ class ActivityWatcherForDialogs(
133
150
}
134
151
}
135
152
}
153
+ activity::class .simpleName?.let { startMediaProjectionLaunchers.put(it, launcher) }
136
154
}
137
155
138
156
private fun addDialogCallback (resumedActivity : WeakReference <Activity ?>) {
@@ -169,7 +187,11 @@ class ActivityWatcherForDialogs(
169
187
}
170
188
171
189
override fun onScreenSharingStarted () {
172
- // TODO: 15.02.2023 show bubble
190
+ if (Glia .isInitialized()) {
191
+ serviceChatHeadController.init ()
192
+ }
193
+ val gliaOrRootView: View ? = getGliaViewOrRootView(it)
194
+ serviceChatHeadController.onResume(gliaOrRootView)
173
195
}
174
196
}
175
197
}
@@ -353,10 +375,10 @@ class ActivityWatcherForDialogs(
353
375
}
354
376
355
377
private fun acquireMediaProjectionToken (activity : Activity ) {
356
- startMediaProjection? .let { startMediaProjection ->
378
+ startMediaProjectionLaunchers[activity:: class .simpleName] .let { startMediaProjection ->
357
379
activity.getSystemService(MediaProjectionManager ::class .java)
358
380
?.let { mediaProjectionManager ->
359
- startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent())
381
+ startMediaProjection? .launch(mediaProjectionManager.createScreenCaptureIntent())
360
382
Logger .d(
361
383
TAG ,
362
384
" Acquire a media projection token: launching permission request"
0 commit comments