Skip to content

Commit 5505bf7

Browse files
committed
add new sample activities
1 parent 59e2ec0 commit 5505bf7

File tree

7 files changed

+422
-16
lines changed

7 files changed

+422
-16
lines changed

webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,18 +1382,20 @@ public void onIceDisconnected(String streamId) {
13821382
config.webRTCListener.onIceDisconnected(streamId);
13831383
}
13841384

1385-
if (streamStoppedByUser) {
1386-
release(true);
1387-
return;
1388-
}
1389-
1390-
if (config.reconnectionEnabled) {
1391-
rePublishPlay();
1392-
}
1393-
1394-
if(isConference()){
1395-
releaseRemoteRenderers();
1396-
}
1385+
if (peers.size() == 1) {
1386+
if (streamStoppedByUser) {
1387+
release(true);
1388+
return;
1389+
}
1390+
1391+
if (config.reconnectionEnabled) {
1392+
rePublishPlay();
1393+
}
1394+
1395+
if (isConference()) {
1396+
releaseRemoteRenderers();
1397+
}
1398+
}
13971399

13981400
});
13991401
}

webrtc-android-sample-app/src/main/AndroidManifest.xml

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,6 @@
9999
android:exported="true"
100100
android:theme="@style/Theme.AppCompat.DayNight"
101101
android:configChanges="orientation|keyboard|screenSize|smallestScreenSize|screenLayout"/>
102-
<activity android:name=".advanced.USBCameraActivity"
103-
android:exported="true"
104-
android:theme="@style/Theme.AppCompat.DayNight"
105-
android:configChanges="orientation|keyboard|screenSize|smallestScreenSize|screenLayout"/>
106102
<activity android:name=".advanced.MultiTrackPlayActivity"
107103
android:exported="true"
108104
android:theme="@style/Theme.AppCompat.DayNight"
@@ -115,6 +111,15 @@
115111
android:exported="true"
116112
android:theme="@style/Theme.AppCompat.DayNight"
117113
android:configChanges="orientation|keyboard|screenSize|smallestScreenSize|screenLayout"/>
114+
<activity android:name=".TeacherActivity"
115+
android:exported="true"
116+
android:theme="@style/Theme.AppCompat.DayNight"
117+
android:configChanges="orientation|keyboard|screenSize|smallestScreenSize|screenLayout"/>
118+
<activity android:name=".StudentActivity"
119+
android:exported="true"
120+
android:theme="@style/Theme.AppCompat.DayNight"
121+
android:configChanges="orientation|keyboard|screenSize|smallestScreenSize|screenLayout"/>
122+
118123
<receiver android:name=".advanced.notification.AcceptCallReceiver" android:exported="false"/>
119124
<receiver android:name=".advanced.notification.DeclineCallReceiver" android:exported="false"/>
120125

webrtc-android-sample-app/src/main/java/io/antmedia/webrtc_android_sample_app/MainActivity.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ protected void onCreate(Bundle savedInstanceState) {
6363
}
6464

6565
private void createList() {
66+
/*
6667
addActivity(PublishActivity.class, "Publish");
6768
addActivity(PlayActivity.class, "Play");
6869
addActivity(PeerActivity.class, "Peer");
@@ -81,6 +82,10 @@ private void createList() {
8182
addActivity(PublishActivityWithAreYouSpeaking.class, "Publish with Are You Speaking");
8283
addActivity(StatsActivity.class, "Stats");
8384
addActivity(WebviewActivity.class, "Webview");
85+
*/
86+
addActivity(TeacherActivity.class, "Teacher");
87+
addActivity(StudentActivity.class, "Student");
88+
8489

8590
}
8691

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package io.antmedia.webrtc_android_sample_app;
2+
3+
import static android.view.View.INVISIBLE;
4+
import static android.view.View.VISIBLE;
5+
import static android.widget.Toast.LENGTH_LONG;
6+
7+
import android.os.Build;
8+
import android.os.Bundle;
9+
import android.os.Handler;
10+
import android.util.Log;
11+
import android.view.View;
12+
import android.widget.Button;
13+
import android.widget.EditText;
14+
import android.widget.LinearLayout;
15+
import android.widget.Toast;
16+
17+
import androidx.annotation.RequiresApi;
18+
import androidx.appcompat.app.AppCompatActivity;
19+
20+
import org.webrtc.DataChannel;
21+
import org.webrtc.SurfaceViewRenderer;
22+
import org.webrtc.VideoTrack;
23+
24+
import java.nio.ByteBuffer;
25+
import java.nio.charset.StandardCharsets;
26+
27+
import io.antmedia.webrtcandroidframework.api.DefaultDataChannelObserver;
28+
import io.antmedia.webrtcandroidframework.api.DefaultWebRTCListener;
29+
import io.antmedia.webrtcandroidframework.api.IDataChannelObserver;
30+
import io.antmedia.webrtcandroidframework.api.IWebRTCClient;
31+
import io.antmedia.webrtcandroidframework.api.IWebRTCListener;
32+
import io.antmedia.webrtcandroidframework.api.PlayParams;
33+
34+
public class StudentActivity extends AppCompatActivity {
35+
private IWebRTCClient webRTCClient;
36+
private LinearLayout playersLayout;
37+
private String streamId = "melik";
38+
private String roomId = "room1";
39+
String serverUrl = "ws://10.0.2.2:5080/live/websocket";
40+
private SurfaceViewRenderer studentRenderer;
41+
42+
@RequiresApi(api = Build.VERSION_CODES.M)
43+
@Override
44+
protected void onCreate(Bundle savedInstanceState) {
45+
super.onCreate(savedInstanceState);
46+
setContentView(R.layout.activity_student);
47+
48+
playersLayout = findViewById(R.id.players);
49+
50+
studentRenderer = findViewById(R.id.student_renderer);
51+
52+
53+
webRTCClient = IWebRTCClient.builder()
54+
.setServerUrl(serverUrl)
55+
.setLocalVideoRenderer(studentRenderer)
56+
.setActivity(this)
57+
.setWebRTCListener(createWebRTCListener())
58+
.setDataChannelObserver(createDatachannelObserver())
59+
.build();
60+
61+
View startStreamingButton = findViewById(R.id.start_streaming_button);
62+
View raiseHandButton = findViewById(R.id.raise_hand_button);
63+
startStreamingButton.setOnClickListener(v -> startStopStream(v));
64+
raiseHandButton.setOnClickListener(v -> {
65+
sendTextMessage("RAISE_HAND");
66+
});
67+
68+
studentRenderer.setVisibility(INVISIBLE);
69+
}
70+
71+
72+
public void startStopStream(View v) {
73+
if (!webRTCClient.isStreaming(streamId)) {
74+
((Button) v).setText("Stop");
75+
Log.i(getClass().getSimpleName(), "Calling play start");
76+
PlayParams params = new PlayParams(
77+
roomId,
78+
null,
79+
null,
80+
"subscriberMelik",
81+
"Subscriber Melik",
82+
null,
83+
null,
84+
true
85+
);
86+
87+
webRTCClient.play(params);
88+
}
89+
else {
90+
((Button) v).setText("Start");
91+
Log.i(getClass().getSimpleName(), "Calling play start");
92+
webRTCClient.stop(roomId);
93+
}
94+
}
95+
96+
private IDataChannelObserver createDatachannelObserver() {
97+
return new DefaultDataChannelObserver() {
98+
@Override
99+
public void textMessageReceived(String messageText) {
100+
super.textMessageReceived(messageText);
101+
Toast.makeText(StudentActivity.this, messageText, LENGTH_LONG);
102+
103+
if (messageText.contains("BECOME_ATTENDEE")) {
104+
Log.i("","BECOME_ATTENDEE");
105+
studentRenderer.setVisibility(VISIBLE);
106+
webRTCClient.publish(streamId, null,
107+
true, true,
108+
null, null,
109+
"melik", roomId);
110+
111+
//important enable track
112+
webRTCClient.enableTrack(roomId, "burak", true);
113+
}
114+
else if (messageText.contains("BECOME_STUDENT")) {
115+
Log.i("","BECOME_STUDENT");
116+
studentRenderer.setVisibility(INVISIBLE);
117+
118+
webRTCClient.stop(streamId);
119+
120+
//important disable track
121+
webRTCClient.enableTrack(roomId, "burak", false);
122+
123+
}
124+
}
125+
};
126+
}
127+
128+
private IWebRTCListener createWebRTCListener() {
129+
return new DefaultWebRTCListener() {
130+
@Override
131+
public void onNewVideoTrack(VideoTrack videoTrack, String trackId) {
132+
runOnUiThread(() -> {
133+
SurfaceViewRenderer renderer = new SurfaceViewRenderer(getApplicationContext());
134+
renderer.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
135+
LinearLayout.LayoutParams.WRAP_CONTENT));
136+
playersLayout.addView(renderer);
137+
webRTCClient.getConfig().remoteVideoRenderers.add(renderer);
138+
renderer.setTag(videoTrack);
139+
webRTCClient.setRendererForVideoTrack(renderer, videoTrack);
140+
});
141+
}
142+
};
143+
}
144+
145+
public void sendTextMessage(String messageToSend) {
146+
final ByteBuffer buffer = ByteBuffer.wrap(messageToSend.getBytes(StandardCharsets.UTF_8));
147+
DataChannel.Buffer buf = new DataChannel.Buffer(buffer, false);
148+
149+
//important roomId
150+
webRTCClient.sendMessageViaDataChannel(roomId, buf);
151+
}
152+
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package io.antmedia.webrtc_android_sample_app;
2+
3+
import static android.widget.Toast.LENGTH_LONG;
4+
5+
import android.os.Build;
6+
import android.os.Bundle;
7+
import android.os.Handler;
8+
import android.util.Log;
9+
import android.view.View;
10+
import android.widget.Button;
11+
import android.widget.LinearLayout;
12+
import android.widget.Toast;
13+
14+
import androidx.annotation.RequiresApi;
15+
import androidx.appcompat.app.AppCompatActivity;
16+
17+
import org.webrtc.DataChannel;
18+
import org.webrtc.SurfaceViewRenderer;
19+
import org.webrtc.VideoTrack;
20+
21+
import java.nio.ByteBuffer;
22+
import java.nio.charset.StandardCharsets;
23+
24+
import io.antmedia.webrtcandroidframework.api.DefaultConferenceWebRTCListener;
25+
import io.antmedia.webrtcandroidframework.api.DefaultDataChannelObserver;
26+
import io.antmedia.webrtcandroidframework.api.IDataChannelObserver;
27+
import io.antmedia.webrtcandroidframework.api.IWebRTCClient;
28+
import io.antmedia.webrtcandroidframework.api.IWebRTCListener;
29+
30+
public class TeacherActivity extends AppCompatActivity {
31+
private IWebRTCClient webRTCClient;
32+
private LinearLayout playersLayout;
33+
String streamId = "burak";
34+
String roomId = "room1";
35+
String serverUrl = "ws://10.0.2.2:5080/live/websocket";
36+
37+
38+
@RequiresApi(api = Build.VERSION_CODES.M)
39+
@Override
40+
protected void onCreate(Bundle savedInstanceState) {
41+
super.onCreate(savedInstanceState);
42+
setContentView(R.layout.activity_teacher);
43+
playersLayout = findViewById(R.id.players);
44+
SurfaceViewRenderer teacherRenderer = findViewById(R.id.teacher_renderer);
45+
46+
webRTCClient = IWebRTCClient.builder()
47+
.setLocalVideoRenderer(teacherRenderer)
48+
.setServerUrl(serverUrl)
49+
.setActivity(this)
50+
.setInitiateBeforeStream(true)
51+
.setBluetoothEnabled(true)
52+
.setWebRTCListener(createWebRTCListener(roomId, streamId))
53+
.setDataChannelObserver(createDatachannelObserver())
54+
.build();
55+
56+
View startStreamingButton = findViewById(R.id.start_streaming_button);
57+
View subscribersButton = findViewById(R.id.raise_hand_button);
58+
View makeStudentButton = findViewById(R.id.make_student_button);
59+
startStreamingButton.setOnClickListener(v -> startStopStream(v));
60+
subscribersButton.setOnClickListener(v -> {
61+
webRTCClient.getSubscriberCount(roomId);
62+
webRTCClient.getSubscriberList(roomId, 0, 10);
63+
});
64+
65+
makeStudentButton.setOnClickListener(v -> {
66+
sendTextMessage("BECOME_STUDENT");
67+
});
68+
69+
70+
}
71+
72+
73+
public void startStopStream(View v) {
74+
if (!webRTCClient.isStreaming(streamId)) {
75+
((Button) v).setText("Stop");
76+
webRTCClient.joinToConferenceRoom(roomId, streamId);
77+
}
78+
else {
79+
((Button) v).setText("Start");
80+
webRTCClient.leaveFromConference(roomId);
81+
}
82+
}
83+
84+
private IDataChannelObserver createDatachannelObserver() {
85+
return new DefaultDataChannelObserver() {
86+
@Override
87+
public void textMessageReceived(String messageText) {
88+
super.textMessageReceived(messageText);
89+
Toast.makeText(TeacherActivity.this, messageText, LENGTH_LONG);
90+
91+
if (messageText.contains("RAISE_HAND")) {
92+
Log.i("","Raise Hand detected!");
93+
sendTextMessage("BECOME_ATTENDEE");
94+
}
95+
}
96+
};
97+
}
98+
99+
private IWebRTCListener createWebRTCListener(String roomId, String streamId) {
100+
return new DefaultConferenceWebRTCListener(roomId, streamId) {
101+
@Override
102+
public void onIceDisconnected(String streamId) {
103+
super.onIceDisconnected(streamId);
104+
Toast.makeText(TeacherActivity.this,"Disconnected.",Toast.LENGTH_SHORT).show();
105+
}
106+
107+
@Override
108+
public void onNewVideoTrack(VideoTrack videoTrack, String trackId) {
109+
runOnUiThread(() -> {
110+
SurfaceViewRenderer renderer = new SurfaceViewRenderer(getApplicationContext());
111+
renderer.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
112+
LinearLayout.LayoutParams.WRAP_CONTENT));
113+
playersLayout.addView(renderer);
114+
webRTCClient.getConfig().remoteVideoRenderers.add(renderer);
115+
renderer.setTag(videoTrack);
116+
webRTCClient.setRendererForVideoTrack(renderer, videoTrack);
117+
});
118+
}
119+
};
120+
}
121+
122+
public void sendTextMessage(String messageToSend) {
123+
final ByteBuffer buffer = ByteBuffer.wrap(messageToSend.getBytes(StandardCharsets.UTF_8));
124+
DataChannel.Buffer buf = new DataChannel.Buffer(buffer, false);
125+
webRTCClient.sendMessageViaDataChannel(streamId, buf);
126+
}
127+
}

0 commit comments

Comments
 (0)