Skip to content

Commit 1fcc3d1

Browse files
committed
[Android]deprecate the InCallReport module and implement it in multiple modules
1 parent 2d305ce commit 1fcc3d1

7 files changed

Lines changed: 217 additions & 21 deletions

File tree

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package io.agora.api.example.common.widget;
2+
3+
import android.content.Context;
4+
import android.graphics.Color;
5+
import android.util.AttributeSet;
6+
import android.view.SurfaceView;
7+
import android.view.TextureView;
8+
import android.view.View;
9+
import android.view.ViewGroup;
10+
import android.widget.FrameLayout;
11+
import android.widget.TextView;
12+
13+
import androidx.annotation.NonNull;
14+
import androidx.annotation.Nullable;
15+
16+
import io.agora.api.example.common.model.StatisticsInfo;
17+
import io.agora.rtc2.IRtcEngineEventHandler;
18+
19+
public class VideoReportLayout extends FrameLayout {
20+
21+
private final StatisticsInfo statisticsInfo = new StatisticsInfo();
22+
private TextView reportTextView;
23+
private int reportUid = -1;
24+
25+
public VideoReportLayout(@NonNull Context context) {
26+
super(context);
27+
}
28+
29+
public VideoReportLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
30+
super(context, attrs);
31+
}
32+
33+
public VideoReportLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
34+
super(context, attrs, defStyleAttr);
35+
}
36+
37+
@Override
38+
public void addView(View child, int index, ViewGroup.LayoutParams params) {
39+
super.addView(child, index, params);
40+
41+
if (child instanceof SurfaceView || child instanceof TextureView) {
42+
reportTextView = new TextView(getContext());
43+
reportTextView.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
44+
@Override
45+
public void onViewAttachedToWindow(View v) {
46+
47+
}
48+
49+
@Override
50+
public void onViewDetachedFromWindow(View v) {
51+
reportTextView.removeOnAttachStateChangeListener(this);
52+
reportTextView = null;
53+
}
54+
});
55+
reportTextView.setTextColor(Color.parseColor("#eeeeee"));
56+
LayoutParams reportParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
57+
reportParams.topMargin = reportParams.leftMargin = 16;
58+
addView(reportTextView, reportParams);
59+
}
60+
}
61+
62+
public void setReportUid(int uid) {
63+
this.reportUid = uid;
64+
}
65+
66+
public int getReportUid() {
67+
return reportUid;
68+
}
69+
70+
public void setLocalAudioStats(IRtcEngineEventHandler.LocalAudioStats stats){
71+
statisticsInfo.setLocalAudioStats(stats);
72+
setReportText(statisticsInfo.getLocalVideoStats());
73+
}
74+
75+
public void setLocalVideoStats(IRtcEngineEventHandler.LocalVideoStats stats){
76+
if (stats.uid != reportUid) {
77+
return;
78+
}
79+
statisticsInfo.setLocalVideoStats(stats);
80+
setReportText(statisticsInfo.getLocalVideoStats());
81+
}
82+
83+
public void setRemoteAudioStats(IRtcEngineEventHandler.RemoteAudioStats stats){
84+
if (stats.uid != reportUid) {
85+
return;
86+
}
87+
statisticsInfo.setRemoteAudioStats(stats);
88+
setReportText(statisticsInfo.getRemoteVideoStats());
89+
}
90+
91+
public void setRemoteVideoStats(IRtcEngineEventHandler.RemoteVideoStats stats){
92+
if (stats.uid != reportUid) {
93+
return;
94+
}
95+
statisticsInfo.setRemoteVideoStats(stats);
96+
setReportText(statisticsInfo.getRemoteVideoStats());
97+
}
98+
99+
100+
private void setReportText(String reportText) {
101+
if(reportTextView != null){
102+
reportTextView.post(new Runnable() {
103+
@Override
104+
public void run() {
105+
reportTextView.setText(reportText);
106+
}
107+
});
108+
}
109+
}
110+
111+
}

Android/APIExample/app/src/main/java/io/agora/api/example/examples/advanced/InCallReport.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.agora.api.example.examples.advanced;
22

3-
import static io.agora.api.example.common.model.Examples.ADVANCED;
43
import static io.agora.rtc2.video.VideoCanvas.RENDER_MODE_HIDDEN;
54
import static io.agora.rtc2.video.VideoEncoderConfiguration.STANDARD_BITRATE;
65

@@ -25,7 +24,6 @@
2524

2625
import io.agora.api.example.MainApplication;
2726
import io.agora.api.example.R;
28-
import io.agora.api.example.annotation.Example;
2927
import io.agora.api.example.common.BaseFragment;
3028
import io.agora.api.example.common.model.StatisticsInfo;
3129
import io.agora.api.example.utils.CommonUtil;
@@ -36,13 +34,19 @@
3634
import io.agora.rtc2.video.VideoCanvas;
3735
import io.agora.rtc2.video.VideoEncoderConfiguration;
3836

39-
@Example(
40-
index = 17,
41-
group = ADVANCED,
42-
name = R.string.item_incallreport,
43-
actionId = R.id.action_mainFragment_to_InCallReport,
44-
tipsId = R.string.incallstats
45-
)
37+
//@Example(
38+
// index = 17,
39+
// group = ADVANCED,
40+
// name = R.string.item_incallreport,
41+
// actionId = R.id.action_mainFragment_to_InCallReport,
42+
// tipsId = R.string.incallstats
43+
//)
44+
45+
/**
46+
*
47+
* @deprecated The report has been moved to {@link io.agora.api.example.common.widget.VideoReportLayout}.
48+
* You can refer to {@link LiveStreaming} or {@link io.agora.api.example.examples.basic.JoinChannelVideo} example.
49+
*/
4650
public class InCallReport extends BaseFragment implements View.OnClickListener {
4751
private static final String TAG = InCallReport.class.getSimpleName();
4852

Android/APIExample/app/src/main/java/io/agora/api/example/examples/advanced/LiveStreaming.java

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import io.agora.api.example.R;
3030
import io.agora.api.example.annotation.Example;
3131
import io.agora.api.example.common.BaseFragment;
32+
import io.agora.api.example.common.widget.VideoReportLayout;
3233
import io.agora.api.example.utils.CommonUtil;
3334
import io.agora.rtc2.ChannelMediaOptions;
3435
import io.agora.rtc2.ClientRoleOptions;
@@ -56,7 +57,7 @@
5657
public class LiveStreaming extends BaseFragment implements View.OnClickListener {
5758
private static final String TAG = LiveStreaming.class.getSimpleName();
5859

59-
private FrameLayout foreGroundVideo, backGroundVideo;
60+
private VideoReportLayout foreGroundVideo, backGroundVideo;
6061
private Button join, publish, latency;
6162
private EditText et_channel;
6263
private RtcEngine engine;
@@ -65,7 +66,7 @@ public class LiveStreaming extends BaseFragment implements View.OnClickListener
6566
private boolean joined = false;
6667
private boolean isHost = false;
6768
private boolean isLowLatency = false;
68-
private boolean isLocalVideoForeground = false;
69+
private boolean isLocalVideoForeground = true;
6970

7071
@Nullable
7172
@Override
@@ -202,6 +203,10 @@ public void onClick(View v) {
202203
engine.setClientRole(CLIENT_ROLE_AUDIENCE, clientRoleOptions);
203204
} else if (v.getId() == R.id.foreground_video) {
204205
isLocalVideoForeground = !isLocalVideoForeground;
206+
int foreGroundReportId = foreGroundVideo.getReportUid();
207+
foreGroundVideo.setReportUid(backGroundVideo.getReportUid());
208+
backGroundVideo.setReportUid(foreGroundReportId);
209+
205210
if (foreGroundVideo.getChildCount() > 0) {
206211
foreGroundVideo.removeAllViews();
207212
}
@@ -359,6 +364,7 @@ public void run() {
359364
join.setText(getString(R.string.leave));
360365
publish.setEnabled(true);
361366
latency.setEnabled(true);
367+
foreGroundVideo.setReportUid(uid);
362368
}
363369
});
364370
}
@@ -439,6 +445,7 @@ public void onUserJoined(int uid, int elapsed) {
439445
// Add to the remote container
440446
backGroundVideo.addView(surfaceView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
441447

448+
backGroundVideo.setReportUid(remoteUid);
442449
// Setup remote video to render
443450
engine.setupRemoteVideo(new VideoCanvas(surfaceView, RENDER_MODE_HIDDEN, remoteUid));
444451
});
@@ -499,5 +506,45 @@ public void onSnapshotTaken(int uid, String filePath, int width, int height, int
499506
showLongToast("SnapshotTaken error=" + RtcEngine.getErrorDescription(errCode));
500507
}
501508
}
509+
510+
@Override
511+
public void onLocalVideoStats(Constants.VideoSourceType source, LocalVideoStats stats) {
512+
super.onLocalVideoStats(source, stats);
513+
if(isLocalVideoForeground){
514+
foreGroundVideo.setLocalVideoStats(stats);
515+
}else{
516+
backGroundVideo.setLocalVideoStats(stats);
517+
}
518+
}
519+
520+
@Override
521+
public void onLocalAudioStats(LocalAudioStats stats) {
522+
super.onLocalAudioStats(stats);
523+
if(isLocalVideoForeground){
524+
foreGroundVideo.setLocalAudioStats(stats);
525+
}else{
526+
backGroundVideo.setLocalAudioStats(stats);
527+
}
528+
}
529+
530+
@Override
531+
public void onRemoteVideoStats(RemoteVideoStats stats) {
532+
super.onRemoteVideoStats(stats);
533+
if(!isLocalVideoForeground){
534+
foreGroundVideo.setRemoteVideoStats(stats);
535+
}else{
536+
backGroundVideo.setRemoteVideoStats(stats);
537+
}
538+
}
539+
540+
@Override
541+
public void onRemoteAudioStats(RemoteAudioStats stats) {
542+
super.onRemoteAudioStats(stats);
543+
if(!isLocalVideoForeground){
544+
foreGroundVideo.setRemoteAudioStats(stats);
545+
}else{
546+
backGroundVideo.setRemoteAudioStats(stats);
547+
}
548+
}
502549
};
503550
}

Android/APIExample/app/src/main/java/io/agora/api/example/examples/basic/JoinChannelVideo.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import io.agora.api.example.annotation.Example;
3636
import io.agora.api.example.common.BaseFragment;
3737
import io.agora.api.example.common.Constant;
38+
import io.agora.api.example.common.widget.VideoReportLayout;
3839
import io.agora.api.example.utils.CommonUtil;
3940
import io.agora.rtc2.ChannelMediaOptions;
4041
import io.agora.rtc2.Constants;
@@ -57,14 +58,15 @@ public class JoinChannelVideo extends BaseFragment implements View.OnClickListen
5758
{
5859
private static final String TAG = JoinChannelVideo.class.getSimpleName();
5960

60-
private FrameLayout fl_local, fl_remote, fl_remote_2, fl_remote_3;
61+
private VideoReportLayout fl_local, fl_remote, fl_remote_2, fl_remote_3;
6162
private Button join, switch_camera;
6263
private EditText et_channel;
6364
private RtcEngine engine;
6465
private int myUid;
6566
private boolean joined = false;
6667
private Map<Integer, ViewGroup> remoteViews = new ConcurrentHashMap<Integer, ViewGroup>();
6768

69+
6870
@Nullable
6971
@Override
7072
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
@@ -339,6 +341,7 @@ public void run()
339341
{
340342
join.setEnabled(true);
341343
join.setText(getString(R.string.leave));
344+
fl_local.setReportUid(uid);
342345
}
343346
});
344347
}
@@ -451,7 +454,8 @@ public void onUserJoined(int uid, int elapsed)
451454
// Create render view by RtcEngine
452455
surfaceView = new SurfaceView(context);
453456
surfaceView.setZOrderMediaOverlay(true);
454-
ViewGroup view = getAvailableView();
457+
VideoReportLayout view = getAvailableView();
458+
view.setReportUid(uid);
455459
remoteViews.put(uid, view);
456460
// Add to the remote container
457461
view.addView(surfaceView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
@@ -488,9 +492,37 @@ public void run() {
488492
}
489493
});
490494
}
495+
496+
@Override
497+
public void onLocalAudioStats(LocalAudioStats stats) {
498+
super.onLocalAudioStats(stats);
499+
fl_local.setLocalAudioStats(stats);
500+
}
501+
502+
@Override
503+
public void onRemoteAudioStats(RemoteAudioStats stats) {
504+
super.onRemoteAudioStats(stats);
505+
fl_remote.setRemoteAudioStats(stats);
506+
fl_remote_2.setRemoteAudioStats(stats);
507+
fl_remote_3.setRemoteAudioStats(stats);
508+
}
509+
510+
@Override
511+
public void onLocalVideoStats(Constants.VideoSourceType source, LocalVideoStats stats) {
512+
super.onLocalVideoStats(source, stats);
513+
fl_local.setLocalVideoStats(stats);
514+
}
515+
516+
@Override
517+
public void onRemoteVideoStats(RemoteVideoStats stats) {
518+
super.onRemoteVideoStats(stats);
519+
fl_remote.setRemoteVideoStats(stats);
520+
fl_remote_2.setRemoteVideoStats(stats);
521+
fl_remote_3.setRemoteVideoStats(stats);
522+
}
491523
};
492524

493-
private ViewGroup getAvailableView() {
525+
private VideoReportLayout getAvailableView() {
494526
if(fl_remote.getChildCount() == 0){
495527
return fl_remote;
496528
}

Android/APIExample/app/src/main/res/layout/fragment_joinchannel_video.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@
2121
android:layout_weight="0.5"
2222
android:orientation="horizontal">
2323

24-
<FrameLayout
24+
<io.agora.api.example.common.widget.VideoReportLayout
2525
android:id="@+id/fl_local"
2626
android:layout_width="0dp"
2727
android:layout_weight="0.5"
2828
android:layout_height="match_parent"/>
2929

30-
<FrameLayout
30+
<io.agora.api.example.common.widget.VideoReportLayout
3131
android:id="@+id/fl_remote"
3232
android:layout_width="0dp"
3333
android:layout_weight="0.5"
@@ -41,13 +41,13 @@
4141
android:layout_weight="0.5"
4242
android:orientation="horizontal">
4343

44-
<FrameLayout
44+
<io.agora.api.example.common.widget.VideoReportLayout
4545
android:id="@+id/fl_remote2"
4646
android:layout_width="0dp"
4747
android:layout_weight="0.5"
4848
android:layout_height="match_parent"/>
4949

50-
<FrameLayout
50+
<io.agora.api.example.common.widget.VideoReportLayout
5151
android:id="@+id/fl_remote3"
5252
android:layout_width="0dp"
5353
android:layout_weight="0.5"

Android/APIExample/app/src/main/res/layout/fragment_live_streaming.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
android:fitsSystemWindows="true"
77
tools:context=".examples.advanced.LiveStreaming">
88

9-
<FrameLayout
9+
<io.agora.api.example.common.widget.VideoReportLayout
1010
android:id="@+id/background_video"
1111
android:layout_width="match_parent"
1212
android:layout_height="match_parent"
1313
android:layout_above="@+id/ll_join" >
14-
</FrameLayout>
14+
</io.agora.api.example.common.widget.VideoReportLayout>
1515

16-
<FrameLayout
16+
<io.agora.api.example.common.widget.VideoReportLayout
1717
android:id="@+id/foreground_video"
1818
android:layout_width="150dp"
1919
android:layout_height="200dp"

Android/APIExample/app/src/main/res/layout/widget_audio_only_layout.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
android:layout_width="wrap_content"
3636
android:layout_height="wrap_content"
3737
android:layout_gravity="bottom"
38+
android:layout_marginStart="8dp"
39+
android:layout_marginBottom="8dp"
3840
android:showDividers="beginning|middle|end"
3941
android:stretchColumns="1">
4042

0 commit comments

Comments
 (0)