Jelajahi Sumber

v1.0.0开发:UI优化

maijinpei 3 tahun lalu
induk
melakukan
f938e053d2
25 mengubah file dengan 842 tambahan dan 145 penghapusan
  1. 1 0
      demo/build.gradle
  2. 34 18
      demo/src/main/java/com/demo/xinrui/CacheRoleInfo.kt
  3. 122 17
      demo/src/main/java/com/demo/xinrui/DemoActivity.kt
  4. 1 7
      library_xinrui/build.gradle
  5. 14 0
      library_xinrui/src/main/AndroidManifest.xml
  6. 1 1
      library_xinrui/src/main/java/com/yyrh/Version.java
  7. 16 0
      library_xinrui/src/main/java/com/yyrh/core/entity/SdkBackLoginInfo.java
  8. 207 0
      library_xinrui/src/main/java/com/yyrh/core/impl/HybridActivity.java
  9. 0 10
      library_xinrui/src/main/java/com/yyrh/core/impl/charge/InAppBillingActivity.java
  10. 24 1
      library_xinrui/src/main/java/com/yyrh/core/impl/floatball/FloatCenterService.java
  11. 9 2
      library_xinrui/src/main/java/com/yyrh/core/impl/floatball/FloatCenterServiceManager.java
  12. 68 6
      library_xinrui/src/main/java/com/yyrh/core/impl/login/LoginViewModel.java
  13. 12 0
      library_xinrui/src/main/java/com/yyrh/core/internal/IJsFeature.java
  14. 2 2
      library_xinrui/src/main/java/com/yyrh/core/network/Host.java
  15. 71 0
      library_xinrui/src/main/java/com/yyrh/core/network/SdkJsImpl.java
  16. 89 0
      library_xinrui/src/main/java/com/yyrh/core/network/SdkRequest.java
  17. 1 1
      library_xinrui/src/main/java/com/yyrh/factory/ChannelSdkOperation.java
  18. 1 1
      library_xinrui/src/main/java/com/yyrh/factory/ISdkOperation.java
  19. 25 10
      library_xinrui/src/main/java/com/yyrh/factory/SdkManager.java
  20. 44 4
      library_xinrui/src/main/java/com/yyrh/factory/YyrhSdkOperation.java
  21. 58 57
      library_xinrui/src/main/java/com/yyrh/sdk/SDKEntry.java
  22. 1 3
      library_xinrui/src/main/java/com/yyrh/sdk/YyrhSdkManager.java
  23. 3 4
      library_xinrui/src/main/java/com/yyrh/ui/dialog/WvPayYyrhDialog.java
  24. 37 0
      library_xinrui/src/main/res/layout/hnyy_hybrid.xml
  25. 1 1
      library_xinrui/src/main/res/layout/hnyy_tips_dialog.xml

+ 1 - 0
demo/build.gradle

@@ -47,6 +47,7 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
+
     lintOptions {
         abortOnError false
     }

+ 34 - 18
demo/src/main/java/com/demo/xinrui/CacheRoleInfo.kt

@@ -2,6 +2,7 @@ package com.demo.xinrui
 
 import android.content.Context
 import android.text.TextUtils
+import com.yyrh.utils.YYLog
 import org.json.JSONException
 import org.json.JSONObject
 
@@ -11,11 +12,12 @@ import org.json.JSONObject
  */
 class CacheRoleInfo {
 
-
     data class RoleInfo(
         var roleId: String = "", var roleName: String = "", var roleLevel: String = "",
-        var serverCode: String = "", var serverName: String = "", var vipLevel: String = "",
-        var balance: String = "", var totalPurchase: Int = 0, var roleCTime: Long = 0
+        var rolePower: String = "", var balance: String = "", var vipLevel: String = "",
+        var serverId: String = "", var serverName: String = "", var partyId: String = "",
+        var partyName: String = "", var reincarnationCount: String = "0", var totalPurchase: String = "0",
+        var roleCTime: String = "", var gender: String = "男"
     ) {
 
 
@@ -25,12 +27,17 @@ class CacheRoleInfo {
                 jsonObject.put("role_id", roleId)
                 jsonObject.put("role_name", roleName)
                 jsonObject.put("role_level", roleLevel)
-                jsonObject.put("server_code", serverCode)
-                jsonObject.put("server_name", serverName)
-                jsonObject.put("vip_level", vipLevel)
+                jsonObject.put("role_power", rolePower)
                 jsonObject.put("balance", balance)
+                jsonObject.put("vip_level", vipLevel)
+                jsonObject.put("server_id", serverId)
+                jsonObject.put("server_name", serverName)
+                jsonObject.put("party_id", partyId)
+                jsonObject.put("party_name", partyName)
+                jsonObject.put("reincarnation_count", reincarnationCount)
                 jsonObject.put("total_purchase", totalPurchase)
                 jsonObject.put("role_ctime", roleCTime)
+                jsonObject.put("gender", gender)
                 return jsonObject.toString()
             } catch (e: JSONException) {
                 e.printStackTrace()
@@ -40,19 +47,23 @@ class CacheRoleInfo {
     }
 
     companion object {
-
         fun setDemoRoleInfo(context: Context, userId: String): RoleInfo {
-            val ts = System.currentTimeMillis() / 1000
+            val ts = (System.currentTimeMillis() / 1000).toString()
             val roleInfo = RoleInfo(
                 roleId = "aaa$ts",
                 roleName = "角色名123",
                 roleLevel = "110",
-                serverCode = "333",
-                serverName = "服务器名333",
-                vipLevel = "1",
+                rolePower = "战力123456",
                 balance = "600",
-                totalPurchase = 0,
-                roleCTime = ts
+                vipLevel = "1",
+                serverId = "333",
+                serverName = "服务器名333",
+                partyId = "party_1234",
+                partyName = "帮派1234",
+                reincarnationCount = "0",
+                totalPurchase = "0",
+                roleCTime = ts,
+                gender = "男"
             )
             val info = roleInfo.toJsonString()
             val sp = context.getSharedPreferences("app_role_info", Context.MODE_PRIVATE)
@@ -75,12 +86,17 @@ class CacheRoleInfo {
                         roleId = jsonObject.getString("role_id"),
                         roleName = jsonObject.getString("role_name"),
                         roleLevel = jsonObject.getString("role_level"),
-                        serverCode = jsonObject.getString("server_code"),
-                        serverName = jsonObject.getString("server_name"),
-                        vipLevel = jsonObject.getString("vip_level"),
+                        rolePower = jsonObject.getString("role_power"),
                         balance = jsonObject.getString("balance"),
-                        totalPurchase = jsonObject.getInt("total_purchase"),
-                        roleCTime = jsonObject.getLong("role_ctime")
+                        vipLevel = jsonObject.getString("vip_level"),
+                        serverId = jsonObject.getString("server_id"),
+                        serverName = jsonObject.getString("server_name"),
+                        partyId = jsonObject.getString("party_id"),
+                        partyName = jsonObject.getString("party_name"),
+                        reincarnationCount = jsonObject.getString("reincarnation_count"),
+                        totalPurchase = jsonObject.getString("total_purchase"),
+                        roleCTime = jsonObject.getString("role_ctime"),
+                        gender = jsonObject.getString("gender")
                     )
                 }
 

+ 122 - 17
demo/src/main/java/com/demo/xinrui/DemoActivity.kt

@@ -8,16 +8,17 @@ import android.os.Looper
 import android.os.Message
 import android.view.KeyEvent
 import android.view.View
-import android.widget.Button
-import android.widget.LinearLayout
-import android.widget.ScrollView
-import android.widget.TextView
+import android.widget.*
 import cn.yyxx.support.hawkeye.LogUtils
 import cn.yyxx.support.hawkeye.ToastUtils
+import com.yyrh.constant.Constants
+import com.yyrh.constant.RoleInfo
+import com.yyrh.core.impl.HybridActivity
 import com.yyrh.sdk.SDKEntry
 import com.yyrh.sdk.callback.InitCallback
 import com.yyrh.sdk.callback.LoginCallback
 import com.yyrh.sdk.callback.LogoutCallback
+import com.yyrh.sdk.callback.PayCallback
 import kotlin.system.exitProcess
 
 /**
@@ -32,18 +33,21 @@ class DemoActivity : Activity(), View.OnClickListener {
         Item(3, "03 角色创建上报"),
         Item(4, "04 角色登录上报"),
         Item(5, "05 角色升级上报"),
-        Item(6, "06 测试测试"),
+        Item(6, "06 定额支付"),
         Item(7, "07 测试测试"),
     )
 
     private lateinit var layout: LinearLayout
-    private lateinit var mTextView: TextView
+    private lateinit var textView: TextView
+    private lateinit var editText: EditText
+
+    private var cacheRoleInfo: CacheRoleInfo.RoleInfo? = null
 
     private val handler = object : Handler(Looper.getMainLooper()) {
         override fun handleMessage(msg: Message) {
             when (msg.what) {
                 10001 -> {
-                    with(mTextView) {
+                    with(textView) {
                         text = text.toString() + msg.obj.toString()
                     }
                 }
@@ -58,6 +62,31 @@ class DemoActivity : Activity(), View.OnClickListener {
         SDKEntry.getSdkInstance().initSdk(this, object : InitCallback {
             override fun onInitSuccess(msg: String?) {
                 ToastUtils.toastInfo(this@DemoActivity, "onInitSuccess: $msg")
+
+                // 初始化成功后才设置回调
+                SDKEntry.getSdkInstance().setSDKLogoutListener(this@DemoActivity, object : LogoutCallback {
+                    override fun onLogoutSuccess() {
+                        ToastUtils.toastInfo(this@DemoActivity, "onLogoutSuccess")
+                        SDKEntry.getSdkInstance().login(this@DemoActivity, object : LoginCallback {
+                            override fun onLoginSuccess(token: String?) {
+                                ToastUtils.toastInfo(this@DemoActivity, "登录成功,token: $token")
+                                cacheRoleInfo = CacheRoleInfo.getDemoRoleInfo(this@DemoActivity, SDKEntry.getSdkInstance().currentUserId)
+                            }
+
+                            override fun onLoginFailed(msg: String?) {
+                                ToastUtils.toastInfo(this@DemoActivity, "登录失败,msg: $msg")
+                            }
+
+                            override fun onLoginError(msg: String?) {
+                                ToastUtils.toastInfo(this@DemoActivity, "登录失败,msg: $msg")
+                            }
+                        })
+                    }
+
+                    override fun onLogoutFailed() {
+                        ToastUtils.toastInfo(this@DemoActivity, "onLogoutFailed")
+                    }
+                })
             }
 
             override fun onInitFailed(msg: String?) {
@@ -77,23 +106,15 @@ class DemoActivity : Activity(), View.OnClickListener {
             }
         }, true)
 
-        SDKEntry.getSdkInstance().setSDKLogoutListener(this, object : LogoutCallback {
-            override fun onLogoutSuccess() {
-                ToastUtils.toastInfo(this@DemoActivity, "onLogoutSuccess")
-            }
 
-            override fun onLogoutFailed() {
-                ToastUtils.toastInfo(this@DemoActivity, "onLogoutFailed")
-            }
-        })
     }
 
     private fun initView() {
         layout = LinearLayout(this)
         layout.orientation = LinearLayout.VERTICAL
         initButton()
-        mTextView = TextView(this)
-        with(mTextView) {
+        textView = TextView(this)
+        with(textView) {
             text = ""
             this@DemoActivity.layout.addView(this)
         }
@@ -111,6 +132,11 @@ class DemoActivity : Activity(), View.OnClickListener {
                 setOnClickListener(this@DemoActivity)
                 this@DemoActivity.layout.addView(this)
             }
+            if (event.id == 6) {
+                editText = EditText(this)
+                editText.hint = "请输入金额,单位分"
+                this.layout.addView(editText)
+            }
         }
     }
 
@@ -121,6 +147,7 @@ class DemoActivity : Activity(), View.OnClickListener {
                     SDKEntry.getSdkInstance().login(this@DemoActivity, object : LoginCallback {
                         override fun onLoginSuccess(token: String?) {
                             ToastUtils.toastInfo(this@DemoActivity, "登录成功,token: $token")
+                            cacheRoleInfo = CacheRoleInfo.getDemoRoleInfo(this@DemoActivity, SDKEntry.getSdkInstance().currentUserId)
                         }
 
                         override fun onLoginFailed(msg: String?) {
@@ -138,6 +165,7 @@ class DemoActivity : Activity(), View.OnClickListener {
                     SDKEntry.getSdkInstance().login(this@DemoActivity, object : LoginCallback {
                         override fun onLoginSuccess(token: String?) {
                             ToastUtils.toastInfo(this@DemoActivity, "登录成功,token: $token")
+                            cacheRoleInfo = CacheRoleInfo.getDemoRoleInfo(this@DemoActivity, SDKEntry.getSdkInstance().currentUserId)
                         }
 
                         override fun onLoginFailed(msg: String?) {
@@ -149,10 +177,87 @@ class DemoActivity : Activity(), View.OnClickListener {
                         }
                     })
                 }
+                3 -> {
+                    cacheRoleInfo = null
+                    cacheRoleInfo = CacheRoleInfo.setDemoRoleInfo(this@DemoActivity, SDKEntry.getSdkInstance().currentUserId)
+                    SDKEntry.getSdkInstance().upLoadRoleInfo(Constants.UPLOADTYPE_CREATEROLE, this@DemoActivity, getGameRoleInfo())
+                }
+                4 -> SDKEntry.getSdkInstance().upLoadRoleInfo(Constants.UPLOADTYPE_ENTERGAME, this@DemoActivity, getGameRoleInfo())
+                5 -> SDKEntry.getSdkInstance().upLoadRoleInfo(Constants.UPLOADTYPE_LEVELUP, this@DemoActivity, getGameRoleInfo())
+                6 -> {
+                    val order = HashMap<String, String>()
+                    order["role_id"] = cacheRoleInfo?.roleId!!
+                    order["role_name"] = getGameRoleInfo().roleName
+                    order["role_level"] = getGameRoleInfo().roleLevel
+                    order["server_id"] = getGameRoleInfo().serverId
+                    order["server_name"] = getGameRoleInfo().serverName
+                    order["role_id"] = getGameRoleInfo().roleId
+                    order["role_id"] = getGameRoleInfo().roleId
+
+                    SDKEntry.getSdkInstance().pay(getChargeInfo(), object : PayCallback {
+                        override fun onPaySuccess(msg: String?) {
+                        }
+
+                        override fun onPayFailed(msg: String?) {
+                        }
+                    }, this@DemoActivity)
+                }
+                7 -> {
+                    val url =
+                        "http://testsdkapi.yyxxgame.com/wap_v1/pay.html?product_money=0.01&pmode=d2VpeGluaDV8d3h85b6u5L%2Bh5pSv5LuYI2FsaXBheXdhcHx6ZmJ85pSv5LuY5a6d&params=6478a55c41adf093bf7014cc9b152522f55c37056f0903c23e7500a64bcdee5acbf591df01bdb646677de4521a83df58&product_name=%E8%B4%AD%E4%B9%B010%E5%85%83%E5%AE%9D"
+
+                    HybridActivity.start(this@DemoActivity, url)
+                }
             }
         }
     }
 
+    private fun getGameRoleInfo(): RoleInfo {
+        val roleInfo = RoleInfo()
+        cacheRoleInfo?.apply {
+            roleInfo.roleId = roleId
+            roleInfo.roleName = roleName
+            roleInfo.roleLevel = roleLevel
+            roleInfo.gender = gender
+            roleInfo.serverId = serverId
+            roleInfo.serverName = serverName
+            roleInfo.hasGold = balance
+            roleInfo.vipLevel = vipLevel
+            roleInfo.rolePower = rolePower
+            roleInfo.partyId = partyId
+            roleInfo.partyName = partyName
+            roleInfo.roleCreateTime = roleCTime
+            roleInfo.reincarnationCount = reincarnationCount
+            roleInfo.charge = totalPurchase
+        }
+        return roleInfo
+    }
+
+    private fun getChargeInfo(): HashMap<String, Any> {
+        val order = HashMap<String, Any>()
+        val ts = System.currentTimeMillis() / 1000
+        cacheRoleInfo?.apply {
+            order["role_id"] = roleId
+            order["role_name"] = roleName
+            order["role_level"] = roleLevel
+            order["server_id"] = serverId
+            order["server_name"] = serverName
+            order["game_no"] = "order_id_$ts"
+            order["pay_money"] = editText.text.toString()
+            order["order_desc"] = "购买60元宝"
+            order["order_name"] = "60元宝"
+            order["product_name"] = "元宝"
+            order["productId"] = "测试商品ID"
+            order["ext"] = "callback_order_id_$ts"
+            order["vip_level"] = vipLevel
+            order["count"] = "60"
+            order["radio"] = "10"
+            order["reincarnationCount"] = reincarnationCount
+            order["hasGold"] = balance
+        }
+        return order
+    }
+
     override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
         if (keyCode == KeyEvent.KEYCODE_BACK) {
             SDKEntry.getSdkInstance().exitGame(this) {

+ 1 - 7
library_xinrui/build.gradle

@@ -10,12 +10,6 @@ android {
         minSdkVersion rootProject.ext.android.minSdkVersion
         targetSdkVersion rootProject.ext.android.targetSdkVersion
 
-        externalNativeBuild {
-            cmake {
-                cppFlags '-std=c++11 -frtti -fexceptions -lz'
-                abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
-            }
-        }
         externalNativeBuild {
             cmake {
                 cppFlags '-std=c++11 -frtti -fexceptions -lz'
@@ -36,7 +30,7 @@ android {
     buildTypes {
         release {
             minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+            proguardFiles  'proguard-rules.pro'
         }
     }
 

+ 14 - 0
library_xinrui/src/main/AndroidManifest.xml

@@ -12,6 +12,12 @@
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
     <uses-permission android:name="android.permission.BLUETOOTH" />
 
+    <!-- 适配Android 11 上软件包可见性被屏蔽导致无法跳转第三方应用 -->
+    <queries>
+        <!-- wx -->
+        <package android:name="com.tencent.mm" />
+    </queries>
+
     <application
         android:allowBackup="true"
         android:allowNativeHeapPointerTagging="false"
@@ -29,6 +35,14 @@
         <service
             android:name="com.yyrh.core.impl.floatball.FloatCenterService"
             android:exported="true" />
+
+        <activity
+            android:name="com.yyrh.core.impl.HybridActivity"
+            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
+            android:imeOptions="flagNoFullscreen|flagNoExtractUi"
+            android:launchMode="singleTask"
+            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
+            android:windowSoftInputMode="adjustResize|stateHidden|stateVisible" />
     </application>
 
 </manifest>

+ 1 - 1
library_xinrui/src/main/java/com/yyrh/Version.java

@@ -1,5 +1,5 @@
 package com.yyrh;
 
 public class Version {
-    public static final String VERSION_NAME = "1.0.0";
+    public static final String VERSION_NAME = "2.2.8";
 }

+ 16 - 0
library_xinrui/src/main/java/com/yyrh/core/entity/SdkBackLoginInfo.java

@@ -7,10 +7,12 @@ package com.yyrh.core.entity;
 public class SdkBackLoginInfo {
 
     public String userId = "";
+    public String userName = "";
     public boolean isRegUser = false;
     public boolean isRealName = false;
     public String userCenterUrl = "";
     public String realNameUrl = "";
+    public boolean hideFloatCenter = false;
 
     private volatile static SdkBackLoginInfo INSTANCE = null;
 
@@ -27,9 +29,23 @@ public class SdkBackLoginInfo {
 
     public void reset() {
         this.userId = "";
+        this.userName = "";
         this.isRegUser = false;
         this.isRealName = false;
         this.userCenterUrl = "";
         this.realNameUrl = "";
+        this.hideFloatCenter = false;
+    }
+
+    @Override
+    public String toString() {
+        return "SdkBackLoginInfo{" +
+                "userId='" + userId + '\'' +
+                ", userName='" + userName + '\'' +
+                ", isRegUser=" + isRegUser +
+                ", isRealName=" + isRealName +
+                ", userCenterUrl='" + userCenterUrl + '\'' +
+                ", realNameUrl='" + realNameUrl + '\'' +
+                '}';
     }
 }

+ 207 - 0
library_xinrui/src/main/java/com/yyrh/core/impl/HybridActivity.java

@@ -0,0 +1,207 @@
+package com.yyrh.core.impl;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Color;
+import android.net.Uri;
+import android.net.http.SslError;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.view.WindowManager;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.webkit.CookieSyncManager;
+import android.webkit.SslErrorHandler;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.ImageView;
+
+import com.yyrh.Version;
+import com.yyrh.core.internal.IJsFeature;
+import com.yyrh.core.network.SdkJsImpl;
+import com.yyrh.factory.SdkManager;
+import com.yyrh.utils.YYLog;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import cn.yyxx.support.AndroidBug5497Workaround;
+import cn.yyxx.support.AppUtils;
+import cn.yyxx.support.ResUtils;
+import cn.yyxx.support.device.DeviceInfoUtils;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/22
+ */
+public class HybridActivity extends Activity {
+
+    private ImageView ivLoading, ivClose;
+    private WebView webView;
+    private Animation rotateAnimation;
+    private static String mUrl = "";
+    private final IJsFeature feature = new IJsFeature() {
+        @Override
+        public void onJsInvoke(int feature, String data) {
+            YYLog.d("feature: " + feature + " ,data: " + data);
+            switch (feature) {
+                case SdkJsImpl.SdkJsFeature.FEATURE_CLOSE:
+                    HybridActivity.this.finish();
+                    break;
+                case SdkJsImpl.SdkJsFeature.FEATURE_ZF_ORDER:
+                    YYLog.i("order: " + data);
+                    break;
+                case SdkJsImpl.SdkJsFeature.FEATURE_SWITCH_ACCOUNT:
+                    SdkManager.defaultManager().logOut();
+                    break;
+            }
+        }
+
+        @Override
+        public String onJsCallback(int feature, String data) {
+            if (feature == SdkJsImpl.SdkJsFeature.FEATURE_WEB_EXT) {
+                JSONObject jsonObject = new JSONObject();
+                try {
+                    if (SdkManager.defaultManager().isLandscape) {
+                        jsonObject.put("orientation", "landscape");
+                    } else {
+                        jsonObject.put("orientation", "portrait");
+                    }
+                    jsonObject.put("version", Version.VERSION_NAME);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                return jsonObject.toString();
+            }
+            return "";
+        }
+    };
+
+
+    public static void start(Activity activity, String url) {
+        mUrl = url;
+        activity.startActivity(new Intent(activity, HybridActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        initView();
+        initWebView();
+    }
+
+    private void initView() {
+        if (SdkManager.defaultManager().isLandscape) {
+            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
+        }
+        setContentView(ResUtils.getResId(this, "hnyy_hybrid", "layout"));
+
+        if (!SdkManager.defaultManager().isLandscape) {
+            AndroidBug5497Workaround.assistActivity(this);
+        }
+
+        ivLoading = findViewById(ResUtils.getResId(this, "hnyy_iv_loading", "id"));
+        rotateAnimation = AnimationUtils.loadAnimation(this, ResUtils.getResId(this, "hnyy_rotate_anim", "anim"));
+        ivLoading.startAnimation(rotateAnimation);
+
+        ivClose = findViewById(ResUtils.getResId(this, "hnyy_iv_close", "id"));
+        ivClose.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                HybridActivity.this.finish();
+            }
+        });
+
+        webView = findViewById(ResUtils.getResId(this, "hnyy_webview", "id"));
+    }
+
+    private void initWebView() {
+        webView.setVerticalScrollBarEnabled(true);
+        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
+        webView.addJavascriptInterface(new SdkJsImpl(feature), "yyrhsdk");
+        webView.setBackgroundColor(Color.TRANSPARENT);
+
+        WebSettings settings = webView.getSettings();
+        settings.setAllowFileAccess(true);
+        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
+        settings.setSupportZoom(true);
+        settings.setSaveFormData(true);
+        settings.setSavePassword(true);
+        settings.setBuiltInZoomControls(false);
+        settings.setUseWideViewPort(true);
+        settings.setSupportMultipleWindows(false);
+        settings.setAppCacheEnabled(true);
+        settings.setDomStorageEnabled(true);
+        settings.setJavaScriptEnabled(true);
+        settings.setGeolocationEnabled(true);
+        settings.setAppCacheMaxSize(Long.MAX_VALUE);
+        settings.setAppCachePath(this.getDir("appcache", 0).getPath());
+        settings.setDatabasePath(this.getDir("databases", 0).getPath());
+        settings.setGeolocationDatabasePath(this.getDir("geolocation", 0).getPath());
+        settings.setPluginState(WebSettings.PluginState.ON_DEMAND);
+        CookieSyncManager.createInstance(this);
+        CookieSyncManager.getInstance().sync();
+
+        if (DeviceInfoUtils.isNetworkConnected(this)) {
+            webView.loadUrl(mUrl);
+        } else {
+            webView.loadData("网络异常,请检查重试", "text/html; charset=UTF-8", null);
+        }
+
+        webView.setWebViewClient(new WebViewClient() {
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url) {
+                YYLog.d("url: " + url);
+                if (url.startsWith("http:") || url.startsWith("https:")) {
+                    if (!view.canGoBack()) {
+                        return false;
+                    }
+                    if (view.getHitTestResult().getType() == WebView.HitTestResult.UNKNOWN_TYPE) {
+                        return false;
+                    }
+                    view.loadUrl(url);
+                }
+                if (url.startsWith("weixin://wap/pay")) {
+                    if (AppUtils.isPackageInstalled(HybridActivity.this, "com.tencent.mm")) {
+                        try {
+                            startActivity(Intent.parseUri(url, Intent.URI_INTENT_SCHEME));
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    } else {
+                        webView.loadData("请先安装微信", "text/html;charset=UTF-8", null);
+                        return false;
+                    }
+                    return true;
+                }
+                if (url.startsWith("alipays://")) {
+                    try {
+                        startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(url)));
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    return true;
+                }
+                return false;
+            }
+
+            @Override
+            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+                super.onReceivedSslError(view, handler, error);
+            }
+        });
+
+        webView.setWebChromeClient(new WebChromeClient() {
+            @Override
+            public void onProgressChanged(WebView view, int newProgress) {
+                if (newProgress == 100 && ivLoading != null && ivLoading.getVisibility() == View.VISIBLE) {
+                    ivLoading.clearAnimation();
+                    ivLoading.setVisibility(View.GONE);
+                }
+            }
+        });
+    }
+}

+ 0 - 10
library_xinrui/src/main/java/com/yyrh/core/impl/charge/InAppBillingActivity.java

@@ -1,10 +0,0 @@
-package com.yyrh.core.impl.charge;
-
-import android.support.v4.app.FragmentActivity;
-
-/**
- * @author #Suyghur.
- * Created on 2021/10/20
- */
-public class InAppBillingActivity extends FragmentActivity {
-}

+ 24 - 1
library_xinrui/src/main/java/com/yyrh/core/impl/floatball/FloatCenterService.java

@@ -6,8 +6,11 @@ import android.content.Intent;
 import android.os.Binder;
 import android.os.IBinder;
 import android.support.annotation.Nullable;
+import android.text.TextUtils;
 import android.widget.ImageView;
 
+import com.yyrh.core.entity.SdkBackLoginInfo;
+import com.yyrh.core.impl.HybridActivity;
 import com.yyrh.factory.SdkManager;
 import com.yyrh.ui.floatview.FloatingBall;
 import com.yyrh.ui.floatview.FloatingBallMenu;
@@ -34,7 +37,9 @@ public class FloatCenterService extends Service {
         @Override
         public ArrayList<FloatingBallMenu.Item> onInitMenuData() {
             ArrayList<FloatingBallMenu.Item> items = new ArrayList<>();
-            items.add(new FloatingBallMenu.Item(FloatingBallMenu.FloatFeature.ACCOUNT_CENTER, ""));
+            if (!TextUtils.isEmpty(SdkBackLoginInfo.getInstance().userCenterUrl)) {
+                items.add(new FloatingBallMenu.Item(FloatingBallMenu.FloatFeature.ACCOUNT_CENTER, SdkBackLoginInfo.getInstance().userCenterUrl));
+            }
             items.add(new FloatingBallMenu.Item(FloatingBallMenu.FloatFeature.SWITCH_ACCOUNT, ""));
             items.add(new FloatingBallMenu.Item(FloatingBallMenu.FloatFeature.MENU_DISMISS, ""));
             return items;
@@ -42,7 +47,22 @@ public class FloatCenterService extends Service {
 
         @Override
         public void onMenuItemClick(FloatingBallMenu.Item item, int pos) {
+            switch (item.feature) {
+                case ACCOUNT_CENTER:
+                    HybridActivity.start(activity, SdkBackLoginInfo.getInstance().userCenterUrl);
+                    break;
+                case SWITCH_ACCOUNT:
+                    SdkManager.defaultManager().logOut();
+                    break;
+                case MENU_DISMISS:
+                    if (floatingBall != null) {
+                        floatingBall.dismissMenu();
+                    }
+                    SdkBackLoginInfo.getInstance().hideFloatCenter = true;
+                    detach();
+                    break;
 
+            }
         }
 
         @Override
@@ -71,6 +91,9 @@ public class FloatCenterService extends Service {
         if (activity == null) {
             return;
         }
+        if (SdkBackLoginInfo.getInstance().hideFloatCenter){
+            return;
+        }
         if (floatingBall == null) {
             floatingBall = new FloatingBall(activity, SdkManager.defaultManager().isLandscape, callback);
         }

+ 9 - 2
library_xinrui/src/main/java/com/yyrh/core/impl/floatball/FloatCenterServiceManager.java

@@ -6,7 +6,9 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
 import android.os.IBinder;
+import android.text.TextUtils;
 
+import com.yyrh.core.entity.SdkBackLoginInfo;
 import com.yyrh.core.impl.floatball.FloatCenterService.FloatCenterServiceBinder;
 import com.yyrh.utils.YYLog;
 
@@ -23,7 +25,7 @@ public class FloatCenterServiceManager {
     private Intent intent = null;
     private boolean isBindService = false;
 
-    private final ServiceConnection serviceConnection = new ServiceConnection() {
+    private ServiceConnection serviceConnection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder iBinder) {
             service = ((FloatCenterServiceBinder) iBinder).getService();
@@ -62,7 +64,11 @@ public class FloatCenterServiceManager {
             YYLog.e("浮标服务未初始化或发生异常");
             return;
         }
-        service.attach();
+        if (!TextUtils.isEmpty(SdkBackLoginInfo.getInstance().userId)) {
+            service.attach();
+        } else {
+            detach();
+        }
     }
 
     public void detach() {
@@ -83,6 +89,7 @@ public class FloatCenterServiceManager {
         }
         intent = null;
         activity = null;
+        serviceConnection = null;
     }
 
 }

+ 68 - 6
library_xinrui/src/main/java/com/yyrh/core/impl/login/LoginViewModel.java

@@ -44,7 +44,21 @@ public class LoginViewModel {
                         if (JsonUtils.hasJsonKey(jsonObject, "token")) {
                             token = jsonObject.getString("token");
                         }
+                        if (JsonUtils.hasJsonKey(jsonObject, "links")) {
+                            JSONObject links = jsonObject.getJSONObject("links");
+
+                            if (JsonUtils.hasJsonKey(links, "authentication")) {
+                                SdkBackLoginInfo.getInstance().realNameUrl = links.getString("authentication");
+                            }
+                            if (JsonUtils.hasJsonKey(links, "user_center")) {
+                                SdkBackLoginInfo.getInstance().userCenterUrl = links.getString("user_center");
+                            }
+                        }
+                        if (JsonUtils.hasJsonKey(jsonObject, "is_rn")) {
+                            SdkBackLoginInfo.getInstance().isRealName = jsonObject.getInt("is_rn") == 1;
+                        }
                         SdkBackLoginInfo.getInstance().userId = uid;
+                        SdkBackLoginInfo.getInstance().userName = userName;
                         session.userId = uid;
                         session.userName = userName;
                         session.pwd = pwd;
@@ -75,12 +89,36 @@ public class LoginViewModel {
                     try {
                         JSONObject jsonObject = new JSONObject(resultInfo.data);
                         Session session = new Session();
-                        session.userId = jsonObject.getString("channel_uid");
+                        String uid = "";
+                        String token = "";
+                        if (JsonUtils.hasJsonKey(jsonObject, "channel_uid")) {
+                            uid = jsonObject.getString("channel_uid");
+                        }
+                        if (JsonUtils.hasJsonKey(jsonObject, "token")) {
+                            token = jsonObject.getString("token");
+                        }
+                        if (JsonUtils.hasJsonKey(jsonObject, "links")) {
+                            JSONObject links = jsonObject.getJSONObject("links");
+
+                            if (JsonUtils.hasJsonKey(links, "authentication")) {
+                                SdkBackLoginInfo.getInstance().realNameUrl = links.getString("authentication");
+                            }
+                            if (JsonUtils.hasJsonKey(links, "user_center")) {
+                                SdkBackLoginInfo.getInstance().userCenterUrl = links.getString("user_center");
+                            }
+                        }
+                        if (JsonUtils.hasJsonKey(jsonObject, "is_rn")) {
+                            SdkBackLoginInfo.getInstance().isRealName = jsonObject.getInt("is_rn") == 1;
+                        }
+                        SdkBackLoginInfo.getInstance().userId = uid;
+                        SdkBackLoginInfo.getInstance().userName = userName;
+                        SdkBackLoginInfo.getInstance().isRegUser = true;
+                        session.userId = uid;
                         session.userName = userName;
                         session.pwd = pwd;
                         SessionUtils.getInstance().saveSession(session);
                         TipsToast.showSuccessMsg(activity, resultInfo.msg);
-                        callback.onSuccess(jsonObject.getString("token"));
+                        callback.onSuccess(token);
                         activity.finish();
                     } catch (JSONException e) {
                         e.printStackTrace();
@@ -98,7 +136,7 @@ public class LoginViewModel {
         });
     }
 
-    public void phoneRegister(final Activity activity, String phone, final String pwd, String captcha) {
+    public void phoneRegister(final Activity activity, final String phone, final String pwd, String captcha) {
         SdkRequest.phoneRegister(activity, phone, pwd, captcha, new IRequestCallback() {
             @Override
             public void onResponse(ResultInfo resultInfo) {
@@ -106,12 +144,36 @@ public class LoginViewModel {
                     try {
                         JSONObject jsonObject = new JSONObject(resultInfo.data);
                         Session session = new Session();
-                        session.userId = jsonObject.getString("channel_uid");
-                        session.userName = jsonObject.getString("uname");
+                        String uid = "";
+                        String token = "";
+                        if (JsonUtils.hasJsonKey(jsonObject, "channel_uid")) {
+                            uid = jsonObject.getString("channel_uid");
+                        }
+                        if (JsonUtils.hasJsonKey(jsonObject, "token")) {
+                            token = jsonObject.getString("token");
+                        }
+                        if (JsonUtils.hasJsonKey(jsonObject, "links")) {
+                            JSONObject links = jsonObject.getJSONObject("links");
+
+                            if (JsonUtils.hasJsonKey(links, "authentication")) {
+                                SdkBackLoginInfo.getInstance().realNameUrl = links.getString("authentication");
+                            }
+                            if (JsonUtils.hasJsonKey(links, "user_center")) {
+                                SdkBackLoginInfo.getInstance().userCenterUrl = links.getString("user_center");
+                            }
+                        }
+                        if (JsonUtils.hasJsonKey(jsonObject, "is_rn")) {
+                            SdkBackLoginInfo.getInstance().isRealName = jsonObject.getInt("is_rn") == 1;
+                        }
+                        SdkBackLoginInfo.getInstance().userId = uid;
+                        SdkBackLoginInfo.getInstance().userName = phone;
+                        SdkBackLoginInfo.getInstance().isRegUser = true;
+                        session.userId = uid;
+                        session.userName = phone;
                         session.pwd = pwd;
                         SessionUtils.getInstance().saveSession(session);
                         TipsToast.showSuccessMsg(activity, resultInfo.msg);
-                        callback.onSuccess(jsonObject.getString("token"));
+                        callback.onSuccess(token);
                         activity.finish();
                     } catch (JSONException e) {
                         e.printStackTrace();

+ 12 - 0
library_xinrui/src/main/java/com/yyrh/core/internal/IJsFeature.java

@@ -0,0 +1,12 @@
+package com.yyrh.core.internal;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/22
+ */
+public interface IJsFeature {
+
+    void onJsInvoke(int feature, String data);
+
+    String onJsCallback(int feature, String data);
+}

+ 2 - 2
library_xinrui/src/main/java/com/yyrh/core/network/Host.java

@@ -19,10 +19,10 @@ public class Host {
     public static final String BASIC_ROUTE_PHONE_SMS_LOGIN = "phone_sms_loin";
     public static final String BASIC_ROUTE_PHONE_RESET_PWD = "phone_reset_pwd";
     public static final String BASIC_ROUTE_REPORT_ROLE_INFO = "report_role_info";
-    public static final String BASIC_ROUTE_RECHARGE_INIT = "recharge_int";
+    public static final String BASIC_ROUTE_RECHARGE_INIT = "recharge_init";
     public static final String BASIC_ROUTE_REAL_NAME = "user_rn_record";
     public static final String BASIC_ROUTE_QUERY_ORDER = "order_query";
-    public static final String BASIC_ROUTE_INIT_AGREEMENT = "agreement_int";
+    public static final String BASIC_ROUTE_INIT_AGREEMENT = "agreement_init";
     public static final String BASIC_ROUTE_PAYMENT_WAY = "payment_way";
     public static int MODEL = 0;
 

+ 71 - 0
library_xinrui/src/main/java/com/yyrh/core/network/SdkJsImpl.java

@@ -0,0 +1,71 @@
+package com.yyrh.core.network;
+
+import android.webkit.JavascriptInterface;
+
+import com.yyrh.core.internal.IJsFeature;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/22
+ */
+public class SdkJsImpl {
+
+    private IJsFeature callback = null;
+
+    public SdkJsImpl(IJsFeature callback) {
+        this.callback = callback;
+    }
+
+    @JavascriptInterface
+    public void zfColse() {
+        callback.onJsInvoke(SdkJsFeature.FEATURE_CLOSE, "");
+    }
+
+    @JavascriptInterface
+    public void usrRn(String data) {
+        callback.onJsInvoke(SdkJsFeature.FEATURE_REAL_NAME, data);
+    }
+
+    @JavascriptInterface
+    public void showJsMsg(String data) {
+        callback.onJsInvoke(SdkJsFeature.FEATURE_SHOW_MSG, data);
+    }
+
+    @JavascriptInterface
+    public void modifyPwd(String data) {
+        callback.onJsInvoke(SdkJsFeature.FEATURE_MODIFY_PWD, data);
+    }
+
+
+    @JavascriptInterface
+    public void zfOrder(String data) {
+        callback.onJsInvoke(SdkJsFeature.FEATURE_ZF_ORDER, data);
+    }
+
+    @JavascriptInterface
+    public void openq0q0(String url) {
+        callback.onJsInvoke(SdkJsFeature.FEATURE_OPEN_0Q0, url);
+    }
+
+    @JavascriptInterface
+    public String webExt() {
+        return callback.onJsCallback(SdkJsFeature.FEATURE_WEB_EXT, "");
+    }
+
+    @JavascriptInterface
+    public void switchAccount() {
+        callback.onJsInvoke(SdkJsFeature.FEATURE_SWITCH_ACCOUNT, "");
+    }
+
+
+    public @interface SdkJsFeature {
+        int FEATURE_CLOSE = 1000;
+        int FEATURE_REAL_NAME = 1001;
+        int FEATURE_SHOW_MSG = 1002;
+        int FEATURE_MODIFY_PWD = 1003;
+        int FEATURE_ZF_ORDER = 1004;
+        int FEATURE_OPEN_0Q0 = 1005;
+        int FEATURE_WEB_EXT = 1006;
+        int FEATURE_SWITCH_ACCOUNT = 1007;
+    }
+}

+ 89 - 0
library_xinrui/src/main/java/com/yyrh/core/network/SdkRequest.java

@@ -1,12 +1,23 @@
 package com.yyrh.core.network;
 
 import android.content.Context;
+import android.text.TextUtils;
 
+import com.yyrh.constant.RoleInfo;
 import com.yyrh.core.SDKDrive;
+import com.yyrh.core.entity.ResultInfo;
+import com.yyrh.core.entity.SdkBackLoginInfo;
 import com.yyrh.core.internal.IRequestCallback;
+import com.yyrh.utils.ManifestUtils;
+import com.yyrh.utils.YYLog;
+import com.yythird.sdk.ChannelSDK;
 
 import org.json.JSONObject;
 
+import java.util.HashMap;
+
+import cn.yyxx.support.AppUtils;
+
 /**
  * @author #Suyghur.
  * Created on 2021/10/15
@@ -72,4 +83,82 @@ public final class SdkRequest {
         }
         VolleyRequest.post(context, jsonObject, callback);
     }
+
+
+    public static void submitRoleInfo(Context context, String type, RoleInfo roleInfo, IRequestCallback callback) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("report_role_type", type);
+            jsonObject.put("uname", SdkBackLoginInfo.getInstance().userName);
+            jsonObject.put("channel_uid", SdkBackLoginInfo.getInstance().userName);
+            jsonObject.put("role_id", roleInfo.getRoleId());
+            jsonObject.put("role_name", roleInfo.getRoleName());
+            jsonObject.put("role_level", roleInfo.getRoleLevel());
+            jsonObject.put("role_power", roleInfo.getRolePower());
+            jsonObject.put("role_gold", roleInfo.getHasGold());
+            jsonObject.put("server_id", roleInfo.getServerId());
+            jsonObject.put("server_name", roleInfo.getServerName());
+            jsonObject.put("party_id", roleInfo.getPartyId());
+            jsonObject.put("party_name", roleInfo.getPartyName());
+            jsonObject.put("vip_level", roleInfo.getVipLevel());
+            jsonObject.put("role_charge", roleInfo.getCharge());
+            jsonObject.put("role_ctime", roleInfo.getRoleCreateTime());
+            jsonObject.put("route_path", Host.BASIC_ROUTE_REPORT_ROLE_INFO);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        VolleyRequest.post(context, jsonObject, callback);
+    }
+
+    public static void createOrder(Context context, HashMap<String, Object> orderInfo, IRequestCallback callback) {
+        JSONObject jsonObject = new JSONObject();
+
+        String cpOrderId = (String) orderInfo.get("game_no");
+        String money = (String) orderInfo.get("pay_money");
+        String serverId = (String) orderInfo.get("server_id");
+        String serverName = (String) orderInfo.get("server_name");
+        String roleId = (String) orderInfo.get("role_id");
+        String roleLevel = (String) orderInfo.get("role_level");
+        String roleName = (String) orderInfo.get("role_name");
+        String ext = (String) orderInfo.get("ext");
+        String orderName = (String) orderInfo.get("order_name");
+        String productId = (String) orderInfo.get("productId");
+        String roleCTime = (String) orderInfo.get("role_ctime");
+
+        if (TextUtils.isEmpty(cpOrderId) || TextUtils.isEmpty(money) || TextUtils.isEmpty(serverId) || TextUtils.isEmpty(serverName)
+                || TextUtils.isEmpty(roleId) || TextUtils.isEmpty(roleName) || TextUtils.isEmpty(ext) || TextUtils.isEmpty(orderName)
+                || TextUtils.isEmpty(productId) || TextUtils.isEmpty(roleCTime) || TextUtils.isEmpty(roleLevel)) {
+            YYLog.e("下单参数有空值,请检查");
+            callback.onResponse(new ResultInfo());
+            return;
+        }
+        try {
+            String channelOrderExt = ChannelSDK.getInstance().SDKGetOrderExt();
+            if (!TextUtils.isEmpty(channelOrderExt)) {
+                jsonObject.put("sdk_params", channelOrderExt);
+            }
+            String orderExt = ManifestUtils.getMetaDataValue(context, "yyrh_order_ext");
+            if (!TextUtils.isEmpty(orderExt)) {
+                jsonObject.put("order_ext", orderExt);
+            }
+            jsonObject.put("uname", SdkBackLoginInfo.getInstance().userName);
+            jsonObject.put("channel_uid", SdkBackLoginInfo.getInstance().userId);
+            jsonObject.put("cp_order_id", cpOrderId);
+            jsonObject.put("money", money);
+            jsonObject.put("product_id", productId);
+            jsonObject.put("order_name", orderName);
+            jsonObject.put("server_id", serverId);
+            jsonObject.put("server_name", serverName);
+            jsonObject.put("role_id",roleId);
+            jsonObject.put("role_name",roleName);
+            jsonObject.put("role_level",roleLevel);
+            jsonObject.put("role_ctime",roleCTime);
+            jsonObject.put("ext",ext);
+            jsonObject.put("app_name", AppUtils.getAppName(context));
+            jsonObject.put("route_path",Host.BASIC_ROUTE_RECHARGE_INIT);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        VolleyRequest.post(context,jsonObject,callback);
+    }
 }

+ 1 - 1
library_xinrui/src/main/java/com/yyrh/factory/ChannelSdkOperation.java

@@ -84,7 +84,7 @@ public class ChannelSdkOperation implements ISdkOperation {
     public void pay(Activity activity, HashMap<String, Object> map) {
 
         if (SDKSettings.isThirdPay) {
-            channelSdk.SDKPay(activity, map, SDKEntry.getSdkInstance().sdkCallback);
+            channelSdk.SDKPay(activity, map, SdkManager.defaultManager().sdkCallback);
         } else {
             YyrhSdkManager.defaultManager().yyrhPay(activity, map);
         }

+ 1 - 1
library_xinrui/src/main/java/com/yyrh/factory/ISdkOperation.java

@@ -23,7 +23,7 @@ public interface ISdkOperation {
 
     void uploadRoleInfo(String type, Activity activity, RoleInfo roleInfo);
 
-    void setSDKLogoutListener(Activity ac, ChannelSdkCallback sdkCallback);
+    void setSDKLogoutListener(Activity activity, ChannelSdkCallback sdkCallback);
 
     void pay(Activity activity, HashMap<String, Object> map);
 

+ 25 - 10
library_xinrui/src/main/java/com/yyrh/factory/SdkManager.java

@@ -68,7 +68,7 @@ public class SdkManager {
     public boolean isLandscape = false;
     private static boolean hasReadIds = false;
     private static String deviceIds = "";
-    private boolean initState = false;
+    private String roleCTime = "";
 
 
     private final AtomicInteger timeCount = new AtomicInteger(0);
@@ -364,16 +364,16 @@ public class SdkManager {
 
     public void uploadRoleInfo(String type, Activity activity, RoleInfo roleInfo) {
         if (operation == null) {
-            YYLog.i("登录失败,SDK未初始化或初始化失败");
+            YYLog.i("上报角色信息失败,SDK未初始化或初始化失败");
             return;
         }
+        this.roleCTime = roleInfo.getRoleCreateTime();
         operation.uploadRoleInfo(type, activity, roleInfo);
-
     }
 
     public void reportAdEvent(String event, JSONObject json) {
         if (operation == null) {
-            YYLog.i("登录失败,SDK未初始化或初始化失败");
+            YYLog.i("上报广告事件失败,SDK未初始化或初始化失败");
             return;
         }
         operation.reportAdEvent(event, json);
@@ -381,13 +381,20 @@ public class SdkManager {
 
     public void pay(Activity activity, HashMap<String, Object> map) {
         if (operation == null) {
-            YYLog.i("登录失败,SDK未初始化或初始化失败");
+            YYLog.i("支付失败,SDK未初始化或初始化失败");
             return;
         }
-        operation.pay(activity, map);
+        map.put("role_ctime", roleCTime);
+        if (ChannelSDK.getInstance().SDKGetPstatus()) {
+            // 强制使用自己支付
+            forcePay(activity, map);
+        } else {
+            operation.pay(activity, map);
+        }
     }
 
-    public void forcePay(final Activity activity, HashMap<String, Object> map) {
+    private void forcePay(final Activity activity, HashMap<String, Object> map) {
+
         NetRequestApi.payOrderInit(PAYMENTWAY, map, activity, new PayOrderCallback() {
             @Override
             public void onPaySuccess(HashMap<String, Object> map) {
@@ -412,7 +419,7 @@ public class SdkManager {
 
     public void logOut() {
         if (operation == null) {
-            YYLog.i("登录失败,SDK未初始化或初始化失败");
+            YYLog.i("用户注销失败,SDK未初始化或初始化失败");
             return;
         }
         operation.logOut();
@@ -421,7 +428,7 @@ public class SdkManager {
     public void setSDKLogoutListener(Activity activity, LogoutCallback callback) {
         this.logoutCallback = callback;
         if (operation == null) {
-            YYLog.i("登录失败,SDK未初始化或初始化失败");
+            YYLog.i("设置用户注销回调失败,SDK未初始化或初始化失败");
             return;
         }
         operation.setSDKLogoutListener(activity, sdkCallback);
@@ -429,12 +436,20 @@ public class SdkManager {
 
     public void getRealNameInfo(Activity activity, RealNameMsgCallback realNameMsgCallback) {
         if (operation == null) {
-            YYLog.i("登录失败,SDK未初始化或初始化失败");
+            YYLog.i("获取实名信息失败,SDK未初始化或初始化失败");
             return;
         }
         operation.getRealNameInfo(activity, realNameMsgCallback);
     }
 
+    public String getCurrentUserId() {
+        if (operation == null) {
+            YYLog.i("获取用户ID失败,SDK未初始化或初始化失败");
+            return "";
+        }
+        return SdkBackLoginInfo.getInstance().userId;
+    }
+
     /**
      * 生命周期
      */

+ 44 - 4
library_xinrui/src/main/java/com/yyrh/factory/YyrhSdkOperation.java

@@ -4,13 +4,19 @@ import android.app.Activity;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.os.Bundle;
+import android.text.TextUtils;
 import android.view.View;
 
+import com.yyrh.constant.Constants;
 import com.yyrh.constant.RoleInfo;
+import com.yyrh.core.entity.ResultInfo;
 import com.yyrh.core.entity.SdkBackLoginInfo;
+import com.yyrh.core.impl.HybridActivity;
 import com.yyrh.core.impl.floatball.FloatCenterServiceManager;
 import com.yyrh.core.impl.login.LoginActivity;
 import com.yyrh.core.internal.IImplCallback;
+import com.yyrh.core.internal.IRequestCallback;
+import com.yyrh.core.network.SdkRequest;
 import com.yyrh.sdk.SDKEntry;
 import com.yyrh.sdk.YyrhSdkManager;
 import com.yyrh.sdk.callback.RealNameMsgCallback;
@@ -29,11 +35,15 @@ public class YyrhSdkOperation implements ISdkOperation {
     }
 
     @Override
-    public void login(Activity activity) {
+    public void login(final Activity activity) {
         LoginActivity.start(activity, true, SdkManager.defaultManager().isLandscape, new IImplCallback() {
             @Override
             public void onResult(int code, String result) {
                 if (code == 1) {
+                    // 拉起实名页面
+                    if (!SdkBackLoginInfo.getInstance().isRealName && !TextUtils.isEmpty(SdkBackLoginInfo.getInstance().realNameUrl)) {
+                        HybridActivity.start(activity, SdkBackLoginInfo.getInstance().realNameUrl);
+                    }
                     SdkManager.defaultManager().sdkCallback.onLoginSuccess(result);
                 } else {
                     SdkManager.defaultManager().sdkCallback.onLoginError(result);
@@ -44,18 +54,48 @@ public class YyrhSdkOperation implements ISdkOperation {
 
     @Override
     public void uploadRoleInfo(String type, Activity activity, RoleInfo roleInfo) {
+        String reportTime = "";
+        switch (type) {
+            case Constants.UPLOADTYPE_CREATEROLE:
+                reportTime = "createRole";
+                break;
+            case Constants.UPLOADTYPE_ENTERGAME:
+                reportTime = "enterGame";
+                break;
+            case Constants.UPLOADTYPE_LEVELUP:
+                reportTime = "roleUpgrade";
+                break;
+        }
+        SdkRequest.submitRoleInfo(activity, reportTime, roleInfo, new IRequestCallback() {
+            @Override
+            public void onResponse(ResultInfo resultInfo) {
 
+            }
+        });
     }
 
     @Override
-    public void setSDKLogoutListener(Activity ac, ChannelSdkCallback sdkCallback) {
+    public void setSDKLogoutListener(Activity activity, ChannelSdkCallback sdkCallback) {
 
     }
 
 
     @Override
-    public void pay(Activity activity, HashMap<String, Object> map) {
-        YyrhSdkManager.defaultManager().yyrhPay(activity, map);
+    public void pay(final Activity activity, HashMap<String, Object> map) {
+        SdkRequest.createOrder(activity, map, new IRequestCallback() {
+            @Override
+            public void onResponse(ResultInfo resultInfo) {
+                if (resultInfo.code == 1) {
+                    try {
+                        JSONObject jsonObject = new JSONObject(resultInfo.data);
+                        String url = jsonObject.getString("pay_web_url");
+                        HybridActivity.start(activity, url);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        });
     }
 
     @Override

+ 58 - 57
library_xinrui/src/main/java/com/yyrh/sdk/SDKEntry.java

@@ -8,6 +8,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.os.Bundle;
+import android.text.TextUtils;
 
 import com.yyrh.advertisement.AdSdkCallback;
 import com.yyrh.advertisement.AdvertiseManager;
@@ -360,44 +361,6 @@ public class SDKEntry {
         SdkManager.defaultManager().login(activity, callback);
     }
 
-    public void pay(final HashMap<String, Object> map, final PayCallback callback, final Activity activity) {
-        this.payCall = callback;
-        YYLog.i("payOrderInit");
-        map.put("role_ctime", this.role_ctime);
-
-
-        if (SDKSettings.loginData.uname.equals("")) {
-
-            new TosUtil(activity, TosUtil.TOAST_ERROR, activity.getString(ResourceUtil.getStringId(activity, "hnyy_login2pay"))).show();
-
-            return;
-        }
-
-        if (channelSDKImpl.SDKGetPstatus()) {
-            SdkManager.defaultManager().forcePay(activity, map);
-            return;
-        }
-        NetRequestApi.payOrderInit(RECHARGEINT, map, activity, new PayOrderCallback() {
-
-
-            @Override
-            public void onPaySuccess(HashMap<String, Object> map) {
-
-
-                adSdkCallback.onCreateOrder(map);
-                SdkManager.defaultManager().pay(activity, map);
-
-            }
-
-            @Override
-            public void onPayFailed(String msg) {
-                callback.onPayFailed(msg);
-            }
-
-        });
-    }
-
-
     public void setSDKLogoutListener(Activity activity, final LogoutCallback callback) {
         YYLog.i("setSDKLogoutListener");
         logoutCall = callback;
@@ -409,12 +372,6 @@ public class SDKEntry {
         SdkManager.defaultManager().logOut();
     }
 
-    public void exitGame(Activity activity, ExitCallback callback) {
-        YYLog.i("exitGame");
-        this.exitCall = callback;
-        SdkManager.defaultManager().exit(activity, callback);
-    }
-
     public void upLoadRoleInfo(String type, Activity activity, RoleInfo roleInfo) {
         YYLog.i("sdk uploadUserInfo");
 
@@ -433,33 +390,73 @@ public class SDKEntry {
         String partyId = roleInfo.getPartyId();
         String reincarnationCount = roleInfo.getReincarnationCount();
         String charge = roleInfo.getCharge();
-        if (Utils.judgeStrNull(charge)) {
+        if (TextUtils.isEmpty(charge)) {
             charge = "0";
         }
 
-        if (Utils.judgeStrNull(roleId) || Utils.judgeStrNull(roleName)
-                || Utils.judgeStrNull(roleLevel)
-                || Utils.judgeStrNull(gender)
-                || Utils.judgeStrNull(serverId)
-                || Utils.judgeStrNull(serverName)
-                || Utils.judgeStrNull(hasGold)
-                || Utils.judgeStrNull(vipLevel)
-                || Utils.judgeStrNull(roleCreateTime)
-                || Utils.judgeStrNull(role_power)
-                || Utils.judgeStrNull(reincarnationCount)) {
+        if (TextUtils.isEmpty(roleId)
+                || TextUtils.isEmpty(roleName)
+                || TextUtils.isEmpty(roleLevel)
+                || TextUtils.isEmpty(gender)
+                || TextUtils.isEmpty(serverId)
+                || TextUtils.isEmpty(serverName)
+                || TextUtils.isEmpty(hasGold)
+                || TextUtils.isEmpty(vipLevel)
+                || TextUtils.isEmpty(roleCreateTime)
+                || TextUtils.isEmpty(role_power)
+                || TextUtils.isEmpty(reincarnationCount)) {
 
             YYLog.i("上报参数有空值,请检查: " + roleInfo.getAllParam());
 
         } else {
             YYLog.i("游戏角色信息上报sdk相关参数: " + roleInfo.getAllParam());
 
-            YyrhSdkManager.defaultManager().uploadRoleInfo(type, activity, roleId, roleName, roleLevel, serverId, serverName, hasGold, vipLevel, role_power, partyId, partyName, roleCreateTime, charge);
             SdkManager.defaultManager().uploadRoleInfo(type, activity, roleInfo);
             adSdkCallback.onUpLoadRoleInfo(type, roleInfo);
-
         }
     }
 
+    public void pay(final HashMap<String, Object> map, final PayCallback callback, final Activity activity) {
+        this.payCall = callback;
+        YYLog.i("payOrderInit");
+
+        for (String key :map.keySet()){
+            YYLog.i("key: "+key+" ,value: "+map.get(key));
+        }
+
+        SdkManager.defaultManager().pay(activity,map);
+//
+//        if (channelSDKImpl.SDKGetPstatus()) {
+//            SdkManager.defaultManager().forcePay(activity, map);
+//            return;
+//        }
+//        NetRequestApi.payOrderInit(RECHARGEINT, map, activity, new PayOrderCallback() {
+//
+//
+//            @Override
+//            public void onPaySuccess(HashMap<String, Object> map) {
+//
+//
+//                adSdkCallback.onCreateOrder(map);
+//                SdkManager.defaultManager().pay(activity, map);
+//
+//            }
+//
+//            @Override
+//            public void onPayFailed(String msg) {
+//                callback.onPayFailed(msg);
+//            }
+//
+//        });
+    }
+
+    public void exitGame(Activity activity, ExitCallback callback) {
+        YYLog.i("exitGame");
+        this.exitCall = callback;
+        SdkManager.defaultManager().exit(activity, callback);
+    }
+
+
     public void reportAdEvent(String event, JSONObject json) {
         YYLog.i("game event :" + event + " and json: " + json.toString());
         SdkManager.defaultManager().reportAdEvent(event, json);
@@ -559,6 +556,10 @@ public class SDKEntry {
         YyrhSdkManager.defaultManager().yyrhShowPolicy(activity, userPolicyCallback);
     }
 
+    public String getCurrentUserId() {
+        return SdkManager.defaultManager().getCurrentUserId();
+    }
+
     private static final class SDKEntryHolder {
         private static final SDKEntry INSTANCE = new SDKEntry();
     }

+ 1 - 3
library_xinrui/src/main/java/com/yyrh/sdk/YyrhSdkManager.java

@@ -558,7 +558,6 @@ public class YyrhSdkManager {
             @Override
             public void run() {
                 new WvPayYyrhDialog(activity, ResourceUtil.getStyleId(activity, "hnyy_base_dialog"), url, map).show();
-
             }
         });
 
@@ -587,8 +586,7 @@ public class YyrhSdkManager {
         builder.Create().show();
     }
 
-    public void uploadRoleInfo(String type, Activity activity,
-                               String roleId, String roleName, String roleLevel, String serverId,
+    public void uploadRoleInfo(String type, Activity activity, String roleId, String roleName, String roleLevel, String serverId,
                                String serverName, String hasGold, String vipLevel, String role_power, String partyId, String partyName, String createTime, String charge) {
         NetRequestApi.upLoadingRoleInfo(type, activity, roleId, roleName, roleLevel, serverId,
                 serverName, hasGold, vipLevel, role_power, partyId, partyName, createTime, charge);

+ 3 - 4
library_xinrui/src/main/java/com/yyrh/ui/dialog/WvPayYyrhDialog.java

@@ -1,5 +1,7 @@
 package com.yyrh.ui.dialog;
 
+import static com.yyrh.constant.SDKSettings.isLandscape;
+
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
@@ -13,9 +15,8 @@ import android.webkit.WebViewClient;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
-
-import com.yyrh.ui.PageJsInteraction;
 import com.yyrh.sdk.YyrhSdkManager;
+import com.yyrh.ui.PageJsInteraction;
 import com.yyrh.utils.ResourceUtil;
 import com.yyrh.utils.TosUtil;
 import com.yyrh.utils.Utils;
@@ -25,8 +26,6 @@ import org.json.JSONObject;
 
 import java.util.HashMap;
 
-import static com.yyrh.constant.SDKSettings.isLandscape;
-
 
 public class WvPayYyrhDialog extends BaseDialog implements View.OnClickListener{
 

+ 37 - 0
library_xinrui/src/main/res/layout/hnyy_hybrid.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@android:color/transparent"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="300dp"
+        android:layout_marginLeft="20dp"
+        android:layout_marginRight="20dp"
+        android:background="@drawable/hnyy_container_white_bg"
+        android:padding="10dp">
+
+        <WebView
+            android:id="@+id/hnyy_webview"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_gravity="center" />
+
+        <ImageView
+            android:id="@+id/hnyy_iv_loading"
+            android:layout_width="40dp"
+            android:layout_height="40dp"
+            android:layout_gravity="center"
+            android:src="@drawable/hnyy_loading_img" />
+
+        <ImageView
+            android:id="@+id/hnyy_iv_close"
+            android:layout_width="18dp"
+            android:layout_height="18dp"
+            android:layout_gravity="top|right"
+            android:src="@drawable/hnyy_delete_img" />
+    </FrameLayout>
+</LinearLayout>

+ 1 - 1
library_xinrui/src/main/res/layout/hnyy_tips_dialog.xml

@@ -22,7 +22,7 @@
 
     <LinearLayout
         android:layout_width="match_parent"
-        android:layout_height="50dp"
+        android:layout_height="60dp"
         android:layout_marginBottom="20dp"
         android:gravity="center">