diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..ab5013a4c911adec2f40b502e586278d6b2bf1ad
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,26 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+apply from:'config.gradle'
+
+buildscript {
+ repositories {
+ maven {
+ url 'https://sdk.wdyxgames.com/nexus/repository/sdk-public/'
+ }
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:4.0.2'
+ }
+}
+
+allprojects {
+ repositories {
+ maven {
+ url 'https://sdk.wdyxgames.com/nexus/repository/sdk-public/'
+ }
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/config.gradle b/config.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..06004fe3139c685559190b2c275d9806883a6f65
--- /dev/null
+++ b/config.gradle
@@ -0,0 +1,64 @@
+ext {
+ //isLibrary
+ // true app模块为library调试本地依赖库
+ // false app模块为application 上传apk
+ isLibrary = false
+
+ //true 引入本地依赖库(maven推送时不允许引入本地aar或library类库应为false)
+ isUseLocalLibs = true
+
+ android = [
+ compileSdkVersion: 29,
+ minSdkVersion : 21,
+ targetSdkVersion : 29
+ ]
+
+ version = [
+ fastjson : '1.2.78',
+ accessNative: '0.1.2.1413-beta2',
+ crash : '4.2.14',
+ ]
+ dependencies = [
+ fastjson : "com.alibaba:fastjson:${version.fastjson}",
+ accessNative: "com.hoolai.access.platform:access-native:${version.accessNative}",
+ hoolaiCrash : "com.hoolai.access.crash:hoolai-crash:${version.crash}"
+
+ ]
+
+ testUtils = [
+ testImplementation : 'junit:junit:4.13.2',
+ androidTestImplementation: 'androidx.test.ext:junit:1.1.5',
+ androidTestImplementation: 'androidx.test.espresso:espresso-core:3.5.1'
+ ]
+
+ fastsdk = [
+ groupId: 'com.hoolai.access.open',
+ name : 'hoolai-core',
+ version: '1.0.3.11.2-beta'
+ ]
+
+ exCrash = [
+ groupId: 'com.hoolai.access.trace',
+ name : 'exCrash',
+ version: '1.0.0.0'
+ ]
+
+ hotfix = [
+ groupId: 'com.hoolai.access.hotfix',
+ name : 'hotfix',
+ version: '1.0.0.0'
+ ]
+
+ logTag = [
+ groupId: 'com.hoolai.access.log',
+ name : 'logTag',
+ version: '1.0.0.1'
+ ]
+
+ uTools = [
+ groupId: 'com.hoolai.access.open.fastaccess.utils',
+ name : 'uTools',
+ version: '1.0.0.0'
+ ]
+
+}
\ No newline at end of file
diff --git a/game_demo/.gitignore b/game_demo/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..42afabfd2abebf31384ca7797186a27a4b7dbee8
--- /dev/null
+++ b/game_demo/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/game_demo/build.gradle b/game_demo/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..8993f8bb84e27db37cc65d3907cba8ad022533eb
--- /dev/null
+++ b/game_demo/build.gradle
@@ -0,0 +1,45 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ compileSdkVersion 33
+
+ defaultConfig {
+ applicationId "com.hoolai.oversea.access"
+ minSdkVersion 23
+ targetSdkVersion 33
+ versionCode 24
+ versionName "1.2.4"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+ signingConfigs {
+ yourkeystore {
+ keyAlias 'access'
+ keyPassword 'access123'
+ storeFile file("${rootProject.projectDir.absolutePath}/keystorefile/access_global.keystore")
+ storePassword 'access123'
+ }
+ }
+ buildTypes {
+ debug {
+ minifyEnabled false //是否混淆
+ signingConfig signingConfigs.yourkeystore
+ }
+ release {
+ minifyEnabled false //是否混淆
+ signingConfig signingConfigs.yourkeystore
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ //注意远程依赖库的版本(必须)
+ implementation 'com.hoolai.access.open:hoolai-core:1.0.0.0-global12'
+ implementation 'com.hoolai.oversea:hl-oversea-global:1.0.0.0-dev5'
+}
\ No newline at end of file
diff --git a/game_demo/google-services.json b/game_demo/google-services.json
new file mode 100644
index 0000000000000000000000000000000000000000..4920ef69140a0f3c43c81f263e9adef1dc4c85f8
--- /dev/null
+++ b/game_demo/google-services.json
@@ -0,0 +1,55 @@
+{
+ "project_info": {
+ "project_number": "242883477374",
+ "project_id": "access-f4133",
+ "storage_bucket": "access-f4133.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:242883477374:android:f7b5a4a9564fcd86e3bd2f",
+ "android_client_info": {
+ "package_name": "com.hoolai.oversea.access"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "242883477374-p0j6gg8pjibens17rfibf1tsd1d72tkm.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "com.hoolai.oversea.access",
+ "certificate_hash": "bc8591140a47250db392865765c4ce7d4e5b8b96"
+ }
+ },
+ {
+ "client_id": "242883477374-s5a7d489td3s976hcgmcqq1nar7aqrie.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "com.hoolai.oversea.access",
+ "certificate_hash": "c6889e4b5808728c7e1d82baed969e8351a2dd4e"
+ }
+ },
+ {
+ "client_id": "242883477374-7u4f0fvqg2a6jrd7ro6sat6ms2ledtml.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyAR9uWzd7yaXb6cDOY1HcDk46JZaEqMhgA"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": [
+ {
+ "client_id": "242883477374-7u4f0fvqg2a6jrd7ro6sat6ms2ledtml.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/game_demo/proguard-rules.pro b/game_demo/proguard-rules.pro
new file mode 100644
index 0000000000000000000000000000000000000000..481bb434814107eb79d7a30b676d344b0df2f8ce
--- /dev/null
+++ b/game_demo/proguard-rules.pro
@@ -0,0 +1,21 @@
+# 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
\ No newline at end of file
diff --git a/game_demo/src/main/AndroidManifest.xml b/game_demo/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1b50a049832ff21c8d7f5ee9d6f18246c8e78aa6
--- /dev/null
+++ b/game_demo/src/main/AndroidManifest.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/game_demo/src/main/assets/access.config b/game_demo/src/main/assets/access.config
new file mode 100644
index 0000000000000000000000000000000000000000..085f265e7610215e054f793314305ddffd5e2f71
--- /dev/null
+++ b/game_demo/src/main/assets/access.config
@@ -0,0 +1 @@
+F5OvkhmmnIQ+3ot6Y0R6mlEfM/pduDHyhPPJ4t9FsdEGstVHsBh13LCUjQZoOXb4f+11nTHw2S7gNJ5lVskOypSbR9GuujINqicrCO6ij2hoTNSW6ikKxik/d+a9hE/hEosC2h0loEE1IcAaQlgJ7QYakJIsXeQz2O2GRbVstklmbdnFrenerx5iKDfMA4Z1MS9JVYuwTcQDodrRXDq96mMh/nnDZRqeLSA+yaqrsnOnr6GXACaerHDYMNXcaUOlMiJLYYW7a9mJjBXFNdpq2zMgyyw77DJ29oKk0P5uSIZ9xDcfllnZZV07oJ5ikYwGUvw8JZSy40jXaEArW1G0UQRcUIzY4tSgCmQUe0vGaCittAE7e3/914N2NVAMuN3ZObmwTN+ufpJfdubnnAFqhSjIQse0lJ8twRn24/yCdacDVehke4nISTSm8A5CCFjmEDJeeLas1wvCoWaL2DxThIWJlebZA4GcNS/S0kHXY8FKZPRlPpXDUCdAOBoO3XzWMy4pkpRb7f0xMhQAEucmerX/g8TzilAXRjhGgBZLWbck3VdUDBec3Wb+yKObih3kmqTek0VkyXCRupZNHIlw/Df4yB1SBGaFpiTDFBdYIwfXYdxKTWeJTzXl7MhqcByxXMGIaVHyOKWq56/giUhTbBpcrEp+HztAsQleuP7bn6dnTZy6TFDyhyIQrVE5bNIZhBZxeHBLyfZK3q2wkEKMNb/JAmukaNcLmPGbsVKl3r9Wl1QdqdK3roAJAxz7o3nJ1yjwXPNpeFEiBvEPEX783ELcwcV0t2ojdN1vVMh7UFlralHzgUdEsrhM2dJfRBkrk/IF9BvVq1i5jpm9gIMJhGywWrkxLUG6yBFbBItKUxeYLTaNJKV7MrV+F0t1K1243QECrKQ6jB2tFoPiD5y9/OuOIkoLiX3h+2nQR3Zgh7yi4FvoapH+/zo91LLqmG2KZ+AP8wwEe2GrG04k974fCy4OzQWjw6qfmHN5r4W9nfR9ocQRs2N+M8FeeRDiK5HBI88CVKYdYFANDV63UfL6kCeZQ/+5b8ULbEr3zhx0ALY3daRcUcMmXPlgzWZiJiXm8PxbYPKUfrzzsUcpHqNh2kCTcIEtw4tV0/T11NxUCOMgkiO4QJoFE+DPcbrHkpTPLormp/BjgAlG9Ifjulf1LKD0bTIX6BBHS5XGSx6oUqjtG2oXTzytahtPPZKCR3mEjkPVwbLTgGlK+ZSHNTIGOs+sIthQbh3FHzN97JLHBIPvehJPXFUMuApF8Eju9nWgMiI/NUifyexbZidue0lzyrt9U3BYKSVNYLBAAjLb9fXVplEjhxKYPE+GGpsRHT7hqaSngpDntvsrrDZhF8OTbHCRrgbzpWa4TJw7ni3D8t3Lj8MXHhE6BRMDdPCZP96mK6cuESd19hqSe0N502pX3nVuNhJMUfLXILOEvqii4MWjFyyQBBgcsG1JNYeSMZJwv0walsjO7A7uYGW9yZmtz/u4OSua3g4noQru4IpErdAwkRjUYRSKz5hvrD9Y+wVhcHEObDjDR+V/4BBiBhdq96iqyonZhfrPomjM7ItVqK+Oyb7rF9jiphhdgxgaD+kQ0Hownz2jqAqcsWnugGwLuw8w60rrEx9EHs5ERDA/DmsvfjU/iQXDsiUQWaZws+Yar9S+nbIJ5jyVl8gq6Qx7ug9Xb1Et6RgZ4R+S+sr0nS0=
\ No newline at end of file
diff --git a/game_demo/src/main/assets/access_localization.ini b/game_demo/src/main/assets/access_localization.ini
new file mode 100644
index 0000000000000000000000000000000000000000..399c1340a992aaed1a78e89a96be696a362b7c9d
--- /dev/null
+++ b/game_demo/src/main/assets/access_localization.ini
@@ -0,0 +1,721 @@
+[default,zh-Hans]
+NETWORK_ERROR = 网络异常
+ERROR = core 内通用非ok码
+DATA_ILLEGAL = 数据非法
+SANDBOX_OR_RESOURCE_EMPTY = 沙盒或资源目录为空
+INIT_CFG_ERROR = 初始化配置文件异常
+INIT_ACCOUNT_ERROR = 初始化账号列表异常
+INIT_PAYMENT_ERROR = 初始化支付系统异常
+NOT_START_SYSTEM = 没有启动系统
+ALREADY_INIT_SYSTEM = 系统已经初始化
+PARSE_RESPONSE_ERROR = 解析响应错误
+PARSE_INIT_INFO_ERROR = 解析初始化数据错误
+PARSE_LOGIN_INFO_ERROR = 解析登陆信息异常
+USERNAME_OR_PASSWORD_EMPTY = 用户名或密码为空
+ACCOUNT_ID_OR_CODE_EMPTY = 账户ID或账户码为空
+ACCOUNT_ALREADY_BIND_CHANNEL = 账号已经绑定当前渠道
+PHONE_OR_CODE_EMPTY = 手机号或验证码为空
+PHONE_NUMBER_EMPTY = 手机号码为空
+PHONE_FORMAT_ERROR = 手机号码格式错误
+QUICK_AUTH_TOKEN_EMPTY = 快速登陆授权Token为空
+NOT_SURE_ALL_INTERACTIVE = 未确认所有的对话框交互
+NOT_EXIST_SERVICE_DIALOG = 不存在业务对话框
+ALREADY_LOGIN = 已经登陆
+LOGIN_FAILED = 登录失败
+REMOVE_ACCOUNT_ERROR = 删除账号失败
+PAYMENT_ERROR = 支付异常
+CREATE_LOCAL_ORDER_ERROR = 创建本地订单异常
+EXIST_LOCAL_ORDER = 存在本地未完成订单
+REMOVE_LOCAL_ORDER_ERROR = 移除本地订单异常
+NOT_IN_INIT = 当前不在初始化状态
+NOT_IN_LOGIN = 当前不在登陆状态
+INIT_SYSTEM_ERROR = 初始化系统异常
+INIT_PREFERENCES_ERROR = 初始化用户偏好设置异常
+EXIST_VIEW_NOT_CLOSE = 存在未被关闭的view
+CURRENT_VIEW_NOT_OPENED = 当前view未被打开
+FETCH_DESC_FAILED = 抓取异常描述失败
+NOT_EXIST_CHILD_ACCOUNT = 当前小号不存在
+NAME_OR_IDENTITY_EMPTY = 姓名或身份证为空
+ACCOUNT_INFO_NOT_EXIST = 账号信息不存在
+ORDER_INFO_NOT_EXIST = 订单信息不存在
+CHANNEL_NOT_SUPPORT_LOGIN = 渠道登陆不支持
+NOT_SUPPORT_OPERATOR = 当前操作不支持
+PLEASE_RESTART_UPDATE = 更新已完成,请重启
+LOCALIZATION_UPDATE_RESTART = 国际化文件已更新,重启生效
+CONFIGRATION_UPDATE_RESTART = 配置文件已更新,重启生效
+NOT_GENUINE_APP = 非正版应用,请下载正版应用
+CANCEL_REAL_NAME = 取消实名认证
+UNOFFICIAL_AUTHENTICATION = 非官方认证登录
+UNKNOWN = 未知异常
+
+enterGame = 进入游戏
+policyPrivacy = 阅读并同意[隐私条款]及[用户协议]
+otherLogin = 其它登录方式
+realAuth = 实名认证
+quickLogin = 快速登录
+phoneQuickLogin=本机号码一键登录
+pleaseInputPwd = 请输入密码
+pleaseInputAccount = 请输入账号
+getVerifyCode = 验证码
+pleaseInputVerifyCode = 请输入验证码
+pleaseInputPhone = 请输入手机号
+tip = 提示
+authorization = 认证
+cancel = 取消
+sure = 确定
+pleaseInputIdentifyId = 请输入身份证号
+pleaseInputName = 请输入姓名
+realNameRules = 根据国家新闻出版署《关于防止未成年沉迷网络游戏的通知》,未实名账号不可体验游戏,请尽快完成实名登记
+mainEnter = 主号进入
+chileEnter = 小号进入
+checkedPrivace = 请先勾选并同意相关政策条款再登录游戏
+checkPermissionTip = 由于您已拒绝%权限,开启该功能需要打开“设置”>“权限管理”进行授权
+realNameError = 您输入的姓名格式不正确
+idCardError = 您输入的身份证格式不正确
+phoneError = 手机号码格式不正确
+vcodeError = 验证码格式不正确
+pwdError = 密码格式不正确
+getVcodeFailed = 获取验证码失败
+
+bindAccount = 绑定账号
+bindAccountTip = 当前渠道账号未绑定游客
+guestAccountTip = 当前账号为游客账号,请尽快绑定三方账号,避免账号丢失
+guestSwitchTip = 您当前为游客账号,切换账号将丢失当前游客账号的游戏进度
+bindingAccountTip = 当前账号已绑定%s账号
+accountId = 账号ID
+accountCode = 账号码
+bindAccountIdPlaceholder = 请输入账号恢复Id
+bindAccountCodePlaceholder = 请输入账号恢复码
+bindIdCodedescription = 当更换设备时可在切换账号页面中输入当前的恢复Id和恢复码,就可以使用原有账号角色数据继续游戏
+unbindIdCodedescription = 如果账号未绑定任何三方账号,可输入账号恢复Id和恢复码用来切换账号
+switchAccountTip = 当前登录的渠道账号已绑定其他游客账号,是否进行切换
+switchAccount = 切换账号
+switchAccountFailture = 切换账号失败
+sameAccountTip = 当前账号已登录
+loginSuccessTip = 用户%s,登录成功
+
+orderValidate = 订单核验中...
+startingPay = 开始购买
+purchaseing = 购买中...
+
+[en]
+NETWORK_ERROR = Network exception
+ERROR = General non-OK code within the core
+DATA_ILLEGAL = Illegal data
+SANDBOX_OR_RESOURCE_EMPTY = Sandbox or resource directory is empty
+INIT_CFG_ERROR = Initialization configuration file exception
+INIT_ACCOUNT_ERROR = Initialization account list exception
+INIT_PAYMENT_ERROR = Initialization payment system exception
+NOT_START_SYSTEM = System not started
+ALREADY_INIT_SYSTEM = System already initialized
+PARSE_RESPONSE_ERROR = Parse response error
+PARSE_INIT_INFO_ERROR = Parse initialization data error
+PARSE_LOGIN_INFO_ERROR = Parse login information exception
+USERNAME_OR_PASSWORD_EMPTY = Username or password is empty
+ACCOUNT_ID_OR_CODE_EMPTY = Account ID or account code is empty
+ACCOUNT_ALREADY_BIND_CHANNEL = Account already bound to the current channel
+PHONE_OR_CODE_EMPTY = Phone number or verification code is empty
+PHONE_NUMBER_EMPTY = Phone number is empty
+PHONE_FORMAT_ERROR = Phone number format is incorrect
+QUICK_AUTH_TOKEN_EMPTY = Quick login authorization token is empty
+NOT_SURE_ALL_INTERACTIVE = Not all dialog interactions are confirmed
+NOT_EXIST_SERVICE_DIALOG = Service dialog does not exist
+ALREADY_LOGIN = Already logged in
+LOGIN_FAILED = Login failed
+REMOVE_ACCOUNT_ERROR = Failed to remove account
+PAYMENT_ERROR = Payment exception
+CREATE_LOCAL_ORDER_ERROR = Exception occurred when creating a local order
+EXIST_LOCAL_ORDER = Existing local incomplete order
+REMOVE_LOCAL_ORDER_ERROR = Exception occurred when removing a local order
+NOT_IN_INIT = Not in initialization state
+NOT_IN_LOGIN = Not in login state
+INIT_SYSTEM_ERROR = Initialization system exception
+INIT_PREFERENCES_ERROR = Initialization user preference settings exception
+EXIST_VIEW_NOT_CLOSE = Existing unclosed view
+CURRENT_VIEW_NOT_OPENED = Current view not opened
+FETCH_DESC_FAILED = Failed to fetch exception description
+NOT_EXIST_CHILD_ACCOUNT = Current child account does not exist
+NAME_OR_IDENTITY_EMPTY = Name or ID card is empty
+ACCOUNT_INFO_NOT_EXIST = Account information does not exist
+ORDER_INFO_NOT_EXIST = Order information does not exist
+CHANNEL_NOT_SUPPORT_LOGIN = Channel login not supported
+NOT_SUPPORT_OPERATOR = Current operation not supported
+PLEASE_RESTART_UPDATE = Update completed, please restart
+LOCALIZATION_UPDATE_RESTART = Localization files updated, restart required
+CONFIGRATION_UPDATE_RESTART = Configuration files updated, restart required
+NOT_GENUINE_APP = Non-genuine application, please download the official version
+CANCEL_REAL_NAME = Cancel real-name authentication
+UNOFFICIAL_AUTHENTICATION = Unofficial authentication login
+UNKNOWN = Unknown exception
+
+
+enterGame = Enter the game
+policyPrivacy = Read and agree to [Privacy Policy] and [User Agreement]
+otherLogin = Other login methods
+realAuth = Real-name authentication
+quickLogin = Quick login
+phoneQuickLogin = Quick login with caller ID
+pleaseInputPwd = Please enter the password
+pleaseInputAccount = Please enter the account
+getVerifyCode = Verification code
+pleaseInputVerifyCode = Please enter the verification code
+pleaseInputPhone = Please enter the phone number
+tip = Tip
+authorization = Authorization
+cancel = Cancel
+sure = Confirm
+pleaseInputIdentifyId = Please enter the ID card number
+pleaseInputName = Please enter the name
+realNameRules = According to the requirements of the National Press and Publication Administration's "Notice on Preventing Minors from Being Addicted Online Games", unverified accounts cannot experience the game. Please complete real-name authentication as soon as possible.
+mainEnter = Enter with main account
+childEnter = Enter with child account
+checkedPrivace = Please check and agree to the relevant policy terms before logging into the game
+checkPermissionTip = As you have denied the % permission, enabling this feature requires opening "Settings" > "Permission Management" for authorization
+realNameError = The name you entered is not in the correct format
+idCardError = The ID card you entered is not in the correct format
+phoneError = Incorrect phone number format
+vcodeError = Incorrect verification code format
+pwdError = Incorrect password format
+getVcodeFailed = Failed to get verification code
+
+
+bindAccount = Bind account
+bindAccountTip = Current channel account is not bound to a guest account
+guestAccountTip = Current account is a guest account, please bind to a third-party account as soon as possible in case of loss of account
+guestSwitchTip = You are currently a guest account, Switching accounts will lose the game progress of the current guest account
+bindingAccountTip = Current account is already bound to %s account
+accountId = Account ID
+accountCode = Account code
+bindAccountIdPlaceholder = Please enter account recovery ID
+bindAccountCodePlaceholder = Please enter account recovery code
+bindIdCodedescription = When switching devices, you can input the current recovery ID and recovery code on the account switch page to continue using the original account character data
+unbindIdCodedescription = If the account is not bound to any third-party account, you can enter the account recovery ID and recovery code to switch accounts
+switchAccountTip = The current logged-in channel account is already bound to another guest account. Do you want to switch?
+switchAccount = Switch account
+switchAccountFailture = Failed to switch account
+sameAccountTip = Current account is already logged in
+loginSuccessTip = User %s logged in successfully
+
+orderValidate = Order validation in progress...
+startingPay = Start purchasing
+purchaseing = Purchasing...
+
+[es]
+NETWORK_ERROR = Error de red
+ERROR = Código no ok universal dentro del core
+DATA_ILLEGAL = Datos inválido
+SANDBOX_OR_RESOURCE_EMPTY = Entorno de pruebas o directorio de recursos vacío
+INIT_CFG_ERROR = Error al inicializar archivo de configuración
+INIT_ACCOUNT_ERROR = Error al inicializar lista de cuentas
+INIT_PAYMENT_ERROR = Error al inicializar el sistema de pago
+NOT_START_SYSTEM = Sistema no iniciado
+ALREADY_INIT_SYSTEM = Sistema inicializado
+PARSE_RESPONSE_ERROR = Error al analizar respuesta
+PARSE_INIT_INFO_ERROR = Error al analizar datos de inicialización
+PARSE_LOGIN_INFO_ERROR = Error al analizar información de inicio de sesión
+USERNAME_OR_PASSWORD_EMPTY = Nombre d usuario o contraseña vacía
+ACCOUNT_ID_OR_CODE_EMPTY = ID de cuenta o código de cuenta vacío
+ACCOUNT_ALREADY_BIND_CHANNEL = Cuenta vinculada al canal actual
+PHONE_OR_CODE_EMPTY = Número de teléfono móvil o código de verificación vacío
+PHONE_NUMBER_EMPTY = Número de teléfono móvil vacío
+PHONE_FORMAT_ERROR = Error de formato de teléfono móvil
+QUICK_AUTH_TOKEN_EMPTY = Token d autorización de inicio de sesión rápido vacío
+NOT_SURE_ALL_INTERACTIVE = Todas las interacciones del cuadro de diálogo no confirmadas
+NOT_EXIST_SERVICE_DIALOG = No existe el cuadro de diálogo de negocios
+ALREADY_LOGIN = Sesión iniciada
+LOGIN_FAILED = Inicio de sesión fallida
+REMOVE_ACCOUNT_ERROR = Error al eliminar cuenta
+PAYMENT_ERROR = Error de pago
+CREATE_LOCAL_ORDER_ERROR = Error al crear pedido local
+EXIST_LOCAL_ORDER = Hay pedido local pendiente
+CREATE_LOCAL_ORDER_ERROR = Error al retirar pedido local
+NOT_IN_INIT = No en estado de inicialización
+NOT_IN_LOGIN = No en estado de inicio de sesión
+INIT_SYSTEM_ERROR = Error al inicializar el sistema
+INIT_PREFERENCES_ERROR = Error al inicializar configuración de preferencias de usuario
+EXIST_VIEW_NOT_CLOSE = Hay view no cerrado
+CURRENT_VIEW_NOT_OPENED = view actual abierto
+FETCH_DESC_FAILED = Error al capturar descripción de anomalía
+USER_INFO_NOT_EXIST=La cuenta auxiliar actual no existe
+NAME_OR_IDENTITY_EMPTY = Nombre o documento de identificación vacío
+ACCOUNT_INFO_NOT_EXIST = La información de cuenta no existe
+ORDER_INFO_NOT_EXIST = La información de pedido no existe
+CHANNEL_NOT_SUPPORT_LOGIN = No admite inicio de sesión del canal actual
+NOT_SUPPORT_OPERATOR = No admite la operación actual
+PLEASE_RESTART_UPDATE = Actualización terminada, reinicie
+LOCALIZATION_UPDATE_RESTART = Archivo internacional actualizado, reinicie para que surta efecto
+CONFIGRATION_UPDATE_RESTART = Archivo de configuración actualizado, reinicie para que surta efecto
+NOT_GENUINE_APP = Aplicación no genuina, descargue una genuina
+CANCEL_REAL_NAME = Cancelar autentificación de nombre real
+UNOFFICIAL_AUTHENTICATION = Inicio de sesión de autenticación no oficial
+UNKNOWN = Error desconocido
+
+
+enterGame = Entrar en el juego
+policyPrivacy = Lea y acepte los [Términos de Privacidad] y [Acuerdo de Usuario]
+otherLogin = Otros métodos de inicio de sesión
+realAuth = Autentificación de nombre real
+quickLogin = Inicio de sesión rápido
+phoneQuickLogin=Iniciar sesión con un solo clic con el número del teléfono móvil
+pleaseInputPwd = Ingrese la contraseña
+pleaseInputAccount = Ingrese la cuenta
+getVerifyCode = Código de verificación
+pleaseInputVerifyCode = Ingrese el código de verificación
+pleaseInputPhone = Ingrese el número de teléfono móvil
+tip = Aviso
+authorization = Autentificación
+cancel = Cancelar
+sure = Confirmar
+pleaseInputIdentifyId = Ingrese el número de identificación
+pleaseInputName = Ingrese el nombre
+realNameRules = Conforme a los requisitos del "Aviso sobre la Prevención de la Adicción de Menores de Edad a los Juegos en Línea" de la Administración Nacional de Prensa y Publicaciones, no se puede experimentar el juego sin una cuenta de nombre real, complete el registro de nombre real lo antes posible.
+mainEnter = Ingresar con cuenta principal
+chileEnter = Ingresar con cuenta auxiliar
+checkedPrivace = Marque y acepte los términos de la política pertinente antes de iniciar sesión en el juego.
+checkPermissionTip = Como ha denegado el permiso%, debe habilitar esta función yendo a "Configuración" > "Gestión de permisos" para autorizar
+realNameError = El formato del nombre ingrsado es incorrecto
+idCardError = El formato del documento de identificación ingresado es incorrecto
+phoneError = El formato del número de teléfono móvil es incorrecto
+vcodeError = El formato del código de verificación es incorrecto
+pwdError = El formato de la contraseña es incorrecto
+getVcodeFailed = Error al obtener código de verificación
+
+
+bindAccount = Vincular cuenta
+bindAccountTip = La cuenta actual del canal no está vinculada a visitado
+guestAccountTip = Es la cuenta de visitado, vincule la cuenta de un tercero lo antes posible para evitar la pérdida de la cuenta.
+guestSwitchTip = Actualmente eres una cuenta de invitado, Al cambiar de cuenta, se perderá el progreso del juego de la cuenta de invitado actual.
+bindAccountTip = La cuenta actual está vinculada a la cuenta %s
+accountId = ID de cuenta
+accountCode = Número de cuenta
+bindAccountIdPlaceholder = Ingrese Id de recuperación de cuenta
+bindAccountCodePlaceholder = Ingrese el código de recuperación de la cuenta
+bindIdCodedescription = Al cambiar el dispositivo, puede introducir el Id de recuperación actual y el código de recuperación en la página de cambio de cuenta, y continuar el juego con los datos del personaje de la cuenta original.
+unbindIdCodedescription = Si la cuenta no está vinculada a ninguna cuenta de tercero, puede introducir el ID de recuperación de la cuenta y el código de recuperación para cambiar la cuenta.
+switchAccountTip = La cuenta del canal de inicio de sesión actual está vinculada a otra cuenta de visitado, ¿cambiar?
+switchAccount = Cambiar cuenta
+switchAccountFailture = Error al cambiar cuenta
+sameAccountTip = La cuenta actual se ha iniciado sesión
+loginSuccessTip = Usuario %s, inicio de sesión con éxito
+
+orderValidate = Verificando pedido...
+startingPay = Comprar
+purchaseing = Comprando...
+
+[fr]
+NETWORK_ERROR = Anomalie réseau.
+ERROR = code non-ok générique dans le core.
+DATA_ILLEGAL = Données illégales.
+SANDBOX_OR_RESOURCE_EMPTY = Le répertoire du bac à sable ou des ressources est vide
+INIT_CFG_ERROR = Erreur de profil d'initialisation.
+INIT_ACCOUNT_ERROR = Erreur d'initialisation de la liste des comptes
+INIT_PAYMENT_ERROR = Erreur d'initialisation du système de paiement
+NOT_START_SYSTEM = Le système n'a pas démarré
+ALREADY_INIT_SYSTEM = Le système est déjà initialisé
+PARSE_RESPONSE_ERROR = Erreur d'analyse de la réponse.
+PARSE_INIT_INFO_ERROR = Erreur d'analyse des données d'initialisation.
+PARSE_LOGIN_INFO_ERROR = Erreur d'analyse des informations de connexion.
+USERNAME_OR_PASSWORD_EMPTY = Le nom d'utilisateur ou le mot de passe est vide.
+ACCOUNT_ID_OR_CODE_EMPTY = ID de compte ou code de compte vide
+ACCOUNT_ALREADY_BIND_CHANNEL = Le compte a été lié au canal actuel
+PHONE_OR_CODE_EMPTY = Le numéro de téléphone mobile ou le code de vérification est vide.
+PHONE_NUMBER_EMPTY = Le numéro de téléphone mobile est vide
+PHONE_FORMAT_ERROR = Le format du numéro de téléphone mobile est incorrect.
+QUICK_AUTH_TOKEN_EMPTY = Le token d'autorisation de connexion rapide est vide.
+NOT_SURE_ALL_INTERACTIVE = Toutes les interactions de la boîte de dialogue ne sont pas confirmées.
+NOT_EXIST_SERVICE_DIALOG = Aucun dialogue commercial n'existe.
+ALREADY_LOGIN = Déjà connecté.
+LOGIN_FAILED = Échec de la connexion.
+REMOVE_ACCOUNT_ERROR = Échec de la suppression du compte.
+PAYMENT_ERROR = Erreur de paiement
+CREATE_LOCAL_ORDER_ERROR = Erreur de création d'une commande locale.
+EXIST_LOCAL_ORDER = Il y a une commande locale non remplie.
+REMOVE_LOCAL_ORDER_ERROR = Supprimer une erreur de commande locale.
+NOT_IN_INIT = Actuellement pas dans l'état d'initialisation.
+NOT_IN_LOGIN = Pas encore connecté.
+INIT_SYSTEM_ERROR = Erreur du système d'initialisation.
+INIT_PREFERENCES_ERROR = Erreur d'initialisation des préférences de l'utilisateur.
+EXIST_VIEW_NOT_CLOSE = Un view n'a pas été fermé.
+CURRENT_VIEW_NOT_OPENED = Le view actuel n'est pas ouvert.
+FETCH_DESC_FAILED = Échec de la saisie de la description des erreurs.
+NOT_EXIST_CHILD_ACCOUNT = Le compte enfant n'existe pas.
+NAME_OR_IDENTITY_EMPTY = Le nom ou ID est vide.
+ACCOUNT_INFO_NOT_EXIST = L'information sur le compte n'existe pas.
+USER_INFO_NOT_EXIST = L'information sur la commande n'existe pas.
+CHANNEL_NOT_SUPPORT_LOGIN = La connexion au canal est non supportée.
+NOT_SUPPORT_OPERATOR = L'opération actuelle n'est pas supportée.
+PLEASE_RESTART_UPDATE = La mise à jour est terminée, veuillez redémarrer.
+LOCALIZATION_UPDATE_RESTART = Le fichier d'internationalisation a été mis à jour, veuillez redémarrer pour qu'il prenne effet.
+CONFIGRATION_UPDATE_RESTART = Le fichier de configuration a été mis à jour, veuillez redémarrer pour qu'il prenne effet.
+NOT_GENUINE_APP = Application non authentique, veuillez télécharger l'application authentique.
+CANCEL_REAL_NAME = Annuler la vérification de l'identité.
+UNOFFICIAL_AUTHENTICATION = Connexion d'authentification non officielle.
+UNKNOWN = Erreur inconnue.
+
+
+enterGame = Entrer dans le jeu.
+policyPrivacy = Lire et accepter [Politique de confidentialité] et [Accord de l'utilisateur].
+otherLogin = Autres méthodes de connexion.
+realAuth = La vérification de l'identité.
+quickLogin = Connexion rapide.
+phoneQuickLogin=Connexion en un clic avec le numéro local.
+pleaseInputPwd = Veuillez saisir le mot de passe.
+pleaseInputAccount = Veuillez saisir votre numéro de compte.
+getVerifyCode = Code de vérification.
+pleaseInputVerifyCode = Veuillez saisir le code de vérification.
+pleaseInputPhone = Veuillez saisir le numéro de téléphone portable.
+tip = Notice
+authorization = Authentification
+cancel = Annuler
+sure = Confirmer
+pleaseInputIdentifyId = Veuillez saisir le numéro d'identification.
+pleaseInputName = Veuillez saisir votre nom.
+realNameRules = Selon l’avis de l'Administration générale de la presse et des publications sur la prévention de l'accès des mineurs aux jeux en ligne, vous ne pouvez pas participer au jeu sans un compte à nom réel. Veuillez donc compléter l'enregistrement à nom réel dès que possible.
+mainEnter = Entrée du compte main
+chileEnter = Entrée du compte enfant
+checkedPrivace = Veuillez cocher et accepter les conditions d'utilisation avant de vous connecter au jeu.
+checkPermissionTip = Vous avez refusé la permission %, pour ouvrir cette fonction, vous devez ouvrir "Paramètres" > "Gestion des permissions" pour l'autorisation.
+realNameError = Le nom que vous avez saisi n'est pas au bon format.
+idCardError = Vous avez saisi un numéro d'identification incorrect.
+phoneError = Le format de votre numéro de téléphone portable n'est pas correct.
+vcodeError = Le code de vérification n'est pas dans le bon format.
+pwdError = Le format du mot de passe est incorrect.
+getVcodeFailed = Le code de vérification n'a pas été obtenu.
+
+
+bindAccount = Lier le compte
+bindAccountTip = Le compte de canal actuel n'est pas lié au visiteur.
+guestAccountTip = Le compte actuel est un compte visiteur, veuillez lier un compte tiers dès que possible pour éviter une perte de compte.
+guestSwitchTip = Vous êtes actuellement un compte invité. Changer de compte entraînera la perte de la progression du jeu du compte invité actuel.
+bindingAccountTip = Le compte courant est lié au compte %s.
+accountId = ID du compte
+accountCode = Code du compte
+bindAccountIdPlaceholder = Veuillez saisir le numéro de compte de recouvrement.
+bindAccountIdPlaceholder = Veuillez saisir le code de recouvrement.
+bindIdCodedescription = Lorsque vous changez d'appareil, vous pouvez saisir le numéro de compte et le code de recouvrement, puis vous pouvez utiliser les données de personnage du compte d'origine pour continuer le jeu.
+unbindIdCodedescription = Si le compte n'est pas lié à un compte tiers, vous pouvez saisir le numéro de compte et le code de recouvrement pour changer de compte.
+switchAccountTip = Le compte du canal actuellement connecté est lié à d'autres comptes visiteurs. Voulez-vous changer de compte ?
+switchAccount = Changer de compte
+switchAccountFailture = Échec du changement de compte
+sameAccountTip = Le compte actuel est connecté
+loginSuccessTip = Utilisateur%s, connexion réussie
+
+orderValidate = Vérification de la commande en cours...
+startingPay = Commencer l'achat
+purchaseing = Acheter...
+
+[it]
+NETWORK_ERROR = Errore di rete
+ERROR = In core cidice usato non ok
+DATA_ILLEGAL = Dati non corretti
+SANDBOX_OR_RESOURCE_EMPTY = Sandbox o elenco risorse vuoto
+INIT_CFG_ERROR = Errore documenti impostazioni di inizializzazione
+INIT_ACCOUNT_ERROR = Errore lista account inizializzazione
+INIT_PAYMENT_ERROR = Errore di sistema pagamento inizializzazione
+NOT_START_SYSTEM = Non è presente il sistema di avviamento
+ALREADY_INIT_SYSTEM = Inizializzazione sistema avvenuta
+PARSE_RESPONSE_ERROR = Errore risposta analisi
+PARSE_INIT_INFO_ERROR = Errore dati inizializzazione analisi
+PARSE_LOGIN_INFO_ERROR = Errore info accesso analisi
+USERNAME_OR_PASSWORD_EMPTY = Nome utente o password vuoti
+ACCOUNT_ID_OR_CODE_EMPTY = ID account o codice account vuoti
+ACCOUNT_ALREADY_BIND_CHANNEL = Account già associato al canale attuale
+PHONE_OR_CODE_EMPTY = Numero di telefono o codice di verifica vuoti
+PHONE_NUMBER_EMPTY = Numero di telefono vuoto
+PHONE_FORMAT_ERROR = Formato numero di telefono errato
+QUICK_AUTH_TOKEN_EMPTY = Token permesso access rapido vuoto
+NOT_SURE_ALL_INTERACTIVE = Non ancora confermata l’interazione di tutti i dialoghi
+NOT_EXIST_SERVICE_DIALOG = Dialogo del servizio inesistente
+ALREADY_LOGIN = Accesso già effettuato
+LOGIN_FAILED = Accesso fallito
+REMOVE_ACCOUNT_ERROR = Eliminazione account fallita
+PAYMENT_ERROR = Errore pagamento
+CREATE_LOCAL_ORDER_ERROR = Errore creazione ordine locale
+EXIST_LOCAL_ORDER = È presente un ordine locale non completato
+REMOVE_LOCAL_ORDER_ERROR = Errore rimozione ordine locale
+NOT_IN_INIT = Al momento non si è nello stato di inizializzazione
+NOT_IN_LOGIN = Al momento non si è nell stato di accesso
+INIT_SYSTEM_ERROR = Errore inizializzazione di sistema
+INIT_PREFERENCES_ERROR = Errore impostazioni preferite inizializzazione utente
+EXIST_VIEW_NOT_CLOSE = È presente view non chiusa
+CURRENT_VIEW_NOT_OPENED = View attuale non aperta
+FETCH_DESC_FAILED = Fallimento descrizione errore fetch
+NOT_EXIST_CHILD_ACCOUNT = Account secondario attuale inesistente
+NAME_OR_IDENTITY_EMPTY = Nome o identità vuoti
+ACCOUNT_NOT_EXIST=Info account inesistenti
+ORDER_INFO_NOT_EXIST = Info ordine inesistenti
+CHANNEL_NOT_SUPPORT_LOGIN = Accesso canale non supportato
+NOT_SUPPORT_OPERATOR = Operazione attuale non supportata
+PLEASE_RESTART_UPDATE = Aggiornamento completato, riavviare
+LOCALIZATION_UPDATE_RESTART = Documento di localizzazione aggiornato, riavvia per attivare
+CONFIGRATION_UPDATE_RESTART = Documento impostazioni aggiornato, riavvia per attivare
+NOT_GENUINE_APP = Versione app non originale, scaricare versione ufficiale
+CANCEL_REAL_NAME = Annulla verifica identità取消实名认证
+UNOFFICIAL_AUTHENTICATION = Accesso non ufficiale
+UNKNOWN = Errore sconosciuto
+
+
+enterGame = Entra nel gioco
+policyPrivacy = Leggi e approva [normativa sulla privacy] e [contratto utente]
+otherLogin = Altri metodi di accesso
+realAuth = Verifica identità
+quickLogin = Accessi rapido
+phoneQuickLogin=Accesso rapido con questo numero
+pleaseInputPwd = Inserire password
+pleaseInputAccount = Inserire account
+getVerifyCode = Codice di verifica
+pleaseInputVerifyCode = Inserire codice di verifica
+pleaseInputPhone = Inserire numero di telefono
+tip = Consiglio
+authorization = Autorizzazione
+cancel = Annulla
+sure = Conferma
+pleaseInputIdentifyId = Inserire numero documento d’identità
+pleaseInputName = Inserire nome
+realNameRules = In base alle nuove informazioni pubblicate in “Avviso sulla prevenzione della dipendenza da giochi on-line dei minori”, gli account con identità non identificata non possono accedere al gioco, registra la tua identità al più presto.
+mainEnter = Entrata account principale
+chileEnter = Emtrata account secondario
+checkedPrivace = Metti la spunta per approvare le normative necessarie per accedere al gioco
+checkPermissionTip = Dato che hai negato il permesso di %, per attivare questa funzione è necessario aprire “impostazioni”>“gestione permessi” e attivare il permesso
+realNameError = Formato nome e cognome inseriti errato
+idCardError = Il formato di documento d’identità che hai inserito non è corretto
+phoneError = Formato numero di telefono errato
+vcodeError = Formato codice di verifca errato
+pwdError = Formato password errato
+getVcodeFailed = Ottenimento codice di verifica fallito
+
+
+bindAccount = Associa account
+bindAccountTip = L’ospite non ha associato l’account canale attuale
+guestAccountTip = L’account attuale è un account ospite, associa al più presto un account di terze parti, così da evitare la perdita dell’account
+guestSwitchTip = Attualmente sei un account ospite. Cambiare account farà perdere i progressi di gioco dell'account ospite corrente.
+bindingAccountTip = Account attuale già associato all’account %s
+accountId = ID account
+accountCode = Codice account
+bindAccountIdPlaceholder = Inserire Id di recupero account
+bindAccountCodePlaceholder = Inserire codice di recupero account
+bindIdCodedescription = Quando si cambia dispositivo si possono inserire i seguenti id di recupero e codice di recupero nella pagina di cambio account, così si possono utilizzare i dati del personaggio dell’account originale e proseguire il gioco
+unbindIdCodedescription = Se l’account non ha account di terze parti associate, si possono inserire l’id di recupero e il codice di recupero per passare all’account
+switchAccountTip = L’account del canale dell’accesso attuale è già associato a un’altro account di gioco, effettuare il cambio?
+switchAccount = Cambio account
+switchAccountFailture = Cambio account fallito
+sameAccountTip = Accesso account attuale effettuato
+loginSuccessTip = Utente %s, accesso riuscito
+
+orderValidate = Verifica ordine in corso...
+startingPay = Inizia acquisto
+purchaseing = Acquisto in corso...
+
+[ja]
+NETWORK_ERROR = ネットワークエラー
+ERROR = core 内共通の非okコード
+DATA_ILLEGAL = 不適切なデータ
+SANDBOX_OR_RESOURCE_EMPTY = サンドボックスまたはリソースディレクトリが空です
+INIT_CFG_ERROR = 構成ファイルの初期化にエラーが発生しました
+INIT_ACCOUNT_ERROR = アカウントリストの初期化にエラーが発生しました
+INIT_PAYMENT_ERROR =支払いシステムの初期化にエラーが発生しました
+NOT_START_SYSTEM = システムが起動していません
+ALREADY_INIT_SYSTEM = システムは初期化されました
+PARSE_RESPONSE_ERROR = レスポンスの解析にエラーが発生しました
+PARSE_INIT_INFO_ERROR = 初期化データの解析にエラーが発生しました
+PARSE_LOGIN_INFO_ERROR = ログイン情報の解析にエラーが発生しました
+USERNAME_OR_PASSWORD_EMPTY = ユーザー名またはパスワードが空です
+ACCOUNT_ID_OR_CODE_EMPTY = アカウントIDまたアカウントコードが空です
+ACCOUNT_ALREADY_BIND_CHANNEL = アカウントは既にこのチャンネルと連携されています
+PHONE_OR_CODE_EMPTY = 携帯番号または認証コードが空です
+PHONE_NUMBER_EMPTY = 携帯番号が空です
+PHONE_FORMAT_ERROR = 携帯番号の形式が間違っています
+QUICK_AUTH_TOKEN_EMPTY = クイックログインの認証Tokenが空です
+NOT_SURE_ALL_INTERACTIVE = すべてのダイアログインタラクションは確認されていません
+NOT_EXIST_SERVICE_DIALOG = 業務ダイアログは存在しません
+ALREADY_LOGIN = ログイン済み
+LOGIN_FAILED = ログイン失敗
+REMOVE_ACCOUNT_ERROR = アカウントの削除に失敗しました
+PAYMENT_ERROR = 支払いエラー
+CREATE_LOCAL_ORDER_ERROR = ローカル注文の作成時にエラーが発生しました
+EXIST_LOCAL_ORDER = 未完了のローカル注文があります
+REMOVE_LOCAL_ORDER_ERROR = ローカル注文の削除時にエラーが発生しました
+NOT_IN_INIT = 現在は初期化状態ではありません
+NOT_IN_LOGIN = 現在はログイン状態ではありません
+INIT_SYSTEM_ERROR = システムの初期化にエラーが発生しました
+INIT_PREFERENCES_ERROR = ユーザーパーソナライズ設定の初期化にエラーが発生しました
+EXIST_VIEW_NOT_CLOSE = 閉じられていないビューがあります
+CURRENT_VIEW_NOT_OPENED = このビューは開いていません
+FETCH_DESC_FAILED = エラーの説明の取得に失敗しました
+NOT_EXIST_CHILD_ACCOUNT = このサブアカウントが存在しません
+NAME_OR_IDENTITY_EMPTY = 名前または身分証明書が空です
+ACCOUNT_INFO_NOT_EXIST = アカウント情報が存在しません
+ORDER_INFO_NOT_EXIST = 注文情報が存在しません
+CHANNEL_NOT_SUPPORT_LOGIN = チャンネルログインがサポートされていません
+NOT_SUPPORT_OPERATOR = この操作がサポートされていません
+PLEASE_RESTART_UPDATE = アップデートが完了しました。再起動してください
+LOCALIZATION_UPDATE_RESTART = 国際化ファイルが更新されました。再起動すると有効になります。
+CONFIGRATION_UPDATE_RESTART = 構成ファイルが更新されました。再起動すると有効になります。
+NOT_GENUINE_APP = 正規版のアプリではありません。正規版をダウンロードしてください
+CANCEL_REAL_NAME = 実名認証をキャンセルします
+UNOFFICIAL_AUTHENTICATION = 非公式認証ログイン
+UNKNOWN = 未知の異常
+
+
+enterGame = ゲームに入る
+policyPrivacy = [プライバシーポリシー]と[利用規約]を読んで同意します
+otherLogin = その他のログイン方法
+realAuth = 実名認証
+quickLogin = クイックログイン
+phoneQuickLogin=この携帯番号でクイックログイン
+pleaseInputPwd = パスワードを入力してください
+pleaseInputAccount = アカウントを入力してください
+getVerifyCode = 認証コード
+pleaseInputVerifyCode = 認証コードを入力してください
+pleaseInputPhone = 携帯番号を入力してください
+tip = チップス
+authorization = 認証
+cancel = キャンセル
+sure = 確認
+pleaseInputIdentifyId = 身分証明書番号を入力してください
+pleaseInputName = 名前を入力してください
+realNameRules = 国家新聞出版署の『未成年者のオンラインゲーム依存防止に関する通知』の要件に従って、実名認証されていないアカウントはゲームを体験することができません。速やかに実名登録を完了してください
+mainEnter = メインアカウントで入る
+chileEnter = サブアカウントで入る
+checkedPrivace = ゲームにログインする前に、関連するポリシー条項を確認し、同意してください。
+checkPermissionTip = %権限を拒否したため、この機能を有効にするには、「設定」 > 「権限管理」 を開いて許可する必要があります
+realNameError = 入力した名前の形式が正しくありません
+idCardError = 入力した身分証明書の形式が正しくありません
+phoneError = 携帯番号の形式が正しくありません
+vcodeError = 認証コードの形式が正しくありません
+pwdError = パスワードの形式が正しくありません
+getVcodeFailed = 認証コードの取得に失敗しました
+
+
+bindAccount = アカウント連携
+bindAccountTip = このチャンネルアカウントはゲストと連携されていません
+guestAccountTip = 現在のアカウントはゲストアカウントです。アカウントを失わないよう、できるだけ早く第三者アカウントに連携してください
+guestSwitchTip = あなたは現在ゲスト アカウントです。アカウントを切り替えると、現在のゲスト アカウントのゲームの進行状況が失われます
+bindingAccountTip = 現在のアカウントは%sアカウントに連携されています
+accountId = アカウントID
+accountCode = アカウントコード
+bindAccountIdPlaceholder = アカウント回復IDを入力してください
+bindAccountCodePlaceholder = アカウント回復コードを入力してください
+bindIdCodedescription = デバイスを変更した場合、アカウント切り替え画面で現在の回復IDと回復コードを入力すると、元のアカウントのキャラクターデータでゲームを継続することができます。
+unbindIdCodedescription = アカウントが第三者アカウントに連携されていない場合は、アカウント回復IDと回復コードを入力することでアカウントを切り替えることができます。
+switchAccountTip = 現在ログインしているチャンネルアカウントは別のゲストアカウントに連携されています。切り替えますか?
+switchAccount = アカウント切り替え
+switchAccountFailture = アカウントの切り替えに失敗しました
+sameAccountTip = このアカウントはログインしています
+loginSuccessTip = ユーザー%s、ログインに成功しました
+
+orderValidate = 注文確認中...
+startingPay = 購入を開始します
+purchaseing = 購入中...
+
+[pt]
+NETWORK_ERROR = Erro de rede
+ERROR = Código de erro geral das funções principais
+DATA_ILLEGAL = Dados inválidos
+SANDBOX_OR_RESOURCE_EMPTY = Não há recursos na pasta de recursos
+INIT_CFG_ERROR = Ocorreu um erro ao inicializar o arquivo de configuração
+INIT_ACCOUNT_ERROR = Ocorreu um erro ao inicializar a lista de contas
+INIT_PAYMENT_ERROR = Ocorreu um erro ao inicializar o sistema de pagamento
+NOT_START_SYSTEM = O sistema não foi inicializado
+ALREADY_INIT_SYSTEM = O sistema foi inicializado
+PARSE_RESPONSE_ERROR = Ocorre um erro ao analisar a resposta
+PARSE_INIT_INFO_ERROR = Ocorre um erro ao analisar dados inicializados
+PARSE_LOGIN_INFO_ERROR = Falha ao analisar as informações de login
+USERNAME_OR_PASSWORD_EMPTY = Nome do usuário e senha devem ser preenchidos
+ACCOUNT_ID_OR_CODE_EMPTY = ID da conta e código da conta devem ser preenchidos
+ACCOUNT_ALREADY_BIND_CHANNEL = A conta já está vinculada ao canal atual
+PHONE_OR_CODE_EMPTY = Número do celular e código de verificação devem ser preenchidos
+PHONE_NUMBER_EMPTY = Número do celular deve ser preenchido
+PHONE_FORMAT_ERROR = Formato do número de celular incorreto
+QUICK_AUTH_TOKEN_EMPTY = A identidade do jogador não pode ser autorizado com bug de Token
+NOT_SURE_ALL_INTERACTIVE = Todos os diálogos ainda não foram confirmados
+NOT_EXIST_SERVICE_DIALOG = Não há diálogos de negócios
+ALREADY_LOGIN = Já está logado
+LOGIN_FAILED = Falha no login
+REMOVE_ACCOUNT_ERROR = Falha ao excluir a conta
+PAYMENT_ERROR = Erro de pagamento
+CREATE_LOCAL_ORDER_ERROR = Criação do pedido local falhou
+EXIST_LOCAL_ORDER = Há um pedido local pendente
+REMOVE_LOCAL_ORDER_ERROR = Falha ao remover o pedido local
+NOT_IN_INIT = O sistema ainda não foi inicializado
+NOT_IN_LOGIN = Você ainda não fez login
+INIT_SYSTEM_ERROR = Ocorreu um erro ao inicializar o sistema
+INIT_PREFERENCES_ERROR = Ocorreu um erro ao inicializar a configuração de preferências do usuário
+EXIST_VIEW_NOT_CLOSE = Tem View pendente
+CURRENT_VIEW_NOT_OPENED = View Atual ainda não foi aberto
+FETCH_DESC_FAILED = Falha ao obter as informações do erro
+NOT_EXIST_CHILD_ACCOUNT = A conta secundária não existe
+NAME_OR_IDENTITY_EMPTY = O nome e o número do RG devem ser preenchidos
+ACCOUNT_INFO_NOT_EXIST = As informações da conta não foram encontradas
+ORDER_INFO_NOT_EXIST = As informações do pedido não foram encontradas
+CHANNEL_NOT_SUPPORT_LOGIN = Este canal não suporta login
+NOT_SUPPORT_OPERATOR = A operação atual não é suportada
+PLEASE_RESTART_UPDATE = A atualização foi concluída. Reinicie o aplicativo
+LOCALIZATION_UPDATE_RESTART = Atualização do arquivo de internacionalização concluída. Reinicie o aplicativo para ver as alterações
+CONFIGRATION_UPDATE_RESTART = Atualização do arquivo de configuração concluída. Reinicie o aplicativo para ver as alterações
+NOT_GENUINE_APP = Aplicativo duvidoso, baixe aplicativo de confiança
+CANCEL_REAL_NAME = Cancelar a verificação do nome real
+UNOFFICIAL_AUTHENTICATION = Método de login inválido
+UNKNOWN = Erro desconhecido
+
+
+enterGame = Entrar
+policyPrivacy = Li e aceito a [Política de Privacidade] e o [Contrato do Usuário]
+otherLogin = Outros métodos de login
+realAuth = Verificação do nome real
+quickLogin = Login rápido
+phoneQuickLogin=Login rápido com número do celular local
+pleaseInputPwd = Insira a senha
+pleaseInputAccount = Insira a conta
+getVerifyCode = Código de verificação
+pleaseInputVerifyCode = Insira o código de verificação
+pleaseInputPhone = Insira o número do celular
+tip = Dica
+authorization = Autorização
+cancel = Cancelar
+sure = Confirmar
+pleaseInputIdentifyId = Insira seu número do RG
+pleaseInputName = Insira seu nome
+realNameRules = Conforme os requisitos do “Aviso para Impedir que Menores de Idade Joguem Online” publicado pela Administração Nacional de Imprensa e Publicação, os usuários não verificados não podem experimentar esse jogo. Por favor, conclua o registro do nome real o mais rápido possível
+mainEnter = Entrar com conta principal
+chileEnter = Entrar com conta secundária
+checkedPrivace = Marque e aceite os termos da política antes de entrar no jogo
+checkPermissionTip = Como você não autorizou a permissão de %, para ativar essa função, é necessário abrir “Configurações” > “Gerenciamento de permissões” e autorizar
+realNameError = Você inseriu o nome em um formato incorreto
+idCardError = Você inseriu o número do RG em um formato incorreto
+phoneError = Formato do número de celular incorreto
+vcodeError = Formato do código de verificação incorreto
+pwdError = Formato da senha incorreto
+getVcodeFailed = Falha ao obter o código de verificação
+
+
+bindAccount = Vincular conta
+bindAccountTip = A conta atual deste canal ainda não vincula um convidado
+guestAccountTip = A conta atual é uma conta de convidado. Vincule a conta de terceiros o mais rápido possível para evitar a perda da conta
+guestSwitchTip = Você é atualmente uma conta de convidado. Ao trocar de conta, você perderá o progresso do jogo da conta de convidado atual
+bindingAccountTip = A conta atual já está vinculada à conta %s
+accountId = ID da conta
+accountCode = Código da conta
+bindAccountIdPlaceholder = Insira o ID de recuperação da conta
+bindAccountCodePlaceholder = Insira o código de recuperação da conta
+bindIdCodedescription = Se você trocar de dispositivo, não se preocupe! Basta inserir o ID de recuperação e o código de recuperação atuais na página de troca de conta. Assim, você poderá continuar jogando com os dados de personagem da conta original
+unbindIdCodedescription = Se você não estiver vinculado a nenhuma conta de terceiros, você poderá inserir o ID de recuperação da conta e o código de recuperação para trocar de conta
+switchAccountTip = A conta deste canal que está usando agora já está vinculada a outra conta de convidado. Deseja trocar de conta?
+switchAccount = Trocar de conta
+switchAccountFailture = Falha ao trocar de conta
+sameAccountTip = A conta atual está logada
+loginSuccessTip = Usuário %s fez login com sucesso
+
+orderValidate = Verificando pedido...
+startingPay = Começar a comprar
+purchaseing = Comprando...
+
+[system]
+TIMESTAMPT = 1701326040
+background_color_view = DFE0E5
+button_background_default_color = 008CD6
+button_background_unable_color = CFCFD1
+button_background_pressed_color = 009FEC
+button_background_color = 008CD6
+button_border_color = D80020
+label_font_color = D80020
diff --git a/game_demo/src/main/assets/develop.config b/game_demo/src/main/assets/develop.config
new file mode 100644
index 0000000000000000000000000000000000000000..3130c514dad80c7e4070c44e963ded290c88e935
--- /dev/null
+++ b/game_demo/src/main/assets/develop.config
@@ -0,0 +1 @@
+Nylq2KwJc9zyQHHorv7V1k9OQlVmZRldJ7pYyX3SBh0n80IkSOshbI1GpwwpPnfN1pIzICsQe8SNodtNxtOFo+5+2GwSop3KQ9L8huM6Q+uLvbmV77hS+lHX9l3c4qqsgUqC/V8hTAWVFMNCCwjYZX5FZsPrsjsaimPJita5FoC5Xakapt5bP9fEf/t5eetVFxQRTCaU1kJvbaZc0lyP9IDEabEAgbecqx6ldQQxfucII8s2L/61ZosgzoGRuCizpNTyRotsLyeRJCDZup1MK8k2NqwngizHcndiAPi71cUSdoZN8HSCkruPvlIpVPE9hNE/1dx65rQSCuabsvKeHA==
\ No newline at end of file
diff --git a/game_demo/src/main/java/com/hoolai/access/demo/GameActivity.java b/game_demo/src/main/java/com/hoolai/access/demo/GameActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..b02661591523f07ded0817ea224691095d15b98b
--- /dev/null
+++ b/game_demo/src/main/java/com/hoolai/access/demo/GameActivity.java
@@ -0,0 +1,609 @@
+package com.hoolai.access.demo;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.Handler;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.ScrollView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.hoolai.access.open.fastaccess.channel.FastSdk;
+import com.hoolai.access.open.fastaccess.channel.request.EventType;
+import com.hoolai.access.open.fastaccess.channel.request.GoodsInfo;
+import com.hoolai.access.open.fastaccess.channel.request.PayParams;
+import com.hoolai.access.open.fastaccess.channel.request.PlayerInfo;
+import com.hoolai.access.open.fastaccess.channel.request.ShareParams;
+import com.hoolai.access.open.fastaccess.channel.request.ShareType;
+import com.hoolai.access.open.fastaccess.channel.result.InitResult;
+import com.hoolai.access.open.fastaccess.channel.result.LoginResult;
+import com.hoolai.access.open.fastaccess.interf.HLAccountListener;
+import com.hoolai.access.open.fastaccess.interf.HLPaymentListener;
+import com.hoolai.access.open.fastaccess.interf.HLSystemListener;
+import com.hoolai.access.open.fastaccess.utils.Logger;
+import com.hoolai.access.open.fastaccess.utils.SPUtils;
+import com.hoolai.access.open.fastaccess.utils.ToastUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Hoolai_sdk接入说明
+ * 接入文档地址 http://support.hoolai.com/docs/#/android/complete
+ */
+public class GameActivity extends Activity {
+
+ private TextView contentTv;
+ private LoginResult userResponse;
+ private Button initBtn, loginBtn, logoutBtn;
+ private EditText et_tv, et_rpc, et_pwd, et_itemId;
+ private EditText et_ip_host, et_ip_pwd, et_ip_port;
+ private boolean isInit;
+ private int height;
+ private int width;
+ private boolean isEnterGame;
+ private StringBuffer sb = new StringBuffer();
+ private ScrollView scrollView;
+ private LinearLayout linearLayout;
+ private static final String ITME_ID = "itemId";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+// AccessConfigMgr.cfgInstance().StartSocket("10.1.3.29", 3333, "aaa");
+// Logger.i("--------------------------------------------StartSocket");
+ View decorView = getWindow().getDecorView();
+ int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
+ decorView.setSystemUiVisibility(uiOptions);
+ setContentView(R.layout.activity_main);
+
+ contentTv = findViewById(R.id.main_tv);
+ et_tv = findViewById(R.id.et_main);
+ et_rpc = findViewById(R.id.et_rpc);
+ et_pwd = findViewById(R.id.et_pwd);
+ et_itemId = findViewById(R.id.et_itemId);
+ et_ip_host = findViewById(R.id.et_ip_host);
+ et_ip_port = findViewById(R.id.et_ip_port);
+ et_ip_pwd = findViewById(R.id.et_ip_pwd);
+ scrollView = findViewById(R.id.main_scrollview);
+ linearLayout = findViewById(R.id.main_linearlayout);
+ initBtn = findViewById(R.id.init);
+ loginBtn = findViewById(R.id.login);
+ logoutBtn = findViewById(R.id.logout);
+ DisplayMetrics displayMetrics = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);
+ this.width = displayMetrics.widthPixels;
+ this.height = displayMetrics.heightPixels;
+
+ hoolaiSdkInit();
+
+ et_itemId.setText("1");
+ String itemId = SPUtils.getInstance().getStringValue(ITME_ID);
+ if (!TextUtils.isEmpty(itemId)) {
+ et_itemId.setText(itemId);
+ }
+
+// FastSdk.checkPermission(this, "android.permission.READ_EXTERNAL_STORAGE", true);
+// FastSdk.checkPermission(this, "android.permission.READ_EXTERNAL_STORAGE", true);
+// FastSdk.checkPermissions(this, new String[] {"android.permission.READ_EXTERNAL_STORAGE", "android.permission.READ_PHONE_STATE"
+// , "android.permission.CAMERA", "android.permission.ACCESS_FINE_LOCATION"}, true);
+ }
+
+ @Override
+ public Resources.Theme getTheme() {
+ Resources.Theme theme = super.getTheme();
+ theme.applyStyle(android.R.style.Theme_NoTitleBar_Fullscreen, true);
+ return theme;
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ FastSdk.onSaveInstanceState(outState);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ FastSdk.onStart(this);
+ }
+
+ @Override
+ protected void onResume() {
+ Logger.i("游戏页面onResume");
+ super.onResume();
+ FastSdk.onResume(this);
+
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ FastSdk.onStop(this);
+
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ FastSdk.onPause(this);
+ }
+
+ @Override
+ protected void onRestart() {
+ super.onRestart();
+ Logger.i("游戏页面onRestart");
+ FastSdk.onRestart(this);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ FastSdk.onDestroy(this);
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ FastSdk.onNewIntent(intent);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ FastSdk.onActivityResult(this, requestCode, resultCode, data);
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ FastSdk.onRequestPermissionsResult(requestCode, permissions, grantResults);
+
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ FastSdk.onConfigurationChanged(this, newConfig, getResources());
+ ViewGroup.LayoutParams layoutParams = getWindow().getDecorView().getLayoutParams();
+ if (layoutParams.width >= layoutParams.height) {
+ layoutParams.width = width;
+ layoutParams.height = height;
+ } else {
+ layoutParams.width = height;
+ layoutParams.height = width;
+ }
+ getWindow().onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ public void onBackPressed() {
+// super.onBackPressed();
+ //如果游戏需要捕获返回事件,请在这里做逻辑判断调用FastSdk.onBackPressed();
+ FastSdk.onBackPressed();
+ exit();
+ }
+
+ /**
+ * hoolai sdk初始化,必须放到onCreate中,并且在主线程中调用
+ */
+ private void hoolaiSdkInit() {
+ FastSdk.hlSystemListener = new HLSystemListener() {
+ @Override
+ public void onInitSuccess(InitResult result) {
+ initBtn.setVisibility(View.GONE);
+ loginBtn.setVisibility(View.VISIBLE);
+ isInit = true;
+ if (!contentTv.getText().toString().contains("登录成功")) {
+ sb.append("初始化成功!初始化结果:\n" + result.toString());
+ refreshView();
+ }
+ LogUtil.i("Hoolai sdk初始化成功:");
+ Toast.makeText(GameActivity.this, "初始化成功!", Toast.LENGTH_SHORT).show();
+ // FastSdk.checkPermission(GameActivity.this, "android.permission.BLUETOOTH_SCAN");
+ }
+
+ @Override
+ public void onInitFailed(String reason) {
+ LogUtil.i("Hoolai sdk初始化失败:" + reason);
+ Toast.makeText(GameActivity.this, "初始化失败:" + reason, Toast.LENGTH_SHORT).show();
+ //sdk初始化失败
+ //注意初始化未成功不得调用sdk任何接口,游戏可在这里做提示或者重新初始化操作
+
+ }
+
+ @Override
+ public void onCustomExit() {
+ Toast.makeText(GameActivity.this, "弹出游戏的退出界面", Toast.LENGTH_SHORT).show();
+ /**
+ * demo 只作为参考,游戏应该根据自己所需逻辑实现
+ * 渠道没有退出二次确认框
+ * 根据需要加二次确认框
+ */
+ // 渠道不存在退出界面,如百度移动游戏等,此时需在此处弹出游戏退出确认界面,否则会出现渠道审核不通过情况
+ // 游戏实现自己的退出界面 ,实现退出逻辑,请勿直接照搬demo
+ // 根据需要加二次确认框
+ new AlertDialog.Builder(GameActivity.this)
+ .setTitle("游戏退出弹窗")
+ .setMessage("我是游戏的弹窗界面哦")
+ .setNegativeButton("取消", null)
+ .setPositiveButton("确定", (dialog, which) -> onExitSuccess(""))
+ .setCancelable(false).show();
+ }
+
+ @Override
+ public void onExitSuccess(String result) {
+ //当前渠道如果有退出界面,触发该回调
+ //处理退出逻辑,
+ moveTaskToBack(true);
+ finish();
+ //建议游戏按照下面代码逻辑,退出程序兼容性最好,否则可能会造成oppop、vivo等渠道退出不彻底,导致再次点击启动应用黑屏。
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_HOME);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+ android.os.Process.killProcess(android.os.Process.myPid());
+ }
+
+ @Override
+ public void onUpdate(String data) {
+
+ }
+ };
+ FastSdk.hlAccountListener = new HLAccountListener() {
+ @Override
+ public void onRefreshUser(LoginResult result) {
+ LogUtil.i("Hoolai refreshUser:" + result.toString());
+ Toast.makeText(GameActivity.this, "小号切换成功" + result.getNickName(), Toast.LENGTH_SHORT).show();
+
+ }
+
+ @Override
+ public void onLoginSuccess(LoginResult result) {
+ loginBtn.setVisibility(View.GONE);
+ logoutBtn.setVisibility(View.VISIBLE);
+ GameActivity.this.userResponse = result;
+ sb.append("登录成功:" + result.toString());
+ refreshView();
+ }
+
+ @Override
+ public void onLoginFailed(String reason) {
+ LogUtil.i("登录失败:" + reason);
+ runOnUiThread(() -> {
+ sb.append(reason);
+ refreshView();
+ });
+ }
+
+ @Override
+ public void onLogout(Object... var1) {
+ sb.append("已登出");
+ logoutBtn.setVisibility(View.GONE);
+ loginBtn.setVisibility(View.VISIBLE);
+ refreshView();
+ }
+ };
+ FastSdk.hlPaymentListener = new HLPaymentListener() {
+ @Override
+ public void onPaySuccess(String result) {
+ sb.append("支付成功:" + result);
+ refreshView();
+ }
+
+ @Override
+ public void onPayFailed(String reason) {
+ LogUtil.i("支付失败:" + reason);
+ sb.append("支付失败:" + reason);
+ refreshView();
+ }
+
+ @Override
+ public void onQuerySuccess(final List list) {
+ LogUtil.i("商品信息获取成功:" + list.toString());
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (list.size() == 0) {
+ Toast.makeText(GameActivity.this, "商品信息获取为空", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ //游戏获取到商品信息之后可以展示到游戏商品界面
+ //游戏需要有一套默认的商品信息配置,如果通过此接口获取不到商品信息时使用默认的商品配置
+
+ //---------------以下是demo代码-----------------------------------------------
+ Context context;
+ AlertDialog.Builder builder = new AlertDialog.Builder(GameActivity.this);
+ ListView listView = new ListView(GameActivity.this);
+ listView.setAdapter(new ArrayAdapter(GameActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, list));
+ listView.setOnItemClickListener((parent, view1, position, id) -> {
+ GoodsInfo payInfo = list.get(position);
+ // 游戏支付时需要传的参数 示例
+ PayParams payParams = new PayParams();
+ payParams.setItemId(payInfo.getItemId());
+ payParams.setItemName(payInfo.getItemName());
+ payParams.setAmount(Integer.parseInt(payInfo.getItemPrice()));
+ payParams.setCount(Integer.valueOf(payInfo.getItemCount()));
+ //扩展信息,回调时原样返回,因为各渠道回调参数限制不一致。回调参数暂时只支持长度50。callBackInfo中不要使用这些符号:“|”、“=”、“+”、“/”。
+ payParams.setCallbackInfo("支付扩展信息,游戏透传参数" + UUID.randomUUID().toString().replace("-", ""));
+// payParams.addExtendParam("isSupportThirdPayment", "true");//是否支持google之外的三方支付
+// payParams.addExtendParam("payType", "1");// 1 钱包(默认此类型) 2 点卡,短代类支付,需要通过FastSdk.supportShortterm查询
+// payParams.addExtendParam("currency", payInfo.getShowTag());//币种
+ FastSdk.pay(GameActivity.this, payParams);
+ });
+ builder.setView(listView);
+ builder.show();
+ }
+ });
+ }
+ };
+ FastSdk.onCreate(GameActivity.this);
+ }
+
+ //=========================以下是模拟游戏调用,都是必接接口========================================
+
+ /**
+ * 登录调用,必接
+ *
+ * @param view
+ */
+ public void onClickLogin(View view) {
+// SystemClock.sleep(50000);
+ if (isInit) {
+ FastSdk.login();
+ } else {
+ ToastUtils.toast("请初始化完成后操作");
+ }
+ }
+
+ /**
+ * 登出,必接
+ */
+ public void onClickInit(View view) {
+ hoolaiSdkInit();
+ }
+
+ public void onClickLogout(View view) {
+ if (isInit) {
+ FastSdk.logout();
+ if (userResponse != null) {
+ } else {
+ Toast.makeText(GameActivity.this, "请先登录", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+
+ /**
+ * 海外版sdk需要通过此接口获取商品信息进行UI展示,商品信息会根据区域自动转化币种
+ * 上国内渠道此接口可不接入,海外版必接
+ */
+ public void getPriceInfo(View view) {
+ if (userResponse == null) {
+ Toast.makeText(this, "请先登录!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (TextUtils.isEmpty(userResponse.getUid() + "")) {
+ Toast.makeText(this, "请先登录!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ FastSdk.queryGoodsInfo();
+// FastSdk.checkPermissions(GameActivity.this, new String[]{"android.permission.BLUETOOTH_SCAN"});
+
+ }
+
+ /**
+ * 支付调用,必接
+ */
+ public void doPay(View view) {
+ pay(1);
+ }
+
+
+ public void customPay(View view) {
+ String amount = String.valueOf(et_tv.getText());
+ if (TextUtils.isEmpty(amount)) {
+ Toast.makeText(GameActivity.this, "输入金额不能为空", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ pay(Integer.valueOf(amount));
+ }
+
+ private void pay(int amount) {
+ if (userResponse == null) {
+ Toast.makeText(this, "请先登录!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if (!isEnterGame) {
+ Toast.makeText(this, "请先进服!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ PayParams payParams = new PayParams();
+ payParams.setItemId(et_itemId.getText().toString());//商品,要保证游戏内各个商品唯一(可以不传)
+ //ItemName要求:这些特殊符号都不要有: + % # “ & / ? $ ^ *:) \ < > , |。否则会造成某些渠道支付报错如:华为渠道
+ payParams.setItemName("钻石");//购买物品名称
+ payParams.setAmount(amount);//金额(分)
+ payParams.setCount(1);//购买商品数量,例如50元宝,传值50
+ payParams.setCallbackInfo("callbackInfo");//扩展信息,回调时原样返回,因为各渠道回调参数限制不一致。回调参数暂时只支持长度50。callBackInfo中不要使用这些符号:“|”、“=”、“+”、“/”。
+ payParams.setCurrency("CNY");//国内可不传或CNY
+ payParams.setNotifyUrl("https://sdkhub-test.webapp.163.com/api/v1/test/notify/aebfw63ihmaaaaab");
+// payParams.setNotifyUrl("");
+// Map map = new HashMap<>();
+// map.put("key", "");
+// payParams.setOpt(map);
+ FastSdk.pay(GameActivity.this, payParams);
+ SPUtils.getInstance().setStringValue(ITME_ID, et_itemId.getText().toString());
+ //支付服务端回调地址,请在产品信息里配置。
+ }
+
+ /**
+ * 退出接口调用,必接
+ */
+ public void onExit(View view) {
+// AudioTrackUtils.getInstance().stopPlay();
+ exit();
+ }
+
+ public void exit() {
+ FastSdk.exit();
+ }
+
+ /**
+ * 账号管理,aab接入会展示账号管理界面
+ *
+ * @param view
+ */
+ public void onClickAccountmanage(View view) { // 管理账号接口
+ FastSdk.openAccountCenter(this);
+ }
+
+
+ /**
+ * 数据上报,必接
+ *
+ * @param view
+ */
+ public void createRole(View view) {
+ if (userResponse == null) {
+ Toast.makeText(this, "请先登录!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ Logger.i("上报创角");
+ sendPlayRoleInfo(EventType.CreateRole);
+ sendPlayRoleInfo(EventType.CustomerAction);
+ }
+
+ public void enterSever(View view) {
+ if (userResponse == null) {
+ Toast.makeText(this, "请先登录!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ Logger.i("上报进服");
+ isEnterGame = true;
+ sendPlayRoleInfo(EventType.EnterServer);
+ }
+
+ public void levelUp(View view) {
+ if (userResponse == null) {
+ Toast.makeText(this, "请先登录!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ Logger.i("上报升级");
+ sendPlayRoleInfo(EventType.LevelUp);
+ }
+
+ public void share(View view) {
+ startActivity(new Intent(this, ShareActivity.class));
+ }
+
+ private void sendPlayRoleInfo(EventType eventType) {
+ PlayerInfo playerInfo = new PlayerInfo();
+ playerInfo.setRoleId("1235761");//角色唯一标识id
+ playerInfo.setRoleName("昵称2");
+ playerInfo.setRoleLevel("11");
+ playerInfo.setZoneId("100");
+ playerInfo.setZoneName("华东大区");
+ playerInfo.setServerId("100");
+ playerInfo.setServerName("大唐战机");
+ playerInfo.setBalance("66");
+ playerInfo.setVip("1");
+ playerInfo.setPartyName("帮派名称");
+ playerInfo.setClassField("aaaa");
+ playerInfo.setExtendAction("aaaatest");
+ playerInfo.setExtra("a:arm,b:bom");//扩展信息,格式:key:value,key:value
+ playerInfo.setPhylum("1");
+ //对于sdk海外版自定义事件报送,需要在传ACTION的时候做如下处理,中文版可以忽略
+ //userExtData.put(UserExtDataKeys.ACTION, "oversea_custom");
+ //userExtData.put(UserExtDataKeys.CUSTOM_KEY,"海外版自定义事件名称");
+ sb.append(eventType.getDesc() + ":\n" + playerInfo);
+ refreshView();
+ FastSdk.report(eventType, playerInfo);
+ }
+
+
+ public void setProxy(View v) {
+
+// settingProxy();
+ }
+
+ private void settingProxy() {
+ String pwd = et_ip_pwd.getText().toString();
+ String host = et_ip_host.getText().toString();
+ String port = et_ip_port.getText().toString();
+ if (!TextUtils.isEmpty(host) && !TextUtils.isEmpty(pwd) && !TextUtils.isEmpty(port)) {
+// FastSdk.setProxy(1, pwd, host, port);
+ ToastUtils.toast("设置代理:" + host + ",pwd:" + pwd + ",prot:" + port);
+ hoolaiSdkInit();
+ } else {
+ hoolaiSdkInit();
+ }
+ }
+
+ public void setRpc(View v) {
+ String pwd = et_pwd.getText().toString();
+ String host = et_rpc.getText().toString();
+ if (TextUtils.isEmpty(host) || TextUtils.isEmpty(pwd)) {
+ ToastUtils.toast("ip或密码不可为空");
+ return;
+ }
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ private void refreshView() {
+ sb.append("\n");
+ contentTv.setText(sb);
+ Handler mHandler = new Handler();
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (scrollView == null || linearLayout == null) {
+ return;
+ }
+ //end要显示的位置,可以根据自己的需要来计算
+ int end = (linearLayout.getMeasuredHeight() - scrollView.getHeight());
+ if (end < 0) {
+ end = 0;
+ }
+ scrollView.scrollTo(0, end);
+ }
+ }, 500);//延迟500ms启动
+ }
+
+ public void openService(View view) {
+ FastSdk.openService(this);
+ }
+
+ public void gameInfoData(View view) {
+ String action = "game_xxx";
+ Map hashMap = new HashMap<>();
+ hashMap.put("xxx", 123);
+ hashMap.put("ooo", "321");
+ FastSdk.gameDataReport(action, hashMap);
+ }
+}
\ No newline at end of file
diff --git a/game_demo/src/main/java/com/hoolai/access/demo/GameApplication.java b/game_demo/src/main/java/com/hoolai/access/demo/GameApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c31b4b6e422e35507a402886753682e8b7198d4
--- /dev/null
+++ b/game_demo/src/main/java/com/hoolai/access/demo/GameApplication.java
@@ -0,0 +1,36 @@
+package com.hoolai.access.demo;
+
+import android.app.Application;
+import android.content.Context;
+import android.content.res.Configuration;
+import com.hoolai.access.open.fastaccess.channel.FastSdk;
+
+public class GameApplication extends Application {
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ //如使用了Multidex 需要指定 hoolaisdk相关代码到主dex中
+ //-keep com.hoolai.**
+ FastSdk.onApplicationCreate(this);
+ }
+
+ @Override
+ public void onTerminate() {
+ super.onTerminate();
+ FastSdk.onTerminate(this);
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ FastSdk.onConfigurationChanged(this, newConfig);
+
+ }
+
+ @Override
+ protected void attachBaseContext(Context context) {
+ super.attachBaseContext(context);
+ FastSdk.attachBaseContext(this, context);
+ }
+}
diff --git a/game_demo/src/main/java/com/hoolai/access/demo/JavaTest.java b/game_demo/src/main/java/com/hoolai/access/demo/JavaTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..da4dcec1bc792c43c674290cf768aa72fed9b609
--- /dev/null
+++ b/game_demo/src/main/java/com/hoolai/access/demo/JavaTest.java
@@ -0,0 +1,38 @@
+package com.hoolai.access.demo;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class JavaTest {
+
+ public static void main(String[] args) {
+ String message = "欢迎使用《重构官网》,在您使用前,请认真阅读《用户服务协议》和《隐私政策》《隐私政策2》《隐私政策3》,以了解我们的服";
+ message = message.replace(message.substring(0, message.indexOf(",") + 1), "");
+
+ Pattern pattern = Pattern.compile("《(.*?)》");
+ Matcher matcher = pattern.matcher(message);
+ try{
+ String[] strs = {"11", "22", "33"};
+ int i = 0;
+ while(matcher.find()){
+ System.out.println(matcher.group());
+ System.out.println(strs[i]);
+ System.out.println("==========");
+ i++;
+ }
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+
+// String[] temp = message.split("《");
+// for(int i = 0; i < temp.length; i++){
+// if (i > 0 && i < temp.length){
+// String str = temp[i].split("》")[0];
+// System.out.println(str);
+// System.out.println(message.substring(message.indexOf(str) - 1, message.indexOf(str) + str.length() + 1));
+// System.out.println("==========");
+// }
+// }
+// System.out.println(b.length);
+ }
+}
diff --git a/game_demo/src/main/java/com/hoolai/access/demo/LogUtil.java b/game_demo/src/main/java/com/hoolai/access/demo/LogUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..bea69fd4efac0db78e33a467aef021daa3268535
--- /dev/null
+++ b/game_demo/src/main/java/com/hoolai/access/demo/LogUtil.java
@@ -0,0 +1,13 @@
+package com.hoolai.access.demo;
+
+import android.util.Log;
+
+public class LogUtil {
+
+ private static final String TAG = "HL_DEMO";
+
+ public static void i(String str){
+ Log.i(TAG, str);
+ }
+
+}
diff --git a/game_demo/src/main/java/com/hoolai/access/demo/ProductUtils.java b/game_demo/src/main/java/com/hoolai/access/demo/ProductUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd0ce0a8360e9d38da1eae143fa849e5dc93aa75
--- /dev/null
+++ b/game_demo/src/main/java/com/hoolai/access/demo/ProductUtils.java
@@ -0,0 +1,49 @@
+package com.hoolai.access.demo;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import com.hoolai.access.open.fastaccess.channel.FastSdk;
+import com.hoolai.access.open.fastaccess.channel.request.GoodsInfo;
+import com.hoolai.access.open.fastaccess.channel.request.PayParams;
+import com.hoolai.access.open.fastaccess.utils.ToastUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class ProductUtils {
+ public static void showProducts(Activity activity, List list){
+ if (list.size() == 0) {
+ ToastUtils.toast("商品信息获取为空");
+ return;
+ }
+ AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ ListView listView = new ListView(activity);
+ listView.setAdapter(new ArrayAdapter(activity, android.R.layout.simple_list_item_1, android.R.id.text1, list));
+ listView.setOnItemClickListener((parent, view1, position, id) -> {
+ GoodsInfo payInfo = list.get(position);
+ // 游戏支付时需要传的参数 示例
+ PayParams payParams = new PayParams();
+ payParams.setItemId(payInfo.getItemId());
+ payParams.setItemName(payInfo.getItemName());
+ payParams.setAmount(Integer.parseInt(payInfo.getItemPrice()));
+ payParams.setCount(Integer.valueOf(payInfo.getItemCount()));
+ //扩展信息,回调时原样返回,因为各渠道回调参数限制不一致。回调参数暂时只支持长度50。callBackInfo中不要使用这些符号:“|”、“=”、“+”、“/”。
+ payParams.setCallbackInfo("支付扩展信息,游戏透传参数"+ UUID.randomUUID().toString().replace("-",""));
+ Map map = new HashMap<>();
+ map.put("isSupportThirdPayment", "true");//是否支持google之外的三方支付
+ map.put("payType", "1");// 1 钱包(默认此类型) 2 点卡,短代类支付,需要通过FastSdk.supportShortterm查询
+ map.put("currency", payInfo.getShowTag());//币种
+ payParams.setOpt(map);
+ FastSdk.pay(activity, payParams);
+ });
+ builder.setView(listView);
+ builder.show();
+ }
+}
diff --git a/game_demo/src/main/java/com/hoolai/access/demo/ShareActivity.java b/game_demo/src/main/java/com/hoolai/access/demo/ShareActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..c8c23b59ea42265e765a7e8059371d00a40d2219
--- /dev/null
+++ b/game_demo/src/main/java/com/hoolai/access/demo/ShareActivity.java
@@ -0,0 +1,120 @@
+package com.hoolai.access.demo;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.MediaStore;
+import android.view.View;
+import android.widget.Toast;
+import com.hoolai.access.open.fastaccess.channel.FastSdk;
+import com.hoolai.access.open.fastaccess.channel.request.ShareParams;
+import com.hoolai.access.open.fastaccess.channel.request.ShareType;
+import com.hoolai.access.open.fastaccess.interf.HLShareListener;
+import com.hoolai.access.open.fastaccess.utils.Logger;
+import com.hoolai.access.open.fastaccess.utils.ToastUtils;
+
+/**
+ * @author gaor
+ * @date 2023/12/14 20:22
+ * @description 分享
+ */
+public class ShareActivity extends Activity {
+
+ private static int REQUEST_PHOTO_PICKER_SINGLE_SELECT = 1008611;
+ private static int REQUEST_VIDEO_PICKER_SINGLE_SELECT = 1008612;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_share);
+
+ FastSdk.hlShareListener = new HLShareListener() {
+
+ @Override
+ public void onShareSuccess() {
+ ToastUtils.showToast("分享成功", Toast.LENGTH_SHORT);
+ }
+
+ @Override
+ public void onShareFailed(String s) {
+ ToastUtils.showToast("分享失败:" + s, Toast.LENGTH_SHORT);
+ }
+ };
+ }
+
+ public void shareText(View view) {
+ ShareParams shareParams = new ShareParams();
+ shareParams.setTitle("测试链接");
+ shareParams.setContent("https://www.baidu.com");
+ FastSdk.share(ShareType.SYSTEM, ShareType.ChildType.SYSTEM_TEXT, shareParams);
+ }
+
+ public void shareVideo(View view) {
+ Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
+ startActivityForResult(intent, REQUEST_VIDEO_PICKER_SINGLE_SELECT);
+ }
+
+ public void sharePhoto(View view) {
+ Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
+ startActivityForResult(intent, REQUEST_PHOTO_PICKER_SINGLE_SELECT);
+ }
+
+ public void fbShareText(View view) {
+ ShareParams shareParams = new ShareParams();
+ shareParams.setTitle("测试链接");
+ shareParams.setShareUrl("https://www.baidu.com");
+ FastSdk.share(ShareType.FACEBOOK, ShareType.ChildType.FACEBOOK_LINK, shareParams);
+ }
+
+ public void fbPhotoShare(View view) {
+ Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
+ startActivityForResult(intent, REQUEST_PHOTO_PICKER_SINGLE_SELECT);
+ }
+
+ public void fbShareVideo(View view) {
+ Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
+ startActivityForResult(intent, REQUEST_VIDEO_PICKER_SINGLE_SELECT);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (data==null){
+ return;
+ }
+ Uri data1 = data.getData();
+ if (data1==null){
+ return;
+ }
+ Logger.i("shareActivity onActivityResult:" + data1.toString());
+ if (requestCode == REQUEST_PHOTO_PICKER_SINGLE_SELECT) {
+ /*
+ //系统图片分享
+ ShareParams shareParams = new ShareParams();
+ shareParams.setTitle("系统图片分享");
+ shareParams.setPicPath(data1.toString());
+ FastSdk.share(ShareType.SYSTEM, ShareType.ChildType.SYSTEM_IMG, shareParams);*/
+
+ //Facebook图片分享
+ ShareParams shareParams = new ShareParams();
+ shareParams.setTitle("泰裤辣");
+ shareParams.setPicPath(data1.toString());
+ FastSdk.share(ShareType.FACEBOOK, ShareType.ChildType.FACEBOOK_IMG, shareParams);
+
+ } else if (requestCode == REQUEST_VIDEO_PICKER_SINGLE_SELECT) {
+ /*
+ //系统视频分享
+ ShareParams shareParams = new ShareParams();
+ shareParams.setTitle("系统视频分享");
+ shareParams.setPicPath(data1.toString());
+ FastSdk.share(ShareType.SYSTEM, ShareType.ChildType.SYSTEM_FILE, shareParams);*/
+
+ //Facebook视频分享
+ ShareParams shareParams = new ShareParams();
+ shareParams.setTitle("泰裤辣");
+ shareParams.setPicPath(data1.toString());
+ FastSdk.share(ShareType.FACEBOOK, ShareType.ChildType.FACEBOOK_VIDEO, shareParams);
+ }
+ }
+}
diff --git a/game_demo/src/main/res/drawable/bg.jpg b/game_demo/src/main/res/drawable/bg.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..850d83c0993b894572ccd36b2eef8208d0317ee7
Binary files /dev/null and b/game_demo/src/main/res/drawable/bg.jpg differ
diff --git a/game_demo/src/main/res/drawable/bg2.jpg b/game_demo/src/main/res/drawable/bg2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f6d32395302dfb4f0e3b759014ae3262709589fd
Binary files /dev/null and b/game_demo/src/main/res/drawable/bg2.jpg differ
diff --git a/game_demo/src/main/res/drawable/btn_selector.xml b/game_demo/src/main/res/drawable/btn_selector.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3705f848e5e29f6b41fa8dbee52f600e23bcf682
--- /dev/null
+++ b/game_demo/src/main/res/drawable/btn_selector.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/game_demo/src/main/res/drawable/shape_btn.xml b/game_demo/src/main/res/drawable/shape_btn.xml
new file mode 100644
index 0000000000000000000000000000000000000000..401aa6cc6ebcf859e4ac586413f23ea211bafafb
--- /dev/null
+++ b/game_demo/src/main/res/drawable/shape_btn.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/game_demo/src/main/res/drawable/shape_btn_pressed.xml b/game_demo/src/main/res/drawable/shape_btn_pressed.xml
new file mode 100644
index 0000000000000000000000000000000000000000..67f0f35882180b902250b934ac3a4e9f09fea3ea
--- /dev/null
+++ b/game_demo/src/main/res/drawable/shape_btn_pressed.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/game_demo/src/main/res/drawable/shape_et.xml b/game_demo/src/main/res/drawable/shape_et.xml
new file mode 100644
index 0000000000000000000000000000000000000000..310e8c1c27ad17de1f88bf556c8dfbeb5db75aff
--- /dev/null
+++ b/game_demo/src/main/res/drawable/shape_et.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/game_demo/src/main/res/layout-land/activity_main.xml b/game_demo/src/main/res/layout-land/activity_main.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4c4cbc3372196e5f54b813c261772ba5090913f5
--- /dev/null
+++ b/game_demo/src/main/res/layout-land/activity_main.xml
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/game_demo/src/main/res/layout/activity_main.xml b/game_demo/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7a719048d2b9647b207508a5a7cd2acbabf74251
--- /dev/null
+++ b/game_demo/src/main/res/layout/activity_main.xml
@@ -0,0 +1,245 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/game_demo/src/main/res/layout/activity_share.xml b/game_demo/src/main/res/layout/activity_share.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6111276d5dbc543d79a3f193aa8dfc6d2f1db400
--- /dev/null
+++ b/game_demo/src/main/res/layout/activity_share.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/game_demo/src/main/res/mipmap-xxhdpi/ic_launcher.png b/game_demo/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..91170a3caa0112f00061898d2ef3c0aea2e3aab1
Binary files /dev/null and b/game_demo/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/game_demo/src/main/res/values/fastsdk_attrs.xml b/game_demo/src/main/res/values/fastsdk_attrs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..78554f9ebbcc2f604761f0dfd3ead6d406704490
--- /dev/null
+++ b/game_demo/src/main/res/values/fastsdk_attrs.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/game_demo/src/main/res/values/strings.xml b/game_demo/src/main/res/values/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..226f3a399f255159f55edd07e7c07b00d52abe91
--- /dev/null
+++ b/game_demo/src/main/res/values/strings.xml
@@ -0,0 +1,9 @@
+
+ fastSdkDemo
+
+ 987654321
+ fb987654321
+ 987654321ABCDEFG
+
+ 242883477374
+
\ No newline at end of file
diff --git a/game_demo/src/main/res/values/styles.xml b/game_demo/src/main/res/values/styles.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c39455463c9dcf0487b3f3033f9f0dfda8839745
--- /dev/null
+++ b/game_demo/src/main/res/values/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..cb05090bfe5e103b370269fc47802c34c6ac88aa
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,12 @@
+
+android.useAndroidX=true
+#android.enableJetifier=true
+#android.userDexArchive=true
+
+PROJ_UPLOADE_URL=https://sdk.wdyxgames.com/nexus/repository/sdk-release/
+PROJ_UPLOADE_USERNAME=access
+PROJ_UPLOADE_PASSWORD=hoolai
+
+#加快构建编译速度
+android.nonTransitiveRClass=true
+org.gradle.caching=true
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8d06f3a25e14cf5fafcf995876647642e0c3ad68
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Thu Aug 12 14:49:15 CST 2021
+distributionBase=GRADLE_USER_HOME
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
+distributionPath=wrapper/dists
+zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000000000000000000000000000000000000..cccdd3d517fc5249beaefa600691cf150f2fa3e6
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000000000000000000000000000000000000..f9553162f122c71b34635112e717c3e733b5b212
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/keystoreFile/access_global.keystore b/keystoreFile/access_global.keystore
new file mode 100644
index 0000000000000000000000000000000000000000..67bf234c763a885dda2cc00db87ce72647de2452
Binary files /dev/null and b/keystoreFile/access_global.keystore differ
diff --git a/local.properties b/local.properties
new file mode 100644
index 0000000000000000000000000000000000000000..71499ed10775fe0aa962b4b59bbb2ef02fdc32ee
--- /dev/null
+++ b/local.properties
@@ -0,0 +1,8 @@
+## This file must *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+#
+# Location of the SDK. This is only used by Gradle.
+# For customization when using a Version Control System, please read the
+# header note.
+#Thu Mar 16 14:51:48 CST 2023
+sdk.dir=/Users/gaorui/Library/Android/sdk
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..9738e2c893e82fe57d6fbbc0681efdecc2665d6f
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = "hoolai-oversea-demo-new"
+include ':game_demo'