Skip to content

Commit 14d3085

Browse files
committed
Merge branch 'develop'
2 parents f779467 + f5eac64 commit 14d3085

File tree

184 files changed

+41796
-21641
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

184 files changed

+41796
-21641
lines changed

.repackage-assets/maven_local.png

233 KB
Loading

README.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,19 +125,20 @@ Video roadmap and changelog is available [here](https://github.com/GetStream/pro
125125
- [X] Screensharing from mobile
126126
- [X] Picture of the video stream at the highest resolution + docs on how to add a button for this (Daniel)
127127
- [X] Audio & Video filters. Support (Daniel)
128-
- [ ] Default livestream player UI + docs (Jaewoong/ Daniel)
129-
- [ ] Implement Chat overlay for Dogfooding (Jaewoong)
130-
- [ ] Add Dogfooding instructions + directs Google Play (Jaewoong)
131-
- [ ] Reaction dialog API for Compose (Jaewoong)
132-
- [ ] Android SDK development.md cleanup (Daniel)
133-
- [ ] Upgrade to more recent versions of webrtc (Kanat)
134-
- [ ] Review foreground service vs backend for audio rooms etc. (Daniel)
135-
- [ ] Support participant.custom field which was previously ignored. ParticipantState line 216 (Daniel)
128+
- [X] Implement Chat overlay for Dogfooding (Jaewoong)
129+
- [X] Migrate Stream Chat SDK v6 stable (Jaewoong)
130+
- [X] Add Dogfooding instructions + directs Google Play (Jaewoong)
131+
- [X] Support participant.custom field which was previously ignored. ParticipantState line 216 (Daniel)
132+
- [X] Default livestream player UI + docs (Jaewoong)
133+
- [X] Reaction dialog API for Compose (Jaewoong)
134+
- [X] Android SDK development.md cleanup (Jaewoong)
135+
- [X] Upgrade to more recent versions of webrtc (Jaewoong/Kanat)
136+
- [X] Review foreground service vs backend for audio rooms etc. (Aleks)
137+
- [X] Enable SFU switching
136138
- [ ] Logging is too verbose (rtc is very noisy), clean it up to focus on the essential for info and higher (Daniel)
137139

138140
### 0.5.0 milestone
139141

140-
- [ ] Enable SFU switching
141142
- [ ] H264 workaround on Samsung 23? (see https://github.com/livekit/client-sdk-android/blob/main/livekit-android-sdk/src/main/java/io/livekit/android/webrtc/SimulcastVideoEncoderFactoryWrapper.kt#L34 and
142143
- https://github.com/react-native-webrtc/react-native-webrtc/issues/983#issuecomment-975624906)
143144
- [ ] Test coverage

benchmark/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ android {
6363
}
6464
}
6565

66-
flavorDimensions("environment")
66+
flavorDimensions += "environment"
6767
productFlavors {
6868
create("dogfooding") {
6969
dimension = "environment"

benchmark/src/main/kotlin/io/getstream/video/android/benchmark/BaselineProfileGenerator.kt

Lines changed: 1 addition & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,6 @@ package io.getstream.video.android.benchmark
1919
import android.os.Build
2020
import androidx.annotation.RequiresApi
2121
import androidx.benchmark.macro.junit4.BaselineProfileRule
22-
import androidx.test.uiautomator.By
23-
import androidx.test.uiautomator.BySelector
24-
import androidx.test.uiautomator.UiDevice
25-
import androidx.test.uiautomator.UiObject2
26-
import androidx.test.uiautomator.Until
2722
import org.junit.Rule
2823
import org.junit.Test
2924

@@ -43,76 +38,6 @@ internal class BaselineProfileGenerator {
4338
startActivityAndWait()
4439
device.waitForIdle()
4540

46-
// -------------
47-
// Authenticate
48-
// -------------
49-
device.authenticateAndNavigateToHome()
50-
51-
// -------------
52-
// JoinCall
53-
// -------------
54-
device.navigateFromJoinCallToLobby()
55-
56-
// -------------
57-
// Lobby
58-
// -------------
59-
device.navigateFromLobbyToCall()
60-
61-
// -------------
62-
// Call
63-
// -------------
64-
device.testCall()
41+
dogfoodingScenarios()
6542
}
6643
}
67-
68-
private fun UiDevice.authenticateAndNavigateToHome() {
69-
wait(Until.hasObject(By.res("authenticate")), 5_000)
70-
71-
// Click the Authenticate button and login.
72-
waitForObject(By.res("authenticate"))?.click()
73-
74-
waitForIdle()
75-
}
76-
77-
private fun UiDevice.navigateFromJoinCallToLobby() {
78-
wait(Until.hasObject(By.res("start_new_call")), 5_000)
79-
80-
// wait for the Join Call button and navigate to the lobby screen by clicking.
81-
waitForObject(By.res("start_new_call"))?.click()
82-
83-
waitForIdle()
84-
}
85-
86-
private fun UiDevice.navigateFromLobbyToCall() {
87-
waitForObject(By.text(getPermissionText()), 5_000)?.click()
88-
waitForObject(By.text(getPermissionText()), 5_000)?.click()
89-
90-
wait(Until.hasObject(By.res("call_lobby")), 15_000)
91-
wait(Until.hasObject(By.res("participant_video_renderer")), 15_000)
92-
93-
// wait for the Start Call button and navigate to the call screen by clicking.
94-
waitForObject(By.res("start_call"), 15_000)?.click()
95-
96-
waitForIdle()
97-
}
98-
99-
private fun UiDevice.testCall() {
100-
wait(Until.hasObject(By.res("call_content")), 5_000)
101-
wait(Until.hasObject(By.res("video_renderer")), 5_000)
102-
waitForIdle()
103-
}
104-
105-
private fun UiDevice.waitForObject(selector: BySelector, timeout: Long = 5_000): UiObject2? {
106-
if (wait(Until.hasObject(selector), timeout)) {
107-
return findObject(selector)
108-
}
109-
return null
110-
}
111-
112-
private fun getPermissionText(): String {
113-
return when {
114-
Build.VERSION.SDK_INT <= 28 -> "ALLOW"
115-
Build.VERSION.SDK_INT == 29 -> "Allow only while using the app"
116-
else -> "While using the app"
117-
}
118-
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Copyright (c) 2014-2023 Stream.io Inc. All rights reserved.
3+
*
4+
* Licensed under the Stream License;
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://github.com/GetStream/stream-video-android/blob/main/LICENSE
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.getstream.video.android.benchmark
18+
19+
import androidx.benchmark.macro.MacrobenchmarkScope
20+
import androidx.test.uiautomator.By
21+
import androidx.test.uiautomator.UiDevice
22+
import androidx.test.uiautomator.Until
23+
24+
internal fun MacrobenchmarkScope.dogfoodingScenarios() {
25+
// -------------
26+
// Authenticate
27+
// -------------
28+
device.authenticateAndNavigateToHome()
29+
30+
// -------------
31+
// JoinCall
32+
// -------------
33+
device.navigateFromJoinCallToLobby()
34+
35+
// -------------
36+
// Lobby
37+
// -------------
38+
device.navigateFromLobbyToCall()
39+
40+
// -------------
41+
// Call
42+
// -------------
43+
device.testCall()
44+
}
45+
46+
internal fun UiDevice.authenticateAndNavigateToHome() {
47+
wait(Until.hasObject(By.res("authenticate")), 5_000)
48+
49+
// Click the Authenticate button and login.
50+
waitForObject(By.res("authenticate"))?.click()
51+
52+
waitForIdle()
53+
}
54+
55+
internal fun UiDevice.navigateFromJoinCallToLobby() {
56+
wait(Until.hasObject(By.res("start_new_call")), 5_000)
57+
58+
// wait for the Join Call button and navigate to the lobby screen by clicking.
59+
waitForObject(By.res("start_new_call"))?.click()
60+
61+
waitForIdle()
62+
}
63+
64+
internal fun UiDevice.navigateFromLobbyToCall() {
65+
waitForObject(By.text(getPermissionText()), 5_000)?.click()
66+
waitForObject(By.text(getPermissionText()), 5_000)?.click()
67+
68+
wait(Until.hasObject(By.res("call_lobby")), 15_000)
69+
wait(Until.hasObject(By.res("participant_video_renderer")), 15_000)
70+
71+
// wait for the Start Call button and navigate to the call screen by clicking.
72+
waitForObject(By.res("start_call"), 15_000)?.click()
73+
74+
waitForIdle()
75+
}
76+
77+
internal fun UiDevice.testCall() {
78+
wait(Until.hasObject(By.res("call_content")), 5_000)
79+
wait(Until.hasObject(By.res("video_renderer")), 5_000)
80+
waitForIdle()
81+
}

benchmark/src/main/kotlin/io/getstream/video/android/benchmark/StartupBenchmarks.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,9 @@ class StartupBenchmarks {
4949
},
5050
measureBlock = {
5151
startActivityAndWait()
52+
device.waitForIdle()
5253

53-
// TODO Add interactions to wait for when your app is fully drawn.
54-
// The app is fully drawn when Activity.reportFullyDrawn is called.
55-
// For Jetpack Compose, you can use ReportDrawn, ReportDrawnWhen and ReportDrawnAfter
56-
// from the AndroidX Activity library.
57-
58-
// Check the UiAutomator documentation for more information on how to
59-
// interact with the app.
60-
// https://d.android.com/training/testing/other-components/ui-automator
54+
dogfoodingScenarios()
6155
},
6256
)
6357
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (c) 2014-2023 Stream.io Inc. All rights reserved.
3+
*
4+
* Licensed under the Stream License;
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://github.com/GetStream/stream-video-android/blob/main/LICENSE
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.getstream.video.android.benchmark
18+
19+
import android.os.Build
20+
import androidx.test.uiautomator.BySelector
21+
import androidx.test.uiautomator.UiDevice
22+
import androidx.test.uiautomator.UiObject2
23+
import androidx.test.uiautomator.Until
24+
25+
internal fun UiDevice.waitForObject(selector: BySelector, timeout: Long = 5_000): UiObject2? {
26+
if (wait(Until.hasObject(selector), timeout)) {
27+
return findObject(selector)
28+
}
29+
return null
30+
}
31+
32+
internal fun getPermissionText(): String {
33+
return when {
34+
Build.VERSION.SDK_INT <= 28 -> "ALLOW"
35+
Build.VERSION.SDK_INT == 29 -> "Allow only while using the app"
36+
else -> "While using the app"
37+
}
38+
}

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ plugins {
1515
alias(libs.plugins.kotlin.android) apply false
1616
alias(libs.plugins.kotlin.serialization) apply false
1717
alias(libs.plugins.kotlin.compatibility.validator) apply false
18+
alias(libs.plugins.ksp) apply false
1819
alias(libs.plugins.wire) apply false
1920
alias(libs.plugins.nexus) apply false
2021
alias(libs.plugins.google.gms) apply false

buildSrc/src/main/kotlin/io/getstream/video/android/Configuration.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ object Configuration {
55
const val targetSdk = 34
66
const val minSdk = 24
77
const val majorVersion = 0
8-
const val minorVersion = 3
9-
const val patchVersion = 4
8+
const val minorVersion = 4
9+
const val patchVersion = 0
1010
const val versionName = "$majorVersion.$minorVersion.$patchVersion"
11-
const val versionCode = 9
11+
const val versionCode = 10
1212
const val snapshotVersionName = "$majorVersion.$minorVersion.${patchVersion + 1}-SNAPSHOT"
1313
const val artifactGroup = "io.getstream"
14-
const val streamVideoCallGooglePlayVersion = "1.0.0"
14+
const val streamVideoCallGooglePlayVersion = "1.0.1"
1515
}

0 commit comments

Comments
 (0)