userIds = new ArrayList<>();
+ userIds.add(targetId);
+ RongCallClient.getInstance().startCall(Conversation.ConversationType.PRIVATE, targetId, userIds, null, RongCallCommon.CallMediaType.AUDIO, null);
+ }
+
public void acceptCall(String callId) {
RongCallClient.getInstance().setVoIPCallListener(new CallStatusListener(new OnCallStatusListener() {
@Override
@@ -133,6 +182,7 @@ public class CallClientManager {
for (OnCallStatusListener listener : listeners) {
listener.onCallStart(userId, remoteVideo);
}
+ startTimer();
}
@Override
@@ -140,6 +190,7 @@ public class CallClientManager {
for (OnCallStatusListener listener : listeners) {
listener.onCallEnd();
}
+ endTimer();
}
@Override
@@ -162,6 +213,50 @@ public class CallClientManager {
return RongCallClient.getInstance() != null && RongCallClient.getInstance().getCallSession() != null;
}
+ public boolean isCallVideo(RongCallSession callSession) {
+ return callSession.getMediaType().equals(RongCallCommon.CallMediaType.VIDEO);
+ }
+
+ public long getTime(long activeTime) {
+ return activeTime == 0 ? 0 : (System.currentTimeMillis() - activeTime) / 1000;
+ }
+
+ private class CallTimeTask extends TimerTask {
+ Handler handler = new Handler(Looper.getMainLooper());
+
+ @Override
+ public void run() {
+ RongCallSession callSession = RongCallClient.getInstance().getCallSession();
+ if (callSession == null) {
+ cancel();
+ timeTask = null;
+ return;
+ }
+ long time = getTime(callSession.getActiveTime());
+ String extra;
+ if (time > 0) {
+ if (time >= 3600) {
+ extra =
+ String.format(
+ Locale.ROOT,
+ "%d:%02d:%02d",
+ time / 3600,
+ (time % 3600) / 60,
+ (time % 60));
+ } else {
+ extra = String.format(Locale.ROOT, "%02d:%02d", (time % 3600) / 60, (time % 60));
+ }
+ handler.post(() -> {
+ for (OnCallStatusListener listener : listeners) {
+ listener.onTime(extra);
+ }
+ });
+
+ }
+
+ }
+ }
+
private static class CallMeListener implements IRongReceivedCallListener {
@Override
@@ -171,7 +266,11 @@ public class CallClientManager {
bundle.putString("targetId", callSession.getTargetId());
bundle.putString("callId", callSession.getCallId());
bundle.putString("sessionId", callSession.getSessionId());
- RouteManager.forwardActivity(RouteManager.ACTIVITY_CALL_VIDEO, bundle);
+ if (callSession.getMediaType() == RongCallCommon.CallMediaType.VIDEO) {
+ RouteManager.forwardActivity(RouteManager.ACTIVITY_CALL_VIDEO, bundle);
+ } else {
+ RouteManager.forwardActivity(RouteManager.ACTIVITY_CALL_AUDIO, bundle);
+ }
}
@Override
@@ -191,7 +290,6 @@ public class CallClientManager {
}
}
-
private class CallStatusListener implements IRongCallListener {
OnCallStatusListener statusListener;
private long time = 0;
@@ -220,8 +318,11 @@ public class CallClientManager {
*/
@Override
public void onCallOutgoing(RongCallSession callSession, SurfaceView localVideo) {
- localVideo.setZOrderOnTop(true);
- localVideo.setZOrderMediaOverlay(true);
+ if (isCallVideo(callSession)) {
+ localVideo.setZOrderOnTop(true);
+ localVideo.setZOrderMediaOverlay(true);
+ CallClientManager.this.localVideo = localVideo;
+ }
statusListener.onCallWait(localVideo);
System.out.println("CallStatusListener.onCallOutgoing");
}
@@ -235,8 +336,11 @@ public class CallClientManager {
*/
@Override
public void onCallConnected(RongCallSession callSession, SurfaceView localVideo) {
- localVideo.setZOrderOnTop(true);
- localVideo.setZOrderMediaOverlay(true);
+ if (isCallVideo(callSession)) {
+ localVideo.setZOrderOnTop(true);
+ localVideo.setZOrderMediaOverlay(true);
+ CallClientManager.this.localVideo = localVideo;
+ }
statusListener.onCallWait(localVideo);
}
@@ -274,6 +378,7 @@ public class CallClientManager {
extra = String.format(Locale.ROOT, "%02d:%02d", (time % 3600) / 60, (time % 60));
}
}
+
if (!TextUtils.isEmpty(senderId)) {
CallSTerminateMessage message = new CallSTerminateMessage();
message.setReason(reason);
@@ -305,6 +410,8 @@ public class CallClientManager {
}
}
statusListener.onCallEnd();
+ CallClientManager.this.remoteVideo = null;
+ CallClientManager.this.localVideo = null;
}
@Override
@@ -328,17 +435,26 @@ public class CallClientManager {
* 如果对端调用{@link RongCallClient#startCall(int, boolean, Conversation.ConversationType, String, List, List, RongCallCommon.CallMediaType, String, StartCameraCallback)} 或
* {@link RongCallClient#acceptCall(String, int, boolean, StartCameraCallback)}开始的音视频通话,则可以使用如下设置改变对端视频流的镜像显示:
*
- * public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, int userType, SurfaceView remoteVideo) {
- * if (null != remoteVideo) {
- * ((RongRTCVideoView) remoteVideo).setMirror( boolean);//观看对方视频流是否镜像处理
- * }
- * }
- *
+ * public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, int userType, SurfaceView remoteVideo) {
+ * if (null != remoteVideo) {
+ * ((RongRTCVideoView) remoteVideo).setMirror( boolean);//观看对方视频流是否镜像处理
+ * }
+ * }
+ *
*/
@Override
public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, int userType, SurfaceView remoteVideo) {
+ if (mediaType == RongCallCommon.CallMediaType.AUDIO) {
+ statusListener.onCallStart(userId, null);
+ return;
+ }
+ if (CallClientManager.this.remoteVideo != null) {
+ statusListener.onCallStart(userId, CallClientManager.this.remoteVideo);
+ return;
+ }
remoteVideo.setZOrderOnTop(false);
remoteVideo.setZOrderMediaOverlay(false);
+ CallClientManager.this.remoteVideo = remoteVideo;
statusListener.onCallStart(userId, remoteVideo);
System.out.println("CallStatusListener.onRemoteUserJoined");
}
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java
index 16e669c3a..965efb403 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java
@@ -18,6 +18,7 @@ public class RouteManager {
public static final String ACTIVITY_HOME_SEARCH = "/activity/HomeSearchActivity";
public static final String ACTIVITY_HOME_SCREEN = "/activity/HomeScreenActivity";
public static final String ACTIVITY_CALL_VIDEO = "/activity/CallVideoActivity";
+ public static final String ACTIVITY_CALL_AUDIO = "/activity/CallVAudioActivity";
public static final String PATH_EDITPROFILE = "/main/EditProfileActivity";
//设置基本资料
diff --git a/OneToOne/src/main/java/com/shayu/onetoone/provider/OTOCallEndMessageItemProvider.java b/OneToOne/src/main/java/com/shayu/onetoone/provider/OTOCallEndMessageItemProvider.java
index 733a97bdb..d95de5fbe 100644
--- a/OneToOne/src/main/java/com/shayu/onetoone/provider/OTOCallEndMessageItemProvider.java
+++ b/OneToOne/src/main/java/com/shayu/onetoone/provider/OTOCallEndMessageItemProvider.java
@@ -1,185 +1,33 @@
package com.shayu.onetoone.provider;
-import static io.rong.calllib.RongCallCommon.CallDisconnectedReason.HANGUP;
import static io.rong.calllib.RongCallCommon.CallDisconnectedReason.OTHER_DEVICE_HAD_ACCEPTED;
import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
+import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
import android.widget.Toast;
import com.shayu.onetoone.R;
+import com.shayu.onetoone.manager.CallClientManager;
+import com.shayu.onetoone.manager.RouteManager;
import com.yunbao.common.utils.ToastUtil;
-import io.rong.callkit.RongCallAction;
+import java.util.List;
+
+import io.rong.callkit.CallEndMessageItemProvider;
import io.rong.callkit.util.CallKitUtils;
import io.rong.calllib.RongCallClient;
import io.rong.calllib.RongCallCommon;
import io.rong.calllib.RongCallSession;
import io.rong.calllib.message.CallSTerminateMessage;
-import io.rong.imkit.conversation.messgelist.provider.BaseMessageItemProvider;
import io.rong.imkit.model.UiMessage;
import io.rong.imkit.widget.adapter.IViewProviderListener;
import io.rong.imkit.widget.adapter.ViewHolder;
-import io.rong.imlib.model.Message;
import io.rong.imlib.model.MessageContent;
-import java.util.List;
-import java.util.Locale;
-public class OTOCallEndMessageItemProvider extends BaseMessageItemProvider {
- @Override
- protected io.rong.imkit.widget.adapter.ViewHolder onCreateMessageContentViewHolder(
- ViewGroup parent, int viewType) {
- View textView =
- LayoutInflater.from(parent.getContext())
- .inflate(R.layout.rc_text_message_item, parent, false);
- return new ViewHolder(parent.getContext(), textView);
- }
-
- @Override
- protected void bindMessageContentViewHolder(
- ViewHolder holder,
- ViewHolder parentHolder,
- CallSTerminateMessage callSTerminateMessage,
- UiMessage uiMessage,
- int position,
- List list,
- IViewProviderListener listener) {
- Message message = uiMessage.getMessage();
- final TextView view = holder.getView(io.rong.imkit.R.id.rc_text);
- if (message.getMessageDirection() == Message.MessageDirection.SEND) {
- view.setBackgroundResource(R.drawable.rc_ic_bubble_right);
- } else {
- view.setBackgroundResource(R.drawable.rc_ic_bubble_left);
- }
-
- RongCallCommon.CallMediaType mediaType = callSTerminateMessage.getMediaType();
- String direction = callSTerminateMessage.getDirection();
- Drawable drawable = null;
-
- String msgContent = "";
- switch (callSTerminateMessage.getReason()) {
- case CANCEL:
- msgContent = view.getResources().getString(R.string.rc_voip_mo_cancel);
- break;
- case REJECT:
- msgContent = view.getResources().getString(R.string.rc_voip_mo_reject);
- break;
- case NO_RESPONSE:
- case BUSY_LINE:
- msgContent = view.getResources().getString(R.string.rc_voip_mo_no_response);
- break;
- case REMOTE_BUSY_LINE:
- msgContent = view.getResources().getString(R.string.rc_voip_mt_busy);
- break;
- case REMOTE_CANCEL:
- msgContent = view.getResources().getString(R.string.rc_voip_mt_cancel);
- break;
- case REMOTE_REJECT:
- msgContent = view.getResources().getString(R.string.rc_voip_mt_reject);
- break;
- case REMOTE_NO_RESPONSE:
- msgContent = view.getResources().getString(R.string.rc_voip_mt_no_response);
- break;
- case NETWORK_ERROR:
- case REMOTE_NETWORK_ERROR:
- case INIT_VIDEO_ERROR:
- msgContent = view.getResources().getString(R.string.rc_voip_call_interrupt);
- break;
- case OTHER_DEVICE_HAD_ACCEPTED:
- msgContent = view.getResources().getString(R.string.rc_voip_call_other);
- break;
- case SERVICE_NOT_OPENED:
- case REMOTE_ENGINE_UNSUPPORTED:
- msgContent = view.getResources().getString(R.string.rc_voip_engine_notfound);
- break;
- case REJECTED_BY_BLACKLIST:
- msgContent =
- view.getResources().getString(R.string.rc_voip_mo_rejected_by_blocklist);
- break;
- default:
- String mo_reject = view.getResources().getString(R.string.rc_voip_mo_reject);
- String mt_reject = view.getResources().getString(R.string.rc_voip_mt_reject);
- String extra = callSTerminateMessage.getExtra();
- String timeRegex = "([0-9]?[0-9]:)?([0-5][0-9]:)?([0-5][0-9])$";
- if (!TextUtils.isEmpty(extra)) {
- boolean val = extra.matches(timeRegex);
- if (val) {
- msgContent =
- view.getResources().getString(R.string.rc_voip_call_time_length);
- msgContent += extra;
- } else {
- msgContent =
- view.getResources().getString(R.string.rc_voip_call_time_length);
- }
- } else {
- msgContent =
- callSTerminateMessage.getReason() == HANGUP ? mo_reject : mt_reject;
- }
- break;
- }
-
- view.setText(msgContent);
- view.setCompoundDrawablePadding(15);
-
- if (mediaType.equals(RongCallCommon.CallMediaType.VIDEO)) {
- if (direction != null && direction.equals("MO")) {
- drawable = view.getResources().getDrawable(R.drawable.rc_voip_video_right);
- drawable.setBounds(
- 0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
- view.setCompoundDrawablesRelative(null, null, drawable, null);
- view.setTextColor(view.getResources().getColor(R.color.rc_voip_color_right));
- } else {
- drawable = view.getResources().getDrawable(R.drawable.rc_voip_video_left);
- drawable.setBounds(
- 0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
- view.setCompoundDrawablesRelative(drawable, null, null, null);
- view.setTextColor(view.getResources().getColor(R.color.rc_voip_color_left));
- }
- } else {
- if (direction != null && direction.equals("MO")) {
- if (callSTerminateMessage.getReason().equals(HANGUP)
- || callSTerminateMessage
- .getReason()
- .equals(RongCallCommon.CallDisconnectedReason.REMOTE_HANGUP)) {
- drawable =
- view.getResources()
- .getDrawable(R.drawable.rc_voip_audio_right_connected);
- } else {
- drawable =
- view.getResources().getDrawable(R.drawable.rc_voip_audio_right_cancel);
- }
- drawable.setBounds(
- 0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
- view.setCompoundDrawablesRelative(null, null, drawable, null);
- view.setTextColor(view.getResources().getColor(R.color.rc_voip_color_right));
- } else {
- if (callSTerminateMessage.getReason().equals(HANGUP)
- || callSTerminateMessage
- .getReason()
- .equals(RongCallCommon.CallDisconnectedReason.REMOTE_HANGUP)) {
- drawable =
- view.getResources()
- .getDrawable(R.drawable.rc_voip_audio_left_connected);
- } else {
- drawable =
- view.getResources().getDrawable(R.drawable.rc_voip_audio_left_cancel);
- }
- drawable.setBounds(
- 0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
- view.setCompoundDrawablesRelative(drawable, null, null, null);
- view.setTextColor(view.getResources().getColor(R.color.rc_voip_color_left));
- }
- }
- }
+public class OTOCallEndMessageItemProvider extends CallEndMessageItemProvider {
@Override
protected boolean onItemClick(
@@ -192,7 +40,6 @@ public class OTOCallEndMessageItemProvider extends BaseMessageItemProvider 0) {
@@ -221,19 +68,17 @@ public class OTOCallEndMessageItemProvider extends BaseMessageItemProvider
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OneToOne/src/main/res/layout/dialog_bottom_list.xml b/OneToOne/src/main/res/layout/dialog_bottom_list.xml
index 05b48de55..b09685671 100644
--- a/OneToOne/src/main/res/layout/dialog_bottom_list.xml
+++ b/OneToOne/src/main/res/layout/dialog_bottom_list.xml
@@ -34,6 +34,6 @@
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/recyclerView"
- tools:text="取消" />
+ android:text="取消" />
\ No newline at end of file
diff --git a/OneToOne/src/main/res/layout/view_call_video_item.xml b/OneToOne/src/main/res/layout/view_call_video_item.xml
index d36c6a597..7648321cc 100644
--- a/OneToOne/src/main/res/layout/view_call_video_item.xml
+++ b/OneToOne/src/main/res/layout/view_call_video_item.xml
@@ -48,6 +48,17 @@
app:layout_constraintStart_toStartOf="parent"
app:srcCompat="@mipmap/ic_call_video_select" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OneToOne/src/main/res/mipmap-xxhdpi/ic_call_audio_msg.png b/OneToOne/src/main/res/mipmap-xxhdpi/ic_call_audio_msg.png
new file mode 100644
index 000000000..b4e6f3318
Binary files /dev/null and b/OneToOne/src/main/res/mipmap-xxhdpi/ic_call_audio_msg.png differ
diff --git a/OneToOne/src/main/res/mipmap-xxhdpi/ic_call_money.png b/OneToOne/src/main/res/mipmap-xxhdpi/ic_call_money.png
index fa1fe63a3..5e40a21c3 100644
Binary files a/OneToOne/src/main/res/mipmap-xxhdpi/ic_call_money.png and b/OneToOne/src/main/res/mipmap-xxhdpi/ic_call_money.png differ
diff --git a/common/src/main/java/com/yunbao/common/glide/ImgLoader.java b/common/src/main/java/com/yunbao/common/glide/ImgLoader.java
index c6f6c01c8..b7f48aa3e 100644
--- a/common/src/main/java/com/yunbao/common/glide/ImgLoader.java
+++ b/common/src/main/java/com/yunbao/common/glide/ImgLoader.java
@@ -321,6 +321,23 @@ public class ImgLoader {
}
builder.into(imageView);
}
+ public static void displayBlur(Context context, String url, ImageView imageView,int radius) {
+ displayBlur(context, url, imageView,-1,-1,radius);
+ }
+ public static void displayBlur(Context context, String url, ImageView imageView, int width, int height,int radius) {
+ if (!contextIsExist(context)) {
+ return;
+ }
+
+ RequestBuilder builder = Glide.with(context)
+ .load(url)
+ .thumbnail(thumbnail)
+ .apply(RequestOptions.bitmapTransform(new BlurTransformation(radius)));
+ if (width != -1 && height != -1) {
+ builder = builder.override(width, height);
+ }
+ builder.into(imageView);
+ }
/**
* 显示模糊的毛玻璃图片