From 846a582a3fe9da0b999d4547a5921690db1c8310 Mon Sep 17 00:00:00 2001 From: Kleinjia Date: Thu, 6 Nov 2025 16:32:36 +0800 Subject: [PATCH 1/2] add gamebox --- live/app/proguard-rules.pro | 1 + live/settings.gradle | 1 + live/tuigamekit/.gitignore | 1 + live/tuigamekit/build.gradle | 33 +++ live/tuigamekit/consumer-rules.pro | 0 live/tuigamekit/proguard-rules.pro | 23 ++ live/tuigamekit/src/main/AndroidManifest.xml | 4 + .../trtc/uikit/gamekit/LiteGameEngine.java | 161 ++++++++++++ .../uikit/gamekit/LiteGameUnityPlayer.java | 67 +++++ .../trtc/uikit/gamekit/UnityHostActivity.java | 150 +++++++++++ .../trtc/uikit/gamekit/UnityHostBridge.java | 48 ++++ .../uikit/gamekit/common/GameKitLogger.java | 77 ++++++ .../trtc/uikit/gamekit/gameview/GameView.java | 243 ++++++++++++++++++ .../gamekit_bg_titlebar_rounded_bottom.xml | 10 + .../gamekit_bg_titlebar_rounded_top.xml | 10 + .../res/layout/gamekit_gameview_root_view.xml | 39 +++ .../tuigamekit/src/main/res/values/colors.xml | 4 + .../src/main/res/values/strings.xml | 4 + live/tuilivekit/build.gradle | 1 + .../livekit/voiceroom/state/RoomState.java | 15 ++ .../voiceroom/view/TUIVoiceRoomFragment.java | 3 + .../voiceroom/view/VoiceRoomRootView.java | 54 ++++ .../view/bottommenu/AnchorFunctionView.kt | 7 + .../view/preview/LiveInfoEditView.java | 19 ++ .../view/preview/StreamGameTypePicker.java | 53 ++++ .../src/main/res-common/values-ja/strings.xml | 4 + .../main/res-common/values-zh-rTW/strings.xml | 4 + .../src/main/res-common/values-zh/strings.xml | 4 + .../src/main/res-common/values/array.xml | 5 + .../src/main/res-common/values/strings.xml | 4 + .../res/drawable-xxhdpi/livekit_ic_game.png | Bin 0 -> 4065 bytes ...t_layout_anchor_preview_live_info_edit.xml | 45 ++++ .../livekit_voiceroom_anchor_function.xml | 10 + .../layout/livekit_voiceroom_root_view.xml | 13 + 34 files changed, 1117 insertions(+) create mode 100644 live/tuigamekit/.gitignore create mode 100644 live/tuigamekit/build.gradle create mode 100644 live/tuigamekit/consumer-rules.pro create mode 100644 live/tuigamekit/proguard-rules.pro create mode 100644 live/tuigamekit/src/main/AndroidManifest.xml create mode 100644 live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameEngine.java create mode 100644 live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameUnityPlayer.java create mode 100644 live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostActivity.java create mode 100644 live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostBridge.java create mode 100644 live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/common/GameKitLogger.java create mode 100644 live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/gameview/GameView.java create mode 100644 live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_bottom.xml create mode 100644 live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_top.xml create mode 100644 live/tuigamekit/src/main/res/layout/gamekit_gameview_root_view.xml create mode 100644 live/tuigamekit/src/main/res/values/colors.xml create mode 100644 live/tuigamekit/src/main/res/values/strings.xml create mode 100644 live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/preview/StreamGameTypePicker.java create mode 100644 live/tuilivekit/src/main/res/drawable-xxhdpi/livekit_ic_game.png diff --git a/live/app/proguard-rules.pro b/live/app/proguard-rules.pro index 68af9554..6d98c329 100644 --- a/live/app/proguard-rules.pro +++ b/live/app/proguard-rules.pro @@ -53,6 +53,7 @@ -dontwarn okio.** -keep class io.trtc.tuikit.atomicx.karaoke.** { *; } +-keep class com.trtc.uikit.gamekit.UnityHostBridge { *; } # TRTC SDK Viesion >= 12.5.0 -dontwarn com.tencent.rtmp.video.BaseBridge$BaseBridgeCallback diff --git a/live/settings.gradle b/live/settings.gradle index b726c435..1f69a5c5 100644 --- a/live/settings.gradle +++ b/live/settings.gradle @@ -1,6 +1,7 @@ include ':app' include ':debug' include ':tuilivekit' +include ':tuigamekit' include(":atomic") project(':atomic').projectDir = new File(settingsDir, '../atomic_x') diff --git a/live/tuigamekit/.gitignore b/live/tuigamekit/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/live/tuigamekit/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/live/tuigamekit/build.gradle b/live/tuigamekit/build.gradle new file mode 100644 index 00000000..37dafe37 --- /dev/null +++ b/live/tuigamekit/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'com.android.library' +} + +android { + namespace 'com.trtc.uikit.gamekit' + compileSdk 34 + + defaultConfig { + minSdk 21 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } +} + +dependencies { + implementation 'io.trtc.uikit:rtc-game-box:1.0.0' + api rootProject.getProperties().containsKey("roomEngineSdk") ? rootProject.ext.roomEngineSdk : "io.trtc.uikit:rtc_room_engine:3.1.0.824" + api rootProject.getProperties().containsKey("liteavSdk") ? rootProject.ext.liteavSdk : "com.tencent.liteav:LiteAVSDK_Professional:12.5.0.17567" + api rootProject.getProperties().containsKey("common") ? rootProject.ext.common : "io.trtc.uikit:common:3.1.0.946" +} \ No newline at end of file diff --git a/live/tuigamekit/consumer-rules.pro b/live/tuigamekit/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/live/tuigamekit/proguard-rules.pro b/live/tuigamekit/proguard-rules.pro new file mode 100644 index 00000000..a9f74b5e --- /dev/null +++ b/live/tuigamekit/proguard-rules.pro @@ -0,0 +1,23 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile + +-keep class com.trtc.uikit.gamekit.UnityHostBridge { *; } \ No newline at end of file diff --git a/live/tuigamekit/src/main/AndroidManifest.xml b/live/tuigamekit/src/main/AndroidManifest.xml new file mode 100644 index 00000000..a5918e68 --- /dev/null +++ b/live/tuigamekit/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameEngine.java b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameEngine.java new file mode 100644 index 00000000..02dd4c2e --- /dev/null +++ b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameEngine.java @@ -0,0 +1,161 @@ +package com.trtc.uikit.gamekit; + +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import com.tencent.cloud.tuikit.engine.common.TUICommonDefine; +import com.tencent.cloud.tuikit.engine.room.TUIRoomDefine; +import com.tencent.cloud.tuikit.engine.room.TUIRoomEngine; +import com.trtc.uikit.gamekit.common.GameKitLogger; +import com.trtc.uikit.gamekit.gameview.GameView; + +import org.json.JSONObject; + +public final class LiteGameEngine { + private static final GameKitLogger LOGGER = GameKitLogger.getGameKitLogger(LiteGameEngine.class.getName()); + public static class GameID { + public static String NONE = ""; + public static String GOBANG = "Gobang"; + public static String FLYINGCHESS = "FlyingChess"; + } + + public static class ActionType { + public static String ACTION_GAME_START = "ACTION_GAME_START"; + public static String ACTION_GAME_STOP = "ACTION_GAME_STOP"; + public static String ACTION_USER_ENTER = "ACTION_USER_ENTER"; + public static String ACTION_USER_EXIT = "ACTION_USER_EXIT"; + } + + public static final String customMessageBusinessId = "LiteavGameKit"; + + private String runningGameId = ""; + private static volatile LiteGameEngine sInstance; + private LiteGameEngine() { + } + + public static LiteGameEngine getInstance() { + if (sInstance == null) { + synchronized (LiteGameEngine.class) { + if (sInstance == null) { + sInstance = new LiteGameEngine(); + } + } + } + return sInstance; + } + + public static void destroyInstance() { + synchronized (LiteGameEngine.class) { + if (sInstance != null) { + sInstance = null; + } + } + } + public String getRunningGameId() { + return runningGameId; + } + public void startGame(String gameId, boolean isHost, String userId, String nickName, String avatarUrl) { + if (runningGameId.equals(gameId)) + { + return; + } + runningGameId = gameId; + try { + + JSONObject actionDataObj = new JSONObject(); + actionDataObj.put("IsHost", isHost); + actionDataObj.put("PlayerId", userId); + actionDataObj.put("Nickname", nickName); + actionDataObj.put("AvatarUrl", avatarUrl); + + JSONObject messageObj = new JSONObject(); + messageObj.put("gameId", gameId); + messageObj.put("actionType", ActionType.ACTION_GAME_START); + messageObj.put("actionData", actionDataObj.toString()); + if (gameId.equals(LiteGameEngine.GameID.GOBANG)) { + LiteGameUnityPlayer.UnitySendMessage("GameManager", "StartGobangGame", messageObj.toString()); + } else if (gameId.equals(LiteGameEngine.GameID.FLYINGCHESS)) { + LiteGameUnityPlayer.UnitySendMessage("GameManager", "StartFlyingChessGame", messageObj.toString()); + } + + } catch (Exception e) { + LOGGER.warn( "StartGameInternal fail"); + } + } + + public void startLauncher() { + runningGameId = ""; + LiteGameUnityPlayer.UnitySendMessage("GameManager", "StartLauncher", ""); + } + + public void sendMessageToUnity(String message) { + LiteGameUnityPlayer.UnitySendMessage("GameManager", "OnReceivedMessage", message); + } + + public void broadcastGameQuitMessage() + { + try { + JSONObject message = new JSONObject(); + message.put("gameId", runningGameId); + message.put("actionType", ActionType.ACTION_GAME_STOP); + message.put("actionData", "{}"); + broadcastMessage(message.toString()); + } catch (Exception e) { + LOGGER.warn( "Send game stop message fail"); + } + } + + public void broadcastMessage(String message) { + TUIRoomDefine.RoomCustomMessage customMessage = new TUIRoomDefine.RoomCustomMessage(); + customMessage.businessId = LiteGameEngine.customMessageBusinessId; + customMessage.data = message; + TUIRoomEngine.sharedInstance().sendCustomMessage(customMessage, new TUIRoomDefine.SendCustomMessageCallback() { + @Override + public void onSuccess(TUIRoomDefine.RoomCustomMessage message) { + //Log.i(TAG, "SendMessage to room success"); + } + + @Override + public void onError(TUICommonDefine.Error error, String message) { + LOGGER.warn( "SendMessage to room error:" + error + " message:" + message); + } + }); + } + + public void onRemoteUserEnterRoom(String userId, String userName, String avatarUrl) { + try { + JSONObject actionDataObj = new JSONObject(); + actionDataObj.put("PlayerId", userId); + actionDataObj.put("Nickname", userName); + actionDataObj.put("AvatarUrl", avatarUrl); + + JSONObject outer = new JSONObject(); + outer.put("gameId", runningGameId); + outer.put("actionType", ActionType.ACTION_USER_ENTER); + outer.put("actionData", actionDataObj.toString()); + sendMessageToUnity(outer.toString()); + } catch (Exception e) { + LOGGER.warn( "onRemoteUserEnterRoom message send fail"); + } + } + + public void onRemoteUserLeaveRoom(String userId, String userName, String avatarUrl) { + try { + JSONObject actionDataObj = new JSONObject(); + actionDataObj.put("PlayerId", userId); + actionDataObj.put("Nickname", userName); + actionDataObj.put("AvatarUrl", avatarUrl); + + // 外层对象,并把内层对象作为字符串放入 actionData + JSONObject outer = new JSONObject(); + outer.put("gameId", runningGameId); + outer.put("actionType", ActionType.ACTION_USER_EXIT); + outer.put("actionData", actionDataObj.toString()); + sendMessageToUnity(outer.toString()); + } catch (Exception e) { + LOGGER.warn("onRemoteUserLeaveRoom message send fail"); + } + } +} + diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameUnityPlayer.java b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameUnityPlayer.java new file mode 100644 index 00000000..b50729f1 --- /dev/null +++ b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameUnityPlayer.java @@ -0,0 +1,67 @@ +package com.trtc.uikit.gamekit; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import com.unity3d.player.IUnityPlayerLifecycleEvents; +import com.unity3d.player.UnityPlayer; + +public class LiteGameUnityPlayer extends UnityPlayer { + private static LiteGameUnityPlayer sUnityPlayer; + private boolean isFirstFrameRendered = false; + private OnRenderFirstFrameListener onRenderFirstFrameListener; + + public interface OnRenderFirstFrameListener { + void onFirstFrameRendered(); + } + public LiteGameUnityPlayer(Context context) { + super(context); + } + + public LiteGameUnityPlayer(Context context, IUnityPlayerLifecycleEvents iUnityPlayerLifecycleEvents) { + super(context, iUnityPlayerLifecycleEvents); + } + + @Override + protected void kill() { + } + + private void setFirstFrameRendered() { + isFirstFrameRendered = true; + if (onRenderFirstFrameListener != null) { + onRenderFirstFrameListener.onFirstFrameRendered(); + } + } + + public static synchronized LiteGameUnityPlayer getUnityPlayer(Context ctx) { + if (sUnityPlayer == null) { + sUnityPlayer = new LiteGameUnityPlayer(ctx.getApplicationContext()); + } + return sUnityPlayer; + } + + public static void detachFromParent() { + if (sUnityPlayer != null) { + View v = sUnityPlayer.getView(); + if (v != null && v.getParent() != null) { + ((ViewGroup) v.getParent()).removeView(v); + } + } + } + + public static void onFirstFrameRendered() { + if (sUnityPlayer != null) { + sUnityPlayer.setFirstFrameRendered(); + } + } + public static void UnitySendMessage(String gameOjbName, String methodName, String data) { + UnityPlayer.UnitySendMessage(gameOjbName, methodName, data); + } + + public void setOnRenderFirstFrameListener(LiteGameUnityPlayer.OnRenderFirstFrameListener listener) { + onRenderFirstFrameListener = listener; + if (isFirstFrameRendered && onRenderFirstFrameListener != null) { + onRenderFirstFrameListener.onFirstFrameRendered(); + } + } +} diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostActivity.java b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostActivity.java new file mode 100644 index 00000000..1793104c --- /dev/null +++ b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostActivity.java @@ -0,0 +1,150 @@ +package com.trtc.uikit.gamekit; + +import android.app.Activity; +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.view.ViewGroup; +import android.view.Window; +import com.unity3d.player.IUnityPlayerLifecycleEvents; +import com.unity3d.player.UnityPlayer; + + +public class UnityHostActivity extends Activity implements IUnityPlayerLifecycleEvents { + protected LiteGameUnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code + protected String updateUnityCommandLineArguments(String cmdLine) + { + return cmdLine; + } + private ViewGroup unityContainer; + + // Setup activity layout + @Override protected void onCreate(Bundle savedInstanceState) + { + requestWindowFeature(Window.FEATURE_NO_TITLE); + super.onCreate(savedInstanceState); + + String cmdLine = updateUnityCommandLineArguments(getIntent().getStringExtra("unity")); + getIntent().putExtra("unity", cmdLine); + + mUnityPlayer = LiteGameUnityPlayer.getUnityPlayer(this); + setContentView(mUnityPlayer); + mUnityPlayer.requestFocus(); + +// unityContainer.addView(mUnityPlayer, new ViewGroup.LayoutParams( +// ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); +// mUnityPlayer.requestFocus(); + + String sceneName = getIntent().getStringExtra("sceneName"); + if (sceneName == null || sceneName.isEmpty()) + { + sceneName = "GameAScene"; + } + + UnityPlayer.UnitySendMessage("GameManager", "OpenScene", sceneName); + UnityHostBridge.setHostActivity(this); + } + + // When Unity player unloaded move task to background + @Override public void onUnityPlayerUnloaded() { + moveTaskToBack(true); + } + + // Callback before Unity player process is killed + @Override public void onUnityPlayerQuitted() { + } + + @Override protected void onNewIntent(Intent intent) + { + // To support deep linking, we need to make sure that the client can get access to + // the last sent intent. The clients access this through a JNI api that allows them + // to get the intent set on launch. To update that after launch we have to manually + // replace the intent with the one caught here. + setIntent(intent); + mUnityPlayer.newIntent(intent); + } + + // Quit Unity + @Override protected void onDestroy () + { + LiteGameUnityPlayer.detachFromParent(); + super.onDestroy(); + UnityHostBridge.clearHostActivity(); + } + + // If the activity is in multi window mode or resizing the activity is allowed we will use + // onStart/onStop (the visibility callbacks) to determine when to pause/resume. + // Otherwise it will be done in onPause/onResume as Unity has done historically to preserve + // existing behavior. + @Override protected void onStop() + { + super.onStop(); + mUnityPlayer.onStop(); + } + + @Override protected void onStart() + { + super.onStart(); + mUnityPlayer.onStart(); + } + + // Pause Unity + @Override protected void onPause() + { + super.onPause(); + mUnityPlayer.onPause(); + } + + // Resume Unity + @Override protected void onResume() + { + super.onResume(); + mUnityPlayer.onResume(); + } + + // Low Memory Unity + @Override public void onLowMemory() + { + super.onLowMemory(); + mUnityPlayer.lowMemory(); + } + + // Trim Memory Unity + @Override public void onTrimMemory(int level) + { + super.onTrimMemory(level); + if (level == TRIM_MEMORY_RUNNING_CRITICAL) + { + mUnityPlayer.lowMemory(); + } + } + + // This ensures the layout will be correct. + @Override public void onConfigurationChanged(Configuration newConfig) + { + super.onConfigurationChanged(newConfig); + mUnityPlayer.configurationChanged(newConfig); + } + + // Notify Unity of the focus change. + @Override public void onWindowFocusChanged(boolean hasFocus) + { + super.onWindowFocusChanged(hasFocus); + mUnityPlayer.windowFocusChanged(hasFocus); + } + + // For some reason the multiple keyevent type is not supported by the ndk. + // Force event injection by overriding dispatchKeyEvent(). +// @Override public boolean dispatchKeyEvent(KeyEvent event) +// { +// if (event.getAction() == KeyEvent.ACTION_MULTIPLE) +// return mUnityPlayer.injectEvent(event); +// return super.dispatchKeyEvent(event); +// } +// +// // Pass any events not handled by (unfocused) views straight to UnityPlayer +// @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return mUnityPlayer.onKeyUp(keyCode, event); } +// @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return mUnityPlayer.onKeyDown(keyCode, event); } +// @Override public boolean onTouchEvent(MotionEvent event) { return mUnityPlayer.onTouchEvent(event); } +// @Override public boolean onGenericMotionEvent(MotionEvent event) { return mUnityPlayer.onGenericMotionEvent(event); } +} \ No newline at end of file diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostBridge.java b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostBridge.java new file mode 100644 index 00000000..76b825e2 --- /dev/null +++ b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostBridge.java @@ -0,0 +1,48 @@ +package com.trtc.uikit.gamekit; + +import android.app.Activity; +import android.util.Log; + +import com.tencent.cloud.tuikit.engine.common.TUICommonDefine; +import com.tencent.cloud.tuikit.engine.room.TUIRoomDefine; +import com.tencent.cloud.tuikit.engine.room.TUIRoomEngine; + +public class UnityHostBridge { + private static final String TAG = UnityHostBridge.class.getName(); + private static Activity sHost; + + public static void setHostActivity(Activity a) { + sHost = a; + } + public static void clearHostActivity() { + sHost = null; + } + + public static void finishHostActivity() { + if (sHost == null) { + Log.w(TAG, "finishHost: host is null"); + return; + } + final Activity a = sHost; + a.runOnUiThread(new Runnable() { + @Override + public void run() { + try { + a.finish(); + } catch (Throwable t) { + Log.e(TAG, "finishHost failed", t); + } + } + }); + } + + public static void onUnityPlayerRednerFirstFrame() { + // + Log.w(TAG, "onUnityPlayerRednerFirstFrame"); + LiteGameUnityPlayer.onFirstFrameRendered(); + } + + public static void SendMessage(String message) { + LiteGameEngine.getInstance().broadcastMessage(message); + } +} diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/common/GameKitLogger.java b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/common/GameKitLogger.java new file mode 100644 index 00000000..3ada009a --- /dev/null +++ b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/common/GameKitLogger.java @@ -0,0 +1,77 @@ +package com.trtc.uikit.gamekit.common; + +import android.util.Log; +import com.tencent.trtc.TRTCCloud; +import com.trtc.tuikit.common.system.ContextProvider; +import org.json.JSONException; +import org.json.JSONObject; + +public final class GameKitLogger { + + public static final String MODULE_GAME_KIT = "LiteGameKit"; + + private static final String API = "TuikitLog"; + private static final String LOG_KEY_API = "api"; + private static final String LOG_KEY_PARAMS = "params"; + private static final String LOG_KEY_PARAMS_LEVEL = "level"; + private static final String LOG_KEY_PARAMS_MESSAGE = "message"; + private static final String LOG_KEY_PARAMS_FILE = "file"; + private static final String LOG_KEY_PARAMS_MODULE = "module"; + private static final String LOG_KEY_PARAMS_LINE = "line"; + + private static final int LOG_LEVEL_INFO = 0; + private static final int LOG_LEVEL_WARNING = 1; + private static final int LOG_LEVEL_ERROR = 2; + + private final String moduleName; + private final String fileName; + + private GameKitLogger(String moduleName, String fileName) { + this.moduleName = moduleName; + this.fileName = fileName; + } + + public static GameKitLogger getGameKitLogger(String file) { + return new GameKitLogger(MODULE_GAME_KIT, file); + } + + private static void log(String module, String file, int level, String message) { + try { + JSONObject json = new JSONObject(); + json.put(LOG_KEY_API, API); + + JSONObject params = new JSONObject(); + params.put(LOG_KEY_PARAMS_LEVEL, level); + params.put(LOG_KEY_PARAMS_MESSAGE, message); + params.put(LOG_KEY_PARAMS_MODULE, module); + params.put(LOG_KEY_PARAMS_FILE, file); + params.put(LOG_KEY_PARAMS_LINE, 0); + + json.put(LOG_KEY_PARAMS, params); + + String jsonStr = json.toString(); + TRTCCloud.sharedInstance(ContextProvider.getApplicationContext()).callExperimentalAPI(jsonStr); + } catch (JSONException e) { + Log.e("Logger", e.toString()); + } catch (Exception e) { + // 防止 TRTCCloud 或 ContextProvider 的调用抛出未捕获异常 + Log.e("Logger", e.toString()); + } + } + + public void info(String message) { + log(LOG_LEVEL_INFO, message); + } + + public void warn(String message) { + log(LOG_LEVEL_WARNING, message); + } + + public void error(String message) { + log(LOG_LEVEL_ERROR, message); + } + + private void log(int level, String message) { + log(this.moduleName, this.fileName, level, message); + } +} \ No newline at end of file diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/gameview/GameView.java b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/gameview/GameView.java new file mode 100644 index 00000000..926691a9 --- /dev/null +++ b/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/gameview/GameView.java @@ -0,0 +1,243 @@ +package com.trtc.uikit.gamekit.gameview; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import org.json.JSONException; +import org.json.JSONObject; +import com.tencent.cloud.tuikit.engine.room.TUIRoomDefine; +import com.tencent.cloud.tuikit.engine.room.TUIRoomEngine; +import com.tencent.cloud.tuikit.engine.room.TUIRoomObserver; +import com.trtc.uikit.gamekit.LiteGameEngine; +import com.trtc.uikit.gamekit.LiteGameUnityPlayer; +import com.trtc.uikit.gamekit.R; +import com.trtc.uikit.gamekit.common.GameKitLogger; + +public class GameView extends FrameLayout { + private static final GameKitLogger LOGGER = GameKitLogger.getGameKitLogger(GameView.class.getName()); + private final Context mContext; + private String userId; + private String userName; + private String avatarUrl; + private boolean isOwner = false; + private LiteGameUnityPlayer mUnityPlayer; + + // 回调接口 + public interface OnHideListener { + void onHide(); + } + + private OnHideListener mOnHideListener; + + public void setOnHideListener(OnHideListener listener) { + LOGGER.info("setOnHideListener"); + this.mOnHideListener = listener; + } + + private final TUIRoomObserver mRoomObserver = new TUIRoomObserver() { + @Override + public void onReceiveCustomMessage(TUIRoomDefine.RoomCustomMessage customMessage) { + // LOGGER.info("onReceiveCustomMessage " + customMessage.businessId + " msg:" + customMessage.data); + if (customMessage.businessId.equals(LiteGameEngine.customMessageBusinessId)) { + JSONObject msgJsonObj; + try { + if (!GameView.this.isOwner) + { + String runningGameId = LiteGameEngine.getInstance().getRunningGameId(); + msgJsonObj = new JSONObject(customMessage.data); + String gameId = msgJsonObj.optString("gameId"); + String actionType = msgJsonObj.optString("actionType"); + if (runningGameId.isEmpty()) { // 当前没有游戏 + if (!gameId.isEmpty() && !actionType.equals(LiteGameEngine.ActionType.ACTION_GAME_STOP)) { + startGame(gameId); + showView(); + } + } else { + if (gameId.isEmpty() || actionType.equals(LiteGameEngine.ActionType.ACTION_GAME_STOP)) { + LiteGameEngine.getInstance().startLauncher(); + hideView(); + } else if (!runningGameId.equals(gameId)) { + LiteGameEngine.getInstance().startLauncher(); + startGame(gameId); + } + } + } + } catch (JSONException e) { + throw new RuntimeException(e); + } finally { + LiteGameEngine.getInstance().sendMessageToUnity(customMessage.data); + } + } + } + + @Override + public void onRemoteUserEnterRoom(String roomId, TUIRoomDefine.UserInfo userInfo) { + LiteGameEngine.getInstance().onRemoteUserEnterRoom(userInfo.userId, userInfo.userName, userInfo.avatarUrl); + } + + @Override + public void onRemoteUserLeaveRoom(String roomId, TUIRoomDefine.UserInfo userInfo) { + LiteGameEngine.getInstance().onRemoteUserLeaveRoom(userInfo.userId, userInfo.userName, userInfo.avatarUrl); + } + }; + + public GameView(Context context) { + this(context, null); + } + + public GameView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public GameView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mContext = context; + LayoutInflater.from(mContext).inflate(R.layout.gamekit_gameview_root_view, this, true); + initUnityPlayer(); + } + + private void initUnityPlayer() { + LOGGER.info("initUnityPlayer"); + if (mUnityPlayer != null) { + return; + } + mUnityPlayer = LiteGameUnityPlayer.getUnityPlayer(mContext); + android.view.View unityView = mUnityPlayer.getView(); + // 将 Unity 的 view 添加到这个 FrameLayout 中 + LayoutParams lp = new LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ); + FrameLayout unityPlayerContainer = findViewById(R.id.game_view_container); + unityPlayerContainer.addView(unityView, lp); + + mUnityPlayer.setOnRenderFirstFrameListener(() -> { + findViewById(R.id.game_view_mask).setVisibility(INVISIBLE); + findViewById(R.id.game_view_container).setVisibility(VISIBLE); + }); + + // 让 UnityPlayer 获取焦点以便接收输入 + mUnityPlayer.requestFocus(); + TUIRoomEngine.sharedInstance().addObserver(mRoomObserver); + } + + // -------------------- 生命周期控制方法,Activity 应当调用对应方法 -------------------- + public void onStart(){ + LOGGER.info("onStart"); + if (mUnityPlayer != null) { + mUnityPlayer.onStart(); + } + } + + public void onStop() { + LOGGER.info("onStop"); + if (mUnityPlayer != null) { + mUnityPlayer.onStop(); + } + } + + public void onResume() { + LOGGER.info("onResume"); + if (mUnityPlayer != null) { + mUnityPlayer.onResume(); + } + } + + public void onPause() { + LOGGER.info("onPause"); + if (mUnityPlayer != null) { + mUnityPlayer.onPause(); + } + } + + public void onDestroy() { + LOGGER.info("onDestroy"); + LiteGameEngine.getInstance().startLauncher(); + LiteGameUnityPlayer.detachFromParent(); + if (mUnityPlayer != null) { + mUnityPlayer.setOnRenderFirstFrameListener(null); + } + TUIRoomEngine.sharedInstance().removeObserver(mRoomObserver); + } + + public void onLowMemory() { + LOGGER.info("onLowMemory"); + if (mUnityPlayer != null) { + mUnityPlayer.lowMemory(); + } + } + + public void onWindowFocusChanged(boolean hasFocus) { + LOGGER.info("onWindowFocusChanged"); + if (mUnityPlayer != null) { + mUnityPlayer.windowFocusChanged(hasFocus); + } + } + + // 将输入事件转发给 UnityPlayer(若 Unity 处理了,则直接返回 true) + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (mUnityPlayer != null && mUnityPlayer.injectEvent(event)) { + return true; + } + return super.dispatchKeyEvent(event); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (mUnityPlayer != null) { + if (mUnityPlayer.injectEvent(event)) { + return true; + } + } + return super.onTouchEvent(event); + } + + @Override + public boolean onGenericMotionEvent(MotionEvent event) { + if (mUnityPlayer != null && mUnityPlayer.injectEvent(event)) { + return true; + } + return super.onGenericMotionEvent(event); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + } + + public void init(String userId, String userName, String avatarUrl, boolean isOwner) { + LOGGER.info("init userId:" + userId + " userName:" + userName + " avatarUrl:" + avatarUrl + " isOwner:" + isOwner); + this.userId = userId; + this.userName = userName; + this.avatarUrl = avatarUrl; + this.isOwner = isOwner; + } + + public void showView() { + LOGGER.info("showView"); + setVisibility(VISIBLE); + } + + public void hideView() { + LOGGER.info("hideView"); + setVisibility(GONE); + } + + public void startGame(String gameID) { + LOGGER.info("startGame gameID:" + gameID); + LiteGameEngine.getInstance().startGame(gameID, isOwner, userId, userName, avatarUrl); + } + + public void stopCurrentRunningGame() { + LOGGER.info("stopCurrentRunningGame"); + LiteGameEngine.getInstance().startLauncher(); + if (isOwner) { + LiteGameEngine.getInstance().broadcastGameQuitMessage(); + } + } +} diff --git a/live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_bottom.xml b/live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_bottom.xml new file mode 100644 index 00000000..bb893803 --- /dev/null +++ b/live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_bottom.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_top.xml b/live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_top.xml new file mode 100644 index 00000000..3d582e84 --- /dev/null +++ b/live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_top.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/live/tuigamekit/src/main/res/layout/gamekit_gameview_root_view.xml b/live/tuigamekit/src/main/res/layout/gamekit_gameview_root_view.xml new file mode 100644 index 00000000..dd4f3e0a --- /dev/null +++ b/live/tuigamekit/src/main/res/layout/gamekit_gameview_root_view.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/live/tuigamekit/src/main/res/values/colors.xml b/live/tuigamekit/src/main/res/values/colors.xml new file mode 100644 index 00000000..1753b1d2 --- /dev/null +++ b/live/tuigamekit/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #314D78 + \ No newline at end of file diff --git a/live/tuigamekit/src/main/res/values/strings.xml b/live/tuigamekit/src/main/res/values/strings.xml new file mode 100644 index 00000000..e7bec926 --- /dev/null +++ b/live/tuigamekit/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + litegame unity view + diff --git a/live/tuilivekit/build.gradle b/live/tuilivekit/build.gradle index c5871094..e62b6e90 100644 --- a/live/tuilivekit/build.gradle +++ b/live/tuilivekit/build.gradle @@ -53,6 +53,7 @@ android { dependencies { api project(':atomic') + api project(':tuigamekit') api 'androidx.appcompat:appcompat:1.3.1' api 'com.google.android.material:material:1.12.0' diff --git a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/state/RoomState.java b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/state/RoomState.java index 32a93660..922fd2c2 100644 --- a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/state/RoomState.java +++ b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/state/RoomState.java @@ -71,6 +71,18 @@ public enum LiveStreamPrivacyStatus { } } + public enum LiveStreamGameType { + NONE(R.string.common_stream_game_type_default), + GOBANG(R.string.common_stream_game_type_gobang), + LUDO(R.string.common_stream_game_type_ludo); + + public final int resId; + + LiveStreamGameType(Integer id) { + this.resId = id; + } + } + public enum LiveCategory { DAILY_CHAT(0), APPEARANCE(1), @@ -114,6 +126,9 @@ public static class LiveExtraInfo { public MutableLiveData liveMode = new MutableLiveData<>(LiveStreamPrivacyStatus.PUBLIC); + public MutableLiveData gameType = + new MutableLiveData<>(LiveStreamGameType.NONE); + public long maxAudienceCount = 0; public long messageCount = 0; public long giftIncome = 0; diff --git a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/TUIVoiceRoomFragment.java b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/TUIVoiceRoomFragment.java index ae280768..f2c74cc7 100644 --- a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/TUIVoiceRoomFragment.java +++ b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/TUIVoiceRoomFragment.java @@ -95,6 +95,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat @Override public void onResume() { super.onResume(); + mVoiceRoomRootView.onResume(); mVoiceRoomRootView.post(() -> mVoiceRoomRootView.updateStatus(VoiceRoomRootView.VoiceRoomViewStatus.DISPLAY_COMPLETE)); } @@ -102,6 +103,7 @@ public void onResume() { @Override public void onPause() { super.onPause(); + mVoiceRoomRootView.onPause(); mVoiceRoomRootView.post(() -> mVoiceRoomRootView.updateStatus(VoiceRoomRootView.VoiceRoomViewStatus.END_DISPLAY)); } @@ -115,6 +117,7 @@ public void onDestroyView() { @Override public void onDestroy() { super.onDestroy(); + mVoiceRoomRootView.onDestroy(); removeObserver(); TUICore.unRegisterEvent(this); mVoiceRoomManager.destroy(); diff --git a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/VoiceRoomRootView.java b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/VoiceRoomRootView.java index 78e8c5dd..959951ed 100644 --- a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/VoiceRoomRootView.java +++ b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/VoiceRoomRootView.java @@ -31,12 +31,15 @@ import com.tencent.cloud.tuikit.engine.common.TUICommonDefine; import com.tencent.cloud.tuikit.engine.extension.TUILiveListManager; import com.tencent.cloud.tuikit.engine.room.TUIRoomDefine; +import com.tencent.cloud.tuikit.engine.room.TUIRoomEngine; import com.tencent.qcloud.tuicore.TUIConstants; import com.tencent.qcloud.tuicore.TUICore; import com.tencent.qcloud.tuicore.TUILogin; import com.tencent.qcloud.tuicore.interfaces.ITUINotification; import com.trtc.tuikit.common.imageloader.ImageLoader; import com.trtc.tuikit.common.permission.PermissionCallback; +import com.trtc.uikit.gamekit.LiteGameEngine; +import com.trtc.uikit.gamekit.gameview.GameView; import com.trtc.uikit.livekit.R; import com.trtc.uikit.livekit.common.ErrorLocalized; import com.trtc.uikit.livekit.common.LiveKitLogger; @@ -95,6 +98,8 @@ public class VoiceRoomRootView extends FrameLayout implements ITUINotification { private ExitConfirmDialog mExitConfirmDialog; private ExitSeatDialog mExitSeatDialog; + private GameView mGameView; + private SeatGridViewCoreObserver mSeatGridViewCoreObserver; private final Observer mBackgroundURLObserver = this::updateRoomBackground; @@ -102,6 +107,7 @@ public class VoiceRoomRootView extends FrameLayout implements ITUINotification { private final Observer mVoiceRoomLayoutObserver = this::onVoiceRoomLayoutChanged; private final Observer mSeatInvitationObserver = this::onSeatInvitationChanged; private final Observer mLinkStateObserver = this::onLinkStateChanged; + private final Observer mLiveGameTypeObserver = this::onLiveGameTypeChange; private KaraokeFloatingView mKaraokeFloatingView; private KaraokeControlView mKaraokeControlView; private ViewGroup mLayoutRoot; @@ -200,6 +206,7 @@ private void bindViewId() { mAnchorPreviewView = findViewById(R.id.anchor_preview_view); mKaraokeControlView = findViewById(R.id.ktv_view); mKaraokeFloatingView = new KaraokeFloatingView(mContext); + mGameView = findViewById(R.id.game_view); } private void addObserver() { @@ -208,6 +215,7 @@ private void addObserver() { mVoiceRoomManager.getRoomState().layoutType.observeForever(mVoiceRoomLayoutObserver); mVoiceRoomManager.getSeatState().receivedSeatInvitation.observeForever(mSeatInvitationObserver); mVoiceRoomManager.getSeatState().linkStatus.observeForever(mLinkStateObserver); + mVoiceRoomManager.getRoomState().liveExtraInfo.gameType.observeForever(mLiveGameTypeObserver); mSeatGridViewCoreObserver = new SeatGridViewCoreObserver(mContext, mVoiceRoomManager, mSeatGridView); mSeatGridView.addObserver(mSeatGridViewCoreObserver); TUICore.registerEvent(EVENT_KEY_LIVE_KIT, EVENT_SUB_KEY_CLOSE_VOICE_ROOM, this); @@ -217,6 +225,7 @@ private void removeObserver() { mVoiceRoomManager.getRoomState().backgroundURL.removeObserver(mBackgroundURLObserver); mVoiceRoomManager.getRoomState().liveStatus.removeObserver(mLiveStateObserver); mVoiceRoomManager.getRoomState().layoutType.observeForever(mVoiceRoomLayoutObserver); + mVoiceRoomManager.getRoomState().liveExtraInfo.gameType.removeObserver(mLiveGameTypeObserver); mVoiceRoomManager.getSeatState().receivedSeatInvitation.removeObserver(mSeatInvitationObserver); mVoiceRoomManager.getSeatState().linkStatus.removeObserver(mLinkStateObserver); mSeatGridView.removeObserver(mSeatGridViewCoreObserver); @@ -232,6 +241,18 @@ private void showMainView() { mKaraokeFloatingView.init(mVoiceRoomManager.getRoomState().roomId, mVoiceRoomManager.getRoomManager().isOwner()); mKaraokeControlView.init(mVoiceRoomManager.getRoomState().roomId, mVoiceRoomManager.getRoomManager().isOwner()); + + TUIRoomDefine.LoginUserInfo selfInfo = TUIRoomEngine.getSelfInfo(); + mGameView.init(selfInfo.userId, selfInfo.userName, selfInfo.avatarUrl, mVoiceRoomManager.getRoomManager().isOwner()); + RoomState.LiveStreamGameType gameType = mVoiceRoomManager.getRoomState().liveExtraInfo.gameType.getValue(); + if (gameType != RoomState.LiveStreamGameType.NONE) { + mGameView.showView(); + if (gameType == RoomState.LiveStreamGameType.LUDO) { + mGameView.startGame(LiteGameEngine.GameID.FLYINGCHESS); + } else if (gameType == RoomState.LiveStreamGameType.GOBANG) { + mGameView.startGame(LiteGameEngine.GameID.GOBANG); + } + } } private void onLinkStateChanged(SeatState.LinkStatus status) { @@ -241,6 +262,21 @@ private void onLinkStateChanged(SeatState.LinkStatus status) { } } + private void onLiveGameTypeChange(RoomState.LiveStreamGameType gameType) { + if (mVoiceRoomManager.getRoomState().liveStatus.getValue() == RoomState.LiveStatus.PUSHING) { + if (gameType == RoomState.LiveStreamGameType.NONE) { + mGameView.stopCurrentRunningGame(); + mGameView.hideView(); + } else if (gameType == RoomState.LiveStreamGameType.LUDO) { + mGameView.showView(); + mGameView.startGame(LiteGameEngine.GameID.FLYINGCHESS); + } else if (gameType == RoomState.LiveStreamGameType.GOBANG) { + mGameView.showView(); + mGameView.startGame(LiteGameEngine.GameID.GOBANG); + } + } + } + private void unmuteMicrophone() { mSeatGridView.unmuteMicrophone(new TUIRoomDefine.ActionCallback() { @Override @@ -649,4 +685,22 @@ public enum VoiceRoomViewStatus { DISPLAY_COMPLETE, END_DISPLAY, } + + public void onResume() { + if (mGameView != null) { + mGameView.onResume(); + } + } + + public void onPause() { + if (mGameView != null) { + mGameView.onPause(); + } + } + + public void onDestroy() { + if (mGameView != null) { + mGameView.onDestroy(); + } + } } diff --git a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/bottommenu/AnchorFunctionView.kt b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/bottommenu/AnchorFunctionView.kt index 67e04ecb..a56af0dd 100644 --- a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/bottommenu/AnchorFunctionView.kt +++ b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/bottommenu/AnchorFunctionView.kt @@ -11,6 +11,7 @@ import com.trtc.uikit.livekit.R import com.trtc.uikit.livekit.voiceroom.state.RoomState import com.trtc.uikit.livekit.voiceroom.state.SeatState import com.trtc.uikit.livekit.voiceroom.view.BasicView +import com.trtc.uikit.livekit.voiceroom.view.preview.StreamGameTypePicker import com.trtc.uikit.livekit.voiceroom.view.seatmanager.SeatManagerDialog import com.trtc.uikit.livekit.voiceroom.view.settings.SettingsDialog import io.trtc.tuikit.atomicx.karaoke.KaraokeControlView @@ -35,6 +36,7 @@ class AnchorFunctionView @JvmOverloads constructor( seatApplicationCountText = findViewById(R.id.application_count) findViewById(R.id.iv_settings).setOnClickListener { showSettingsPanel() } findViewById(R.id.iv_song_request).setOnClickListener { showSongRequestPanel() } + findViewById(R.id.iv_game).setOnClickListener { showGameSelectPanel() } findViewById(R.id.iv_seat_management).setOnClickListener { showSeatManagementPanel() } } @@ -65,6 +67,11 @@ class AnchorFunctionView @JvmOverloads constructor( } } + private fun showGameSelectPanel() { + val picker = StreamGameTypePicker(mContext, mVoiceRoomManager) + picker.show() + } + private fun showSeatManagementPanel() { seatManagerDialog = seatManagerDialog ?: SeatManagerDialog(context, mVoiceRoomManager, mSeatGridView) seatManagerDialog?.show() diff --git a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/preview/LiveInfoEditView.java b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/preview/LiveInfoEditView.java index 79a0cd83..1828e07b 100644 --- a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/preview/LiveInfoEditView.java +++ b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/preview/LiveInfoEditView.java @@ -31,12 +31,16 @@ public class LiveInfoEditView extends BasicView { private EditText mEditRoomName; private TextView mTextStreamPrivacyStatus; + private TextView mTextStreamGameType; private ImageView mImageStreamCover; private StreamPresetImagePicker mStreamPresetImagePicker; private final Observer mLiveCoverObserver = this::onLiveCoverChanged; private final Observer mLivePrivacyStatusObserver = this::onLivePrivacyStatusChange; + private final Observer mLiveGameTypeObserver = + this::onLiveGameTypeChange; + public LiveInfoEditView(@NonNull Context context) { this(context, null); } @@ -54,8 +58,10 @@ protected void initView() { LayoutInflater.from(getContext()).inflate(R.layout.livekit_layout_anchor_preview_live_info_edit, this, true); initLivePrivacyStatusPicker(); + initLiveGameTypePicker(); mImageStreamCover = findViewById(R.id.iv_cover); mTextStreamPrivacyStatus = findViewById(R.id.tv_stream_privacy_status); + mTextStreamGameType = findViewById(R.id.tv_stream_game_type); mEditRoomName = findViewById(R.id.et_stream_name); mEditRoomName.addTextChangedListener(new TextWatcher() { @@ -106,12 +112,14 @@ public void init(@NonNull VoiceRoomManager voiceRoomManager) { protected void addObserver() { mRoomState.coverURL.observeForever(mLiveCoverObserver); mRoomState.liveExtraInfo.liveMode.observeForever(mLivePrivacyStatusObserver); + mRoomState.liveExtraInfo.gameType.observeForever(mLiveGameTypeObserver); } @Override protected void removeObserver() { mRoomState.coverURL.removeObserver(mLiveCoverObserver); mRoomState.liveExtraInfo.liveMode.removeObserver(mLivePrivacyStatusObserver); + mRoomState.liveExtraInfo.gameType.removeObserver(mLiveGameTypeObserver); } private void initLiveCoverPicker() { @@ -146,6 +154,13 @@ private void initLivePrivacyStatusPicker() { }); } + private void initLiveGameTypePicker() { + findViewById(R.id.ll_stream_game_type).setOnClickListener(view -> { + StreamGameTypePicker picker = new StreamGameTypePicker(mContext, mVoiceRoomManager); + picker.show(); + }); + } + private void onLiveCoverChanged(String coverURL) { ImageLoader.load(mContext, mImageStreamCover, coverURL, R.drawable.anchor_prepare_live_stream_default_cover); } @@ -153,4 +168,8 @@ private void onLiveCoverChanged(String coverURL) { private void onLivePrivacyStatusChange(RoomState.LiveStreamPrivacyStatus status) { mTextStreamPrivacyStatus.setText(status.resId); } + + private void onLiveGameTypeChange(RoomState.LiveStreamGameType gameType) { + mTextStreamGameType.setText(gameType.resId); + } } diff --git a/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/preview/StreamGameTypePicker.java b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/preview/StreamGameTypePicker.java new file mode 100644 index 00000000..bab87deb --- /dev/null +++ b/live/tuilivekit/src/main/java/com/trtc/uikit/livekit/voiceroom/view/preview/StreamGameTypePicker.java @@ -0,0 +1,53 @@ +package com.trtc.uikit.livekit.voiceroom.view.preview; + +import android.content.Context; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import androidx.core.content.res.ResourcesCompat; + +import com.trtc.tuikit.common.ui.PopupDialog; +import com.trtc.uikit.livekit.R; +import com.trtc.uikit.livekit.voiceroom.manager.VoiceRoomManager; +import com.trtc.uikit.livekit.voiceroom.state.RoomState; + +import java.util.Arrays; +import java.util.List; + + +public class StreamGameTypePicker extends PopupDialog { + + private ListView mListView; + private final RoomState mRoomState; + + public StreamGameTypePicker(Context context, VoiceRoomManager liveController) { + super(context); + mRoomState = liveController.getRoomState(); + initView(context); + initListItemClickListener(); + } + + private void initView(Context context) { + mListView = new ListView(context); + mListView.setBackgroundResource(R.drawable.livekit_dialog_background); + + List dataList = getDataList(context); + ArrayAdapter adapter = new ArrayAdapter<>(context, R.layout.livekit_layout_bottom_list_item, dataList); + mListView.setAdapter(adapter); + mListView.setDivider(ResourcesCompat.getDrawable(context.getResources(), R.drawable.livekit_line_divider, + null)); + mListView.setDividerHeight(1); + setView(mListView); + } + + private void initListItemClickListener() { + mListView.setOnItemClickListener((parent, view, position, id) -> { + mRoomState.liveExtraInfo.gameType.setValue(RoomState.LiveStreamGameType.values()[position]); + dismiss(); + }); + } + + private List getDataList(Context context) { + return Arrays.asList(context.getResources().getStringArray(R.array.common_stream_game_type)); + } +} diff --git a/live/tuilivekit/src/main/res-common/values-ja/strings.xml b/live/tuilivekit/src/main/res-common/values-ja/strings.xml index 8d3da13e..f4962b65 100644 --- a/live/tuilivekit/src/main/res-common/values-ja/strings.xml +++ b/live/tuilivekit/src/main/res-common/values-ja/strings.xml @@ -105,6 +105,7 @@ 1080p ライブブロードキャストカテゴリ: ライブブロードキャストモード: + ゲームモード: ホストによってマイクをキックオフしました ツイートを申請してください 現在のユーザーは別の部屋にいます。単一のルームエンジンインスタンスは、ユーザーのみが1つの部屋に入るのをサポートします。別の部屋に入りたい場合は、最初にチェックアウトするか、新しいルームエンジンインスタンスを使用してください。 @@ -273,6 +274,9 @@ 毎日のチャット 公共 プライバシー + なし + ゴバン + フライングチェス 電話に接続するためのアプリケーションをキャンセルします 分隊の終わり 音声接続を申請します diff --git a/live/tuilivekit/src/main/res-common/values-zh-rTW/strings.xml b/live/tuilivekit/src/main/res-common/values-zh-rTW/strings.xml index 97058188..2cc967ab 100644 --- a/live/tuilivekit/src/main/res-common/values-zh-rTW/strings.xml +++ b/live/tuilivekit/src/main/res-common/values-zh-rTW/strings.xml @@ -105,6 +105,7 @@ 1080p 直播分類: 直播模式: + 游戏模式: 被主持人踢下麥位 申請連麥 當前用戶已在別的房間內,單個 roomEngine 實例只支持用戶進入一個房間,如果要進入不同的房間請先退房或者使用新的 roomEngine 實例 @@ -273,6 +274,9 @@ 日常聊天 公開 隱私 + + 五子棋 + 飛行棋 取消連麥申請 結束連麥 申請語音連麥 diff --git a/live/tuilivekit/src/main/res-common/values-zh/strings.xml b/live/tuilivekit/src/main/res-common/values-zh/strings.xml index 37eb5a12..20c35652 100644 --- a/live/tuilivekit/src/main/res-common/values-zh/strings.xml +++ b/live/tuilivekit/src/main/res-common/values-zh/strings.xml @@ -105,6 +105,7 @@ 1080p 直播分类: 直播模式: + 游戏模式: 被主持人踢下麦位 申请连麦 当前用户已在别的房间内,单个 roomEngine 实例只支持用户进入一个房间,如果要进入不同的房间请先退房或者使用新的 roomEngine 实例 @@ -273,6 +274,9 @@ 日常聊天 公开 隐私 + + 五子棋 + 飞行棋 取消连麦申请 结束连麦 申请语音连麦 diff --git a/live/tuilivekit/src/main/res-common/values/array.xml b/live/tuilivekit/src/main/res-common/values/array.xml index 62709804..2f006627 100644 --- a/live/tuilivekit/src/main/res-common/values/array.xml +++ b/live/tuilivekit/src/main/res-common/values/array.xml @@ -3,4 +3,9 @@ @string/common_stream_privacy_status_default @string/common_stream_privacy_status_privacy + + @string/common_stream_game_type_default + @string/common_stream_game_type_gobang + @string/common_stream_game_type_ludo + \ No newline at end of file diff --git a/live/tuilivekit/src/main/res-common/values/strings.xml b/live/tuilivekit/src/main/res-common/values/strings.xml index 529cfcf3..9081e1e3 100644 --- a/live/tuilivekit/src/main/res-common/values/strings.xml +++ b/live/tuilivekit/src/main/res-common/values/strings.xml @@ -105,6 +105,7 @@ 1080p Live type: Live Mode: + Game Mode: Kicked out of seat by room owner Apply for link mic User is Already in Another Room, Single RoomEngine Instance Only Supports User Entering One Room, To Enter Different Room, Please Leave the Room or Use New RoomEngine Instance @@ -273,6 +274,9 @@ Daily chat Public Privacy + None + Gobang + Ludo Cancel application for link mic End Link Apply for audio link diff --git a/live/tuilivekit/src/main/res/drawable-xxhdpi/livekit_ic_game.png b/live/tuilivekit/src/main/res/drawable-xxhdpi/livekit_ic_game.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0cb7443f2a0ebe8d3b29423f7f93bc9e7ec35e GIT binary patch literal 4065 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 + + + + + + + + + + diff --git a/live/tuilivekit/src/main/res/layout/livekit_voiceroom_anchor_function.xml b/live/tuilivekit/src/main/res/layout/livekit_voiceroom_anchor_function.xml index cc1d09f7..efc2384c 100644 --- a/live/tuilivekit/src/main/res/layout/livekit_voiceroom_anchor_function.xml +++ b/live/tuilivekit/src/main/res/layout/livekit_voiceroom_anchor_function.xml @@ -16,6 +16,16 @@ android:src="@drawable/livekit_function_settings" tools:ignore="ContentDescription" /> + + + + + Date: Fri, 14 Nov 2025 11:04:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?tuigamekit=20=E4=BF=AE=E6=94=B9=E4=B8=BAtui?= =?UTF-8?q?gamebox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- live/settings.gradle | 2 +- live/{tuigamekit => tuigamebox}/.gitignore | 0 live/{tuigamekit => tuigamebox}/build.gradle | 0 live/{tuigamekit => tuigamebox}/consumer-rules.pro | 0 live/{tuigamekit => tuigamebox}/proguard-rules.pro | 0 live/{tuigamekit => tuigamebox}/src/main/AndroidManifest.xml | 0 .../src/main/java/com/trtc/uikit/gamekit/LiteGameEngine.java | 0 .../main/java/com/trtc/uikit/gamekit/LiteGameUnityPlayer.java | 0 .../src/main/java/com/trtc/uikit/gamekit/UnityHostActivity.java | 0 .../src/main/java/com/trtc/uikit/gamekit/UnityHostBridge.java | 0 .../main/java/com/trtc/uikit/gamekit/common/GameKitLogger.java | 0 .../src/main/java/com/trtc/uikit/gamekit/gameview/GameView.java | 0 .../main/res/drawable/gamekit_bg_titlebar_rounded_bottom.xml | 0 .../src/main/res/drawable/gamekit_bg_titlebar_rounded_top.xml | 0 .../src/main/res/layout/gamekit_gameview_root_view.xml | 0 live/{tuigamekit => tuigamebox}/src/main/res/values/colors.xml | 0 live/{tuigamekit => tuigamebox}/src/main/res/values/strings.xml | 0 live/tuilivekit/build.gradle | 2 +- 18 files changed, 2 insertions(+), 2 deletions(-) rename live/{tuigamekit => tuigamebox}/.gitignore (100%) rename live/{tuigamekit => tuigamebox}/build.gradle (100%) rename live/{tuigamekit => tuigamebox}/consumer-rules.pro (100%) rename live/{tuigamekit => tuigamebox}/proguard-rules.pro (100%) rename live/{tuigamekit => tuigamebox}/src/main/AndroidManifest.xml (100%) rename live/{tuigamekit => tuigamebox}/src/main/java/com/trtc/uikit/gamekit/LiteGameEngine.java (100%) rename live/{tuigamekit => tuigamebox}/src/main/java/com/trtc/uikit/gamekit/LiteGameUnityPlayer.java (100%) rename live/{tuigamekit => tuigamebox}/src/main/java/com/trtc/uikit/gamekit/UnityHostActivity.java (100%) rename live/{tuigamekit => tuigamebox}/src/main/java/com/trtc/uikit/gamekit/UnityHostBridge.java (100%) rename live/{tuigamekit => tuigamebox}/src/main/java/com/trtc/uikit/gamekit/common/GameKitLogger.java (100%) rename live/{tuigamekit => tuigamebox}/src/main/java/com/trtc/uikit/gamekit/gameview/GameView.java (100%) rename live/{tuigamekit => tuigamebox}/src/main/res/drawable/gamekit_bg_titlebar_rounded_bottom.xml (100%) rename live/{tuigamekit => tuigamebox}/src/main/res/drawable/gamekit_bg_titlebar_rounded_top.xml (100%) rename live/{tuigamekit => tuigamebox}/src/main/res/layout/gamekit_gameview_root_view.xml (100%) rename live/{tuigamekit => tuigamebox}/src/main/res/values/colors.xml (100%) rename live/{tuigamekit => tuigamebox}/src/main/res/values/strings.xml (100%) diff --git a/live/settings.gradle b/live/settings.gradle index 1f69a5c5..502f8671 100644 --- a/live/settings.gradle +++ b/live/settings.gradle @@ -1,7 +1,7 @@ include ':app' include ':debug' include ':tuilivekit' -include ':tuigamekit' +include ':tuigamebox' include(":atomic") project(':atomic').projectDir = new File(settingsDir, '../atomic_x') diff --git a/live/tuigamekit/.gitignore b/live/tuigamebox/.gitignore similarity index 100% rename from live/tuigamekit/.gitignore rename to live/tuigamebox/.gitignore diff --git a/live/tuigamekit/build.gradle b/live/tuigamebox/build.gradle similarity index 100% rename from live/tuigamekit/build.gradle rename to live/tuigamebox/build.gradle diff --git a/live/tuigamekit/consumer-rules.pro b/live/tuigamebox/consumer-rules.pro similarity index 100% rename from live/tuigamekit/consumer-rules.pro rename to live/tuigamebox/consumer-rules.pro diff --git a/live/tuigamekit/proguard-rules.pro b/live/tuigamebox/proguard-rules.pro similarity index 100% rename from live/tuigamekit/proguard-rules.pro rename to live/tuigamebox/proguard-rules.pro diff --git a/live/tuigamekit/src/main/AndroidManifest.xml b/live/tuigamebox/src/main/AndroidManifest.xml similarity index 100% rename from live/tuigamekit/src/main/AndroidManifest.xml rename to live/tuigamebox/src/main/AndroidManifest.xml diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameEngine.java b/live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/LiteGameEngine.java similarity index 100% rename from live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameEngine.java rename to live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/LiteGameEngine.java diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameUnityPlayer.java b/live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/LiteGameUnityPlayer.java similarity index 100% rename from live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/LiteGameUnityPlayer.java rename to live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/LiteGameUnityPlayer.java diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostActivity.java b/live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/UnityHostActivity.java similarity index 100% rename from live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostActivity.java rename to live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/UnityHostActivity.java diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostBridge.java b/live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/UnityHostBridge.java similarity index 100% rename from live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/UnityHostBridge.java rename to live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/UnityHostBridge.java diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/common/GameKitLogger.java b/live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/common/GameKitLogger.java similarity index 100% rename from live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/common/GameKitLogger.java rename to live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/common/GameKitLogger.java diff --git a/live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/gameview/GameView.java b/live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/gameview/GameView.java similarity index 100% rename from live/tuigamekit/src/main/java/com/trtc/uikit/gamekit/gameview/GameView.java rename to live/tuigamebox/src/main/java/com/trtc/uikit/gamekit/gameview/GameView.java diff --git a/live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_bottom.xml b/live/tuigamebox/src/main/res/drawable/gamekit_bg_titlebar_rounded_bottom.xml similarity index 100% rename from live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_bottom.xml rename to live/tuigamebox/src/main/res/drawable/gamekit_bg_titlebar_rounded_bottom.xml diff --git a/live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_top.xml b/live/tuigamebox/src/main/res/drawable/gamekit_bg_titlebar_rounded_top.xml similarity index 100% rename from live/tuigamekit/src/main/res/drawable/gamekit_bg_titlebar_rounded_top.xml rename to live/tuigamebox/src/main/res/drawable/gamekit_bg_titlebar_rounded_top.xml diff --git a/live/tuigamekit/src/main/res/layout/gamekit_gameview_root_view.xml b/live/tuigamebox/src/main/res/layout/gamekit_gameview_root_view.xml similarity index 100% rename from live/tuigamekit/src/main/res/layout/gamekit_gameview_root_view.xml rename to live/tuigamebox/src/main/res/layout/gamekit_gameview_root_view.xml diff --git a/live/tuigamekit/src/main/res/values/colors.xml b/live/tuigamebox/src/main/res/values/colors.xml similarity index 100% rename from live/tuigamekit/src/main/res/values/colors.xml rename to live/tuigamebox/src/main/res/values/colors.xml diff --git a/live/tuigamekit/src/main/res/values/strings.xml b/live/tuigamebox/src/main/res/values/strings.xml similarity index 100% rename from live/tuigamekit/src/main/res/values/strings.xml rename to live/tuigamebox/src/main/res/values/strings.xml diff --git a/live/tuilivekit/build.gradle b/live/tuilivekit/build.gradle index e62b6e90..886fba21 100644 --- a/live/tuilivekit/build.gradle +++ b/live/tuilivekit/build.gradle @@ -53,7 +53,7 @@ android { dependencies { api project(':atomic') - api project(':tuigamekit') + api project(':tuigamebox') api 'androidx.appcompat:appcompat:1.3.1' api 'com.google.android.material:material:1.12.0'