@@ -27,7 +27,9 @@ import io.getstream.video.android.uiautomator.defaultTimeout
2727import io.getstream.video.android.uiautomator.device
2828import io.getstream.video.android.uiautomator.findObject
2929import io.getstream.video.android.uiautomator.findObjects
30+ import io.getstream.video.android.uiautomator.seconds
3031import io.getstream.video.android.uiautomator.typeText
32+ import io.getstream.video.android.uiautomator.waitForText
3133import io.getstream.video.android.uiautomator.waitToAppear
3234
3335class UserRobot {
@@ -55,9 +57,20 @@ class UserRobot {
5557 return this
5658 }
5759
58- fun joinCall (callId : String? = null, camera : Boolean = true, mic : Boolean = true): UserRobot {
60+ fun joinCall (
61+ callId : String? = null,
62+ camera : UserControls ? = null,
63+ microphone : UserControls ? = null,
64+ ): UserRobot {
5965 enterLobby(callId)
60- joinCallFromLobby(camera = camera, mic = mic)
66+ if (camera != null ) {
67+ camera(camera, hard = true )
68+ }
69+ if (microphone != null ) {
70+ microphone(microphone, hard = true )
71+ }
72+ joinCallFromLobby()
73+ waitForCallToStart()
6174 return this
6275 }
6376
@@ -66,29 +79,20 @@ class UserRobot {
6679 CallDetailsPage .callIdInputField.waitToAppear().typeText(callId)
6780 }
6881 CallDetailsPage .joinCallButton.waitToAppear().click()
82+ waitForLobbyToOpen()
6983 return this
7084 }
7185
7286 // LobbyPage actions
7387
74- fun joinCallFromLobby (camera : Boolean = true, mic : Boolean = true): UserRobot {
75- LobbyPage .joinCallButton.waitToAppear()
76- val cameraIsEnabled = LobbyPage .cameraEnabledToggle.findObjects().isNotEmpty()
77- val micIsEnabled = LobbyPage .microphoneEnabledToggle.findObjects().isNotEmpty()
78-
79- if (camera && ! cameraIsEnabled) {
80- LobbyPage .cameraDisabledToggle.findObject().click()
81- } else if (! camera && cameraIsEnabled) {
82- LobbyPage .cameraEnabledToggle.findObject().click()
83- }
84-
85- if (mic && ! micIsEnabled) {
86- LobbyPage .microphoneDisabledToggle.findObject().click()
87- } else if (! mic && micIsEnabled) {
88- LobbyPage .microphoneEnabledToggle.findObject().click()
89- }
90-
88+ fun joinCallFromLobby (): UserRobot {
9189 LobbyPage .joinCallButton.findObject().click()
90+ waitForCallToStart()
91+ return this
92+ }
93+
94+ private fun waitForLobbyToOpen (): UserRobot {
95+ LobbyPage .closeButton.waitToAppear()
9296 return this
9397 }
9498
@@ -107,34 +111,79 @@ class UserRobot {
107111 return this
108112 }
109113
110- fun camera (action : UserControls ): UserRobot {
111- CallPage .callInfoView.waitToAppear()
114+ fun camera (
115+ action : UserControls ,
116+ hard : Boolean = false, // When true, hard-toggles to ensure server state syncs properly
117+ ): UserRobot {
112118 val isEnabled = CallPage .cameraEnabledToggle.findObjects().isNotEmpty()
113119
114- if (action == UserControls .ENABLE && ! isEnabled) {
115- CallPage .cameraDisabledToggle.findObject().click()
116- } else if (action == UserControls .DISABLE && isEnabled) {
117- CallPage .cameraEnabledToggle.findObject().click()
120+ when {
121+ hard -> when (action) {
122+ UserControls .ENABLE -> {
123+ if (isEnabled) {
124+ CallPage .cameraEnabledToggle.findObject().click()
125+ CallPage .cameraDisabledToggle.waitToAppear().click()
126+ } else {
127+ CallPage .cameraDisabledToggle.findObject().click()
128+ }
129+ }
130+ UserControls .DISABLE -> {
131+ if (isEnabled) {
132+ CallPage .cameraEnabledToggle.findObject().click()
133+ } else {
134+ CallPage .cameraDisabledToggle.findObject().click()
135+ CallPage .cameraEnabledToggle.waitToAppear().click()
136+ }
137+ }
138+ }
139+ action == UserControls .ENABLE && ! isEnabled -> {
140+ CallPage .cameraDisabledToggle.findObject().click()
141+ }
142+ action == UserControls .DISABLE && isEnabled -> {
143+ CallPage .cameraEnabledToggle.findObject().click()
144+ }
118145 }
119146
120147 return this
121148 }
122149
123- fun microphone (action : UserControls ): UserRobot {
124- CallPage .callInfoView.waitToAppear()
150+ fun microphone (
151+ action : UserControls ,
152+ hard : Boolean = false, // When true, hard-toggles to ensure server state syncs properly
153+ ): UserRobot {
125154 val isEnabled = CallPage .microphoneEnabledToggle.findObjects().isNotEmpty()
126155
127- if (action == UserControls .ENABLE && ! isEnabled) {
128- CallPage .microphoneDisabledToggle.findObject().click()
129- } else if (action == UserControls .DISABLE && isEnabled) {
130- CallPage .microphoneEnabledToggle.findObject().click()
156+ when {
157+ hard -> when (action) {
158+ UserControls .ENABLE -> {
159+ if (isEnabled) {
160+ CallPage .microphoneEnabledToggle.findObject().click()
161+ CallPage .microphoneDisabledToggle.waitToAppear().click()
162+ } else {
163+ CallPage .microphoneDisabledToggle.findObject().click()
164+ }
165+ }
166+ UserControls .DISABLE -> {
167+ if (isEnabled) {
168+ CallPage .microphoneEnabledToggle.findObject().click()
169+ } else {
170+ CallPage .microphoneDisabledToggle.findObject().click()
171+ CallPage .microphoneEnabledToggle.waitToAppear().click()
172+ }
173+ }
174+ }
175+ action == UserControls .ENABLE && ! isEnabled -> {
176+ CallPage .microphoneDisabledToggle.findObject().click()
177+ }
178+ action == UserControls .DISABLE && isEnabled -> {
179+ CallPage .microphoneEnabledToggle.findObject().click()
180+ }
131181 }
132182
133183 return this
134184 }
135185
136186 fun settings (action : UserControls ): UserRobot {
137- CallPage .callInfoView.waitToAppear()
138187 val isEnabled = CallPage .callSettingsOpenToggle.findObjects().isNotEmpty()
139188
140189 if (action == UserControls .ENABLE && ! isEnabled) {
@@ -175,6 +224,20 @@ class UserRobot {
175224 CallPage .cornerDraggableView.waitToAppear().swipe(direction, 1.0f )
176225 return this
177226 }
227+
228+ fun waitForParticipantsToJoin (count : Int , timeOutMillis : Long = 20.seconds): UserRobot {
229+ val user = 1
230+ val participants = user + count
231+ CallPage .participantsCountBadge
232+ .waitToAppear()
233+ .waitForText(expectedText = participants.toString(), timeOutMillis = timeOutMillis)
234+ return this
235+ }
236+
237+ private fun waitForCallToStart (): UserRobot {
238+ CallPage .callInfoView.waitToAppear()
239+ return this
240+ }
178241}
179242
180243enum class UserControls {
0 commit comments