diff --git a/AgoraCloudScene/src/main/java/io/agora/online/whiteboard/FcrBoardRoom.kt b/AgoraCloudScene/src/main/java/io/agora/online/whiteboard/FcrBoardRoom.kt
index 044393b7e..7a0394e14 100644
--- a/AgoraCloudScene/src/main/java/io/agora/online/whiteboard/FcrBoardRoom.kt
+++ b/AgoraCloudScene/src/main/java/io/agora/online/whiteboard/FcrBoardRoom.kt
@@ -1,12 +1,18 @@
package io.agora.online.whiteboard
import android.content.Context
+import android.os.Handler
+import android.os.Looper
+import androidx.core.content.ContextCompat
import com.herewhite.sdk.*
import com.herewhite.sdk.domain.*
+import com.herewhite.sdk.window.SlideListener
import io.agora.agoraeducore.core.internal.base.PreferenceManager
+import io.agora.agoraeducore.core.internal.base.ToastManager
import io.agora.agoraeducore.core.internal.education.impl.Constants
import io.agora.agoraeducore.core.internal.framework.utils.GsonUtil
import io.agora.agoraeducore.core.internal.log.LogX
+import io.agora.online.R
import io.agora.online.impl.whiteboard.AudioMixerBridgeImpl
import io.agora.online.impl.whiteboard.FcrWhiteboardConverter
import io.agora.online.impl.whiteboard.WhiteBoardAudioMixingBridgeListener
@@ -25,11 +31,14 @@ import java.lang.reflect.Proxy
* date : 2022/6/7
* description :
*/
-class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
+class FcrBoardRoom(var whiteBoardView: WhiteboardView) : SlideListener {
var whiteBoardSDKLog: FcrBoardSDKLog = FcrBoardSDKLog()
lateinit var whiteSdk: WhiteSdk
var context: Context = whiteBoardView.context
var roomParams: RoomParams? = null
+ var retryTime = 0
+ val TAG = "WhiteBoardSDK"
+ val handler = Handler(Looper.getMainLooper())
var roomListener: FcrBoardRoomListener? = null
set(value) {
whiteBoardSDKLog.roomListener = value
@@ -70,6 +79,7 @@ class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
configuration.isUserCursor = true
configuration.region = FcrWhiteboardConverter.convertStringToRegion(region)
configuration.useMultiViews = true
+ configuration.isEnableAppliancePlugin = true;
whiteSdk = WhiteSdk(
whiteBoardView,
@@ -78,6 +88,41 @@ class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
whiteBoardSDKLog,
AudioMixerBridgeImpl(whiteboardMixingBridgeListener)
)
+ whiteSdk.setSlideListener(this);
+ }
+
+ override fun onSlideError(
+ errorType: SlideErrorType?,
+ errorMsg: String?,
+ slideId: String?,
+ slideIndex: Int
+ ) {
+ if (errorType == SlideErrorType.RESOURCE_ERROR || errorType == SlideErrorType.CANVAS_CRASH) {
+ if (this.retryTime == 0) {
+ this.retry(slideId!!, slideIndex)
+ } else if (this.retryTime < 5) {
+ handler.postDelayed({
+ this.retry(slideId!!, slideIndex)
+ }, 5000)
+ } else {
+ this.retryTime = 0
+ ContextCompat.getMainExecutor(context).execute {
+ ToastManager.showShort(context, R.string.fcr_board_slide_retry_failure)
+ }
+ }
+ } else if (errorType == SlideErrorType.RUNTIME_ERROR) {
+ this.whiteSdk.recoverSlide(slideId, slideIndex)
+ } else if(errorType == SlideErrorType.RUNTIME_WARN){
+ LogX.w(TAG, "slide page: ${slideIndex}, error: ${errorMsg.toString()}")
+ }
+ }
+
+ private fun retry(slideId: String, slideIndex: Int){9
+ this.retryTime += 1
+ this.whiteSdk.recoverSlide(slideId, slideIndex)
+ ContextCompat.getMainExecutor(whiteBoardView.context).execute{
+ ToastManager.showShort(context.getString(R.string.fcr_board_slide_retry) + this.retryTime + "/5")
+ }
}
fun join(config: FcrBoardRoomJoinConfig) {
diff --git a/AgoraCloudScene/src/main/res/values-zh-rTW/strings.xml b/AgoraCloudScene/src/main/res/values-zh-rTW/strings.xml
index 050163315..cc0930e3b 100644
--- a/AgoraCloudScene/src/main/res/values-zh-rTW/strings.xml
+++ b/AgoraCloudScene/src/main/res/values-zh-rTW/strings.xml
@@ -87,6 +87,8 @@
外教已離開教室
+ 課件加載失敗,正在重試
+ 課件加載失敗,請切換下一頁或關閉課件后重新打開
你已被老師授權,請使用白板工具互動
你已被老師收回授權,無法使用白板工具互動
diff --git a/AgoraCloudScene/src/main/res/values-zh/strings.xml b/AgoraCloudScene/src/main/res/values-zh/strings.xml
index f9f7df299..2cd19258c 100644
--- a/AgoraCloudScene/src/main/res/values-zh/strings.xml
+++ b/AgoraCloudScene/src/main/res/values-zh/strings.xml
@@ -93,6 +93,8 @@
外教已离开教室
+ 课件加载失败,正在重试
+ 课件加载失败,请切换下一页或关闭课件后重新打开
你已被老师授权,请使用白板工具互动
你已被老师收回授权,无法使用白板工具互动
diff --git a/AgoraCloudScene/src/main/res/values/strings.xml b/AgoraCloudScene/src/main/res/values/strings.xml
index 89d62d7af..441b19c79 100644
--- a/AgoraCloudScene/src/main/res/values/strings.xml
+++ b/AgoraCloudScene/src/main/res/values/strings.xml
@@ -92,6 +92,8 @@
The teacher has left the classroom
+ course load failure, retry now.
+ course load failure, please load next page or reopen.
You can now annotate on the whiteboard.
Your access to the whiteboard has been revoked by the teacher.
diff --git a/AgoraEduUIKit/src/main/java/io/agora/agoraeduuikit/whiteboard/FcrBoardRoom.kt b/AgoraEduUIKit/src/main/java/io/agora/agoraeduuikit/whiteboard/FcrBoardRoom.kt
index fa67657e2..6e222ac74 100644
--- a/AgoraEduUIKit/src/main/java/io/agora/agoraeduuikit/whiteboard/FcrBoardRoom.kt
+++ b/AgoraEduUIKit/src/main/java/io/agora/agoraeduuikit/whiteboard/FcrBoardRoom.kt
@@ -1,12 +1,19 @@
package io.agora.agoraeduuikit.whiteboard
import android.content.Context
+import android.os.Handler
+import android.os.Looper
+import androidx.core.content.ContextCompat
import com.herewhite.sdk.*
import com.herewhite.sdk.domain.*
+import com.herewhite.sdk.window.SlideListener
import io.agora.agoraeducore.core.internal.base.PreferenceManager
+import io.agora.agoraeducore.core.internal.base.ToastManager
import io.agora.agoraeducore.core.internal.education.impl.Constants
import io.agora.agoraeducore.core.internal.framework.utils.GsonUtil
import io.agora.agoraeducore.core.internal.log.LogX
+import io.agora.agoraeduuikit.R
+import io.agora.agoraeduuikit.component.toast.AgoraUIToast
import io.agora.agoraeduuikit.impl.whiteboard.AudioMixerBridgeImpl
import io.agora.agoraeduuikit.impl.whiteboard.FcrWhiteboardConverter
import io.agora.agoraeduuikit.impl.whiteboard.WhiteBoardAudioMixingBridgeListener
@@ -25,7 +32,7 @@ import java.lang.reflect.Proxy
* date : 2022/6/7
* description :
*/
-class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
+class FcrBoardRoom(var whiteBoardView: WhiteboardView) : SlideListener {
var whiteBoardSDKLog: FcrBoardSDKLog = FcrBoardSDKLog()
lateinit var whiteSdk: WhiteSdk
var context: Context = whiteBoardView.context
@@ -36,7 +43,8 @@ class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
whiteBoardSDKLog.roomListener = value
field = value
}
-
+ var retryTime = 0
+ val handler = Handler(Looper.getMainLooper())
var mixingBridgeListener: ((AgoraBoardInteractionPacket) -> Unit)? = null
val boardRoom = Proxy.newProxyInstance(BoardRoom::class.java.classLoader, arrayOf(BoardRoom::class.java),
@@ -59,6 +67,40 @@ class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
}
}) as BoardRoom
+ override fun onSlideError(
+ errorType: SlideErrorType?,
+ errorMsg: String?,
+ slideId: String?,
+ slideIndex: Int
+ ) {
+ if (errorType == SlideErrorType.RESOURCE_ERROR || errorType == SlideErrorType.CANVAS_CRASH) {
+ if (this.retryTime == 0) {
+ this.retry(slideId!!, slideIndex)
+ } else if (this.retryTime < 5) {
+ handler.postDelayed({
+ this.retry(slideId!!, slideIndex)
+ }, 5000)
+ } else {
+ this.retryTime = 0
+ ContextCompat.getMainExecutor(context).execute {
+ ToastManager.showShort(context, R.string.fcr_board_slide_retry_failure)
+ }
+ }
+ } else if (errorType == SlideErrorType.RUNTIME_ERROR) {
+ this.whiteSdk.recoverSlide(slideId, slideIndex)
+ } else if(errorType == SlideErrorType.RUNTIME_WARN){
+ LogX.w(TAG, "slide page: ${slideIndex}, error: ${errorMsg.toString()}")
+ }
+ }
+
+ private fun retry(slideId: String, slideIndex: Int){
+ this.retryTime += 1
+ this.whiteSdk.recoverSlide(slideId, slideIndex)
+ ContextCompat.getMainExecutor(whiteBoardView.context).execute{
+ ToastManager.showShort(context.getString(R.string.fcr_board_slide_retry) + this.retryTime + "/5")
+ }
+ }
+
fun init(whiteBoardAppId: String, region: String?) {
WhiteDisplayerState.setCustomGlobalStateClass(BoardState::class.java)
val isDebugMode = PreferenceManager.get(Constants.KEY_SP_USE_OPEN_TEST_MODE, false)
@@ -71,7 +113,8 @@ class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
configuration.isUserCursor = true
configuration.region = FcrWhiteboardConverter.convertStringToRegion(region)
configuration.useMultiViews = true
-
+ configuration.isEnableAppliancePlugin = true;
+
whiteSdk = WhiteSdk(
whiteBoardView,
context,
@@ -79,6 +122,7 @@ class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
whiteBoardSDKLog,
AudioMixerBridgeImpl(whiteboardMixingBridgeListener)
)
+ whiteSdk.setSlideListener(this);
}
fun join(config: FcrBoardRoomJoinConfig) {
diff --git a/AgoraEduUIKit/src/main/res/values-zh-rTW/strings.xml b/AgoraEduUIKit/src/main/res/values-zh-rTW/strings.xml
index 4c9af4077..5c6ad2cb6 100644
--- a/AgoraEduUIKit/src/main/res/values-zh-rTW/strings.xml
+++ b/AgoraEduUIKit/src/main/res/values-zh-rTW/strings.xml
@@ -86,6 +86,8 @@
外教已離開教室
+ 課件加載失敗,正在重試
+ 課件加載失敗,請切換下一頁或關閉課件后重新打開
你已被老師授權,請使用白板工具互動
你已被老師收回授權,無法使用白板工具互動
diff --git a/AgoraEduUIKit/src/main/res/values-zh/strings.xml b/AgoraEduUIKit/src/main/res/values-zh/strings.xml
index 1d2e6d11b..dc49974a5 100644
--- a/AgoraEduUIKit/src/main/res/values-zh/strings.xml
+++ b/AgoraEduUIKit/src/main/res/values-zh/strings.xml
@@ -92,6 +92,8 @@
外教已离开教室
+ 课件加载失败,正在重试
+ 课件加载失败,请切换下一页或关闭课件后重新打开
你已被老师授权,请使用白板工具互动
你已被老师收回授权,无法使用白板工具互动
diff --git a/AgoraEduUIKit/src/main/res/values/strings.xml b/AgoraEduUIKit/src/main/res/values/strings.xml
index caaccdb21..5d1d2d638 100644
--- a/AgoraEduUIKit/src/main/res/values/strings.xml
+++ b/AgoraEduUIKit/src/main/res/values/strings.xml
@@ -91,6 +91,8 @@
The teacher has left the classroom
+ course load failure, retry now.
+ course load failure, please load next page or reopen.
You can now annotate on the whiteboard.
Your access to the whiteboard has been revoked by the teacher.
diff --git a/config.gradle b/config.gradle
index 512d0192a..2226b2273 100644
--- a/config.gradle
+++ b/config.gradle
@@ -50,7 +50,7 @@ ext {
'agora_basic_sdk_rtc' : '3.7.1',
'agora_native_full_sdk_arsenal' : '4.0.0',
'agora_rtm_sdk' : '1.5.1',
- 'white_sdk_android' : '2.16.41',
+ 'white_sdk_android' : '2.16.95',
'glide' : '4.11.0',
'glide_compiler' : '4.11.0',
'core_ktx' : '1.3.2',
diff --git a/open-cloudclass-android/AgoraCloudScene/src/main/java/io/agora/online/whiteboard/FcrBoardRoom.kt b/open-cloudclass-android/AgoraCloudScene/src/main/java/io/agora/online/whiteboard/FcrBoardRoom.kt
index 044393b7e..7f556998b 100644
--- a/open-cloudclass-android/AgoraCloudScene/src/main/java/io/agora/online/whiteboard/FcrBoardRoom.kt
+++ b/open-cloudclass-android/AgoraCloudScene/src/main/java/io/agora/online/whiteboard/FcrBoardRoom.kt
@@ -25,11 +25,13 @@ import java.lang.reflect.Proxy
* date : 2022/6/7
* description :
*/
-class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
+class FcrBoardRoom(var whiteBoardView: WhiteboardView) : SlideListener {
var whiteBoardSDKLog: FcrBoardSDKLog = FcrBoardSDKLog()
lateinit var whiteSdk: WhiteSdk
var context: Context = whiteBoardView.context
+ var retryTime = 0
var roomParams: RoomParams? = null
+ val handler = Handler(Looper.getMainLooper())
var roomListener: FcrBoardRoomListener? = null
set(value) {
whiteBoardSDKLog.roomListener = value
@@ -70,6 +72,7 @@ class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
configuration.isUserCursor = true
configuration.region = FcrWhiteboardConverter.convertStringToRegion(region)
configuration.useMultiViews = true
+ configuration.isEnableAppliancePlugin = true;
whiteSdk = WhiteSdk(
whiteBoardView,
@@ -78,6 +81,41 @@ class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
whiteBoardSDKLog,
AudioMixerBridgeImpl(whiteboardMixingBridgeListener)
)
+ whiteSdk.setSlideListener(this);
+ }
+
+ override fun onSlideError(
+ errorType: SlideErrorType?,
+ errorMsg: String?,
+ slideId: String?,
+ slideIndex: Int
+ ) {
+ if (errorType == SlideErrorType.RESOURCE_ERROR || errorType == SlideErrorType.CANVAS_CRASH) {
+ if (this.retryTime == 0) {
+ this.retry(slideId!!, slideIndex)
+ } else if (this.retryTime < 5) {
+ handler.postDelayed({
+ this.retry(slideId!!, slideIndex)
+ }, 5000)
+ } else {
+ this.retryTime = 0
+ ContextCompat.getMainExecutor(context).execute {
+ ToastManager.showShort(context, R.string.fcr_board_slide_retry_failure)
+ }
+ }
+ } else if (errorType == SlideErrorType.RUNTIME_ERROR) {
+ this.whiteSdk.recoverSlide(slideId, slideIndex)
+ } else if(errorType == SlideErrorType.RUNTIME_WARN){
+ LogX.w(TAG, "slide page: ${slideIndex}, error: ${errorMsg.toString()}")
+ }
+ }
+
+ private fun retry(slideId: String, slideIndex: Int){
+ this.retryTime += 1
+ this.whiteSdk.recoverSlide(slideId, slideIndex)
+ ContextCompat.getMainExecutor(whiteBoardView.context).execute{
+ ToastManager.showShort(context.getString(R.string.fcr_board_slide_retry) + this.retryTime + "/5")
+ }
}
fun join(config: FcrBoardRoomJoinConfig) {
diff --git a/open-cloudclass-android/AgoraEduUIKit/src/main/java/io/agora/agoraeduuikit/whiteboard/FcrBoardRoom.kt b/open-cloudclass-android/AgoraEduUIKit/src/main/java/io/agora/agoraeduuikit/whiteboard/FcrBoardRoom.kt
index fa67657e2..54055f34b 100644
--- a/open-cloudclass-android/AgoraEduUIKit/src/main/java/io/agora/agoraeduuikit/whiteboard/FcrBoardRoom.kt
+++ b/open-cloudclass-android/AgoraEduUIKit/src/main/java/io/agora/agoraeduuikit/whiteboard/FcrBoardRoom.kt
@@ -25,12 +25,14 @@ import java.lang.reflect.Proxy
* date : 2022/6/7
* description :
*/
-class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
+class FcrBoardRoom(var whiteBoardView: WhiteboardView) : SlideListener {
var whiteBoardSDKLog: FcrBoardSDKLog = FcrBoardSDKLog()
lateinit var whiteSdk: WhiteSdk
var context: Context = whiteBoardView.context
var roomParams: RoomParams? = null
val TAG = "WhiteBoardSDK"
+ var retryTime = 0
+ val handler = Handler(Looper.getMainLooper())
var roomListener: FcrBoardRoomListener? = null
set(value) {
whiteBoardSDKLog.roomListener = value
@@ -71,6 +73,7 @@ class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
configuration.isUserCursor = true
configuration.region = FcrWhiteboardConverter.convertStringToRegion(region)
configuration.useMultiViews = true
+ configuration.isEnableAppliancePlugin = true;
whiteSdk = WhiteSdk(
whiteBoardView,
@@ -79,6 +82,41 @@ class FcrBoardRoom(var whiteBoardView: WhiteboardView) {
whiteBoardSDKLog,
AudioMixerBridgeImpl(whiteboardMixingBridgeListener)
)
+ whiteSdk.setSlideListener(this);
+ }
+
+ override fun onSlideError(
+ errorType: SlideErrorType?,
+ errorMsg: String?,
+ slideId: String?,
+ slideIndex: Int
+ ) {
+ if (errorType == SlideErrorType.RESOURCE_ERROR || errorType == SlideErrorType.CANVAS_CRASH) {
+ if (this.retryTime == 0) {
+ this.retry(slideId!!, slideIndex)
+ } else if (this.retryTime < 5) {
+ handler.postDelayed({
+ this.retry(slideId!!, slideIndex)
+ }, 5000)
+ } else {
+ this.retryTime = 0
+ ContextCompat.getMainExecutor(context).execute {
+ ToastManager.showShort(context, R.string.fcr_board_slide_retry_failure)
+ }
+ }
+ } else if (errorType == SlideErrorType.RUNTIME_ERROR) {
+ this.whiteSdk.recoverSlide(slideId, slideIndex)
+ } else if(errorType == SlideErrorType.RUNTIME_WARN){
+ LogX.w(TAG, "slide page: ${slideIndex}, error: ${errorMsg.toString()}")
+ }
+ }
+
+ private fun retry(slideId: String, slideIndex: Int){
+ this.retryTime += 1
+ this.whiteSdk.recoverSlide(slideId, slideIndex)
+ ContextCompat.getMainExecutor(whiteBoardView.context).execute{
+ ToastManager.showShort(context.getString(R.string.fcr_board_slide_retry) + this.retryTime + "/5")
+ }
}
fun join(config: FcrBoardRoomJoinConfig) {
diff --git a/open-cloudclass-android/config.gradle b/open-cloudclass-android/config.gradle
index 78a444679..9c394eaaa 100644
--- a/open-cloudclass-android/config.gradle
+++ b/open-cloudclass-android/config.gradle
@@ -52,7 +52,7 @@ ext {
'agora_basic_sdk_rtc' : '3.7.1',
'agora_native_full_sdk_arsenal' : '4.0.0',
'agora_rtm_sdk' : '1.5.1',
- 'white_sdk_android' : '2.16.41',
+ 'white_sdk_android' : '2.16.93',
'glide' : '4.11.0',
'glide_compiler' : '4.11.0',
'core_ktx' : '1.3.2',