瀏覽代碼

v1.0.0开发:版本发布

#Suyghur 3 年之前
父節點
當前提交
81fe0e84fd
共有 33 個文件被更改,包括 372 次插入92 次删除
  1. 3 3
      build.gradle
  2. 11 9
      demo/build.gradle
  3. 二進制
      demo/libs/library_core-release.aar
  4. 8 8
      demo/src/main/AndroidManifest.xml
  5. 9 9
      demo/src/main/assets/yyxx_game/sdk_log.json
  6. 1 1
      demo/src/main/assets/yyxx_game/yyxx_cfg.properties
  7. 8 9
      demo/src/main/java/com/eyuangame/demo/DemoActivity.kt
  8. 0 1
      demo/src/main/java/com/eyuangame/demo/WelcomeActivity.kt
  9. 1 1
      library_base/src/main/java/cn/yyxx/eyuangame/Version.kt
  10. 15 0
      library_base/src/main/java/cn/yyxx/eyuangame/base/EYuanGame.kt
  11. 2 0
      library_base/src/main/java/cn/yyxx/eyuangame/base/entity/Function.kt
  12. 7 8
      library_core/build.gradle
  13. 2 0
      library_core/proguard-rules.pro
  14. 1 1
      library_core/publish.gradle
  15. 5 0
      library_core/src/main/AndroidManifest.xml
  16. 3 3
      library_core/src/main/cpp/aes.cpp
  17. 1 0
      library_core/src/main/cpp/comm_map.cpp
  18. 2 0
      library_core/src/main/cpp/include/toolkit.h
  19. 15 3
      library_core/src/main/cpp/toolkit.cpp
  20. 4 0
      library_core/src/main/java/cn/yyxx/eyuangame/core/SdkBridge.kt
  21. 10 1
      library_core/src/main/java/cn/yyxx/eyuangame/core/entity/SdkBackLoginInfo.kt
  22. 33 9
      library_core/src/main/java/cn/yyxx/eyuangame/core/impl/SdkBridgeImpl.kt
  23. 0 6
      library_core/src/main/java/cn/yyxx/eyuangame/core/impl/SdkJsImpl.kt
  24. 156 11
      library_core/src/main/java/cn/yyxx/eyuangame/core/impl/center/HybridActivity.kt
  25. 2 3
      library_core/src/main/java/cn/yyxx/eyuangame/core/impl/login/LoginActivity.kt
  26. 2 2
      library_core/src/main/java/cn/yyxx/eyuangame/core/impl/login/fragment/LauncherFragment.kt
  27. 0 1
      library_core/src/main/java/cn/yyxx/eyuangame/core/impl/login/fragment/RegisterFragment.kt
  28. 67 0
      library_core/src/main/java/cn/yyxx/eyuangame/core/impl/share/ShareImpl.kt
  29. 1 1
      library_core/src/main/java/cn/yyxx/eyuangame/core/internal/IJsCallback.kt
  30. 1 1
      library_core/src/main/java/cn/yyxx/eyuangame/core/network/Host.kt
  31. 1 0
      library_core/src/main/java/cn/yyxx/eyuangame/core/network/VolleyRequest.kt
  32. 二進制
      libs/eyuangamesdk_base_1.0.0.jar
  33. 1 1
      tutorial.md

+ 3 - 3
build.gradle

@@ -5,7 +5,7 @@ buildscript {
         // demo远程依赖
         REMOTE_LIBRARY = false
         // 发布开关
-        PUBLISH_ENABLE = false
+        PUBLISH_ENABLE = true
         // 混淆开关
         MINIFY_ENABLE = true
         // ndk版本
@@ -13,13 +13,13 @@ buildscript {
         // kotlin版本
         KOTLIN_VERSION = '1.4.20'
         // compileSdkVersion
-        COMPILE_SDK_VERSION = 30
+        COMPILE_SDK_VERSION = 31
         // buildToolsVersion
         BUILD_TOOLS_VERSION = '30.0.3'
         // minSdkVersion
         MIN_SDK_VERSION = 16
         // targetSdkVersion
-        TARGET_SDK_VERSION = 30
+        TARGET_SDK_VERSION = 31
     }
 
     repositories {

+ 11 - 9
demo/build.gradle

@@ -72,14 +72,14 @@ android {
 }
 
 dependencies {
-
     if (PUBLISH_ENABLE) {
         if (REMOTE_LIBRARY) {
-            implementation 'io.github.yyxxgame.sdk:eyuangame-sdk-ktx:1.0.0-alpha8'
+            implementation 'io.github.yyxxgame.sdk:eyuangame-sdk-ktx:1.0.0-alpha10'
         } else {
             api(name: 'library_core-release', ext: 'aar')
 
-            implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
+            implementation "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION"
+            implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
 
             //mmkv
             implementation 'com.tencent:mmkv-static:1.2.10'
@@ -88,18 +88,20 @@ dependencies {
             implementation 'io.github.suyghur.dolin:zap:1.0.0'
 
             implementation 'androidx.core:core-ktx:1.6.0'
-            implementation 'androidx.fragment:fragment-ktx:1.3.5'
-            implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+            implementation 'androidx.fragment:fragment-ktx:1.3.6'
+            implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
             implementation 'com.google.android.material:material:1.4.0'
             implementation 'com.android.installreferrer:installreferrer:2.2'
 
             //google
-            implementation 'com.google.android.play:core:1.10.0'
-            implementation 'com.google.android.gms:play-services-auth:19.0.0'
+            implementation 'com.google.android.play:core:1.10.2'
+            implementation 'com.google.android.gms:play-services-auth:19.2.0'
             //4.0.0的billing库消耗商品会回调两次,后续在排查,先用3.0.3
             implementation "com.android.billingclient:billing-ktx:3.0.3"
-            implementation 'com.google.firebase:firebase-analytics-ktx:19.0.0'
-            implementation 'com.google.firebase:firebase-crashlytics-ktx:18.1.0'
+            implementation 'com.google.firebase:firebase-analytics-ktx:19.0.2'
+            implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.3'
+            implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.3'
+
             //facebook
             implementation 'com.facebook.android:facebook-android-sdk:11.2.0'
 

二進制
demo/libs/library_core-release.aar


+ 8 - 8
demo/src/main/AndroidManifest.xml

@@ -29,7 +29,7 @@
             android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
             android:exported="true"
             android:launchMode="singleTask"
-            android:screenOrientation="portrait">
+            android:screenOrientation="sensorLandscape">
             <intent-filter>
                 <action android:name="${applicationId}" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -41,19 +41,19 @@
             android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
             android:exported="true"
             android:launchMode="singleTask"
-            android:screenOrientation="portrait">
+            android:screenOrientation="sensorLandscape">
             <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
 
-        <!-- Facebook 分享 -->
-        <!--        <provider-->
-        <!--            android:name="com.facebook.FacebookContentProvider"-->
-        <!--            android:authorities="com.facebook.app.FacebookContentProvider283753472796552"-->
-        <!--            android:exported="true" />-->
-        <!-- Facebook end -->
+        <!-- Facebook 分享 start -->
+        <provider
+            android:name="com.facebook.FacebookContentProvider"
+            android:authorities="com.facebook.app.FacebookContentProvider229604925839347"
+            android:exported="true" />
+        <!-- Facebook 分享 end-->
     </application>
 
 </manifest>

+ 9 - 9
demo/src/main/assets/yyxx_game/sdk_log.json

@@ -1,11 +1,11 @@
 {
-  "open_app": "rjo5ax",
-  "choose_login_page": "eo8k08",
-  "sign_up": "mzvwmo",
-  "login_success_quick": "3igk4b",
-  "login_success_fb": "dwbri1",
-  "login_success_google": "tk971u",
-  "login_success_account": "wp73dt",
-  "ecommerce_purchase": "qum6x5",
-  "first_purchase": "r1mt2x"
+  "open_app": "9titg2",
+  "choose_login_page": "l68ap0",
+  "sign_up": "oycdb6",
+  "login_success_quick": "sjxw4u",
+  "login_success_fb": "aorps6",
+  "login_success_google": "opymbu",
+  "login_success_account": "lmngli",
+  "ecommerce_purchase": "na9zu3",
+  "first_purchase": "6tgkgk"
 }

+ 1 - 1
demo/src/main/assets/yyxx_game/yyxx_cfg.properties

@@ -3,7 +3,7 @@ YYXX_GCP_CODE=G010101
 #分包标识
 YYXX_GAME_CODE=100001
 # 事件打点应用ID
-YYXX_ADJUST_APP_ID=43gp4f912rgg
+YYXX_ADJUST_APP_ID=q1lh43zvrv9c
 # Google AppId
 YYXX_GOOGLE_APP_ID=70429070957
 # Google Server Client Id

+ 8 - 9
demo/src/main/java/com/eyuangame/demo/DemoActivity.kt

@@ -37,6 +37,7 @@ class DemoActivity : Activity(), View.OnClickListener {
         Item(8, "08 模拟CP打点(玩家首次完成新手引导)"),
         Item(0, "09 模拟CP打点(玩家首次完成结缘)"),
         Item(10, "10 crashlytics崩溃测试"),
+        Item(11, "11 Facebook分享测试")
     )
 
 
@@ -61,7 +62,7 @@ class DemoActivity : Activity(), View.OnClickListener {
         super.onCreate(savedInstanceState)
         initView()
         LogUtils.handler = handler
-        EYuanGame.getInstance().initialize(this, false, object : ICallback {
+        EYuanGame.getInstance().initialize(this, true, object : ICallback {
             override fun onResult(code: Int, result: String) {
                 ToastUtils.toastInfo(this@DemoActivity, "---- demo提示不做翻译 ----\ncode : $code\n msg : $result\n ---- demo提示不做翻译 ----")
             }
@@ -159,14 +160,12 @@ class DemoActivity : Activity(), View.OnClickListener {
                     EYuanGame.getInstance().linkingEvent(this@DemoActivity, sdkEvent)
                 }
                 10 -> throw RuntimeException("Test Crashlytics Feature")
-//                10 -> {
-//                    TimeDownUtils.startScope(60, object : TimeDownUtils.TimeCallback {
-//                        override fun onTime(time: Int) {
-//                            Logger.d(time)
-//                        }
-//
-//                    })
-//                }
+                11 -> EYuanGame.getInstance().share(this@DemoActivity, "https://www.baidu.com", "#测试标签", "测试引文", object : ICallback {
+                    override fun onResult(code: Int, result: String) {
+
+                    }
+
+                })
             }
         }
     }

+ 0 - 1
demo/src/main/java/com/eyuangame/demo/WelcomeActivity.kt

@@ -78,6 +78,5 @@ class WelcomeActivity : Activity() {
         layout.setBackgroundResource(id)
         layout.animation = animation
         setContentView(layout)
-
     }
 }

+ 1 - 1
library_base/src/main/java/cn/yyxx/eyuangame/Version.kt

@@ -5,7 +5,7 @@ package cn.yyxx.eyuangame
  * Created on 2021/06/09
  */
 object Version {
-    const val VERSION_NAME = "1.0.0-alpha9"
+    const val VERSION_NAME = "1.0.0"
     const val VERSION_CODE = 100
     const val SERVER_VERSION = "1.0.0"
 }

+ 15 - 0
library_base/src/main/java/cn/yyxx/eyuangame/base/EYuanGame.kt

@@ -405,6 +405,21 @@ class EYuanGame private constructor() {
         SdkBridgeManager.call(Function.LINKING_EVENT, arrayOf(Context::class.java, SdkEvent::class.java), arrayOf(context, sdkEvent))
     }
 
+    fun share(activity: Activity, line: String, tag: String, quote: String, callback: ICallback) {
+
+        if (checkSdkBridgeNull(Function.SHARE, null)) {
+            return
+        }
+
+        if (checkSdkNonInit(Function.SHARE, null)) {
+            return
+        }
+        SdkBridgeManager.call(
+            Function.SHARE, arrayOf(Activity::class.java, String::class.java, String::class.java, String::class.java, ICallback::class.java),
+            arrayOf(activity, line, tag, quote, callback)
+        )
+    }
+
 
     private fun checkSdkBridgeNull(function: String, callback: ICallback?): Boolean {
         return if (mSdkBridge == null) {

+ 2 - 0
library_base/src/main/java/cn/yyxx/eyuangame/base/entity/Function.kt

@@ -34,4 +34,6 @@ object Function {
     const val IS_GM_CENTER_ENABLE = "isGmCenterEnable"
     const val INVOKE_SDK_SHARING = "invokeSdkSharing"
     const val LINKING_EVENT="linkingEvent"
+    const val SHARE="share"
+
 }

+ 7 - 8
library_core/build.gradle

@@ -65,8 +65,8 @@ android {
 }
 
 dependencies {
-//    implementation "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION"
-//    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION"
+    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
 
     //mmkv
     implementation 'com.tencent:mmkv-static:1.2.10'
@@ -76,21 +76,20 @@ dependencies {
 
     implementation 'androidx.core:core-ktx:1.6.0'
     implementation 'androidx.fragment:fragment-ktx:1.3.6'
-    implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
+    implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
     implementation 'com.google.android.material:material:1.4.0'
     implementation 'com.android.installreferrer:installreferrer:2.2'
 
     //google
-    implementation 'com.google.android.play:core:1.10.0'
+    implementation 'com.google.android.play:core:1.10.2'
     implementation 'com.google.android.gms:play-services-auth:19.2.0'
     //4.0.0的billing库消耗商品会回调两次,后续在排查,先用3.0.3
     implementation "com.android.billingclient:billing-ktx:3.0.3"
-    implementation 'com.google.firebase:firebase-analytics-ktx:19.0.1'
-    implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.1'
-    implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.1'
+    implementation 'com.google.firebase:firebase-analytics-ktx:19.0.2'
+    implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.3'
+    implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.3'
 
     //facebook
-//    implementation 'com.facebook.android:facebook-login:11.2.0'
     implementation 'com.facebook.android:facebook-android-sdk:11.2.0'
 
     //adjust

+ 2 - 0
library_core/proguard-rules.pro

@@ -135,6 +135,8 @@
 -keep class cn.yyxx.eyuangame.core.internal.IJsCallback{public <fields>; public <methods>;}
 -keep class cn.yyxx.eyuangame.core.SdkBridge{public <fields>; public <methods>;}
 -keep class cn.yyxx.eyuangame.core.impl.SdkDrive{public <fields>; public <methods>;}
+-keep class cn.yyxx.eyuangame.core.impl.SdkJsImpl{*;}
+
 
 # firebase
 -keepattributes SourceFile,LineNumberTable        # Keep file names and line numbers.

+ 1 - 1
library_core/publish.gradle

@@ -4,7 +4,7 @@ apply plugin: 'signing'
 ext {
     PUBLISH_GROUP_ID = 'io.github.yyxxgame.sdk'
     PUBLISH_ARTIFACT_ID = 'eyuangame-sdk-ktx'
-    PUBLISH_VERSION = '1.0.0-alpha9'
+    PUBLISH_VERSION = '1.0.0'
 }
 
 Properties properties = new Properties()

+ 5 - 0
library_core/src/main/AndroidManifest.xml

@@ -11,6 +11,11 @@
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="com.android.vending.BILLING" />
     <uses-permission android:name="com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR" />
+    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
+
+    <queries>
+        <package android:name="com.facebook.katana" />
+    </queries>
 
     <application
         android:allowBackup="true"

+ 3 - 3
library_core/src/main/cpp/aes.cpp

@@ -471,7 +471,7 @@ void AES_CBC_encrypt_buffer(uint8_t *output, uint8_t *input, uint32_t length, co
     uint8_t extra = length % BLOCKLEN; /* Remaining bytes in the last non-full block */
 
     // Skip the key expansion if key is passed as 0
-    if (0 != key) {
+    if (nullptr != key) {
         Key = key;
         KeyExpansion();
     }
@@ -505,13 +505,13 @@ void AES_CBC_decrypt_buffer(uint8_t *output, uint8_t *input, uint32_t length, co
     uint8_t extra = length % BLOCKLEN; /* Remaining bytes in the last non-full block */
 
     // Skip the key expansion if key is passed as 0
-    if (0 != key) {
+    if (nullptr != key) {
         Key = key;
         KeyExpansion();
     }
 
     // If iv is passed as 0, we continue to encrypt without re-setting the Iv
-    if (iv != 0) {
+    if (iv != nullptr) {
         Iv = (uint8_t *) iv;
     }
 

+ 1 - 0
library_core/src/main/cpp/comm_map.cpp

@@ -19,6 +19,7 @@ void CommMap::Init(JNIEnv *env, jobject context) {
     //biz
     comm_params["gcp_code"] = ParamsKit::GetGcpCode(env, context);
     comm_params["game_code"] = ParamsKit::GetGameCode(env, context);
+    comm_params["game_name"] = ToolKit::GetAppName(env, context);
     comm_params["package_name"] = ToolKit::GetPackageName(env, context);
 
     //vers

+ 2 - 0
library_core/src/main/cpp/include/toolkit.h

@@ -20,6 +20,8 @@ public:
 
     static int String2Int(const std::string &s);
 
+    static std::string GetAppName(JNIEnv *env, jobject context);
+
     static std::string GetPackageName(JNIEnv *env, jobject context);
 
     static std::string GetServerVersion(JNIEnv *env);

+ 15 - 3
library_core/src/main/cpp/toolkit.cpp

@@ -64,6 +64,20 @@ int ToolKit::String2Int(const std::string &s) {
     return value;
 }
 
+std::string ToolKit::GetAppName(JNIEnv *env, jobject context) {
+    jclass clz = env->FindClass("cn/yyxx/support/AppUtils");
+    if (clz == nullptr) {
+        Logger::E(env, "AppUtils clz is null");
+        return "";
+    }
+    const char *method_name = "getAppName";
+    const char *sig = "(Landroid/content/Context;)Ljava/lang/String;";
+    jmethodID mid = env->GetStaticMethodID(clz, method_name, sig);
+    auto result = (jstring) env->CallStaticObjectMethod(clz, mid, context);
+    env->DeleteLocalRef(clz);
+    return JString2String(env, result);
+}
+
 std::string ToolKit::GetPackageName(JNIEnv *env, jobject context) {
     jclass clz = env->GetObjectClass(context);
     if (clz == nullptr) {
@@ -137,7 +151,7 @@ std::string ToolKit::GetVersionCode(JNIEnv *env, jobject context) {
 std::string ToolKit::GetAndroidDeviceId(JNIEnv *env, jobject context) {
     jclass clz = env->FindClass("cn/yyxx/support/device/DeviceInfoUtils");
     if (clz == nullptr) {
-        Logger::E(env, "UUIDUtils clz is null");
+        Logger::E(env, "DeviceInfoUtils clz is null");
         return "";
     }
     const char *method_name = "getAndroidDeviceId";
@@ -244,5 +258,3 @@ char *ToolKit::StrReverse(const char *src) {
 
 
 
-
-

+ 4 - 0
library_core/src/main/java/cn/yyxx/eyuangame/core/SdkBridge.kt

@@ -110,4 +110,8 @@ class SdkBridge constructor(context: Context) {
         mImpl?.linkingEvent(context, sdkEvent)
     }
 
+    fun share(activity: Activity, line: String, tag: String, quote: String, callback: ICallback) {
+        mImpl?.share(activity, line, tag, quote, callback)
+    }
+
 }

+ 10 - 1
library_core/src/main/java/cn/yyxx/eyuangame/core/entity/SdkBackLoginInfo.kt

@@ -15,7 +15,11 @@ class SdkBackLoginInfo private constructor() {
     var phoneNum = ""
     var hasBindAccount = false
     var loginType = -1
-
+    var currentRoleId = ""
+    var currentRoleName = ""
+    var currentRoleLevel = ""
+    var currentServerId = ""
+    var currentServerName = ""
 
     fun reset() {
         this.userId = ""
@@ -24,6 +28,11 @@ class SdkBackLoginInfo private constructor() {
         this.phoneNum = ""
         this.hasBindAccount = false
         this.loginType = -1
+        this.currentRoleId = ""
+        this.currentRoleName = ""
+        this.currentRoleLevel = ""
+        this.currentServerId = ""
+        this.currentServerName = ""
     }
 
     fun toJsonString(): String {

+ 33 - 9
library_core/src/main/java/cn/yyxx/eyuangame/core/impl/SdkBridgeImpl.kt

@@ -19,6 +19,7 @@ import cn.yyxx.eyuangame.core.impl.center.HybridActivity
 import cn.yyxx.eyuangame.core.impl.floatball.FloatCenterServiceManager
 import cn.yyxx.eyuangame.core.impl.iab.ChargeImpl
 import cn.yyxx.eyuangame.core.impl.login.LoginActivity
+import cn.yyxx.eyuangame.core.impl.share.ShareImpl
 import cn.yyxx.eyuangame.core.internal.IImplCallback
 import cn.yyxx.eyuangame.core.internal.IRequestCallback
 import cn.yyxx.eyuangame.core.linking.Linking
@@ -78,9 +79,15 @@ class SdkBridgeImpl(context: Context) {
         Logger.i("EYuanGameSdk attachBaseContext ...")
         GAIDUtils.initGoogleAdid(application) { code, _ ->
             if (code == 0) {
-                Logger.i("谷歌框架可以访问,请求gaid")
-                SdkDrive.instance.setParam("device_id", GAIDUtils.getGoogleAdid())
-                FirebaseCrashlytics.getInstance().setCustomKey("device_id", GAIDUtils.getGoogleAdid())
+                if (GAIDUtils.getGoogleAdid() == "00000000-0000-0000-0000-000000000000") {
+                    Logger.i("谷歌框架可以访问,gaid被限制跟踪,使用android id替代")
+                    SdkDrive.instance.setParam("device_id", DeviceInfoUtils.getAndroidDeviceId(application))
+                    FirebaseCrashlytics.getInstance().setCustomKey("device_id", DeviceInfoUtils.getAndroidDeviceId(application))
+                } else {
+                    Logger.i("谷歌框架可以访问,请求gaid")
+                    SdkDrive.instance.setParam("device_id", GAIDUtils.getGoogleAdid())
+                    FirebaseCrashlytics.getInstance().setCustomKey("device_id", GAIDUtils.getGoogleAdid())
+                }
             } else {
                 Logger.e("谷歌框架不可访问,使用android id替代")
                 SdkDrive.instance.setParam("device_id", DeviceInfoUtils.getAndroidDeviceId(application))
@@ -254,6 +261,7 @@ class SdkBridgeImpl(context: Context) {
         }
         isExistLoginHandle = false
         SdkBackLoginInfo.instance.reset()
+
         LoginActivity.login(activity, isAutoLogin, object : IImplCallback {
             override fun onResult(code: Int, result: String) {
                 Logger.d("onResult code : $code , result : $result")
@@ -327,26 +335,33 @@ class SdkBridgeImpl(context: Context) {
     fun roleCreate(activity: Activity, roleInfo: SdkRoleInfo) {
         Logger.i("EYuanGameSdk roleCreate ...")
         isSubmitRoleData = true
+        submitRoleData(activity, 1, roleInfo)
     }
 
     fun roleLauncher(activity: Activity, roleInfo: SdkRoleInfo) {
         Logger.i("EYuanGameSdk roleLauncher ...")
         isSubmitRoleData = true
+        submitRoleData(activity, 2, roleInfo)
     }
 
     fun roleLevelUp(activity: Activity, roleInfo: SdkRoleInfo) {
         Logger.i("EYuanGameSdk roleLevelUp ...")
+        submitRoleData(activity, 3, roleInfo)
     }
 
     @Deprecated("暂时不需要向服务端上报角色信息")
     private fun submitRoleData(activity: Activity, timing: Int, roleInfo: SdkRoleInfo) {
         isSubmitRoleData = true
-        SdkRequest.instance.submitRoleData(activity, timing, roleInfo, object : IRequestCallback {
-            override fun onResponse(resultInfo: ResultInfo) {
-                Logger.d("submitRoleData code : ${resultInfo.code} , msg : ${resultInfo.msg}")
-            }
-
-        })
+        SdkBackLoginInfo.instance.currentRoleId = roleInfo.roleId
+        SdkBackLoginInfo.instance.currentRoleName = roleInfo.roleName
+        SdkBackLoginInfo.instance.currentRoleLevel = roleInfo.roleLevel
+        SdkBackLoginInfo.instance.currentServerId = roleInfo.serverId
+        SdkBackLoginInfo.instance.currentServerName = roleInfo.serverName
+//        SdkRequest.instance.submitRoleData(activity, timing, roleInfo, object : IRequestCallback {
+//            override fun onResponse(resultInfo: ResultInfo) {
+//                Logger.d("submitRoleData code : ${resultInfo.code} , msg : ${resultInfo.msg}")
+//            }
+//        })
     }
 
     fun openExitView(activity: Activity, callback: ICallback) {
@@ -429,6 +444,15 @@ class SdkBridgeImpl(context: Context) {
         Linking.instance.extEvent(context, sdkEvent)
     }
 
+    fun share(activity: Activity, line: String, tag: String, quote: String, callback: ICallback) {
+        Logger.i("EYuanGameSdk share ...")
+        ShareImpl.instance.invokeShare2Fb(activity, line, tag, quote, object : IImplCallback {
+            override fun onResult(code: Int, result: String) {
+                callback.onResult(code, result)
+            }
+        })
+    }
+
     private fun showInitLoadingDialog(context: Context) {
         initLoadingDialog?.apply {
             dismiss()

+ 0 - 6
library_core/src/main/java/cn/yyxx/eyuangame/core/impl/SdkJsImpl.kt

@@ -10,12 +10,6 @@ import cn.yyxx.eyuangame.core.internal.IJsCallback
  */
 class SdkJsImpl(val callback: IJsCallback) {
 
-    @JavascriptInterface
-    fun jsInvoke(method: String, data: String) {
-        Logger.d("jsInvoke method : $method , data : $data")
-        callback.onInvoke(method, data)
-    }
-
     @JavascriptInterface
     fun jsCallback(method: String, data: String): String {
         Logger.d("jsCallback method : $method , data : $data")

+ 156 - 11
library_core/src/main/java/cn/yyxx/eyuangame/core/impl/center/HybridActivity.kt

@@ -11,16 +11,21 @@ import android.view.View
 import android.view.WindowManager
 import android.webkit.*
 import android.widget.FrameLayout
+import cn.yyxx.eyuangame.base.utils.Logger
 import cn.yyxx.eyuangame.core.entity.ClickType
+import cn.yyxx.eyuangame.core.entity.SdkBackLoginInfo
 import cn.yyxx.eyuangame.core.impl.SdkBridgeImpl
 import cn.yyxx.eyuangame.core.impl.SdkDrive
 import cn.yyxx.eyuangame.core.impl.SdkJsImpl
+import cn.yyxx.eyuangame.core.impl.share.ShareImpl
+import cn.yyxx.eyuangame.core.internal.IImplCallback
 import cn.yyxx.eyuangame.core.internal.IJsCallback
 import cn.yyxx.eyuangame.core.ui.dialog.ScaleLoadingDialog
 import cn.yyxx.support.AndroidBug5497Workaround
+import cn.yyxx.support.JsonUtils
 import cn.yyxx.support.ResUtils
 import cn.yyxx.support.device.DeviceInfoUtils
-import cn.yyxx.support.hawkeye.ToastUtils
+import org.json.JSONObject
 
 /**
  * @author #Suyghur.
@@ -28,23 +33,73 @@ import cn.yyxx.support.hawkeye.ToastUtils
  */
 class HybridActivity : Activity(), View.OnClickListener {
 
-    //    private lateinit var ivReturn: ImageView
-//    private lateinit var tvTitle: TextView
+    private var uploadMessageForAndroid5: ValueCallback<Array<Uri>>? = null
+    private var mFileChooseParams: WebChromeClient.FileChooserParams? = null
     private lateinit var webView: WebView
     private var loadingDialog: ScaleLoadingDialog? = null
 
 
     private val callback = object : IJsCallback {
 
-        override fun onInvoke(method: String, data: String) {
-            ToastUtils.toastInfo(this@HybridActivity, "调用Android原生方法$method")
-        }
-
         override fun onCallback(method: String, data: String): String {
-            return when (method) {
-                "getComm" -> SdkDrive.instance.getComm(this@HybridActivity)
-                else -> ""
+            when (method) {
+                "getCommon" -> return SdkDrive.instance.getComm(this@HybridActivity)
+                "close" -> {
+                    runOnUiThread {
+                        this@HybridActivity.finish()
+                    }
+                }
+                "back" -> {
+                    runOnUiThread {
+                        onBackPressed()
+                    }
+                }
+                "facebookShare" -> {
+                    kotlin.runCatching {
+                        val jsonObject = JSONObject(data)
+                        val line = if (JsonUtils.hasJsonKey(jsonObject, "line")) {
+                            jsonObject.getString("line")
+                        } else {
+                            ""
+                        }
+                        val tag = if (JsonUtils.hasJsonKey(jsonObject, "tag")) {
+                            jsonObject.getString("tag")
+                        } else {
+                            ""
+                        }
+                        val quote = if (JsonUtils.hasJsonKey(jsonObject, "quote")) {
+                            jsonObject.getString("quote")
+                        } else {
+                            ""
+                        }
+                        ShareImpl.instance.invokeShare2Fb(this@HybridActivity, line, tag, quote, object : IImplCallback {
+                            override fun onResult(code: Int, result: String) {
+                                Logger.d("invokeShare2Fb onResult")
+                                if (code == 0) {
+                                    webView.loadUrl("javascript:wk.FBShareCallback(1)")
+                                } else {
+                                    webView.loadUrl("javascript:wk.FBShareCallback(-1)")
+                                }
+                            }
+                        })
+
+                    }
+                }
+                "getRoleInfo" -> {
+                    val jsonObject = JSONObject()
+                    kotlin.runCatching {
+                        jsonObject.put("login_type", SdkBackLoginInfo.instance.loginType)
+                        jsonObject.put("uid", SdkBackLoginInfo.instance.userId)
+                        jsonObject.put("role_id", SdkBackLoginInfo.instance.currentRoleId)
+                        jsonObject.put("role_name", SdkBackLoginInfo.instance.currentRoleName)
+                        jsonObject.put("role_level", SdkBackLoginInfo.instance.currentRoleLevel)
+                        jsonObject.put("server_id", SdkBackLoginInfo.instance.currentServerId)
+                        jsonObject.put("server_name", SdkBackLoginInfo.instance.currentServerName)
+                    }
+                    return jsonObject.toString()
+                }
             }
+            return ""
         }
 
     }
@@ -136,6 +191,16 @@ class HybridActivity : Activity(), View.OnClickListener {
 
             override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                 val hitTestResult = view.hitTestResult
+                // 处理paypal
+                if (url.startsWith("https://www.sandbox.paypal.com")
+                    || url.startsWith("https://www.paypal.com")
+                    || url.startsWith("intent://")
+                ) {
+                    container.setBackgroundColor(Color.parseColor("#FFFFFF"))
+                } else {
+                    container.setBackgroundColor(Color.parseColor("#00FFFFFF"))
+                }
+
                 if (url.startsWith("http:") || url.startsWith("https:")) {
                     //解决重定向加载的问题 return false
                     if (!view.canGoBack()) {
@@ -146,7 +211,11 @@ class HybridActivity : Activity(), View.OnClickListener {
                         return false
                     }
                     view.loadUrl(url)
+                } else {
+                    jump2MyCardClient(url)
+                    return true
                 }
+
                 return false
             }
 
@@ -170,7 +239,15 @@ class HybridActivity : Activity(), View.OnClickListener {
 
             //For Android > 5.0
             override fun onShowFileChooser(webView: WebView, filePathCallback: ValueCallback<Array<Uri>>, fileChooserParams: FileChooserParams): Boolean {
-//                openFileChooserImplForAndroid5(filePathCallback)
+                openFileChooserImplForAndroid5(filePathCallback)
+//                uploadMessageForAndroid5 = filePathCallback
+//                mFileChooseParams = fileChooserParams
+//                val intent = Intent(Intent.ACTION_GET_CONTENT)
+//                intent.addCategory(Intent.CATEGORY_OPENABLE)
+//                intent.putExtra("return-data", true)
+//                intent.type = "image/*"
+//                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*")
+//                startActivityForResult(Intent.createChooser(intent, "选择相册"), FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5)
                 return true
             }
 
@@ -192,6 +269,34 @@ class HybridActivity : Activity(), View.OnClickListener {
         }
     }
 
+    override fun onNewIntent(intent: Intent?) {
+        super.onNewIntent(intent)
+    }
+
+    override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent) {
+        super.onActivityResult(requestCode, resultCode, intent)
+        if (requestCode == FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5) {
+            Logger.d("onActivityResult FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5")
+            if (uploadMessageForAndroid5 == null) {
+                Logger.d("mUploadMessageForAndroid5 == null")
+                return
+            }
+            if (intent == null) {
+                uploadMessageForAndroid5!!.onReceiveValue(arrayOf())
+                return
+            }
+            val result = if (resultCode != RESULT_OK) null else intent.data
+            if (result == null) {
+                uploadMessageForAndroid5!!.onReceiveValue(arrayOf())
+            } else {
+                uploadMessageForAndroid5!!.onReceiveValue(arrayOf(result))
+            }
+            uploadMessageForAndroid5 = null
+        } else {
+            ShareImpl.instance.onShareResult(requestCode, resultCode, intent)
+        }
+    }
+
     override fun onResume() {
         super.onResume()
     }
@@ -217,6 +322,44 @@ class HybridActivity : Activity(), View.OnClickListener {
         }
     }
 
+    private fun jump2MyCardClient(url: String) {
+        try {
+            val intent = if (url.startsWith("intent://")
+                || url.startsWith("line://")
+                || url.startsWith("shopeepay://")
+            ) {
+                Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
+            } else {
+                Intent(Intent.ACTION_VIEW, Uri.parse(url))
+            }
+            startActivity(intent)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            Logger.e("${e.message}")
+        }
+    }
+
+    private fun openFileChooserImplForAndroid5(uploadMsg: ValueCallback<Array<Uri>>) {
+        Logger.i("Open ImageChooser For Higher than Android5")
+        uploadMessageForAndroid5 = uploadMsg
+        val contentSelectionIntent = Intent(Intent.ACTION_GET_CONTENT)
+        contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE)
+        contentSelectionIntent.type = "image/*"
+
+        val chooserIntent = Intent(Intent.ACTION_CHOOSER)
+        chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent)
+        chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser")
+
+        startActivityForResult(chooserIntent, FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5)
+    }
+
+    override fun onBackPressed() {
+        if (webView.canGoBack()) {
+            webView.goBack()
+        } else {
+            finish()
+        }
+    }
 
     override fun onClick(v: View?) {
         v?.apply {
@@ -228,6 +371,8 @@ class HybridActivity : Activity(), View.OnClickListener {
 
     companion object {
 
+        private const val FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5 = 2
+
         private var url = ""
 
         fun start(activity: Activity, url: String) {

+ 2 - 3
library_core/src/main/java/cn/yyxx/eyuangame/core/impl/login/LoginActivity.kt

@@ -40,8 +40,6 @@ class LoginActivity : FragmentActivity(), View.OnClickListener {
         private set
 
     private lateinit var rootContainer: ConstraintLayout
-
-    //    private lateinit var loginContainer: ViewStub
     private lateinit var loginContainer: ConstraintLayout
     private lateinit var tabLayout: TabLayout
     private lateinit var viewPager: NoScrollViewPager
@@ -258,7 +256,7 @@ class LoginActivity : FragmentActivity(), View.OnClickListener {
 
             override fun onTabUnselected(tab: TabLayout.Tab?) {
                 if (pagerAdapter.currentFragment is LauncherFragment) {
-                    //TODO 收起下拉列表
+                    // TODO 收起下拉列表
                     (pagerAdapter.currentFragment as LauncherFragment).hideAccountList()
                 }
             }
@@ -396,6 +394,7 @@ class LoginActivity : FragmentActivity(), View.OnClickListener {
     override fun onDestroy() {
         super.onDestroy()
         TimeDownUtils.cancel()
+
     }
 
 

+ 2 - 2
library_core/src/main/java/cn/yyxx/eyuangame/core/impl/login/fragment/LauncherFragment.kt

@@ -239,7 +239,7 @@ class LauncherFragment : Fragment(), View.OnClickListener {
                 }
             }
         }
-        //循环添加列
+        // 循环添加列
         userLists.apply {
             for (i in indices) {
                 val session = this[i]
@@ -253,7 +253,7 @@ class LauncherFragment : Fragment(), View.OnClickListener {
                     }
                 }
 
-                //添加账号
+                // 添加账号
                 val item = mInflater.inflate(ResUtils.getResId(requireActivity(), "yyxx_account_list_item", "layout"), null)
                 item?.apply {
                     val tvAccountName = findViewById<TextView>(ResUtils.getResId(requireActivity(), "yyxx_tv_name", "id"))

+ 0 - 1
library_core/src/main/java/cn/yyxx/eyuangame/core/impl/login/fragment/RegisterFragment.kt

@@ -182,6 +182,5 @@ class RegisterFragment : Fragment(), View.OnClickListener {
                 }
             }
         }
-
     }
 }

+ 67 - 0
library_core/src/main/java/cn/yyxx/eyuangame/core/impl/share/ShareImpl.kt

@@ -0,0 +1,67 @@
+package cn.yyxx.eyuangame.core.impl.share
+
+import android.app.Activity
+import android.content.Intent
+import android.net.Uri
+import cn.yyxx.eyuangame.base.utils.Logger
+import cn.yyxx.eyuangame.core.internal.IImplCallback
+import com.facebook.CallbackManager
+import com.facebook.FacebookCallback
+import com.facebook.FacebookException
+import com.facebook.share.Sharer
+import com.facebook.share.model.ShareHashtag
+import com.facebook.share.model.ShareLinkContent
+import com.facebook.share.widget.ShareDialog
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/09/03
+ */
+class ShareImpl private constructor() {
+
+    private var shareDialog: ShareDialog? = null
+    private var fbCallback: CallbackManager? = null
+
+
+    init {
+        fbCallback = CallbackManager.Factory.create()
+    }
+
+    fun invokeShare2Fb(activity: Activity, line: String, tag: String, quote: String, callback: IImplCallback) {
+        shareDialog = ShareDialog(activity)
+        shareDialog?.registerCallback(fbCallback, object : FacebookCallback<Sharer.Result> {
+            override fun onSuccess(result: Sharer.Result?) {
+                Logger.d("facebook share onSuccess")
+                callback.onResult(0, "facebook share onSuccess")
+            }
+
+            override fun onCancel() {
+                Logger.d("facebook share onCancel")
+                callback.onResult(-1, "facebook share onSuccess")
+            }
+
+            override fun onError(error: FacebookException?) {
+                Logger.d("facebook share onError")
+                callback.onResult(-1, "facebook share onSuccess")
+            }
+        })
+
+        val shareLinkContent = ShareLinkContent.Builder()
+            .setContentUrl(Uri.parse(line))
+            .setShareHashtag(ShareHashtag.Builder().setHashtag(tag).build())
+            .setQuote(quote)
+            .build()
+        shareDialog?.show(shareLinkContent)
+    }
+
+
+    fun onShareResult(requestCode: Int, resultCode: Int, intent: Intent) {
+        fbCallback?.onActivityResult(requestCode, resultCode, intent)
+    }
+
+    companion object {
+        val instance: ShareImpl by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
+            ShareImpl()
+        }
+    }
+}

+ 1 - 1
library_core/src/main/java/cn/yyxx/eyuangame/core/internal/IJsCallback.kt

@@ -6,7 +6,7 @@ package cn.yyxx.eyuangame.core.internal
  */
 interface IJsCallback {
 
-    fun onInvoke(method: String, data: String)
+//    fun onInvoke(method: String, data: String)
 
     fun onCallback(method: String, data: String): String
 

+ 1 - 1
library_core/src/main/java/cn/yyxx/eyuangame/core/network/Host.kt

@@ -10,7 +10,7 @@ import cn.yyxx.support.HostModelUtils
 object Host {
 
     private const val DEFAULT_ONLINE_HOST = "https://sdkapi.eyuangame.com"
-    private const val DEFAULT_TEST_HOST = "http://testsdkapi.eyuangame.com"
+    private const val DEFAULT_TEST_HOST = "https://testsdkapi.eyuangame.com"
 
     var HOST = ""
 

+ 1 - 0
library_core/src/main/java/cn/yyxx/eyuangame/core/network/VolleyRequest.kt

@@ -50,6 +50,7 @@ object VolleyRequest {
             val obj = JSONObject()
             obj.put("p", p)
             obj.put("ts", rawKey)
+            Logger.d("$obj")
             //TODO 拉起登录接口时会莫名其妙ANR,后续再排查
 //            val json = SdkDrive.invokeJob(context, jsonObject.toString())
 //            val obj = JSONObject(json)

二進制
libs/eyuangamesdk_base_1.0.0.jar


+ 1 - 1
tutorial.md

@@ -39,7 +39,7 @@ android.enableJetifier=true
 
 > 在应用级**`build.gradle`**文件下的**`allprojects`**节点下添加仓库的url
 ```groovy
-	implementation 'io.github.yyxxgame.sdk:eyuangame-sdk-ktx:1.0.0-alpha2'
+	implementation 'io.github.yyxxgame.sdk:eyuangame-sdk-ktx:1.0.0'
 ```