瀏覽代碼

v1.0.0开发:Demo页面开发

maijinpei 3 年之前
父節點
當前提交
9b4a79c1d4
共有 100 個文件被更改,包括 6725 次插入386 次删除
  1. 46 7
      demo/build.gradle
  2. 29 2
      demo/src/main/AndroidManifest.xml
  3. 2 0
      demo/src/main/assets/YyrhParam1.cnf
  4. 87 0
      demo/src/main/java/com/demo/xinrui/DemoActivity.java
  5. 22 0
      demo/src/main/java/com/demo/xinrui/DemoApplication.java
  6. 16 0
      demo/src/main/java/com/demo/xinrui/Item.java
  7. 93 0
      demo/src/main/java/com/demo/xinrui/WelcomeActivity.java
  8. 0 30
      demo/src/main/res/drawable-v24/ic_launcher_foreground.xml
  9. 二進制
      demo/src/main/res/drawable-xhdpi/yyxx_welcome.png
  10. 0 170
      demo/src/main/res/drawable/ic_launcher_background.xml
  11. 0 5
      demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  12. 0 5
      demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  13. 二進制
      demo/src/main/res/mipmap-hdpi/ic_launcher.webp
  14. 二進制
      demo/src/main/res/mipmap-hdpi/ic_launcher_round.webp
  15. 二進制
      demo/src/main/res/mipmap-mdpi/ic_launcher.webp
  16. 二進制
      demo/src/main/res/mipmap-mdpi/ic_launcher_round.webp
  17. 二進制
      demo/src/main/res/mipmap-xhdpi/ic_launcher.jpg
  18. 二進制
      demo/src/main/res/mipmap-xhdpi/ic_launcher.webp
  19. 二進制
      demo/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
  20. 二進制
      demo/src/main/res/mipmap-xxhdpi/ic_launcher.webp
  21. 二進制
      demo/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
  22. 二進制
      demo/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
  23. 二進制
      demo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
  24. 0 10
      demo/src/main/res/values-night/themes.xml
  25. 1 1
      demo/src/main/res/values/strings.xml
  26. 5 0
      demo/src/main/res/values/styles.xml
  27. 0 10
      demo/src/main/res/values/themes.xml
  28. 4 0
      keystore.properties
  29. 0 29
      library_channel/build.gradle
  30. 0 5
      library_channel/src/main/AndroidManifest.xml
  31. 0 1
      library_comm/.gitignore
  32. 0 29
      library_comm/build.gradle
  33. 0 0
      library_comm/consumer-rules.pro
  34. 0 21
      library_comm/proguard-rules.pro
  35. 0 5
      library_comm/src/main/AndroidManifest.xml
  36. 0 1
      library_core/.gitignore
  37. 0 29
      library_core/build.gradle
  38. 0 0
      library_core/consumer-rules.pro
  39. 0 21
      library_core/proguard-rules.pro
  40. 0 0
      library_xinrui/.gitignore
  41. 50 0
      library_xinrui/build.gradle
  42. 0 0
      library_xinrui/consumer-rules.pro
  43. 二進制
      library_xinrui/libs/android-support-v4.jar
  44. 二進制
      library_xinrui/libs/dolin_zap_1.0.0.jar
  45. 二進制
      library_xinrui/libs/mmkv-static-1.2.8.jar
  46. 二進制
      library_xinrui/libs/yyxx_support_1.0.1.jar
  47. 0 0
      library_xinrui/proguard-rules.pro
  48. 0 0
      library_xinrui/src/main/AndroidManifest.xml
  49. 0 5
      library_xinrui/src/main/java/com/yyrh/Version.java
  50. 33 0
      library_xinrui/src/main/java/com/yyrh/advertisement/AdSdkCallback.java
  51. 127 0
      library_xinrui/src/main/java/com/yyrh/advertisement/Advertise.java
  52. 56 0
      library_xinrui/src/main/java/com/yyrh/advertisement/AdvertiseFactory.java
  53. 114 0
      library_xinrui/src/main/java/com/yyrh/advertisement/AdvertiseManager.java
  54. 194 0
      library_xinrui/src/main/java/com/yyrh/behavior/ReportLogUtil.java
  55. 19 0
      library_xinrui/src/main/java/com/yyrh/constant/Constants.java
  56. 79 0
      library_xinrui/src/main/java/com/yyrh/constant/InitConfig.java
  57. 85 0
      library_xinrui/src/main/java/com/yyrh/constant/LoginData.java
  58. 162 0
      library_xinrui/src/main/java/com/yyrh/constant/RoleInfo.java
  59. 88 0
      library_xinrui/src/main/java/com/yyrh/constant/SDKSettings.java
  60. 43 0
      library_xinrui/src/main/java/com/yyrh/constant/URLConstants.java
  61. 252 0
      library_xinrui/src/main/java/com/yyrh/easypermission/EasyPermission.java
  62. 35 0
      library_xinrui/src/main/java/com/yyrh/easypermission/GrantResult.java
  63. 18 0
      library_xinrui/src/main/java/com/yyrh/easypermission/NextAction.java
  64. 24 0
      library_xinrui/src/main/java/com/yyrh/easypermission/NextActionType.java
  65. 88 0
      library_xinrui/src/main/java/com/yyrh/easypermission/Permission.java
  66. 198 0
      library_xinrui/src/main/java/com/yyrh/easypermission/PermissionRequestFragment.java
  67. 23 0
      library_xinrui/src/main/java/com/yyrh/easypermission/PermissionRequestListener.java
  68. 122 0
      library_xinrui/src/main/java/com/yyrh/easypermission/PermissionSettingPage.java
  69. 87 0
      library_xinrui/src/main/java/com/yyrh/easypermission/PermissionUtils.java
  70. 19 0
      library_xinrui/src/main/java/com/yyrh/easypermission/RequestPermissionRationalListener.java
  71. 175 0
      library_xinrui/src/main/java/com/yyrh/factory/ChannelSdkOperation.java
  72. 66 0
      library_xinrui/src/main/java/com/yyrh/factory/ISdkOperation.java
  73. 17 0
      library_xinrui/src/main/java/com/yyrh/factory/SdkFactory.java
  74. 164 0
      library_xinrui/src/main/java/com/yyrh/factory/SdkManager.java
  75. 128 0
      library_xinrui/src/main/java/com/yyrh/factory/YyrhSdkOperation.java
  76. 172 0
      library_xinrui/src/main/java/com/yyrh/imei/ImeiUtil.java
  77. 1117 0
      library_xinrui/src/main/java/com/yyrh/networking/NetRequestApi.java
  78. 256 0
      library_xinrui/src/main/java/com/yyrh/networking/urlhttp/CallBackUtil.java
  79. 243 0
      library_xinrui/src/main/java/com/yyrh/networking/urlhttp/RealRequest.java
  80. 15 0
      library_xinrui/src/main/java/com/yyrh/networking/urlhttp/RealResponse.java
  81. 244 0
      library_xinrui/src/main/java/com/yyrh/networking/urlhttp/RequestUtil.java
  82. 289 0
      library_xinrui/src/main/java/com/yyrh/networking/urlhttp/UrlHttpUtil.java
  83. 118 0
      library_xinrui/src/main/java/com/yyrh/pay/PaymentNotify.java
  84. 597 0
      library_xinrui/src/main/java/com/yyrh/sdk/SDKEntry.java
  85. 24 0
      library_xinrui/src/main/java/com/yyrh/sdk/SdkCallback.java
  86. 509 0
      library_xinrui/src/main/java/com/yyrh/sdk/YyrhSdkManager.java
  87. 5 0
      library_xinrui/src/main/java/com/yyrh/sdk/callback/ExitCallback.java
  88. 11 0
      library_xinrui/src/main/java/com/yyrh/sdk/callback/InitCallback.java
  89. 7 0
      library_xinrui/src/main/java/com/yyrh/sdk/callback/LoginCallback.java
  90. 6 0
      library_xinrui/src/main/java/com/yyrh/sdk/callback/LogoutCallback.java
  91. 6 0
      library_xinrui/src/main/java/com/yyrh/sdk/callback/PayCallback.java
  92. 11 0
      library_xinrui/src/main/java/com/yyrh/sdk/callback/PayOrderCallback.java
  93. 5 0
      library_xinrui/src/main/java/com/yyrh/sdk/callback/RealNameMsgCallback.java
  94. 6 0
      library_xinrui/src/main/java/com/yyrh/sdk/callback/RegisterCallback.java
  95. 8 0
      library_xinrui/src/main/java/com/yyrh/sdk/callback/ShowPolicyCallback.java
  96. 10 0
      library_xinrui/src/main/java/com/yyrh/sdk/callback/UserPolicyCallback.java
  97. 99 0
      library_xinrui/src/main/java/com/yyrh/ui/AccountLoginListView.java
  98. 41 0
      library_xinrui/src/main/java/com/yyrh/ui/MarqueTextView.java
  99. 95 0
      library_xinrui/src/main/java/com/yyrh/ui/NewProgressDialogUtils.java
  100. 60 0
      library_xinrui/src/main/java/com/yyrh/ui/PageJsInteraction.java

+ 46 - 7
demo/build.gradle

@@ -2,24 +2,64 @@ plugins {
     id 'com.android.application'
 }
 
+def keystorePropertiesFile = rootProject.file("keystore.properties")
+def keystoreProperties = new Properties()
+keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+
 android {
-    compileSdkVersion 30
+    compileSdkVersion rootProject.ext.android.compileSdkVersion
+    buildToolsVersion rootProject.ext.android.buildToolsVersion
 
     defaultConfig {
         applicationId "com.demo.xinrui"
-        minSdkVersion 16
-        targetSdkVersion 30
+        minSdkVersion rootProject.ext.android.minSdkVersion
+        targetSdkVersion rootProject.ext.android.targetSdkVersion
         versionCode 1
-        versionName "1.0"
+        versionName "1.0.0"
+        ndk {
+            // 设置支持的SO库架构
+            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
+        }
+    }
 
+    signingConfigs {
+        config {
+            keyAlias keystoreProperties['keyAlias']
+            keyPassword keystoreProperties['keyPassword']
+            storeFile file(keystoreProperties['storeFile'])
+            storePassword keystoreProperties['storePassword']
+            v1SigningEnabled true
+            v2SigningEnabled true
+        }
     }
 
     buildTypes {
+        debug {
+            minifyEnabled false
+            signingConfig signingConfigs.config
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+
         release {
             minifyEnabled false
+            signingConfig signingConfigs.config
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
+    lintOptions {
+        abortOnError false
+    }
+
+    repositories {
+        flatDir {
+            dirs 'libs'
+        }
+    }
+
+    dexOptions {
+        preDexLibraries = false
+    }
+
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
@@ -27,7 +67,6 @@ android {
 }
 
 dependencies {
-
-    implementation 'com.android.support:appcompat-v7:28.0.0'
-
+    implementation project(':library_xinrui')
+//    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
 }

+ 29 - 2
demo/src/main/AndroidManifest.xml

@@ -3,11 +3,38 @@
     package="com.demo.xinrui">
 
     <application
+        android:name=".DemoApplication"
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
-        android:roundIcon="@mipmap/ic_launcher_round"
+        android:requestLegacyExternalStorage="false"
+        android:resizeableActivity="false"
         android:supportsRtl="true"
-        android:theme="@style/Theme.XinRuiGameSdk" />
+        android:theme="@style/AppTheme">
+
+        <activity
+            android:name=".WelcomeActivity"
+            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
+            android:launchMode="standard"
+            android:screenOrientation="portrait"
+            android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:name=".DemoActivity"
+            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
+            android:exported="true"
+            android:launchMode="singleTask"
+            android:screenOrientation="sensorLandscape">
+            <intent-filter>
+                <action android:name="${applicationId}" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
 
 </manifest>

+ 2 - 0
demo/src/main/assets/YyrhParam1.cnf

@@ -0,0 +1,2 @@
+GCP_CODE=Y0201057
+CHANNELTAG=YYRHSDK

+ 87 - 0
demo/src/main/java/com/demo/xinrui/DemoActivity.java

@@ -0,0 +1,87 @@
+package com.demo.xinrui;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/14
+ */
+public class DemoActivity extends Activity implements View.OnClickListener {
+
+
+    private final List<Item> features = new ArrayList<Item>() {
+        {
+            add(new Item(1, "01 登录"));
+            add(new Item(2, "02 登出"));
+            add(new Item(3, "03 角色创建上报"));
+            add(new Item(4, "04 角色登录上报"));
+            add(new Item(5, "05 角色升级上报"));
+            add(new Item(6, "06 定额充值"));
+            add(new Item(7, "07 测试测试"));
+        }
+    };
+
+    private LinearLayout layout;
+    private TextView textView;
+
+    private final Handler handler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            if (msg.what == 10001) {
+                String text = textView.getText().toString();
+                textView.setText(text+msg.obj.toString());
+            }
+        }
+    };
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        initView();
+    }
+
+    private void initView() {
+        layout = new LinearLayout(this);
+        layout.setOrientation(LinearLayout.VERTICAL);
+
+        initButton();
+
+        textView = new TextView(this);
+        textView.setText("");
+        layout.addView(textView);
+
+        ScrollView scrollView = new ScrollView(this);
+        scrollView.addView(layout);
+        setContentView(scrollView);
+    }
+
+    private void initButton() {
+        for (Item item : features) {
+            Button button = new Button(this);
+            button.setText(item.name);
+            button.setId(item.id);
+            button.setTag(item.id);
+            button.setOnClickListener(this);
+            layout.addView(button);
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+
+    }
+}

+ 22 - 0
demo/src/main/java/com/demo/xinrui/DemoApplication.java

@@ -0,0 +1,22 @@
+package com.demo.xinrui;
+
+import android.content.Context;
+
+import com.yythird.sdk.YYRhApplication;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/14
+ */
+public class DemoApplication extends YYRhApplication {
+
+    @Override
+    protected void attachBaseContext(Context base) {
+        super.attachBaseContext(base);
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+    }
+}

+ 16 - 0
demo/src/main/java/com/demo/xinrui/Item.java

@@ -0,0 +1,16 @@
+package com.demo.xinrui;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/14
+ */
+public class Item {
+
+    public int id;
+    public String name;
+
+    public Item(int id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+}

+ 93 - 0
demo/src/main/java/com/demo/xinrui/WelcomeActivity.java

@@ -0,0 +1,93 @@
+package com.demo.xinrui;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.widget.LinearLayout;
+
+import com.yyrh.utils.YYLog;
+
+import cn.yyxx.support.ResUtils;
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/14
+ */
+public class WelcomeActivity extends Activity {
+
+    private static final int CODE_GO_INIT = 0x000003E8;
+    private static final int CODE_GO_GAME_ACTIVITY = 0x000003E9;
+
+    private final Handler handler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            switch (msg.what) {
+                case CODE_GO_INIT:
+                    goInit();
+                    break;
+                case CODE_GO_GAME_ACTIVITY:
+                    goGameActivity();
+                    break;
+            }
+        }
+    };
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        handler.sendEmptyMessageDelayed(CODE_GO_INIT, 400);
+    }
+
+    private void goInit() {
+        Animation animation = new AlphaAnimation(0.3f, 1.0f);
+        animation.setDuration(1500L);
+        animation.setAnimationListener(new Animation.AnimationListener() {
+            @Override
+            public void onAnimationStart(Animation animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animation animation) {
+                handler.sendEmptyMessage(CODE_GO_GAME_ACTIVITY);
+            }
+
+            @Override
+            public void onAnimationRepeat(Animation animation) {
+
+            }
+        });
+        setView(animation);
+    }
+
+    private void goGameActivity() {
+        YYLog.i("goGameActivity -> action = " + getPackageName());
+        startActivity(new Intent(getPackageName()));
+        finish();
+    }
+
+    private void setView(Animation animation) {
+        int id = 0;
+        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
+            id = ResUtils.getResId(this, "yyxx_welcome_land", "drawable");
+        } else {
+            id = ResUtils.getResId(this, "yyxx_welcome", "drawable");
+        }
+        if (id == 0) {
+            handler.sendEmptyMessage(CODE_GO_GAME_ACTIVITY);
+            return;
+        }
+        LinearLayout layout = new LinearLayout(this);
+        layout.setBackgroundResource(id);
+        layout.setAnimation(animation);
+        setContentView(layout);
+    }
+}

+ 0 - 30
demo/src/main/res/drawable-v24/ic_launcher_foreground.xml

@@ -1,30 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt"
-    android:width="108dp"
-    android:height="108dp"
-    android:viewportWidth="108"
-    android:viewportHeight="108">
-    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
-        <aapt:attr name="android:fillColor">
-            <gradient
-                android:endX="85.84757"
-                android:endY="92.4963"
-                android:startX="42.9492"
-                android:startY="49.59793"
-                android:type="linear">
-                <item
-                    android:color="#44000000"
-                    android:offset="0.0" />
-                <item
-                    android:color="#00000000"
-                    android:offset="1.0" />
-            </gradient>
-        </aapt:attr>
-    </path>
-    <path
-        android:fillColor="#FFFFFF"
-        android:fillType="nonZero"
-        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
-        android:strokeWidth="1"
-        android:strokeColor="#00000000" />
-</vector>

二進制
demo/src/main/res/drawable-xhdpi/yyxx_welcome.png


+ 0 - 170
demo/src/main/res/drawable/ic_launcher_background.xml

@@ -1,170 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="108dp"
-    android:height="108dp"
-    android:viewportWidth="108"
-    android:viewportHeight="108">
-    <path
-        android:fillColor="#3DDC84"
-        android:pathData="M0,0h108v108h-108z" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M9,0L9,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,0L19,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M29,0L29,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M39,0L39,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M49,0L49,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M59,0L59,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M69,0L69,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M79,0L79,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M89,0L89,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M99,0L99,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,9L108,9"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,19L108,19"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,29L108,29"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,39L108,39"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,49L108,49"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,59L108,59"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,69L108,69"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,79L108,79"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,89L108,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,99L108,99"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,29L89,29"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,39L89,39"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,49L89,49"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,59L89,59"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,69L89,69"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,79L89,79"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M29,19L29,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M39,19L39,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M49,19L49,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M59,19L59,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M69,19L69,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M79,19L79,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-</vector>

+ 0 - 5
demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
-    <background android:drawable="@drawable/ic_launcher_background" />
-    <foreground android:drawable="@drawable/ic_launcher_foreground" />
-</adaptive-icon>

+ 0 - 5
demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
-    <background android:drawable="@drawable/ic_launcher_background" />
-    <foreground android:drawable="@drawable/ic_launcher_foreground" />
-</adaptive-icon>

二進制
demo/src/main/res/mipmap-hdpi/ic_launcher.webp


二進制
demo/src/main/res/mipmap-hdpi/ic_launcher_round.webp


二進制
demo/src/main/res/mipmap-mdpi/ic_launcher.webp


二進制
demo/src/main/res/mipmap-mdpi/ic_launcher_round.webp


二進制
demo/src/main/res/mipmap-xhdpi/ic_launcher.jpg


二進制
demo/src/main/res/mipmap-xhdpi/ic_launcher.webp


二進制
demo/src/main/res/mipmap-xhdpi/ic_launcher_round.webp


二進制
demo/src/main/res/mipmap-xxhdpi/ic_launcher.webp


二進制
demo/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp


二進制
demo/src/main/res/mipmap-xxxhdpi/ic_launcher.webp


二進制
demo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp


+ 0 - 10
demo/src/main/res/values-night/themes.xml

@@ -1,10 +0,0 @@
-<resources xmlns:tools="http://schemas.android.com/tools">
-    <!-- Base application theme. -->
-    <style name="Theme.XinRuiGameSdk" parent="Theme.AppCompat.Light.DarkActionBar">
-        <!-- Primary brand color. -->
-        <item name="colorPrimary">@color/purple_200</item>
-        <item name="colorPrimaryDark">@color/purple_700</item>
-        <item name="colorAccent">@color/teal_200</item>
-        <!-- Customize your theme here. -->
-    </style>
-</resources>

+ 1 - 1
demo/src/main/res/values/strings.xml

@@ -1,3 +1,3 @@
 <resources>
-    <string name="app_name">demo</string>
+    <string name="app_name" translatable="false">XinRuiGameSdk</string>
 </resources>

+ 5 - 0
demo/src/main/res/values/styles.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="android:Theme.Light.NoTitleBar.Fullscreen" />
+</resources>

+ 0 - 10
demo/src/main/res/values/themes.xml

@@ -1,10 +0,0 @@
-<resources xmlns:tools="http://schemas.android.com/tools">
-    <!-- Base application theme. -->
-    <style name="Theme.XinRuiGameSdk" parent="Theme.AppCompat.Light.DarkActionBar">
-        <!-- Primary brand color. -->
-        <item name="colorPrimary">@color/purple_500</item>
-        <item name="colorPrimaryDark">@color/purple_700</item>
-        <item name="colorAccent">@color/teal_200</item>
-        <!-- Customize your theme here. -->
-    </style>
-</resources>

+ 4 - 0
keystore.properties

@@ -0,0 +1,4 @@
+storePassword=shzd1y28_yyxx2021
+keyPassword=shzd1y28_yyxx2021
+keyAlias=alias.shzd_yyxx2021
+storeFile=../zkeystore/shzd_yyxx.keystore

+ 0 - 29
library_channel/build.gradle

@@ -1,29 +0,0 @@
-plugins {
-    id 'com.android.library'
-}
-
-android {
-    compileSdkVersion 30
-
-    defaultConfig {
-        minSdkVersion 16
-        targetSdkVersion 30
-        versionCode 1
-        versionName "1.0"
-    }
-
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-        }
-    }
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
-}
-
-dependencies {
-
-}

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

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.yyrh.yythird">
-
-</manifest>

+ 0 - 1
library_comm/.gitignore

@@ -1 +0,0 @@
-/build

+ 0 - 29
library_comm/build.gradle

@@ -1,29 +0,0 @@
-plugins {
-    id 'com.android.library'
-}
-
-android {
-    compileSdk 30
-
-    defaultConfig {
-        minSdk 16
-        targetSdk 30
-        versionCode 1
-        versionName "1.0"
-    }
-
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-        }
-    }
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
-}
-
-dependencies {
-
-}

+ 0 - 0
library_comm/consumer-rules.pro


+ 0 - 21
library_comm/proguard-rules.pro

@@ -1,21 +0,0 @@
-# Add project specific ProGuard rules here.
-# You can control the set of applied configuration files using the
-# proguardFiles setting in build.gradle.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
-
-# Uncomment this to preserve the line number information for
-# debugging stack traces.
-#-keepattributes SourceFile,LineNumberTable
-
-# If you keep the line number information, uncomment this to
-# hide the original source file name.
-#-renamesourcefileattribute SourceFile

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

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.yyrh.sdk">
-
-</manifest>

+ 0 - 1
library_core/.gitignore

@@ -1 +0,0 @@
-/build

+ 0 - 29
library_core/build.gradle

@@ -1,29 +0,0 @@
-plugins {
-    id 'com.android.library'
-}
-
-android {
-    compileSdkVersion 30
-
-    defaultConfig {
-        minSdkVersion 16
-        targetSdkVersion 30
-        versionCode 1
-        versionName "1.0"
-    }
-
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-        }
-    }
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
-}
-
-dependencies {
-
-}

+ 0 - 0
library_core/consumer-rules.pro


+ 0 - 21
library_core/proguard-rules.pro

@@ -1,21 +0,0 @@
-# Add project specific ProGuard rules here.
-# You can control the set of applied configuration files using the
-# proguardFiles setting in build.gradle.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
-
-# Uncomment this to preserve the line number information for
-# debugging stack traces.
-#-keepattributes SourceFile,LineNumberTable
-
-# If you keep the line number information, uncomment this to
-# hide the original source file name.
-#-renamesourcefileattribute SourceFile

+ 0 - 0
library_channel/.gitignore → library_xinrui/.gitignore


+ 50 - 0
library_xinrui/build.gradle

@@ -0,0 +1,50 @@
+plugins {
+    id 'com.android.library'
+}
+
+android {
+    compileSdkVersion rootProject.ext.android.compileSdkVersion
+    buildToolsVersion rootProject.ext.android.buildToolsVersion
+
+    defaultConfig {
+        minSdkVersion rootProject.ext.android.minSdkVersion
+        targetSdkVersion rootProject.ext.android.targetSdkVersion
+    }
+
+    buildFeatures {
+        buildConfig false
+    }
+    
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    lintOptions {
+        abortOnError false
+    }
+
+    repositories {
+        flatDir {
+            dirs 'libs'
+        }
+    }
+
+    dexOptions {
+        preDexLibraries = false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
+dependencies {
+    api files('libs/android-support-v4.jar')
+    api files('libs/mmkv-static-1.2.8.jar')
+    api files('libs/yyxx_support_1.0.1.jar')
+    api files('libs/dolin_zap_1.0.0.jar')
+}

+ 0 - 0
library_channel/consumer-rules.pro → library_xinrui/consumer-rules.pro


二進制
library_xinrui/libs/android-support-v4.jar


二進制
library_xinrui/libs/dolin_zap_1.0.0.jar


二進制
library_xinrui/libs/mmkv-static-1.2.8.jar


二進制
library_xinrui/libs/yyxx_support_1.0.1.jar


+ 0 - 0
library_channel/proguard-rules.pro → library_xinrui/proguard-rules.pro


+ 0 - 0
library_core/src/main/AndroidManifest.xml → library_xinrui/src/main/AndroidManifest.xml


+ 0 - 5
library_comm/src/main/java/com/yyrh/Version.java → library_xinrui/src/main/java/com/yyrh/Version.java

@@ -1,10 +1,5 @@
 package com.yyrh;
 
-/**
- * @author #Suyghur.
- * Created on 2021/10/13
- */
 public class Version {
-
     public static final String VERSION_NAME = "1.0.0";
 }

+ 33 - 0
library_xinrui/src/main/java/com/yyrh/advertisement/AdSdkCallback.java

@@ -0,0 +1,33 @@
+package com.yyrh.advertisement;
+
+import android.app.Activity;
+
+import com.yyrh.constant.RoleInfo;
+
+import org.json.JSONObject;
+
+import java.util.HashMap;
+
+public interface AdSdkCallback {
+    void onRegisterSuccess(String msg);
+
+    void onLoginSuccess(String msg);
+
+    void onPaySuccess(HashMap<String, Object> map);
+
+    void onCreateOrder(HashMap<String, Object> map);
+
+    void onUpLoadRoleInfo(String type, RoleInfo roleInfo);
+
+    void onResume(Activity activity);
+
+    void onPause(Activity activity);
+
+    void onDestory(Activity activity);
+
+    void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults);
+
+    void onExitGame(Activity activity);
+
+    void onReportAdEvent(String event, JSONObject json);
+}

+ 127 - 0
library_xinrui/src/main/java/com/yyrh/advertisement/Advertise.java

@@ -0,0 +1,127 @@
+package com.yyrh.advertisement;
+
+import android.app.Activity;
+import android.app.Application;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.util.Log;
+
+import com.yyrh.constant.RoleInfo;
+
+import org.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+
+
+public class Advertise {
+
+    public void advertiseInitInApplication(Application application) {
+    }
+
+    public void advertiseInit(Activity activity) {
+    }
+
+    public void login(Activity activity,String account) {
+    }
+
+    public void active(Activity activity) {
+    }
+
+    public void registration(Activity activity,String account) {
+    }
+
+    public void callPayment(Activity activity, HashMap<String, Object> info) {
+    }
+
+    public void paymentFinish(Activity activity, HashMap<String, Object> info) {
+    }
+    public void uploadRoleInfo(Activity activity,String type,  RoleInfo roleInfo) {
+
+    }
+    public void onResume(Activity activity) {
+
+    }
+
+    public void onPause(Activity activity) {
+    }
+    public void onDestory(Activity activity) {
+    }
+    public void onExitGame(Activity activity) {
+    }
+    public Advertise() {
+    }
+
+    public void reportAdEvent(String event, JSONObject json){
+
+    }
+    public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
+    }
+
+    public static String GetApplicationMetaData(Context context, String metaName) {
+        Object metaData = "";
+
+        if (null == metaName || metaName.isEmpty()) {
+
+            return "";
+        }
+        try {
+            ApplicationInfo info = context.getPackageManager()
+                    .getApplicationInfo(context.getPackageName(),
+                            PackageManager.GET_META_DATA);
+            metaData = info.metaData.get(metaName);
+            // 是否有引用
+            if (null != metaData && metaData.toString().contains("ref=")) {
+                String newMetaName = metaData.toString().split("=")[1];
+                metaData = GetApplicationMetaData(context, newMetaName);
+            }
+        } catch (PackageManager.NameNotFoundException e) {
+
+        }
+        if (null == metaData) {
+            metaData = "";
+        }
+        return metaData.toString();
+    }
+
+    public static String getParamFromCnfByName(Context context, String name) {
+        String value = "";
+
+        InputStream input_stream = null;
+        try {
+            input_stream = context.getAssets().open("YyrhAdParam.cnf");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        InputStreamReader inputStreamReader = new InputStreamReader(
+                input_stream);
+
+        BufferedReader reader = new BufferedReader(inputStreamReader);
+
+        String tempString = null;
+
+        try {
+            while ((tempString = reader.readLine()) != null) {
+
+                if (tempString.contains(name)) {
+
+                    value = tempString.substring(tempString.indexOf("=") + 1,
+                            tempString.length());
+                    break;
+                }
+            }
+            reader.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return value;
+
+    }
+
+}

+ 56 - 0
library_xinrui/src/main/java/com/yyrh/advertisement/AdvertiseFactory.java

@@ -0,0 +1,56 @@
+package com.yyrh.advertisement;
+
+import android.content.Context;
+
+
+
+import com.yyrh.utils.Utils;
+
+
+import java.lang.reflect.Constructor;
+
+
+
+
+public class AdvertiseFactory {
+
+
+
+
+    private AdvertiseFactory(){}
+
+
+
+    public static Advertise GetAdvertise(Context context) {
+
+        return AdvertiseFactory.GetAdvertise(context, "YyrhAdParam.cnf");
+    }
+
+    public static Advertise GetAdvertise(Context context, String adParamPath) {
+        String adClassName = Utils.getParamCnfValuebyKey(context, adParamPath, "CLASSNAME");
+        if (adClassName == null || adClassName.equals("")) {
+            return null;
+
+        }
+
+        Advertise advertise = null;
+        try {
+            Class clz = Class.forName(adClassName);
+            Constructor constructor = clz.getDeclaredConstructor();
+            constructor.setAccessible(true);
+            advertise = (Advertise)clz.newInstance();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        }
+
+        return advertise;
+    }
+
+
+}

+ 114 - 0
library_xinrui/src/main/java/com/yyrh/advertisement/AdvertiseManager.java

@@ -0,0 +1,114 @@
+package com.yyrh.advertisement;
+
+import android.app.Activity;
+import android.app.Application;
+import android.content.Context;
+
+import com.yyrh.constant.RoleInfo;
+
+import org.json.JSONObject;
+
+import java.util.HashMap;
+
+
+public class AdvertiseManager {
+
+    private static AdvertiseManager manager = null;
+
+    private Advertise advertise;
+
+    private AdvertiseManager(Context context) {
+        advertise = AdvertiseFactory.GetAdvertise(context);
+    }
+
+    public static AdvertiseManager defaultManager(Context context) {
+        if (manager == null) {
+            synchronized (AdvertiseManager.class) {
+                if (manager == null) {
+                    manager = new AdvertiseManager(context);
+                }
+            }
+        }
+        return manager;
+    }
+
+    public void advertiseInitInApplication(Application application) {
+        if (advertise != null)
+            advertise.advertiseInitInApplication(application);
+    }
+
+    public void advertiseInit(Activity activity) {
+        if (advertise != null)
+            advertise.advertiseInit(activity);
+    }
+
+    public void login(Activity activity,String account) {
+        if (advertise != null) {
+            advertise.login(activity,account);
+        }
+    }
+
+    public void active(Activity activity) {
+        if (advertise != null) {
+            advertise.active(activity);
+        }
+    }
+    public void upLoadRoleInfo(Activity activity,String type, RoleInfo roleInfo){
+        if (advertise != null) {
+            advertise.uploadRoleInfo(activity,type,roleInfo);
+        }
+    }
+    public void registration(Activity activity,String account) {
+        if (advertise != null) {
+            advertise.registration(activity,account);
+        }
+    }
+
+    public void callPayment(Activity activity, HashMap<String, Object> info) {
+        if (advertise != null) {
+            advertise.callPayment(activity, info);
+        }
+    }
+
+    public void paymentFinish(Activity activity, HashMap<String, Object> info) {
+        if (advertise != null) {
+            advertise.paymentFinish(activity, info);
+        }
+    }
+
+    public void onResume(Activity activity) {
+        if (advertise != null) {
+            advertise.onResume(activity);
+        }
+    }
+
+    public void onPause(Activity activity) {
+        if (advertise != null) {
+            advertise.onPause(activity);
+        }
+    }
+
+    public void onDestory(Activity activity) {
+        if (advertise != null) {
+            advertise.onDestory(activity);
+        }
+    }
+
+    public void onExitGame(Activity activity){
+        if (advertise != null) {
+            advertise.onExitGame(activity);
+        }
+    }
+
+    public void reportAdEvent(String event, JSONObject json){
+        if (advertise != null) {
+            advertise.reportAdEvent(event,json);
+        }
+    }
+    public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
+        if (advertise != null) {
+            advertise.onRequestPermissionsResult(requestCode,permissions,grantResults);
+        }
+    }
+
+}

+ 194 - 0
library_xinrui/src/main/java/com/yyrh/behavior/ReportLogUtil.java

@@ -0,0 +1,194 @@
+package com.yyrh.behavior;
+
+import com.yyrh.constant.SDKSettings;
+import com.yyrh.networking.urlhttp.CallBackUtil;
+import com.yyrh.networking.urlhttp.UrlHttpUtil;
+import com.yyrh.utils.SignUtils;
+import com.yyrh.utils.YYLog;
+
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+import static com.yyrh.constant.URLConstants.ACTION_LOG_URL;
+
+import static com.yyrh.constant.URLConstants.SDK_AD_LOG;
+import static com.yyrh.constant.URLConstants.SDK_ERROR_LOG;
+import static com.yyrh.constant.URLConstants.SDK_LOG;
+
+public class ReportLogUtil {
+
+
+    public static void reportNormalLog(String action,String reqName,String reqParam){
+
+
+
+        String timestamp = System.currentTimeMillis()/1000  + "";
+
+
+
+
+        JSONObject json = new JSONObject();
+        try {
+            json.put("action",action);
+            json.put("cs_ver",SDKSettings.SDK_VERSION);
+            json.put("device_model",SDKSettings.device_model);
+            json.put("device_ver",SDKSettings.version);
+
+            json.put("game_code",SDKSettings.game_code);
+            json.put("gcp_code",SDKSettings.gcp_code);
+            json.put("ifa",SDKSettings.imei);
+            json.put("log_type",SDK_LOG);
+
+            json.put("package_name",SDKSettings.package_name);
+            json.put("req_name",reqName);
+            json.put("req_param",reqParam);
+            json.put("system",SDKSettings.system);
+
+            json.put("timestamp",timestamp);
+
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        String sign = SignUtils.sdkLogParamSign(timestamp,json.toString());
+
+
+
+        String url =  ACTION_LOG_URL + "timestamp="  + timestamp +"&sign="+sign;
+
+
+
+        UrlHttpUtil.postJson(url,json.toString(), new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+                YYLog.i(response);
+            }
+        });
+    }
+
+    public static void reportErrorLog(String action,String reqName,String reqParam){
+
+        String timestamp = System.currentTimeMillis()/1000  + "";
+
+
+
+
+        JSONObject json = new JSONObject();
+        try {
+            json.put("action",action);
+            json.put("cs_ver",SDKSettings.SDK_VERSION);
+            json.put("device_model",SDKSettings.device_model);
+            json.put("device_ver",SDKSettings.version);
+
+            json.put("game_code",SDKSettings.game_code);
+            json.put("gcp_code",SDKSettings.gcp_code);
+            json.put("ifa",SDKSettings.imei);
+            json.put("log_type",SDK_ERROR_LOG);
+
+            json.put("package_name",SDKSettings.package_name);
+            json.put("req_name",reqName);
+            json.put("req_param",reqParam);
+            json.put("system",SDKSettings.system);
+
+            json.put("timestamp",timestamp);
+
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        String sign = SignUtils.sdkLogParamSign(timestamp,json.toString());
+
+
+
+        String url =  ACTION_LOG_URL + "timestamp="  + timestamp +"&sign="+sign;
+
+
+
+
+
+
+
+        UrlHttpUtil.postJson(url,json.toString(), new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+                YYLog.i(response);
+            }
+        });
+    }
+
+    public static void reportAdLog(String action,String adParam){
+
+
+
+        String timestamp = System.currentTimeMillis()/1000  + "";
+
+
+
+
+        JSONObject json = new JSONObject();
+        try {
+            json.put("action",action);
+            json.put("ad_param",adParam);
+            json.put("cs_ver",SDKSettings.SDK_VERSION);
+            json.put("device_model",SDKSettings.device_model);
+            json.put("device_ver",SDKSettings.version);
+
+            json.put("game_code",SDKSettings.game_code);
+            json.put("gcp_code",SDKSettings.gcp_code);
+            json.put("ifa",SDKSettings.imei);
+            json.put("log_type",SDK_AD_LOG);
+
+            json.put("package_name",SDKSettings.package_name);
+
+            json.put("system",SDKSettings.system);
+
+            json.put("timestamp",timestamp);
+
+            json.put("yyrh_sp_code",SDKSettings.sp_code);
+
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        String sign = SignUtils.sdkLogParamSign(timestamp,json.toString());
+
+
+
+        String url =  ACTION_LOG_URL + "timestamp="  + timestamp +"&sign="+sign;
+
+
+
+
+
+        UrlHttpUtil.postJson(url,json.toString(), new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+                YYLog.i(response);
+            }
+        });
+
+
+    }
+
+
+}

+ 19 - 0
library_xinrui/src/main/java/com/yyrh/constant/Constants.java

@@ -0,0 +1,19 @@
+package com.yyrh.constant;
+
+public class Constants {
+
+    public static final String UPLOADTYPE_CREATEROLE = "UPLOADTYPE_CREATEROLE";					//创建角色
+    public static final String UPLOADTYPE_ENTERGAME = "UPLOADTYPE_ENTERGAME";
+    public static final String UPLOADTYPE_LEVELUP = "UPLOADTYPE_LEVELUP";
+
+
+    public static final String LOGIN = "LOGIN";
+
+    public static final String LOGOUT = "LOGOUT";
+
+
+    public static final long CLICK_INTERVAL = 2000L;
+
+
+
+}

+ 79 - 0
library_xinrui/src/main/java/com/yyrh/constant/InitConfig.java

@@ -0,0 +1,79 @@
+package com.yyrh.constant;
+
+import android.text.TextUtils;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class InitConfig {
+
+    public static String fristShowPage = "";
+
+
+    public String agreement_privacy = "";
+
+    public String service_center = "";
+
+    public String agreement_user = "";
+
+    public JSONObject links = null;
+
+    public JSONArray reg_tabs = null;
+
+    public int sdk_login  = 1;
+
+    public int bswitch  = 0;
+
+    public static InitConfig toBean(JSONObject json){
+        if (TextUtils.isEmpty(json.toString())) {
+            return null;
+        }
+        InitConfig initConfig = new InitConfig();
+
+        initConfig.reg_tabs = json.optJSONArray("reg_tabs");
+        initConfig.sdk_login = json.optInt("sdk_login", 100);
+
+        initConfig.bswitch = json.optInt("bswitch");
+
+        if (initConfig.reg_tabs != null){
+
+            try {
+                if (initConfig.reg_tabs.get(0).toString().equals("phone")){
+                    InitConfig.fristShowPage = "phone";
+                }
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+        }
+
+        initConfig.links = json.optJSONObject("links");
+
+        if (initConfig.links != null){
+
+
+            initConfig.agreement_privacy = initConfig.links.optString("agreement_privacy");
+            initConfig.service_center = initConfig.links.optString("service_center");
+            initConfig.agreement_user= initConfig.links.optString("agreement_user");
+        }
+
+
+
+
+        return initConfig;
+
+    }
+
+    @Override
+    public String toString() {
+        return "InitConfig{" +
+                "agreement_privacy='" + agreement_privacy + '\'' +
+                ", service_center='" + service_center + '\'' +
+                ", agreement_user='" + agreement_user + '\'' +
+                ", links=" + links +
+                ", reg_tabs=" + reg_tabs +
+                ", sdk_login=" + sdk_login +
+                ", bswitch=" + bswitch +
+                '}';
+    }
+}

+ 85 - 0
library_xinrui/src/main/java/com/yyrh/constant/LoginData.java

@@ -0,0 +1,85 @@
+package com.yyrh.constant;
+
+import android.text.TextUtils;
+
+import com.yyrh.utils.Utils;
+
+import org.json.JSONObject;
+
+public class LoginData {
+
+
+
+    public String uname = "";
+
+    public String token = "";
+
+    public String rn_bd = "";
+
+    public JSONObject links = null;
+
+    public String channel_uid = "";
+
+    public int is_rn = 0;
+
+
+    public String solo_email = "";
+
+    public String user_center = "";
+
+    public String authentication = "";
+
+    public String login_token = "";
+
+    public static LoginData toBean(JSONObject json){
+        if (TextUtils.isEmpty(json.toString())) {
+            return null;
+        }
+        LoginData loginData = new LoginData();
+
+        loginData.token = json.optString("token");
+
+        loginData.uname = json.optString("uname");
+
+        loginData.channel_uid  = json.optString("channel_uid");
+
+        loginData.rn_bd = json.optString("rn_bd");
+
+        loginData.is_rn = json.optInt("is_rn");
+
+        loginData.links = json.optJSONObject("links");
+
+        loginData.login_token = json.optString("login_token");
+
+        if (loginData.links == null){
+            loginData.solo_email = "";
+            loginData.user_center = "";
+        }else {
+            loginData.solo_email = loginData.links.optString("solo_email");
+            loginData.user_center = loginData.links.optString("user_center");
+            loginData.authentication = loginData.links.optString("authentication");
+        }
+
+
+
+
+        return loginData;
+
+    }
+
+    @Override
+    public String toString() {
+        return "LoginData{" +
+                "uname='" + uname + '\'' +
+                ", token='" + token + '\'' +
+                ", rn_bd='" + rn_bd + '\'' +
+                ", links=" + links +
+                ", channel_uid='" + channel_uid + '\'' +
+                ", is_rn=" + is_rn +
+                ", solo_email='" + solo_email + '\'' +
+                ", user_center='" + user_center + '\'' +
+                ", authentication='" + authentication + '\'' +
+                ", login_token='" + login_token + '\'' +
+                '}';
+    }
+}

+ 162 - 0
library_xinrui/src/main/java/com/yyrh/constant/RoleInfo.java

@@ -0,0 +1,162 @@
+package com.yyrh.constant;
+
+public class RoleInfo {
+    private String roleId;
+    private String roleName;
+    private String roleLevel;
+    private String gender;
+    private String serverId;
+    private String serverName;
+    private String hasGold;
+    private String vipLevel;
+    private String rolePower;
+    private String partyId;
+
+    public String getAllParam() {
+        return "roleId:" + getRoleId() + "--roleName:" + getRoleName() + "--roleLevel:" + getRoleLevel()
+                + "--gender:" + getGender() + "--serverId:" + getServerId() + "--serverName:" + getServerName()
+                + "--hasGold:" + getHasGold() + "--vipLevel:" + getVipLevel() + "--rolePower:" + getRolePower()
+                + "--partyId:" + getPartyId() + "--partyName:" + getPartyName() + "--roleCreateTime:" + getRoleCreateTime()
+                + "--reincarnationCount:" + getReincarnationCount() + "----charge:" + getCharge() +
+                "----profession:" + getProfession() + "----roleExt:" + getRoleExt();
+    }
+
+    public String getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(String roleId) {
+        this.roleId = roleId;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public String getRoleLevel() {
+        return roleLevel;
+    }
+
+    public void setRoleLevel(String roleLevel) {
+        this.roleLevel = roleLevel;
+    }
+
+    public String getGender() {
+        return gender;
+    }
+
+    public void setGender(String gender) {
+        this.gender = gender;
+    }
+
+    public String getServerId() {
+        return serverId;
+    }
+
+    public void setServerId(String serverId) {
+        this.serverId = serverId;
+    }
+
+    public String getServerName() {
+        return serverName;
+    }
+
+    public void setServerName(String serverName) {
+        this.serverName = serverName;
+    }
+
+    public String getHasGold() {
+        return hasGold;
+    }
+
+    public void setHasGold(String hasGold) {
+        this.hasGold = hasGold;
+    }
+
+    public String getVipLevel() {
+        return vipLevel;
+    }
+
+    public void setVipLevel(String vipLevel) {
+        this.vipLevel = vipLevel;
+    }
+
+    public String getRolePower() {
+        return rolePower;
+    }
+
+    public void setRolePower(String rolePower) {
+        this.rolePower = rolePower;
+    }
+
+    public String getPartyId() {
+        return partyId;
+    }
+
+    public void setPartyId(String partyId) {
+        this.partyId = partyId;
+    }
+
+    public String getPartyName() {
+        return partyName;
+    }
+
+    public void setPartyName(String partyName) {
+        this.partyName = partyName;
+    }
+
+    public String getRoleCreateTime() {
+        return roleCreateTime;
+    }
+
+    public void setRoleCreateTime(String roleCreateTime) {
+        this.roleCreateTime = roleCreateTime;
+    }
+
+    public String getReincarnationCount() {
+        return reincarnationCount;
+    }
+
+    public void setReincarnationCount(String reincarnationCount) {
+        this.reincarnationCount = reincarnationCount;
+    }
+
+    private String partyName;
+    private String roleCreateTime;
+    private String reincarnationCount;
+
+    private String charge;
+
+    private String profession;
+
+    private String roleExt;
+
+    public String getCharge() {
+        return charge;
+    }
+
+    public void setCharge(String charge) {
+        this.charge = charge;
+    }
+
+    public String getProfession() {
+        return profession;
+    }
+
+    public void setProfession(String profession) {
+        this.profession = profession;
+    }
+
+
+    public String getRoleExt() {
+        return roleExt;
+    }
+
+    public void setRoleExt(String roleExt) {
+        this.roleExt = roleExt;
+    }
+}

+ 88 - 0
library_xinrui/src/main/java/com/yyrh/constant/SDKSettings.java

@@ -0,0 +1,88 @@
+package com.yyrh.constant;
+
+import android.app.Activity;
+import android.content.Context;
+
+import com.yyrh.utils.Utils;
+import com.yythird.sdk.ChannelSDK;
+
+public class SDKSettings {
+    public static String game_code;                // AndroidManifest.xml中配置的游戏id
+    public static String gcp_code;
+    public static String order_ext;
+
+    public static String imei = "";                    // 手机串号
+    public static String ifa_type = "0";
+    public static String android_id;
+
+    public static String version;                // 手机当前版本号
+
+    public static String versionName;        // 版本号
+
+
+    public static String sp_code;
+    public static String device_model;
+    public static String channelTag = "";
+    public static String package_name = "";
+
+    public static String isSimulator = "0";
+
+    public static boolean isDebug = false;        // debug模式配置
+    public static String system = "android";
+    public static String SDK_VERSION = "2.2.8";
+
+
+
+
+
+    public static String LOGINTAG = Constants.LOGIN;
+    public static boolean isThirdLogin = true; //启用第3方登录
+    public static boolean isThirdPay = true; //启用第3方登录
+    public static String UserCentUrl = ""; //用户中心功能
+    public static boolean isLandscape = true; //用户中心功能
+
+
+    public static boolean isOpenRealName = false;
+
+    public static boolean isOpenFloatView = false;
+
+    public static boolean isVefityRealName = true;
+
+    public static boolean isForceRealName = false;
+
+    public static String o_cfg = "";
+
+    public static LoginData loginData = null;
+
+    public static InitConfig initConfig = null;
+
+    public static void initSetting(Context context) {
+
+
+        game_code = Utils.GetApplicationMetaData(context, "yyrh_game_code");
+        order_ext = Utils.GetApplicationMetaData(context, "yyrh_order_ext");
+
+        gcp_code = Utils.getParamCnfValuebyKey(context, "YyrhParam.cnf",
+                "GCP_CODE");
+
+        channelTag = Utils.getParamCnfValuebyKey(context, "YyrhParam.cnf",
+                "CHANNELTAG");
+
+
+        sp_code = Utils.GetApplicationMetaData(context, "yyrh_sp_code");
+
+
+        version = Utils.getDeviceVersion();
+
+
+        versionName = Utils.getVersionName(context);
+        device_model = Utils.getDeviceModel();
+        isLandscape = Utils.isLandscape((Activity) context);
+        LOGINTAG = Constants.LOGIN;
+
+        package_name = Utils.getPackageName((Activity) context);
+        android_id = Utils.getAndroidId(context);
+        o_cfg = ChannelSDK.getInstance().SDKGetPkgExt(context);
+    }
+
+}

+ 43 - 0
library_xinrui/src/main/java/com/yyrh/constant/URLConstants.java

@@ -0,0 +1,43 @@
+package com.yyrh.constant;
+
+public class URLConstants {
+
+//    public static final String BASEURL = "https://sdkapi.yyxxgame.com";
+public static final String BASEURL = "http://testsdkapi.yyxxgame.com";
+
+
+//        public static final String BASEURL = "http://49.234.153.160";
+
+
+    public static final String  INIT =BASEURL + "/activate";
+    public static final String  FASTREGISTER = BASEURL +  "/fast_register";
+    public static final String  USERLOGIN = BASEURL + "/user_login";
+    public static final String  UPLOADROLEINFO = BASEURL +  "/report_role_info";
+    public static final String  RECHARGEINT = BASEURL +  "/recharge_init";
+    public static final String  CHANNELLOGIN = BASEURL +  "/channel_login";
+    public static final String  GETCAPTCHA = BASEURL +  "/phone_captcha";
+    public static final String  REGISTERWITHPHONE = BASEURL +  "/phone_register";
+    public static final String  RESETPWDWITHPHONE = BASEURL +  "/phone_reset_pwd";
+    public static final String  REALNAMERECORD = BASEURL +  "/user_rn_record";
+    public static final String  QUERYORDER = BASEURL +  "/order_query";
+  	public static final String  AGREEMENTINIT = BASEURL +  "/agreement_init";
+    public static final String  LOGINWITHSMS = BASEURL +  "/phone_sms_login";
+    public static final String  PAYMENTWAY = BASEURL +  "/payment_way";
+
+    public static final String  CHANNELZTAG = "YYRHSDK";
+
+
+    public static final String  RSAKEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3eXf1JxdFtx6c8AJTdlSverL8WqRE11yFB6Q+GbQeEVXjSCgQN48qePat7mXbH4LAtjaSEqXHruP4hJO8777wYtEKNKIN2VZgWQElrllAuAtaHyA+UGKwulOKmkR8k1Oxmfd46fnQBwzy+Giab4lqQRQAObCT0QtUrlrsU1U+zwIDAQAB";
+
+
+  public static final String ACTION_LOG_URL = "https://ronghefaxingmd.yyxxgameyw.com/api/apm?";
+
+  public static final String APP_KEY = "c4746e44-daed-11ea-be52-fa163eac610f";
+
+  public static final String SDK_LOG = "sdk_log";
+
+  public static final String SDK_ERROR_LOG = "sdk_log_err";
+
+  public static final String SDK_AD_LOG = "adsdk_log";
+
+}

+ 252 - 0
library_xinrui/src/main/java/com/yyrh/easypermission/EasyPermission.java

@@ -0,0 +1,252 @@
+package com.yyrh.easypermission;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.Process;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @className: EasyPermission
+ * @classDescription:便捷易用的Android 6.0 动态权限适配库,使用方便,无其他引用依赖,copy 即用
+ * @author: Pan_
+ * @createTime: 2018/10/24
+ */
+public class EasyPermission implements NextAction {
+    public static final String TAG = "EasyPermission";
+    private Activity mActivity;
+    private LinkedList<String> mPermissionList = new LinkedList<>();
+    private PermissionRequestListener mPermissionRequestListener;
+    private String mCurPermission;
+
+    private HashMap<String, RequestPermissionRationalListener> mRequestPermissionRationalListenerMap = new HashMap<>();
+    private HashMap<String, GrantResult> mPermissionGrantMap = new HashMap<>();
+
+    public EasyPermission(Activity activity) {
+        mActivity = activity;
+    }
+
+    /**
+     * 创建一个EasyPermission实例,一切从这里开始
+     *
+     * @param activity
+     * @return
+     */
+    public static EasyPermission with(Activity activity) {
+        return new EasyPermission(activity);
+    }
+
+    /**
+     * 添加一个需要获取的权限
+     *
+     * @param permission
+     * @return
+     */
+    public EasyPermission addPermission(String permission) {
+        if (TextUtils.isEmpty(permission)) {
+            return this;
+        }
+
+        mPermissionList.add(permission);
+        return this;
+    }
+
+
+    /**
+     * 添加一组需要获取的权限
+     *
+     * @param permission
+     * @return
+     */
+    public EasyPermission addPermissions(String... permission) {
+        if (permission == null || permission.length <= 0) {
+            return this;
+        }
+
+        mPermissionList.addAll(Arrays.asList(permission));
+        return this;
+    }
+
+    /**
+     * 添加一组需要获取的权限
+     *
+     * @param permission
+     * @return
+     */
+    public EasyPermission addPermissions(String[]... permission) {
+        if (permission == null || permission.length <= 0) {
+            return this;
+        }
+
+        for (String[] group : permission) {
+            mPermissionList.addAll(Arrays.asList(group));
+        }
+        return this;
+    }
+
+
+    /**
+     * 添加一组需要获取的权限
+     *
+     * @param permission
+     * @return
+     */
+    public EasyPermission addPermissions(List<String> permission) {
+        if (permission == null || permission.isEmpty()) {
+            return this;
+        }
+
+        mPermissionList.addAll(permission);
+        return this;
+    }
+
+    /**
+     * 添加一个权限的Rational的处理
+     *
+     * @param permission
+     * @param listener
+     * @return
+     */
+    public EasyPermission addRequestPermissionRationaleHandler(String permission, RequestPermissionRationalListener listener) {
+        if (TextUtils.isEmpty(permission) || listener == null) {
+            return this;
+        }
+
+        mRequestPermissionRationalListenerMap.put(permission, listener);
+        return this;
+    }
+
+    /**
+     * 判断是否已经该权限
+     *
+     * @param context     上下文
+     * @param permissions 权限数组
+     * @return
+     */
+    public static boolean isPermissionGrant(Context context, String... permissions) {
+        for (String permission : permissions) {
+            if (context.checkPermission(permission, Process.myPid(), Process.myUid()) != PackageManager.PERMISSION_GRANTED) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+
+    /**
+     * 打开权限设置页面
+     *
+     * @param context 上下文
+     */
+    public static void openSettingPage(Context context) {
+        PermissionSettingPage.start(context, false);
+    }
+
+    /**
+     * 打开权限设置页面
+     *
+     * @param context 上下文
+     * @param newTask 是否开启新的堆栈打开
+     */
+    public static void openSettingPage(Context context, boolean newTask) {
+        PermissionSettingPage.start(context, newTask);
+    }
+
+    /**
+     * 开始申请权限
+     *
+     * @param listener
+     */
+    public void request(PermissionRequestListener listener) {
+        if (listener == null) {
+            return;
+        }
+        if (mPermissionList.isEmpty()) {
+            throw new RuntimeException("must add some permission to request!!");
+        }
+
+        if (Build.VERSION.SDK_INT < 23) {
+            Log.i(TAG, "targetSdk < 23 ,no need to request permission dynamic");
+            HashMap<String, GrantResult> grantMap = new HashMap<>();
+            for (String permission : mPermissionList) {
+                grantMap.put(permission, GrantResult.GRANT);
+            }
+            listener.onGrant(grantMap);
+            return;
+        }
+        PermissionUtils.checkPermissions(mActivity, mPermissionList);
+        mPermissionRequestListener = listener;
+        pollPermission();
+    }
+
+
+    @TargetApi(23)
+    private void pollPermission() {
+        if (mPermissionList.isEmpty()) {
+            Log.i(TAG, "permission检查完成,开始申请权限");
+            PermissionRequestFragment.build(mPermissionGrantMap, mPermissionRequestListener).go(mActivity);
+            return;
+        }
+        String permission = mPermissionList.pollFirst();
+
+        if (Permission.REQUEST_INSTALL_PACKAGES.equals(permission)) {
+           if(PermissionUtils.isHasInstallPermission(mActivity)){
+               mPermissionGrantMap.put(permission, GrantResult.GRANT);
+               pollPermission();
+           }else{
+               mPermissionGrantMap.put(permission, GrantResult.DENIED);
+               pollPermission();
+           }
+
+        } else if (Permission.SYSTEM_ALERT_WINDOW.equals(permission)) {
+            if(PermissionUtils.isHasOverlaysPermission(mActivity)){
+                mPermissionGrantMap.put(permission, GrantResult.GRANT);
+                pollPermission();
+            }else{
+                mPermissionGrantMap.put(permission, GrantResult.DENIED);
+                pollPermission();
+            }
+        } else if (mActivity.checkPermission(permission, Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED) {
+            mPermissionGrantMap.put(permission, GrantResult.GRANT);
+            pollPermission();
+        } else {
+            mPermissionGrantMap.put(permission, GrantResult.DENIED);
+            if (mRequestPermissionRationalListenerMap.get(permission) != null) {
+                mCurPermission = permission;
+                mRequestPermissionRationalListenerMap.get(permission).onRequestPermissionRational(permission, mActivity.shouldShowRequestPermissionRationale(permission), this);
+            } else {
+                pollPermission();
+            }
+        }
+    }
+
+    @Override
+    public void next(NextActionType next) {
+        if (next == null) {
+            mPermissionGrantMap.put(mCurPermission, GrantResult.IGNORE);
+            pollPermission();
+            return;
+        }
+        switch (next) {
+            case NEXT:
+                pollPermission();
+                break;
+            case IGNORE:
+                mPermissionGrantMap.put(mCurPermission, GrantResult.IGNORE);
+                pollPermission();
+                break;
+            case STOP:
+                mPermissionRequestListener.onCancel(mCurPermission);
+                break;
+        }
+    }
+}

+ 35 - 0
library_xinrui/src/main/java/com/yyrh/easypermission/GrantResult.java

@@ -0,0 +1,35 @@
+package com.yyrh.easypermission;
+
+/**
+ * @className: GrantResult
+ * @classDescription:申请权限结果枚举类
+ * @author: Pan_
+ * @createTime: 2018/10/25
+ */
+public enum GrantResult {
+
+    /**
+     * 授予权限
+     */
+    GRANT(0),
+
+    /**
+     * 拒接权限
+     */
+    DENIED(-1),
+
+    /**
+     * 之前在requestPremissionRational里面的next接口返回了IGNORE
+     */
+    IGNORE(-2);
+
+    private int type;
+
+    GrantResult(int type) {
+        this.type = type;
+    }
+
+    public int getValue(){
+        return type;
+    }
+}

+ 18 - 0
library_xinrui/src/main/java/com/yyrh/easypermission/NextAction.java

@@ -0,0 +1,18 @@
+package com.yyrh.easypermission;
+
+/**
+ * @className: NextAction
+ * @classDescription: addRequestPermissionRationaleHandler的处理函数,当定义了一个权限的rationaleHandler的时候,必须在处理回调里面调用这个接口的next方法, 才能进行下一步,
+ * 否则整个权限申请链条将会中断,权限申请将不会触发
+ * @author: Pan_
+ * @createTime: 2018/10/24
+ */
+public interface NextAction {
+
+    /**
+     * addRequestPermissionRationaleHandler的处理函数,当定义了一个权限的rationaleHandler的时候,必须在处理回调里面调用这个接口的next方法, 才能进行下一步,
+     * 否则整个权限申请链条将会中断,权限申请将不会触发
+     * @param next
+     */
+    public void next(NextActionType next);
+}

+ 24 - 0
library_xinrui/src/main/java/com/yyrh/easypermission/NextActionType.java

@@ -0,0 +1,24 @@
+package com.yyrh.easypermission;
+
+/**
+ * @className: NextActionType
+ * @classDescription:NextAction 回调的类型
+ * @author: Pan_
+ * @createTime: 2018/10/24
+ */
+public enum NextActionType {
+    /**
+     * 忽略这个权限,后面的步骤不会申请这个权限
+     */
+    IGNORE,
+
+    /**
+     * 表示继续处理,继续下一个权限
+     */
+    NEXT,
+
+    /**
+     * 停止处理,直接回调onCancel函数
+     */
+    STOP;
+}

+ 88 - 0
library_xinrui/src/main/java/com/yyrh/easypermission/Permission.java

@@ -0,0 +1,88 @@
+package com.yyrh.easypermission;
+
+/**
+ * @className: Permission
+ * @classDescription:权限定义类
+ * @author: Pan_
+ * @createTime: 2018/10/26
+ */
+public class Permission {
+
+    public static final String READ_CALENDAR = "android.permission.READ_CALENDAR";
+    public static final String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";
+
+    public static final String CAMERA = "android.permission.CAMERA";
+
+    public static final String READ_CONTACTS = "android.permission.READ_CONTACTS";
+    public static final String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
+    public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
+
+    public static final String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
+    public static final String ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION";
+
+    public static final String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
+
+    public static final String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
+    public static final String CALL_PHONE = "android.permission.CALL_PHONE";
+    public static final String READ_CALL_LOG = "android.permission.READ_CALL_LOG";
+    public static final String WRITE_CALL_LOG = "android.permission.WRITE_CALL_LOG";
+    public static final String ADD_VOICEMAIL = "com.android.voicemail.permission.ADD_VOICEMAIL";
+    public static final String USE_SIP = "android.permission.USE_SIP";
+    public static final String PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS";
+
+    public static final String BODY_SENSORS = "android.permission.BODY_SENSORS";
+
+    public static final String SEND_SMS = "android.permission.SEND_SMS";
+    public static final String RECEIVE_SMS = "android.permission.RECEIVE_SMS";
+    public static final String READ_SMS = "android.permission.READ_SMS";
+    public static final String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH";
+    public static final String RECEIVE_MMS = "android.permission.RECEIVE_MMS";
+
+    public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
+    public static final String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
+
+    public static final String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES"; // 8.0及以上应用安装权限
+    public static final String SYSTEM_ALERT_WINDOW = "android.permission.SYSTEM_ALERT_WINDOW"; // 6.0及以上悬浮窗权限
+
+    public static final class Group {
+        public static final String[] CALENDAR = new String[]{
+                Permission.READ_CALENDAR,
+                Permission.WRITE_CALENDAR};
+
+        public static final String[] CAMERA = new String[]{Permission.CAMERA};
+
+        public static final String[] CONTACTS = new String[]{
+                Permission.READ_CONTACTS,
+                Permission.WRITE_CONTACTS,
+                Permission.GET_ACCOUNTS};
+
+        public static final String[] LOCATION = new String[]{
+                Permission.ACCESS_FINE_LOCATION,
+                Permission.ACCESS_COARSE_LOCATION};
+
+        public static final String[] MICROPHONE = new String[]{Permission.RECORD_AUDIO};
+
+        public static final String[] PHONE = new String[]{
+                Permission.READ_PHONE_STATE,
+                Permission.CALL_PHONE,
+                Permission.READ_CALL_LOG,
+                Permission.WRITE_CALL_LOG,
+                Permission.ADD_VOICEMAIL,
+                Permission.USE_SIP,
+                Permission.PROCESS_OUTGOING_CALLS};
+
+        public static final String[] SENSORS = new String[]{Permission.BODY_SENSORS};
+
+        public static final String[] SMS = new String[]{
+                Permission.SEND_SMS,
+                Permission.RECEIVE_SMS,
+                Permission.READ_SMS,
+                Permission.RECEIVE_WAP_PUSH,
+                Permission.RECEIVE_MMS};
+
+        public static final String[] STORAGE = new String[]{
+                Permission.READ_EXTERNAL_STORAGE,
+                Permission.WRITE_EXTERNAL_STORAGE};
+    }
+}
+

+ 198 - 0
library_xinrui/src/main/java/com/yyrh/easypermission/PermissionRequestFragment.java

@@ -0,0 +1,198 @@
+package com.yyrh.easypermission;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Looper;
+import android.provider.Settings;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @className: PermissionRequestFragment
+ * @classDescription:权限申请代理fragment
+ * @author: Pan_
+ * @createTime: 2018/10/25
+ */
+
+public final class PermissionRequestFragment extends Fragment implements Runnable {
+    private int mRequestCode;
+    private PermissionRequestListener mPermissionRequestListener;
+    private HashMap<String, GrantResult> mPermissionGrantMap = new HashMap<>();
+    private RequestCodeGenerater mRequestCodeGenerater = new RequestCodeGenerater();
+
+
+    /**
+     * build函数构造一个用于权限请求的fragment
+     *
+     * @param permissionMap
+     * @param permissionRequestListener
+     * @return
+     */
+    public static PermissionRequestFragment build(HashMap<String, GrantResult> permissionMap, PermissionRequestListener permissionRequestListener) {
+        PermissionRequestFragment fragment = new PermissionRequestFragment();
+        fragment.setPermissionGrantMap(permissionMap);
+        fragment.setPermissionRequestListener(permissionRequestListener);
+        return fragment;
+    }
+
+
+    public void setPermissionRequestListener(PermissionRequestListener permissionRequestListener) {
+        mPermissionRequestListener = permissionRequestListener;
+    }
+
+    public void setPermissionGrantMap(HashMap<String, GrantResult> permissionGrantMap) {
+        mPermissionGrantMap = permissionGrantMap;
+    }
+
+    /**
+     * 开始请求
+     */
+    public void go(Activity activity) {
+        if (activity != null) {
+            if (Looper.getMainLooper() != Looper.myLooper()) {
+                throw new RuntimeException("you must request permission in main thread!!");
+            }
+            activity.getFragmentManager().beginTransaction().add(this, activity.getClass().getName()).commit();
+        } else {
+            throw new RuntimeException("activity is null!!");
+        }
+    }
+
+    private boolean isBackCall;//是否已经回调了,避免安装权限和悬浮窗同时请求导致的重复回调
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        //super.onActivityResult(requestCode, resultCode, data);
+        if (!isBackCall && requestCode == mRequestCode) {
+            isBackCall = true;
+            //需要延迟执行,不然有些华为机型授权了但是获取不到权限
+            getActivity().getWindow().getDecorView().postDelayed(this, 500);
+        }
+    }
+
+
+    @Override
+    public void run() {
+        //请求其他危险权限
+        startRequestPermission();
+    }
+
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mRequestCode = mRequestCodeGenerater.generate();
+        if ((mPermissionGrantMap.containsKey(Permission.REQUEST_INSTALL_PACKAGES) && mPermissionGrantMap.get(Permission.REQUEST_INSTALL_PACKAGES) == GrantResult.DENIED)
+                || (mPermissionGrantMap.containsKey(Permission.SYSTEM_ALERT_WINDOW) && mPermissionGrantMap.get(Permission.SYSTEM_ALERT_WINDOW) == GrantResult.DENIED)) {
+            if (mPermissionGrantMap.containsKey(Permission.REQUEST_INSTALL_PACKAGES)) {
+                //跳转到允许安装未知来源设置页面
+                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:" + getActivity().getPackageName()));
+                startActivityForResult(intent, mRequestCode);
+            }
+
+            if (mPermissionGrantMap.containsKey(Permission.SYSTEM_ALERT_WINDOW)) {
+                //跳转到悬浮窗设置页面
+                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getActivity().getPackageName()));
+                startActivityForResult(intent, mRequestCode);
+            }
+
+        } else {
+            startRequestPermission();
+        }
+    }
+
+    @TargetApi(23)
+    private void startRequestPermission() {
+        ArrayList<String> needRequestPermissionList = new ArrayList<>();
+        Set<Map.Entry<String, GrantResult>> entrySet = mPermissionGrantMap.entrySet();
+        for (Map.Entry<String, GrantResult> entry : entrySet) {
+            if (entry.getValue() == GrantResult.DENIED) {
+                needRequestPermissionList.add(entry.getKey());
+            }
+        }
+
+        for (String permission : needRequestPermissionList) {
+            Log.i(EasyPermission.TAG, "需要申请的权限:" + permission);
+        }
+        if (needRequestPermissionList.isEmpty() && mPermissionRequestListener != null) {
+            Log.i(EasyPermission.TAG, "没有需要申请的权限,直接回调");
+            mPermissionRequestListener.onGrant(mPermissionGrantMap);
+            return;
+        }
+        String[] permissionArray = needRequestPermissionList.toArray(new String[needRequestPermissionList.size()]);
+        requestPermissions(permissionArray, mRequestCode);
+    }
+
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+        if (requestCode != mRequestCode) {
+            Log.i(EasyPermission.TAG, "requestCode不一致,不处理");
+            return;
+        }
+
+        for (int i = 0; i < permissions.length; i++) {
+            Log.i(EasyPermission.TAG, "onRequestPermissionsResult返回状态,权限:" + permissions[i] + "  是否授权:" + grantResults[i]);
+            String permission = permissions[i];
+            if (Permission.REQUEST_INSTALL_PACKAGES.equals(permission)) {
+                if (PermissionUtils.isHasInstallPermission(getActivity().getApplicationContext())) {
+                    mPermissionGrantMap.put(permission, GrantResult.GRANT);
+                } else {
+                    mPermissionGrantMap.put(permission, GrantResult.DENIED);
+                }
+
+            } else if (Permission.SYSTEM_ALERT_WINDOW.equals(permission)) {
+                if (PermissionUtils.isHasOverlaysPermission(getActivity().getApplicationContext())) {
+                    mPermissionGrantMap.put(permission, GrantResult.GRANT);
+                } else {
+                    mPermissionGrantMap.put(permission, GrantResult.DENIED);
+                }
+            } else {
+                mPermissionGrantMap.put(permissions[i], grantResults[i] == PackageManager.PERMISSION_GRANTED ? GrantResult.GRANT : GrantResult.DENIED);
+            }
+
+        }
+
+
+        //打印返回结果
+        Set<Map.Entry<String, GrantResult>> entrySet = mPermissionGrantMap.entrySet();
+        Log.i(EasyPermission.TAG, "打印最终返回结果:");
+        for (Map.Entry<String, GrantResult> entry : entrySet) {
+            Log.i(EasyPermission.TAG, "权限:" + entry.getKey() + "  状态:" + entry.getValue());
+        }
+        if (mPermissionRequestListener != null) {
+            mPermissionRequestListener.onGrant(mPermissionGrantMap);
+        }
+        getFragmentManager().beginTransaction().remove(this).commit();
+    }
+
+
+    /**
+     * requestCode的生成器,用于生成不重复的requestCode
+     */
+    private static class RequestCodeGenerater {
+        /**
+         * 生成初始化值
+         */
+        private volatile static int FACTOR_REQUEST_CODE = 0;
+
+        /**
+         * 同步生成方法
+         *
+         * @return
+         */
+        public synchronized int generate() {
+            return FACTOR_REQUEST_CODE++;
+        }
+    }
+
+}

+ 23 - 0
library_xinrui/src/main/java/com/yyrh/easypermission/PermissionRequestListener.java

@@ -0,0 +1,23 @@
+package com.yyrh.easypermission;
+
+import java.util.Map;
+
+/**
+ * @className: PermissionRequestListener
+ * @classDescription:
+ * @author: Pan_
+ * @createTime: 2018/10/25
+ */
+public abstract class PermissionRequestListener {
+    /**
+     * 权限申请结果的回调,map里面对应着需要申请的权限和结果
+     * @param result
+     */
+    public abstract void onGrant(Map<String,GrantResult> result);
+
+    /**
+     * 当用户在RequestPermissionRationalListner的next函数里面回调STOP,则会调用这个回调,返回stop时候的权限的字符串
+     * @param stopPermission
+     */
+    public abstract void onCancel(String stopPermission);
+}

+ 122 - 0
library_xinrui/src/main/java/com/yyrh/easypermission/PermissionSettingPage.java

@@ -0,0 +1,122 @@
+package com.yyrh.easypermission;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Build;
+import android.provider.Settings;
+
+/**
+ * @className: PermissionSettingPage
+ * @classDescription:权限设置页面的跳转工具类
+ * @author: Pan_
+ * @createTime: 2018/10/26
+ */
+public class PermissionSettingPage {
+
+    private static final String MARK = Build.MANUFACTURER.toLowerCase();
+
+    /**
+     * 跳转到应用权限设置页面
+     *
+     * @param context 上下文对象
+     * @param newTask 是否使用新的任务栈启动
+     */
+    static void start(Context context, boolean newTask) {
+
+        Intent intent = null;
+        if (MARK.contains("huawei")) {
+            intent = huawei(context);
+        } else if (MARK.contains("xiaomi")) {
+            intent = xiaomi(context);
+        } else if (MARK.contains("oppo")) {
+            intent = oppo(context);
+        } else if (MARK.contains("vivo")) {
+            intent = vivo(context);
+        } else if (MARK.contains("meizu")) {
+            intent = meizu(context);
+        }
+
+        if (intent == null || !hasIntent(context, intent)) {
+            intent = google(context);
+        }
+
+        if (newTask) {
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        }
+
+        try {
+            context.startActivity(intent);
+        } catch (Exception ignored) {
+            intent = google(context);
+            context.startActivity(intent);
+        }
+    }
+
+    private static Intent google(Context context) {
+        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+        intent.setData(Uri.fromParts("package", context.getPackageName(), null));
+        return intent;
+    }
+
+    private static Intent huawei(Context context) {
+        Intent intent = new Intent();
+        intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity"));
+        if (hasIntent(context, intent)) return intent;
+        intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.addviewmonitor.AddViewMonitorActivity"));
+        if (hasIntent(context, intent)) return intent;
+        intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.notificationmanager.ui.NotificationManagmentActivity"));
+        return intent;
+    }
+
+    private static Intent xiaomi(Context context) {
+        Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
+        intent.putExtra("extra_pkgname", context.getPackageName());
+        if (hasIntent(context, intent)) return intent;
+
+        intent.setPackage("com.miui.securitycenter");
+        if (hasIntent(context, intent)) return intent;
+
+        intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
+        if (hasIntent(context, intent)) return intent;
+
+        intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
+        return intent;
+    }
+
+    private static Intent oppo(Context context) {
+        Intent intent = new Intent();
+        intent.putExtra("packageName", context.getPackageName());
+        intent.setClassName("com.color.safecenter", "com.color.safecenter.permission.floatwindow.FloatWindowListActivity");
+        if (hasIntent(context, intent)) return intent;
+
+        intent.setClassName("com.coloros.safecenter", "com.coloros.safecenter.sysfloatwindow.FloatWindowListActivity");
+        if (hasIntent(context, intent)) return intent;
+
+        intent.setClassName("com.oppo.safe", "com.oppo.safe.permission.PermissionAppListActivity");
+        return intent;
+    }
+
+    private static Intent vivo(Context context) {
+        Intent intent = new Intent();
+        intent.setClassName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.FloatWindowManager");
+        intent.putExtra("packagename", context.getPackageName());
+        if (hasIntent(context, intent)) return intent;
+
+        intent.setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.safeguard.SoftPermissionDetailActivity"));
+        return intent;
+    }
+
+    private static Intent meizu(Context context) {
+        Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
+        intent.putExtra("packageName", context.getPackageName());
+        intent.setComponent(new ComponentName("com.meizu.safe", "com.meizu.safe.security.AppSecActivity"));
+        return intent;
+    }
+
+    private static boolean hasIntent(Context context, Intent intent) {
+        return context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
+    }
+}

+ 87 - 0
library_xinrui/src/main/java/com/yyrh/easypermission/PermissionUtils.java

@@ -0,0 +1,87 @@
+package com.yyrh.easypermission;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.provider.Settings;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @className: PermissionUtils
+ * @classDescription:
+ * @author: Pan_
+ * @createTime: 2018/10/25
+ */
+
+final class PermissionUtils {
+    /**
+     * 是否是6.0以上版本
+     */
+    static boolean isOverMarshmallow() {
+        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
+    }
+
+    /**
+     * 是否是8.0以上版本
+     */
+    static boolean isOverOreo() {
+        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
+    }
+
+    /**
+     * 返回应用程序在清单文件中注册的权限
+     */
+    static List<String> getManifestPermissions(Context context) {
+        PackageManager pm = context.getPackageManager();
+        try {
+            return Arrays.asList(pm.getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS).requestedPermissions);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+
+
+    /**
+     * 检测权限有没有在清单文件中注册
+     *
+     * @param activity              Activity对象
+     * @param requestPermissions    请求的权限组
+     */
+    static void checkPermissions(Activity activity, List<String> requestPermissions) {
+        List<String> manifest = PermissionUtils.getManifestPermissions(activity);
+        if (manifest != null && manifest.size() != 0) {
+            for (String permission : requestPermissions) {
+                if (!manifest.contains(permission)) {
+                    throw new RuntimeException("you must add this permission:"+permission+" to AndroidManifest");
+                }
+            }
+        }
+    }
+
+    /**
+     * 是否有安装权限
+     */
+    static boolean isHasInstallPermission(Context context) {
+        if (isOverOreo()) {
+            return context.getPackageManager().canRequestPackageInstalls();
+        }
+        return true;
+    }
+
+    /**
+     * 是否有悬浮窗权限
+     */
+    static boolean isHasOverlaysPermission(Context context) {
+        if (isOverMarshmallow()) {
+            return Settings.canDrawOverlays(context);
+        }
+        return true;
+    }
+
+
+}

+ 19 - 0
library_xinrui/src/main/java/com/yyrh/easypermission/RequestPermissionRationalListener.java

@@ -0,0 +1,19 @@
+package com.yyrh.easypermission;
+
+/**
+ * @className: RequestPermissionRationalListener
+ * @classDescription:
+ * @author: Pan_
+ * @createTime: 2018/10/24
+ */
+public interface RequestPermissionRationalListener {
+
+    /**
+     * 申请权限Rationale的处理回调函数,可以在这个函数里面处理权限rational的情况,例如弹一些dialog提示用户允许开启权限等,但是调用完成后必须调用NextAction
+     * 方法,传进去一个NextActionType,否则后续操作不会执行,同时NextActionType最好不要传空,传空默认当成IGNORE处理
+     * @param permission
+     * @param requestPermissionRationaleResult
+     * @param nextAction
+     */
+    public void onRequestPermissionRational(String permission, boolean requestPermissionRationaleResult, NextAction nextAction);
+}

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

@@ -0,0 +1,175 @@
+package com.yyrh.factory;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+
+import com.yyrh.constant.RoleInfo;
+import com.yyrh.constant.SDKSettings;
+import com.yyrh.sdk.SDKEntry;
+import com.yyrh.sdk.YyrhSdkManager;
+import com.yyrh.sdk.callback.RealNameMsgCallback;
+import com.yyrh.utils.Utils;
+import com.yyrh.utils.YYLog;
+import com.yythird.base.ChannelSdkCallback;
+import com.yythird.sdk.ChannelSDK;
+
+import org.json.JSONObject;
+
+import java.util.HashMap;
+
+
+public class ChannelSdkOperation implements ISdkOperation {
+    private static ChannelSDK channelSdk = null;
+
+    public ChannelSdkOperation(Context context) {
+        channelSdk = ChannelSDK.getInstance();
+    }
+
+
+
+    @Override
+    public void login(Activity activity) {
+        channelSdk.SDKLogin(activity, SDKEntry.getSdkInstance().sdkCallback);
+    }
+
+    @Override
+    public void uploadRoleInfo(String type, Activity activity, RoleInfo roleInfo) {
+        String roleId = roleInfo.getRoleId();
+        String roleName = roleInfo.getRoleName();
+        String roleLevel = roleInfo.getRoleLevel();
+        String gender = roleInfo.getGender();
+        String serverId = roleInfo.getServerId();
+        String serverName = roleInfo.getServerName();
+        String hasGold = roleInfo.getHasGold();
+        String vipLevel = roleInfo.getVipLevel();
+        String roleCreateTime = roleInfo.getRoleCreateTime();
+        String partyName = roleInfo.getPartyName();
+        String role_power = roleInfo.getRolePower();
+        String partyId = roleInfo.getPartyId();
+        String reincarnationCount = roleInfo.getReincarnationCount();
+
+
+        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(partyId)
+                || Utils.judgeStrNull(reincarnationCount)) {
+
+            YYLog.i("上传参数有空值,请检查: " + roleInfo.getAllParam());
+
+        } else {
+
+            channelSdk.SDKUploadInfo(type, activity, roleInfo);
+
+        }
+    }
+
+    @Override
+    public void setSDKLogoutListener(Activity ac, ChannelSdkCallback sdkCallback) {
+        channelSdk.setSDKLogoutListener(ac, sdkCallback);
+    }
+
+    @Override
+    public void pay(Activity activity, HashMap<String, Object> map) {
+
+        if (SDKSettings.isThirdPay){
+            channelSdk.SDKPay(activity, map, SDKEntry.getSdkInstance().sdkCallback);
+        }else{
+            YyrhSdkManager.defaultManager(activity).yyrhPay(activity,map);
+        }
+
+    }
+
+    @Override
+    public void exit(Activity activity) {
+        channelSdk.SDKExit(activity, SDKEntry.getSdkInstance().sdkCallback);
+    }
+
+    @Override
+    public void logOut() {
+        channelSdk.SDKLogout();
+    }
+
+    @Override
+    public void getRealNameInfo(Activity activity, RealNameMsgCallback realNameMsgCallback) {
+        if (Utils.getTextIsNull(SDKSettings.loginData.rn_bd)) {
+            ChannelSDK.getInstance().onGetChannelRealNameInfo(activity);
+        } else {
+            realNameMsgCallback.onLoadRealNameMsg(true, SDKSettings.loginData.rn_bd);
+        }
+    }
+
+    @Override
+    public void reportAdEvent(String event, JSONObject json) {
+        channelSdk.SDKReportAdInfo(event,json);
+    }
+
+    @Override
+    public void sdkOnStart(Activity activity) {
+        channelSdk.onStart(activity);
+    }
+
+    @Override
+    public void sdkOnCreate(Activity activity, Bundle savedInstanceState) {
+        channelSdk.onCreate(activity, savedInstanceState);
+    }
+
+    @Override
+    public void sdkOnPause(Activity activity) {
+        channelSdk.onPause(activity);
+    }
+
+    @Override
+    public void sdkOnResume(Activity activity) {
+        channelSdk.onResume(activity);
+    }
+
+    @Override
+    public void sdkOnRestart(Activity activity) {
+        channelSdk.onRestart(activity);
+    }
+
+    @Override
+    public void sdkOnNewIntent(Activity acitivty, Intent intent) {
+        channelSdk.onNewIntent(acitivty, intent);
+    }
+
+    @Override
+    public void sdkOnStop(Activity activity) {
+        channelSdk.onStop(activity);
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfigs) {
+        channelSdk.onConfigurationChanged(newConfigs);
+    }
+
+    @Override
+    public void sdkOnDestroy(Activity activity) {
+        channelSdk.onDestroy(activity);
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+        channelSdk.onRequestPermissionsResult(requestCode, permissions, grantResults);
+    }
+
+    @Override
+    public void onActivityResult(Activity ac, int requestCode, int resultCode, Intent data) {
+        channelSdk.onActivityResult(ac, requestCode, resultCode, data);
+    }
+
+    @Override
+    public void onWindowFocusChanged(Activity activity, boolean hasFocus) {
+        channelSdk.onWindowFocusChanged(activity, hasFocus);
+    }
+}

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

@@ -0,0 +1,66 @@
+package com.yyrh.factory;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+
+import com.yyrh.constant.RoleInfo;
+import com.yyrh.sdk.callback.RealNameMsgCallback;
+import com.yythird.base.ChannelSdkCallback;
+
+import org.json.JSONObject;
+
+import java.util.HashMap;
+
+public interface ISdkOperation {
+
+    /**
+     * operation
+     */
+
+
+    void login(Activity activity);
+
+    void uploadRoleInfo(String type, Activity activity, RoleInfo roleInfo);
+
+    void setSDKLogoutListener(Activity ac, ChannelSdkCallback sdkCallback);
+
+    void pay(Activity activity, HashMap<String, Object> map);
+
+    void exit(Activity activity);
+
+    void logOut();
+
+    void getRealNameInfo(Activity activity, RealNameMsgCallback realNameMsgCallback);
+
+    void reportAdEvent(String event, JSONObject json);
+    /**
+     * 生命周期
+     */
+    void sdkOnStart(Activity activity);
+
+    void sdkOnCreate(Activity activity, Bundle savedInstanceState);
+
+    void sdkOnPause(Activity activity);
+
+    void sdkOnResume(Activity activity);
+
+    void sdkOnRestart(Activity activity);
+
+    void sdkOnNewIntent(Activity acitivty, Intent intent);
+
+    void sdkOnStop(Activity activity);
+
+    void onConfigurationChanged(Configuration newConfigs);
+
+    void sdkOnDestroy(Activity activity);
+
+
+    void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults);
+
+    void onActivityResult(Activity ac, int requestCode, int resultCode, Intent data);
+
+    void onWindowFocusChanged(Activity activity, boolean hasFocus);
+
+}

+ 17 - 0
library_xinrui/src/main/java/com/yyrh/factory/SdkFactory.java

@@ -0,0 +1,17 @@
+package com.yyrh.factory;
+
+import android.content.Context;
+
+import com.yyrh.constant.SDKSettings;
+
+public class SdkFactory {
+    private SdkFactory(){}
+    public static ISdkOperation GetSdk(Context context) {
+
+         if (SDKSettings.isThirdLogin){
+             return new ChannelSdkOperation(context);
+         }else{
+             return new YyrhSdkOperation(context);
+         }
+    }
+}

+ 164 - 0
library_xinrui/src/main/java/com/yyrh/factory/SdkManager.java

@@ -0,0 +1,164 @@
+package com.yyrh.factory;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+
+import com.yyrh.constant.RoleInfo;
+import com.yyrh.networking.NetRequestApi;
+import com.yyrh.sdk.SDKEntry;
+import com.yyrh.sdk.YyrhSdkManager;
+import com.yyrh.sdk.callback.PayOrderCallback;
+import com.yyrh.sdk.callback.RealNameMsgCallback;
+import com.yyrh.utils.YYLog;
+import com.yythird.base.ChannelSdkCallback;
+
+import org.json.JSONObject;
+
+import java.util.HashMap;
+
+import static com.yyrh.constant.Constants.CLICK_INTERVAL;
+import static com.yyrh.constant.URLConstants.BASEURL;
+import static com.yyrh.constant.URLConstants.PAYMENTWAY;
+
+public class SdkManager {
+
+    private static SdkManager manager = null;
+
+    private ISdkOperation operation;
+
+
+
+    private long clickLoginTime = 0L;
+
+    private SdkManager(Context context) {
+        operation = SdkFactory.GetSdk(context);
+    }
+
+    public static SdkManager defaultManager(Context context) {
+        if (manager == null) {
+            synchronized (SdkManager.class) {
+                if (manager == null) {
+                    manager = new SdkManager(context);
+                }
+            }
+        }
+        return manager;
+    }
+
+
+
+    /**
+     * operation
+     */
+
+    public  void  onInitSuccess(Activity activity){
+        operation = SdkFactory.GetSdk(activity);
+    }
+
+    public void login(Activity activity){
+
+        if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
+            YYLog.i("调用登录接口太频繁,拦截此次操作");
+            return;
+        }
+        clickLoginTime = System.currentTimeMillis();
+        operation.login(activity);
+    }
+
+    public void uploadRoleInfo(String type, Activity activity, RoleInfo roleInfo){
+        operation.uploadRoleInfo(type,activity,roleInfo);
+    }
+    public void reportAdEvent(String event, JSONObject json){
+        operation.reportAdEvent(event,json);
+    }
+
+    public void pay(Activity activity, HashMap<String, Object> map){
+        operation.pay(activity,map);
+    }
+    public void forcePay(final Activity activity, HashMap<String, Object> map){
+
+        NetRequestApi.payOrderInit(PAYMENTWAY, map, activity, new PayOrderCallback() {
+            @Override
+            public void onPaySuccess(HashMap<String, Object> map) {
+
+                SDKEntry.getSdkInstance().adSdkCallback.onCreateOrder(map);
+                YyrhSdkManager.defaultManager(activity).yyrhPay(activity,map);
+            }
+
+            @Override
+            public void onPayFailed(String msg) {
+                SDKEntry.getSdkInstance().sdkCallback.onPayFinishCallback(false,msg);
+            }
+        });
+    }
+    public void exit(Activity activity){
+        operation.exit(activity);
+    }
+    public void logOut(){
+        operation.logOut();
+    }
+    public void getRealNameInfo(Activity activity, RealNameMsgCallback realNameMsgCallback){
+        operation.getRealNameInfo(activity,realNameMsgCallback);
+    }
+    public void setSDKLogoutListener(Activity ac, ChannelSdkCallback sdkCallback){
+        operation.setSDKLogoutListener(ac,sdkCallback);
+    }
+
+
+    /**
+     * 生命周期
+     */
+    public void sdkOnStart(Activity activity){
+        operation.sdkOnStart(activity);
+    }
+
+    public void sdkOnCreate(Activity activity, Bundle savedInstanceState){
+        operation.sdkOnCreate(activity,savedInstanceState);
+    }
+
+    public void sdkOnPause(Activity activity){
+        operation.sdkOnPause(activity);
+    }
+
+    public void sdkOnResume(Activity activity){
+        operation.sdkOnResume(activity);
+    }
+
+    public void sdkOnRestart(Activity activity){
+        operation.sdkOnRestart(activity);
+    }
+
+    public void sdkOnNewIntent(Activity acitivty, Intent intent){
+        operation.sdkOnNewIntent(acitivty,intent);
+    }
+
+    public void sdkOnStop(Activity activity){
+        operation.sdkOnStop(activity);
+    }
+
+    public void onConfigurationChanged(Configuration newConfigs){
+        operation.onConfigurationChanged(newConfigs);
+    }
+
+    public void sdkOnDestroy(Activity activity){
+        operation.sdkOnDestroy(activity);
+    }
+
+
+    public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
+        operation.onRequestPermissionsResult(requestCode,permissions,grantResults);
+    }
+
+    public void onActivityResult(Activity ac,int requestCode, int resultCode, Intent data){
+        operation.onActivityResult(ac,requestCode,resultCode,data);
+    }
+
+    public void onWindowFocusChanged(Activity activity, boolean hasFocus){
+        operation.onWindowFocusChanged(activity,hasFocus);
+    }
+
+
+}

+ 128 - 0
library_xinrui/src/main/java/com/yyrh/factory/YyrhSdkOperation.java

@@ -0,0 +1,128 @@
+package com.yyrh.factory;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+
+import com.yyrh.constant.RoleInfo;
+import com.yyrh.sdk.SDKEntry;
+import com.yyrh.sdk.YyrhSdkManager;
+import com.yyrh.sdk.callback.RealNameMsgCallback;
+import com.yythird.base.ChannelSdkCallback;
+
+import org.json.JSONObject;
+
+import java.util.HashMap;
+
+public class YyrhSdkOperation implements ISdkOperation {
+
+    private static YyrhSdkManager yyrhSdkManager = null;
+
+    public YyrhSdkOperation(Context context){
+        yyrhSdkManager = YyrhSdkManager.defaultManager(context);
+    }
+
+
+    @Override
+    public void login(Activity activity) {
+        yyrhSdkManager.yyrhLogin(activity);
+    }
+
+    @Override
+    public void uploadRoleInfo(String type, Activity activity, RoleInfo roleInfo) {
+
+    }
+
+    @Override
+    public void setSDKLogoutListener(Activity ac, ChannelSdkCallback sdkCallback) {
+
+    }
+
+
+    @Override
+    public void pay(Activity activity, HashMap<String, Object> map) {
+        yyrhSdkManager.yyrhPay(activity,map);
+    }
+
+    @Override
+    public void exit(Activity activity) {
+        yyrhSdkManager.yyrhExitGame(activity);
+    }
+
+    @Override
+    public void logOut() {
+        yyrhSdkManager.yyrhLogout();
+    }
+
+    @Override
+    public void getRealNameInfo(Activity activity, RealNameMsgCallback realNameMsgCallback) {
+        yyrhSdkManager.yyrhGetRealNameInfo(activity,realNameMsgCallback);
+    }
+
+    @Override
+    public void reportAdEvent(String event, JSONObject json) {
+        SDKEntry.getSdkInstance().adSdkCallback.onReportAdEvent(event,json);
+    }
+
+    @Override
+    public void sdkOnStart(Activity activity) {
+
+    }
+
+    @Override
+    public void sdkOnCreate(Activity activity, Bundle savedInstanceState) {
+
+    }
+
+    @Override
+    public void sdkOnPause(Activity activity) {
+        yyrhSdkManager.onPause(activity);
+    }
+
+    @Override
+    public void sdkOnResume(Activity activity) {
+        yyrhSdkManager.onResume(activity);
+    }
+
+    @Override
+    public void sdkOnRestart(Activity activity) {
+
+    }
+
+    @Override
+    public void sdkOnNewIntent(Activity acitivty, Intent intent) {
+
+    }
+
+    @Override
+    public void sdkOnStop(Activity activity) {
+
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfigs) {
+
+    }
+
+    @Override
+    public void sdkOnDestroy(Activity activity) {
+        yyrhSdkManager.onDestroy(activity);
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+
+    }
+
+    @Override
+    public void onActivityResult(Activity ac, int requestCode, int resultCode, Intent data) {
+
+    }
+
+    @Override
+    public void onWindowFocusChanged(Activity activity, boolean hasFocus) {
+
+    }
+}

+ 172 - 0
library_xinrui/src/main/java/com/yyrh/imei/ImeiUtil.java

@@ -0,0 +1,172 @@
+package com.yyrh.imei;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.Build;
+
+import android.provider.Settings;
+import android.support.v4.app.ActivityCompat;
+import android.telephony.TelephonyManager;
+
+
+import com.yyrh.constant.Constants;
+import com.yyrh.constant.SDKSettings;
+import com.yyrh.utils.Utils;
+import com.yythird.sdk.ChannelSDK;
+
+
+public class ImeiUtil {
+    public static String getImei(Context context) {
+
+        TelephonyManager telephonyManager = null;
+        String imei = "";
+        try {
+            telephonyManager = (TelephonyManager) context
+                    .getSystemService(Context.TELEPHONY_SERVICE);
+
+
+            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
+                // TODO: Consider calling
+                //    ActivityCompat#requestPermissions
+                // here to request the missing permissions, and then overriding
+                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
+                //                                          int[] grantResults)
+                // to handle the case where the user grants the permission. See the documentation
+                // for ActivityCompat#requestPermissions for more details.
+
+                imei = Settings.Secure.getString(context.getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);
+
+
+                if (judgeStrNull(imei)){
+                    return userSimulateImei(context);
+                }else{
+                    SDKSettings.ifa_type = "3";
+                    return imei;
+                }
+
+
+
+
+            }
+
+            if (telephonyManager.getDeviceId() != null) {
+
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                    imei =  telephonyManager.getImei();
+                }else{
+                    imei = telephonyManager.getDeviceId();
+                }
+                SDKSettings.ifa_type = "1";
+
+            } else {
+
+                imei = Settings.Secure.getString(context.getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);
+                SDKSettings.ifa_type = "3";
+
+            }
+
+            } catch (Exception e) {
+                System.out.println(e.toString());
+            }
+
+
+
+            if (judgeStrNull(imei)){
+
+                return userSimulateImei(context);
+
+
+            }else{
+                Utils.setSharedPreferences("yyrh","simulateImei",imei,context);
+            }
+
+            return imei;
+
+
+    }
+
+     static String userSimulateImei(Context context){
+
+        SharedPreferences sp = context.getSharedPreferences("yyrh", Activity.MODE_PRIVATE);
+        String  simulateImei = sp.getString("simulateImei", "");
+
+        if (!judgeStrNull(simulateImei)){
+            return simulateImei;
+        }else {
+
+
+            // 用putString的方法保存数据
+            String encryptMD5to16 ="YYR" + encryptMD5to16();
+            SDKSettings.ifa_type = "0";
+            Utils.setSharedPreferences("yyrh","simulateImei",encryptMD5to16,context);
+
+
+            return encryptMD5to16;
+        }
+    }
+    public static boolean judgeStrNull(String str) {
+        return (str == null || str.equals(""));
+    }
+
+    public static String encryptMD5to16() {
+        return simulateUniqueId().substring(8, 24);
+
+    }
+
+
+    //获得独一无二的Psuedo ID
+    public static String simulateUniqueId() {
+        String serial = null;
+
+        String m_szDevIDShort = "" +
+                Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
+
+                Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
+
+                Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
+
+                Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
+
+                Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
+
+                Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
+
+                Build.USER.length() % 10; //13 位
+
+        String  time = m_szDevIDShort + (System.currentTimeMillis());
+        return  getMD5(time);
+    }
+
+    public static String getMD5(String content) {
+        String s = null;
+        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+                'a', 'b', 'c', 'd', 'e', 'f'};
+        try {
+            java.security.MessageDigest md = java.security.MessageDigest
+                    .getInstance("MD5");
+            md.update(content.getBytes());
+            byte tmp[] = md.digest();
+            char str[] = new char[16 * 2];
+            int k = 0;
+            for (int i = 0; i < 16; i++) {
+                byte byte0 = tmp[i];
+                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
+                str[k++] = hexDigits[byte0 & 0xf];
+            }
+            s = new String(str);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return s;
+    }
+
+    public void  getOaid(final Context context){
+       ChannelSDK.getInstance().SDKGetOaid();
+    }
+
+
+}

+ 1117 - 0
library_xinrui/src/main/java/com/yyrh/networking/NetRequestApi.java

@@ -0,0 +1,1117 @@
+package com.yyrh.networking;
+
+import android.app.Activity;
+
+import android.os.Message;
+
+import android.widget.Toast;
+
+
+import com.yyrh.constant.InitConfig;
+import com.yyrh.constant.LoginData;
+import com.yyrh.pay.PaymentNotify;
+import com.yyrh.sdk.SDKEntry;
+import com.yyrh.sdk.callback.ShowPolicyCallback;
+
+import com.yyrh.ui.fragment.UserPhoneLoginFragment;
+import com.yyrh.ui.fragment.UserPhoneLoginSetpwdFragment;
+import com.yyrh.ui.fragment.UserRetrievePwdFragment;
+import com.yyrh.utils.ResourceUtil;
+import com.yyrh.utils.SignUtils;
+import com.yyrh.utils.SwitchUtil;
+import com.yyrh.utils.TosUtil;
+import com.yyrh.utils.Utils;
+import com.yyrh.utils.YYLog;
+
+import com.yyrh.constant.Constants;
+import com.yyrh.constant.SDKSettings;
+import com.yyrh.networking.urlhttp.CallBackUtil;
+import com.yyrh.networking.urlhttp.UrlHttpUtil;
+import com.yyrh.sdk.callback.InitCallback;
+import com.yyrh.sdk.callback.LoginCallback;
+import com.yyrh.sdk.callback.PayOrderCallback;
+import com.yyrh.sdk.callback.RegisterCallback;
+import com.yyrh.ui.ProgressDialogUtils;
+import com.yythird.sdk.ChannelSDK;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+import static com.yyrh.constant.Constants.LOGIN;
+import static com.yyrh.constant.SDKSettings.channelTag;
+
+import static com.yyrh.constant.SDKSettings.isThirdLogin;
+import static com.yyrh.constant.SDKSettings.isThirdPay;
+
+import static com.yyrh.constant.SDKSettings.loginData;
+import static com.yyrh.constant.SDKSettings.order_ext;
+import static com.yyrh.constant.URLConstants.AGREEMENTINIT;
+import static com.yyrh.constant.URLConstants.BASEURL;
+import static com.yyrh.constant.URLConstants.CHANNELLOGIN;
+import static com.yyrh.constant.URLConstants.CHANNELZTAG;
+import static com.yyrh.constant.URLConstants.FASTREGISTER;
+import static com.yyrh.constant.URLConstants.GETCAPTCHA;
+import static com.yyrh.constant.URLConstants.INIT;
+
+import static com.yyrh.constant.URLConstants.LOGINWITHSMS;
+import static com.yyrh.constant.URLConstants.QUERYORDER;
+import static com.yyrh.constant.URLConstants.REALNAMERECORD;
+import static com.yyrh.constant.URLConstants.RECHARGEINT;
+import static com.yyrh.constant.URLConstants.REGISTERWITHPHONE;
+import static com.yyrh.constant.URLConstants.RESETPWDWITHPHONE;
+import static com.yyrh.constant.URLConstants.RSAKEY;
+import static com.yyrh.constant.URLConstants.UPLOADROLEINFO;
+import static com.yyrh.constant.URLConstants.USERLOGIN;
+
+
+public class NetRequestApi {
+    public static void init(final Activity activity, final InitCallback initCallback) {
+
+
+
+        HashMap<String, String> map = getCommonParams();
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+
+        if (BASEURL.equals("http://testsdkapi.yyxxgame.com")) {
+            Toast.makeText(activity, "正在使用测试环境,请勿上线" + BASEURL, Toast.LENGTH_SHORT).show();
+        }
+
+        UrlHttpUtil.post(activity,INIT, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+                  YYLog.i(errorMessage);
+
+
+                initCallback.onInitError(activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip")));
+
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+                try {
+                    JSONObject json = new JSONObject(response);
+                    int code = json.optInt("code", -1);
+                    String msg = json.optString("msg", "");
+                    if (code != 1) {
+                        initCallback.onInitFailed(msg);
+                        return;
+                    }
+                    JSONObject data = json.getJSONObject("data");
+
+                    SDKSettings.initConfig = InitConfig.toBean(data);
+
+                    if (SDKSettings.initConfig.sdk_login == 1) {
+                        if (channelTag.equals(CHANNELZTAG)) {
+                            isThirdLogin = false;
+                        } else {
+                            isThirdLogin = true;
+                        }
+
+
+                    } else {
+
+                        SDKSettings.UserCentUrl = data.optString("h5_web_host", "");
+
+                        isThirdLogin = false;
+                    }
+
+
+                    SwitchUtil.ControlKFSwitch(SDKSettings.initConfig.bswitch);
+
+                    YYLog.i("初始化成功。");
+                    initCallback.onInitSuccess("init success");
+
+                } catch (JSONException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+            }
+        });
+
+    }
+
+    public static void loginWithYy(boolean isShowPrg, final Activity activity, String account, String password,String login_token, final LoginCallback loginCallback) {
+
+
+        HashMap<String, String> map = getCommonParams();
+
+
+        map.put("smt_type", SignUtils.toURLEncoded(SDKSettings.isSimulator));
+
+        if (Utils.judgeStrNull(password)){
+            map.put("login_token", login_token);
+        }else {
+            String uname_pwd = null;
+
+            try {
+                uname_pwd = SignUtils.encryptRsaByPublicKey(RSAKEY, account + "|" + password);
+            } catch (Exception e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+            map.put("uname_pwd", uname_pwd);
+        }
+
+        map.put("package_name", SDKSettings.package_name);
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+        UrlHttpUtil.post(activity,USERLOGIN, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+
+                new TosUtil(activity, TosUtil.TOAST_ERROR, activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip"))).show();
+
+                loginCallback.onLoginError(activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip")));
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+
+                JSONObject json = null;
+                JSONObject data = null;
+                try {
+                    json = new JSONObject(response);
+                    data = json.getJSONObject("data");
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                int code = json.optInt("code", -1);
+                if (code != 1) {
+
+                    YYLog.i("登录失败:" + json.optString("msg", "登录失败"));
+                    loginCallback.onLoginFailed(json.optString("msg", "登录失败"));
+                    return;
+                }
+
+                SDKSettings.loginData = LoginData.toBean(data);
+
+
+
+
+                SDKSettings.LOGINTAG = LOGIN;
+
+                if (loginData.is_rn == 0) {
+                    SDKSettings.isVefityRealName = false;
+                } else {
+                    SDKSettings.isVefityRealName = true;
+                }
+
+                YYLog.i("登录成功。+ token:" +  loginData.token);
+
+                loginCallback.onLoginSuccess(loginData.token);
+
+            }
+        });
+
+    }
+
+    public static void registerWithYy(final Activity activity, String account, String password, final RegisterCallback registerCallback) {
+
+
+
+        ProgressDialogUtils.show(activity, activity.getString(ResourceUtil.getStringId(activity, "hnyy_registering")));
+
+        HashMap<String, String> map = getCommonParams();
+
+
+        map.put("smt_type", SignUtils.toURLEncoded(SDKSettings.isSimulator));
+
+
+        String uname_pwd = null;
+
+        try {
+            uname_pwd = SignUtils.encryptRsaByPublicKey(RSAKEY, account + "|" + password);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        map.put("uname_pwd", uname_pwd);
+        map.put("package_name", SDKSettings.package_name);
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+
+        UrlHttpUtil.post(activity,FASTREGISTER, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+
+                registerCallback.onRegisterFailed(activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip")));
+
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+                JSONObject json = null;
+                JSONObject data = null;
+                try {
+                    json = new JSONObject(response);
+                    data = json.getJSONObject("data");
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                int code = json.optInt("code", -1);
+                if (code != 1) {
+                    YYLog.i("注册账号失败:" + json.optString("msg", "注册失败"));
+                    registerCallback.onRegisterFailed(json.optString("msg", "注册失败"));
+                    return;
+                }
+
+                SDKSettings.loginData = LoginData.toBean(data);
+
+
+
+
+
+                YYLog.i("注册账号成功。 token:" + loginData.token);
+                registerCallback.onRegisterSuccess(loginData.token);
+
+            }
+        });
+
+    }
+
+    public static void loginWithChannel(final Activity activity, String channelLoginInfo, final LoginCallback loginCallback) {
+
+          HashMap<String, String> map = getCommonParams();
+
+
+        map.put("sdk_params", channelLoginInfo);
+
+        map.put("package_name", SDKSettings.package_name);
+
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+        UrlHttpUtil.post(activity,CHANNELLOGIN, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+
+
+                new TosUtil(activity, TosUtil.TOAST_ERROR, activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip"))).show();
+
+
+                loginCallback.onLoginError(activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip")));
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+
+
+                JSONObject json = null;
+                JSONObject data = null;
+                String errMsg = null;
+                try {
+                    json = new JSONObject(response);
+                    errMsg = json.optString("msg", "登录验证失败");
+                    data = json.getJSONObject("data");
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                    SDKEntry.getSdkInstance().sdkCallback.onLoginChannelFail(errMsg);
+                    return;
+                }
+                int code = json.optInt("code", -1);
+                if (code != 1) {
+                    YYLog.i("登录验证失败");
+                    String msg = json.optString("msg", "登录验证失败");
+                    loginCallback.onLoginFailed(msg);
+                    SDKEntry.getSdkInstance().sdkCallback.onLoginChannelFail(msg);
+                    return;
+                }
+                SDKSettings.loginData = LoginData.toBean(data);
+
+
+
+                SDKEntry.getSdkInstance().sdkCallback.onLoginChannelSuccess(data.toString());
+                YYLog.i("渠道登录验证成功。token:" + loginData.token);
+
+                loginCallback.onLoginSuccess(loginData.token);
+            }
+        });
+
+    }
+
+    public static void upLoadingRoleInfo(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) {
+
+        HashMap<String, String> map = getCommonParams();
+
+
+        if (type.equals(Constants.UPLOADTYPE_CREATEROLE)) {
+            map.put("report_role_type", "createRole");
+        } else if (type.equals(Constants.UPLOADTYPE_ENTERGAME)) {
+            map.put("report_role_type", "enterGame");
+        } else if (type.equals(Constants.UPLOADTYPE_LEVELUP)) {
+            map.put("report_role_type", "roleUpgrade");
+            return;
+        }
+        if (partyName.equals("暂无")) {
+            partyName = "";
+        }
+
+
+        if (createTime.length() != 10) {
+
+            new TosUtil(activity, TosUtil.TOAST_ERROR, activity.getString(ResourceUtil.getStringId(activity, "hnyy_ctime_format_error"))).show();
+
+            return;
+        }
+
+
+        map.put("uname", loginData.uname);
+        map.put("channel_uid", loginData.channel_uid);
+        map.put("party_id", partyId);
+        map.put("party_name", partyName);
+        map.put("server_id", serverId);
+        map.put("server_name", serverName);
+        map.put("role_id", roleId);
+        map.put("role_name", roleName);
+        map.put("role_level", roleLevel);
+        map.put("vip_level", vipLevel);
+        map.put("role_power", role_power);
+        map.put("role_gold", hasGold);
+        map.put("role_ctime", createTime);
+
+        map.put("role_charge", charge);
+
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+
+        UrlHttpUtil.post(activity,UPLOADROLEINFO, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+
+                try {
+                    JSONObject json = new JSONObject(response);
+                    int code = json.optInt("code", -1);
+                    if (code == 1) {
+                        YYLog.i("上传角色信息成功。");
+                        return;
+                    } else {
+                        YYLog.i("上传角色信息失败,请检查参数是否为空。");
+                    }
+
+                } catch (JSONException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+
+
+            }
+        });
+
+    }
+
+    public static void payOrderInit(String url,final HashMap<String, Object> map,
+                                    final Activity activity, final PayOrderCallback callback) {
+
+
+
+        String cp_order_id = (String) map.get("game_no");
+        String money = (String) map.get("pay_money");
+        String server_id = (String) map.get("server_id");
+        String server_name = (String) map.get("server_name");
+        String role_id = (String) map.get("role_id");
+        String role_level = (String) map.get("role_level");
+        String role_name = (String) map.get("role_name");
+        String ext = (String) map.get("ext");
+        String order_name = (String) map.get("order_desc");
+        String product_id = (String) map.get("productId");
+
+
+        if (Utils.judgeStrNull(cp_order_id) || Utils.judgeStrNull(money)
+                || Utils.judgeStrNull(server_id)
+                || Utils.judgeStrNull(server_name)
+                || Utils.judgeStrNull(role_id)
+                || Utils.judgeStrNull(role_name)
+                || Utils.judgeStrNull(ext)
+                || Utils.judgeStrNull(order_name)
+                || Utils.judgeStrNull(product_id)
+        ) {
+
+            YYLog.i("下单参数有空值,请检查: " + map.toString());
+            return;
+
+        }
+
+        YYLog.i("下单参数: " + map.toString());
+
+        String app_name = Utils.getApplicationName(activity);
+
+        String role_ctime = (String) map.get("role_ctime");
+        if (Utils.judgeStrNull(role_ctime)) {
+            new TosUtil(activity, TosUtil.TOAST_ERROR, activity.getString(ResourceUtil.getStringId(activity, "hnyy_pls_upload_roleinfo_frist"))).show();
+
+            return;
+        }
+
+
+        HashMap<String, String> orderMap = getCommonParams();
+
+
+        orderMap.put("uname", loginData.uname);
+        orderMap.put("channel_uid", loginData.channel_uid);
+        orderMap.put("cp_order_id", cp_order_id);
+        orderMap.put("money", money);
+        orderMap.put("server_id", server_id);
+        orderMap.put("server_name", server_name);
+        orderMap.put("role_id", role_id);
+        orderMap.put("role_name", role_name);
+        orderMap.put("role_level", role_level);
+        orderMap.put("ext", ext);
+        orderMap.put("order_name", order_name);
+        orderMap.put("app_name", app_name);
+
+        orderMap.put("role_ctime", role_ctime);
+        orderMap.put("product_id", product_id);
+
+
+        String channelOrderExt = ChannelSDK.getInstance().SDKGetOrderExt();
+
+        if (!Utils.judgeStrNull(channelOrderExt)) {
+            orderMap.put("sdk_params", channelOrderExt);
+        }
+
+        if (!Utils.judgeStrNull(order_ext)) {
+            orderMap.put("order_ext", SignUtils.toURLEncoded(SDKSettings.order_ext));
+        }
+
+
+
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(orderMap, time);
+        orderMap.put("time", time);
+        orderMap.put("sign", paramSign);
+
+        UrlHttpUtil.post(activity,url, orderMap, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+
+                new TosUtil(activity, TosUtil.TOAST_ERROR, activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip"))).show();
+
+                callback.onPayFailed(activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip")));
+
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+                try {
+                    JSONObject json = new JSONObject(response);
+                    int code = json.optInt("code", -1);
+                    if (code != 1) {
+                        String msg = json.optString("msg");
+                        callback.onPayFailed(msg);
+                        return;
+                    }
+
+                    JSONObject data = json.getJSONObject("data");
+                    int state = data.optInt("sdk_pay", 100);
+
+                    if (state == 1) {
+
+                        if (channelTag.equals(CHANNELZTAG)) {
+                            map.put("url", data.optString("pay_web_url", ""));
+                            isThirdPay = false;
+                        } else {
+                            isThirdPay = true;
+                        }
+
+                    } else {
+                        map.put("url", data.optString("pay_web_url", ""));
+                        isThirdPay = false;
+                    }
+                    map.put("order_id", data.optString("order_id", ""));
+                    map.put("3rdext", data.optString("3rdext", ""));
+                    map.put("query_params", data.optString("query_params", ""));
+                    callback.onPaySuccess(map);
+
+                } catch (JSONException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+            }
+        });
+
+    }
+
+    public static void getPhoneCaptcha(final Activity activity, String phone, String action, final UserPhoneLoginFragment.CaptchaCallback captchaCallback) {
+
+        ProgressDialogUtils.show(activity, activity.getString(ResourceUtil.getStringId(activity, "hnyy_get_code")));
+
+        HashMap<String, String> map = getCommonParams();
+
+
+        map.put("phone", SignUtils.toURLEncoded(phone));
+        map.put("action", SignUtils.toURLEncoded(action));
+
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+        UrlHttpUtil.post(activity,GETCAPTCHA, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+                ProgressDialogUtils.dismiss();
+                new TosUtil(activity, TosUtil.TOAST_ERROR, activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip"))).show();
+
+                captchaCallback.onGetFailed(activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip")));
+
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+                ProgressDialogUtils.dismiss();
+
+
+                JSONObject json = null;
+
+                try {
+                    json = new JSONObject(response);
+
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                    return;
+                }
+                int code = json.optInt("code", -1);
+                if (code == 1) {
+                    captchaCallback.onGetSuccess(json.optString("msg", "验证码发送成功"));
+                } else {
+                    captchaCallback.onGetFailed(json.optString("msg", "验证码发送失败"));
+                }
+
+            }
+        });
+
+    }
+
+    public static void phoneLoginWithSms(final Activity activity, String phone,String code,final UserPhoneLoginFragment.PhoneLoginCallback phoneLoginCallback) {
+        if (ProgressDialogUtils.isShowing()) {
+            return;
+        }
+
+        HashMap<String, String> map = getCommonParams();
+
+
+
+        map.put("sms", SignUtils.toURLEncoded(code));
+        map.put("phone", SignUtils.toURLEncoded(phone));
+
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+        UrlHttpUtil.post(activity,LOGINWITHSMS, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+
+                phoneLoginCallback.onPhoneLoginFailed(activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip")));
+
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+
+                JSONObject json = null;
+                JSONObject data = null;
+                try {
+                    json = new JSONObject(response);
+                    data = json.getJSONObject("data");
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                int code = json.optInt("code", -1);
+                if (code != 1) {
+
+                    YYLog.i("手机登录失败:" + json.optString("msg", "手机登录失败"));
+                    phoneLoginCallback.onPhoneLoginFailed(json.optString("msg", "手机登录失败"));
+
+                    return;
+                }
+                if (data.optInt("new_user") == 1){
+                    phoneLoginCallback.onPhoneNewLogin();
+                }else{
+                    SDKSettings.loginData = LoginData.toBean(data);
+                    YYLog.i("手机注册成功,正在登录游戏。+ token:" + loginData.token);
+                    phoneLoginCallback.onPhoneLoginSuccess(loginData.token);
+
+                }
+
+            }
+        });
+    }
+
+
+
+    public static void registerWithPhone(final Activity activity, String code, String userInfo, final UserPhoneLoginSetpwdFragment.PhoneRegisterCallback phoneRegisterCallback) {
+
+        HashMap<String, String> map = getCommonParams();
+
+
+        map.put("uname_pwd", userInfo);
+        map.put("sms", SignUtils.toURLEncoded(code));
+        map.put("smt_type", SignUtils.toURLEncoded(SDKSettings.isSimulator));
+
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+        UrlHttpUtil.post(activity,REGISTERWITHPHONE, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+
+                phoneRegisterCallback.onRegisterFailed(activity.getString(ResourceUtil.getStringId(activity, "hnyy_network_error_tip")));
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+
+
+                JSONObject json = null;
+                JSONObject data = null;
+                try {
+                    json = new JSONObject(response);
+                    data = json.getJSONObject("data");
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                int code = json.optInt("code", -1);
+                if (code != 1) {
+
+                    YYLog.i("手机注册失败:" + json.optString("msg", "手机注册失败"));
+                    phoneRegisterCallback.onRegisterFailed(json.optString("msg", "手机注册失败"));
+                    return;
+                }
+
+                SDKSettings.loginData = LoginData.toBean(data);
+
+
+                YYLog.i("手机注册成功,正在登录游戏。+ token:" + loginData.token);
+                phoneRegisterCallback.onRegisterSuccess(loginData.token);
+            }
+        });
+    }
+
+    /**
+     * 支付回调通用扩展,目前仅应用宝需要用到
+     */
+    public static void payChannelNotify(final HashMap<String, String> payInfo, final String notifyUrl) {
+
+        final HashMap<String, String> ntymap = new HashMap();
+
+        for (Map.Entry<String, String> entry : payInfo.entrySet()) {
+
+
+            ntymap.put(entry.getKey(), SignUtils.toURLEncoded(entry.getValue()));
+
+        }
+        String url = notifyUrl + "?" + SignUtils.encryptParam(ntymap);
+        Message payMsg = new Message();
+        payMsg.what = 1;
+        HashMap<String, String> paydata = new HashMap<>();
+        paydata.put("url", url);
+        payMsg.obj = paydata;
+        new PaymentNotify().sendMessage(payMsg);
+
+    }
+
+    public static void resetPwdWithPhone(Activity activity, String phone, String code, String pwd, final UserRetrievePwdFragment.ResetPwdCallback resetPwdCallback) {
+
+
+        HashMap<String, String> map = getCommonParams();
+
+
+        String uname_pwd = null;
+        try {
+            uname_pwd = SignUtils.encryptRsaByPublicKey(RSAKEY, phone + "|" + pwd + "|" + code);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+
+        map.put("phone_pwd", uname_pwd);
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+        UrlHttpUtil.post(activity,RESETPWDWITHPHONE, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+
+
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+
+
+                JSONObject json = null;
+                String msg = "";
+                try {
+                    json = new JSONObject(response);
+                    msg = json.optString("msg");
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                int code = json.optInt("code", -1);
+                if (code != 1) {
+
+                    resetPwdCallback.onResetFailed(msg);
+
+                    return;
+                }
+
+                resetPwdCallback.onResetSuccess(msg);
+
+
+            }
+        });
+
+
+    }
+
+    public static void upLoadUserRealNameInfo(String report_type, String channelRealNameInfo) {
+        HashMap<String, String> map = getCommonParams();
+
+
+        map.put("channel_uid", SignUtils.toURLEncoded(loginData.channel_uid));
+        map.put("uname", SignUtils.toURLEncoded(loginData.uname));
+        map.put("report_type", report_type);
+        map.put("sdk_params", channelRealNameInfo);
+
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+        UrlHttpUtil.post(REALNAMERECORD, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+
+
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+
+                ProgressDialogUtils.dismiss();
+
+                JSONObject json = null;
+
+                try {
+                    json = new JSONObject(response);
+
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                int code = json.optInt("code", -1);
+
+                if (code == 1) {
+                    String rn_bd = "";
+                    try {
+                        JSONObject data = json.getJSONObject("data");
+                        rn_bd = data.optString("rn_bd", "");
+                    } catch (JSONException e) {
+                        e.printStackTrace();
+                    }
+                    loginData.rn_bd = rn_bd;
+
+                }
+
+
+            }
+        });
+
+    }
+
+    public static void recordUserRealNameInfo(Activity activity, String report_type, String channelRealNameInfo) {
+
+        HashMap<String, String> map = getCommonParams();
+
+
+        map.put("channel_uid", SignUtils.toURLEncoded(loginData.channel_uid));
+        map.put("uname", SignUtils.toURLEncoded(loginData.uname));
+        map.put("report_type", report_type);
+        map.put("sdk_params", channelRealNameInfo);
+
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+        UrlHttpUtil.post(REALNAMERECORD, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+                ProgressDialogUtils.dismiss();
+
+
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+
+                ProgressDialogUtils.dismiss();
+
+                JSONObject json = null;
+                String msg = "";
+                try {
+                    json = new JSONObject(response);
+                    msg = json.optString("msg");
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                int code = json.optInt("code", -1);
+                if (code != 1) {
+
+                    SDKEntry.getSdkInstance().sdkCallback.realNameMsgCallback(false, "");
+                } else {
+                    String rn_bd = "";
+                    try {
+                        JSONObject data = json.getJSONObject("data");
+                        rn_bd = data.optString("rn_bd", "");
+                    } catch (JSONException e) {
+                        e.printStackTrace();
+                    }
+                    loginData.rn_bd = rn_bd;
+                    SDKEntry.getSdkInstance().sdkCallback.realNameMsgCallback(true, rn_bd);
+                }
+
+
+            }
+        });
+
+
+    }
+
+    public static void queryOrder(String order_id, final HashMap<String, Object> payMap) {
+        HashMap<String, String> map = getCommonParams();
+
+
+        String query_params = (String) payMap.get("query_params");
+
+        YYLog.i("begin query order,order_id:" + order_id + "----  and query_params:" + query_params);
+        if (Utils.judgeStrNull(query_params)) {
+            return;
+        }
+
+
+        map.put("order_id", SignUtils.toURLEncoded(order_id));
+        map.put("package_name", SDKSettings.package_name);
+
+
+        map.put("query_params", query_params);
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+        UrlHttpUtil.post(QUERYORDER, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+                YYLog.i(errorMessage);
+            }
+
+            @Override
+            public void onResponse(String response) {
+
+                JSONObject json = null;
+                JSONObject data = null;
+                try {
+                    json = new JSONObject(response);
+                    data = json.getJSONObject("data");
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+
+                int code = json.optInt("code", -1);
+
+                YYLog.i(response);
+                if (code == 1) {
+
+                    int orderStatus = data.optInt("order_status");
+
+                    if (orderStatus == 1) {
+                        SDKEntry.getSdkInstance().adSdkCallback.onPaySuccess(payMap);
+                    }
+                }
+
+
+            }
+        });
+
+    }
+
+    public static void initAgreement(Activity activity, final ShowPolicyCallback showPolicyCallback) {
+
+
+        HashMap<String, String> map = new HashMap();
+
+        String game_code = Utils.GetApplicationMetaData(activity, "yyrh_game_code");
+
+        String gcp_code = Utils.getParamCnfValuebyKey(activity, "YyrhParam.cnf",
+                "GCP_CODE");
+
+        map.put("game_code", game_code);
+        map.put("gcp_code", gcp_code);
+
+
+        String time = SignUtils.toURLEncoded(System.currentTimeMillis() / 1000 + "");
+        String paramSign = SignUtils.paramSign(map, time);
+
+        map.put("time", time);
+        map.put("sign", paramSign);
+
+
+
+        UrlHttpUtil.post(AGREEMENTINIT, map, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+
+                showPolicyCallback.onError();
+            }
+
+            @Override
+            public void onResponse(String response) {
+                ProgressDialogUtils.dismiss();
+
+                JSONObject json = null;
+                JSONObject data = null;
+                try {
+                    json = new JSONObject(response);
+                    data = json.getJSONObject("data");
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+
+                int code = json.optInt("code", -1);
+
+                YYLog.i(response);
+                if (code == 1) {
+
+                    String agreement_url = data.optString("agreement_url");
+                    if (Utils.judgeStrNull(agreement_url)) {
+                        showPolicyCallback.onHide();
+                    } else {
+                        showPolicyCallback.onShow(agreement_url);
+                    }
+
+
+                }
+
+            }
+        });
+    }
+
+    private static HashMap<String, String> getCommonParams() {
+        HashMap<String, String> map = new HashMap();
+
+        map.put("game_code", SignUtils.toURLEncoded(SDKSettings.game_code));
+        map.put("gcp_code", SignUtils.toURLEncoded(SDKSettings.gcp_code));
+        map.put("cs_ver", SignUtils.toURLEncoded(SDKSettings.SDK_VERSION));
+        map.put("system", SignUtils.toURLEncoded(SDKSettings.system));
+        map.put("ifa", SignUtils.toURLEncoded(SDKSettings.imei));
+        map.put("device_ver", SignUtils.toURLEncoded(SDKSettings.version));
+        map.put("sp_code", SignUtils.toURLEncoded(SDKSettings.sp_code));
+
+        map.put("device_model", SignUtils.toURLEncoded(SDKSettings.device_model));
+        map.put("package_name", SDKSettings.package_name);
+        map.put("ifa_type", SDKSettings.ifa_type);
+        map.put("android_id", SDKSettings.android_id);
+
+        if (!Utils.judgeStrNull(SDKSettings.o_cfg)) {
+            map.put("o_cfg", SDKSettings.o_cfg);
+            YYLog.i("o_cfg : " + SDKSettings.o_cfg);
+        } else {
+            YYLog.i("o_cfg is null");
+        }
+
+        return map;
+    }
+
+}

+ 256 - 0
library_xinrui/src/main/java/com/yyrh/networking/urlhttp/CallBackUtil.java

@@ -0,0 +1,256 @@
+package com.yyrh.networking.urlhttp;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Handler;
+import android.os.Looper;
+import android.widget.ImageView;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * Created by fighting on 2017/4/7.
+ */
+
+public abstract class CallBackUtil<T> {
+    static Handler mMainHandler = new Handler(Looper.getMainLooper());
+
+
+    public  void onProgress(float progress, long total ){}
+
+    void onError(final RealResponse response){
+
+        final String errorMessage;
+        if(response.inputStream != null){
+            errorMessage = getRetString(response.inputStream);
+        }else if(response.errorStream != null) {
+            errorMessage = getRetString(response.errorStream);
+        }else if(response.exception != null) {
+            errorMessage = response.exception.getMessage();
+        }else {
+            errorMessage = "";
+        }
+        mMainHandler.post(new Runnable() {
+            @Override
+            public void run() {
+
+                onFailure(response.code,errorMessage);
+
+            }
+        });
+    }
+    void onSeccess(RealResponse response){
+        final T obj = onParseResponse(response);
+        mMainHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                onResponse(obj);
+            }
+        });
+    }
+
+
+    /**
+     * 解析response,执行在子线程
+     */
+    public abstract T onParseResponse(RealResponse response);
+
+    /**
+     * 访问网络失败后被调用,执行在UI线程
+     */
+    public abstract void onFailure(int code,String errorMessage);
+
+    /**
+     *
+     * 访问网络成功后被调用,执行在UI线程
+     */
+    public abstract void onResponse(T response);
+
+
+
+    public static abstract class CallBackDefault extends CallBackUtil<RealResponse> {
+        @Override
+        public RealResponse onParseResponse(RealResponse response) {
+            return response;
+        }
+    }
+
+    public static abstract class CallBackString extends CallBackUtil<String> {
+        @Override
+        public String onParseResponse(RealResponse response) {
+            try {
+                return getRetString(response.inputStream);
+            } catch (Exception e) {
+                throw new RuntimeException("failure");
+            }
+        }
+    }
+
+
+    public static abstract class CallBackBitmap extends CallBackUtil<Bitmap> {
+        private int mTargetWidth;
+        private int mTargetHeight;
+
+        public CallBackBitmap(){};
+        public CallBackBitmap(int targetWidth,int targetHeight){
+            mTargetWidth = targetWidth;
+            mTargetHeight = targetHeight;
+        };
+        public CallBackBitmap(ImageView imageView){
+            int width = imageView.getWidth();
+            int height = imageView.getHeight();
+            if(width <=0 || height <=0){
+                throw new RuntimeException("无法获取ImageView的width或height");
+            }
+            mTargetWidth = width;
+            mTargetHeight = height;
+        };
+        @Override
+        public Bitmap onParseResponse(RealResponse response) {
+            if(mTargetWidth ==0 || mTargetHeight == 0){
+                return BitmapFactory.decodeStream(response.inputStream);
+            }else {
+                return getZoomBitmap( response.inputStream);
+            }
+        }
+
+        /**
+         * 压缩图片,避免OOM异常
+         */
+        private Bitmap getZoomBitmap(InputStream inputStream) {
+            byte[] data = null;
+            try {
+                data = input2byte(inputStream);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            BitmapFactory.Options options = new BitmapFactory.Options();
+            options.inJustDecodeBounds = true;
+
+            BitmapFactory.decodeByteArray(data,0,data.length,options);
+            int picWidth = options.outWidth;
+            int picHeight = options.outHeight;
+            int sampleSize = 1;
+            int heightRatio = (int) Math.floor((float) picWidth / (float) mTargetWidth);
+            int widthRatio = (int) Math.floor((float) picHeight / (float) mTargetHeight);
+            if (heightRatio > 1 || widthRatio > 1){
+                sampleSize = Math.max(heightRatio,widthRatio);
+            }
+            options.inSampleSize = sampleSize;
+            options.inJustDecodeBounds = false;
+            Bitmap bitmap = BitmapFactory.decodeByteArray(data,0,data.length,options);
+
+            if(bitmap == null){
+                throw new RuntimeException("Failed to decode stream.");
+            }
+            return bitmap;
+        }
+    }
+
+    public static final byte[] input2byte(InputStream inStream)
+            throws IOException {
+        ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+        byte[] buff = new byte[100];
+        int rc = 0;
+        while ((rc = inStream.read(buff, 0, 100)) > 0) {
+            swapStream.write(buff, 0, rc);
+        }
+        byte[] in2b = swapStream.toByteArray();
+        return in2b;
+    }
+
+    /**
+     * 下载文件时的回调类
+     */
+    public static abstract class CallBackFile extends CallBackUtil<File> {
+
+        private final String mDestFileDir;
+        private final String mdestFileName;
+
+        /**
+         *
+         * @param destFileDir:文件目录
+         * @param destFileName:文件名
+         */
+        public CallBackFile(String destFileDir, String destFileName){
+            mDestFileDir = destFileDir;
+            mdestFileName = destFileName;
+        }
+        @Override
+        public File onParseResponse(RealResponse response) {
+
+            InputStream is = null;
+            byte[] buf = new byte[1024*8];
+            int len = 0;
+            FileOutputStream fos = null;
+            try{
+                is = response.inputStream;
+                final long total = response.contentLength;
+
+                long sum = 0;
+
+                File dir = new File(mDestFileDir);
+                if (!dir.exists()){
+                    dir.mkdirs();
+                }
+                File file = new File(dir, mdestFileName);
+                fos = new FileOutputStream(file);
+                while ((len = is.read(buf)) != -1){
+                    sum += len;
+                    fos.write(buf, 0, len);
+                    final long finalSum = sum;
+                    mMainHandler.post(new Runnable() {
+                        @Override
+                        public void run() {
+                            onProgress(finalSum * 100.0f / total,total);
+                        }
+                    });
+                }
+                fos.flush();
+
+                return file;
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally{
+                try{
+                    fos.close();
+                    if (is != null) is.close();
+                } catch (IOException e){
+                }
+                try{
+                    if (fos != null) fos.close();
+                } catch (IOException e){
+                }
+
+            }
+            return null;
+        }
+    }
+
+
+    private static String getRetString(InputStream is) {
+        String buf;
+        try {
+            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
+            StringBuilder sb = new StringBuilder();
+            String line = "";
+            while ((line = reader.readLine()) != null) {
+                sb.append(line + "\n");
+            }
+            is.close();
+            buf = sb.toString();
+            return buf;
+
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+}

+ 243 - 0
library_xinrui/src/main/java/com/yyrh/networking/urlhttp/RealRequest.java

@@ -0,0 +1,243 @@
+package com.yyrh.networking.urlhttp;
+
+import android.text.TextUtils;
+
+import java.io.BufferedWriter;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by fighting on 2017/4/24.
+ */
+
+ class RealRequest {
+    private static final String BOUNDARY = java.util.UUID.randomUUID().toString();
+    private static final String TWO_HYPHENS = "--";
+    private static final String LINE_END = "\r\n";
+
+    /**
+     * get请求
+     */
+    RealResponse getData(String requestURL, Map<String, String> headerMap){
+        HttpURLConnection conn = null;
+        try {
+            conn= getHttpURLConnection(requestURL,"GET");
+            conn.setDoInput(true);
+            if(headerMap != null){
+                setHeader(conn,headerMap);
+            }
+            conn.connect();
+            return getRealResponse(conn);
+        } catch (Exception e) {
+            return getExceptonResponse(conn, e);
+        }
+    }
+
+    /**
+     * post请求
+     */
+    RealResponse postData(String requestURL, String body, String bodyType, Map<String, String> headerMap) {
+        HttpURLConnection conn = null;
+        try {
+            conn = getHttpURLConnection(requestURL,"POST");
+            conn.setDoOutput(true);//可写出
+            conn.setDoInput(true);//可读入
+            conn.setUseCaches(false);//不是有缓存
+
+            if(!TextUtils.isEmpty(bodyType)) {
+                conn.setRequestProperty("Content-Type", bodyType);
+            }
+            if(headerMap != null){
+                setHeader(conn,headerMap);//请求头必须放在conn.connect()之前
+            }
+            conn.connect();// 连接,以上所有的请求配置必须在这个API调用之前
+            if(!TextUtils.isEmpty(body)) {
+                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"));
+                writer.write(body);
+                writer.close();
+            }
+
+            return getRealResponse(conn);
+        } catch (Exception e) {
+            return getExceptonResponse(conn, e);
+        }
+    }
+
+    /**
+     * 上传文件
+     */
+    RealResponse uploadFile(String requestURL, File file,List<File> fileList,Map<String,File> fileMap,String fileKey,String fileType,Map<String,String> paramsMap,Map<String, String> headerMap,CallBackUtil callBack) {
+        HttpURLConnection conn = null;
+        try {
+            conn = getHttpURLConnection(requestURL,"POST");
+            setConnection(conn);
+            if(headerMap != null){
+                setHeader(conn,headerMap);
+            }
+            conn.connect();
+            DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream());
+            if (paramsMap != null) {
+                outputStream.write(getParamsString(paramsMap).getBytes());//上传参数
+                outputStream.flush();
+            }
+            if(file != null) {
+                writeFile(file, fileKey, fileType, outputStream,callBack);//上传文件
+            }else if(fileList != null){
+                for (File f : fileList){
+                    writeFile(f, fileKey, fileType, outputStream,null);
+                }
+            }else if(fileMap != null){
+                for (String key : fileMap.keySet()){
+                    writeFile(fileMap.get(key), key, fileType, outputStream,null);
+                }
+            }
+            byte[] endData = (LINE_END + TWO_HYPHENS + BOUNDARY + TWO_HYPHENS + LINE_END).getBytes();//写结束标记位
+            outputStream.write(endData);
+            outputStream.flush();
+            return getRealResponse(conn);
+        } catch (Exception e) {
+            return getExceptonResponse(conn,e);
+        }
+    }
+
+    /**
+     * 得到Connection对象,并进行一些设置
+     */
+    private HttpURLConnection getHttpURLConnection(String requestURL,String requestMethod) throws IOException {
+        URL url = new URL(requestURL);
+        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+        conn.setConnectTimeout(12*1000);
+        conn.setReadTimeout(12*1000);
+        conn.setRequestMethod(requestMethod);
+        return conn;
+    }
+
+    /**
+     * 设置请求头
+     */
+    private void setHeader(HttpURLConnection conn, Map<String, String> headerMap) {
+        if(headerMap != null){
+            for (String key: headerMap.keySet()){
+                conn.setRequestProperty(key, headerMap.get(key));
+            }
+        }
+    }
+
+    /**
+     * 上传文件时设置Connection参数
+     */
+    private void setConnection(HttpURLConnection conn) throws ProtocolException {
+        conn.setDoOutput(true);
+        conn.setDoInput(true);
+        conn.setUseCaches(false);
+        conn.setRequestProperty("Connection", "Keep-Alive");
+        conn.setRequestProperty("Charset", "UTF-8");
+        conn.setRequestProperty("Content-Type","multipart/form-data; BOUNDARY=" + BOUNDARY);
+    }
+
+    /**
+     * 上传文件时得到拼接的参数字符串
+     */
+    private String getParamsString(Map<String, String> paramsMap) {
+        StringBuffer strBuf = new StringBuffer();
+        for (String key : paramsMap.keySet()){
+            strBuf.append(TWO_HYPHENS);
+            strBuf.append(BOUNDARY);
+            strBuf.append(LINE_END);
+            strBuf.append("Content-Disposition: form-data; name=\"" + key + "\"");
+            strBuf.append(LINE_END);
+
+            strBuf.append("Content-Type: " + "text/plain" );
+            strBuf.append(LINE_END);
+            strBuf.append("Content-Lenght: "+paramsMap.get(key).length());
+            strBuf.append(LINE_END);
+            strBuf.append(LINE_END);
+            strBuf.append(paramsMap.get(key));
+            strBuf.append(LINE_END);
+        }
+        return strBuf.toString();
+    }
+
+    /**
+     * 上传文件时写文件
+     */
+    private void writeFile(File file, String fileKey, String fileType, DataOutputStream outputStream, final CallBackUtil callBack) throws IOException {
+        outputStream.write(getFileParamsString(file, fileKey, fileType).getBytes());
+        outputStream.flush();
+
+        FileInputStream inputStream = new FileInputStream(file);
+        final long total = file.length();
+        long sum = 0;
+        byte[] buffer = new byte[1024*2];
+        int length = -1;
+        while ((length = inputStream.read(buffer)) != -1){
+            outputStream.write(buffer,0,length);
+            sum = sum + length;
+            if(callBack != null){
+                final long finalSum = sum;
+                CallBackUtil.mMainHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        callBack.onProgress(finalSum * 100.0f / total,total);
+                    }
+                });
+            }
+        }
+        outputStream.flush();
+        inputStream.close();
+    }
+
+    /**
+     * 上传文件时得到一定格式的拼接字符串
+     */
+    private String getFileParamsString(File file, String fileKey, String fileType) {
+        StringBuffer strBuf = new StringBuffer();
+        strBuf.append(LINE_END);
+        strBuf.append(TWO_HYPHENS);
+        strBuf.append(BOUNDARY);
+        strBuf.append(LINE_END);
+        strBuf.append("Content-Disposition: form-data; name=\"" + fileKey + "\"; filename=\"" + file.getName() + "\"");
+        strBuf.append(LINE_END);
+        strBuf.append("Content-Type: " + fileType );
+        strBuf.append(LINE_END);
+        strBuf.append("Content-Lenght: "+file.length());
+        strBuf.append(LINE_END);
+        strBuf.append(LINE_END);
+        return strBuf.toString();
+    }
+
+    /**
+     * 当正常返回时,得到Response对象
+     */
+    private RealResponse getRealResponse(HttpURLConnection conn) throws IOException {
+
+        RealResponse response = new RealResponse();
+        response.code = conn.getResponseCode();
+        response.contentLength = conn.getContentLength();
+        response.inputStream = conn.getInputStream();
+        response.errorStream = conn.getErrorStream();
+        return response;
+    }
+
+    /**
+     * 当发生异常时,得到Response对象
+     */
+    private RealResponse getExceptonResponse(HttpURLConnection conn, Exception e) {
+        if(conn != null){
+            conn.disconnect();
+        }
+        e.printStackTrace();
+        RealResponse response = new RealResponse();
+        response.exception = e;
+        return response;
+    }
+
+}

+ 15 - 0
library_xinrui/src/main/java/com/yyrh/networking/urlhttp/RealResponse.java

@@ -0,0 +1,15 @@
+package com.yyrh.networking.urlhttp;
+
+import java.io.InputStream;
+
+/**
+ * Created by fighting on 2017/4/24.
+ */
+
+public class RealResponse {
+    public InputStream inputStream;
+    public InputStream errorStream;
+    public int code;
+    public long contentLength;
+    public Exception exception;
+}

+ 244 - 0
library_xinrui/src/main/java/com/yyrh/networking/urlhttp/RequestUtil.java

@@ -0,0 +1,244 @@
+package com.yyrh.networking.urlhttp;
+
+import android.text.TextUtils;
+
+
+import com.yyrh.behavior.ReportLogUtil;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+
+import static com.yyrh.constant.URLConstants.ACTION_LOG_URL;
+
+/**
+ * Created by fighting on 2017/4/24.
+ */
+
+class RequestUtil{
+    private Thread mThread;
+
+    /**
+     * 一般的get请求或post请求
+     */
+    RequestUtil(String method,String url, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {
+        switch (method){
+            case "GET":
+            urlHttpGet(url,paramsMap,headerMap,callBack);
+            break;
+            case "POST":
+            urlHttpPost(url,paramsMap,null,headerMap,callBack);
+            break;
+        }
+    }
+
+    /**
+     * post请求,传递json格式数据。
+     */
+    RequestUtil(String url, String jsonStr, Map<String, String> headerMap, CallBackUtil callBack) {
+        urlHttpPost(url,null,jsonStr,headerMap,callBack);
+    }
+
+    /**
+     * 上传文件
+     */
+    RequestUtil(String url, File file ,List<File> fileList,Map<String,File> fileMap,String fileKey,String fileType, Map<String,String> paramsMap, Map<String, String> headerMap,CallBackUtil callBack) {
+        urlHttpUploadFile(url,file,fileList,fileMap,fileKey,fileType,paramsMap,headerMap,callBack);
+    }
+
+    /**
+     * get请求
+     */
+    private void urlHttpGet(final String url, final Map<String, String> paramsMap, final Map<String, String> headerMap, final CallBackUtil callBack) {
+        mThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                RealResponse response = new RealRequest().getData(getUrl(url,paramsMap),headerMap);
+                if(response.code == HttpURLConnection.HTTP_OK){
+                    callBack.onSeccess(response);
+                }else {
+                    callBack.onError(response);
+                }
+            }
+
+        });
+    }
+
+    /**
+     * post请求
+     */
+    private void urlHttpPost(final String url, final Map<String, String> paramsMap, final String jsonStr, final Map<String, String> headerMap, final CallBackUtil callBack) {
+        mThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                RealResponse response = new RealRequest().postData(url, getPostBody(paramsMap,jsonStr),getPostBodyType(paramsMap,jsonStr),headerMap);
+                if(response.code == HttpURLConnection.HTTP_OK){
+                    callBack.onSeccess(response);
+                }else {
+                    callBack.onError(response);
+
+                    if (!url.startsWith(ACTION_LOG_URL)){
+                        resportErrorLog(url,response);
+                    }
+
+                }
+
+            }
+
+        });
+
+    }
+
+    /**
+     * 上报接口错误日志
+     */
+    private void  resportErrorLog(String url,RealResponse response){
+
+
+        String errorMessage = "";
+        if(response.inputStream != null){
+            errorMessage = getRetString(response.inputStream);
+        }else if(response.errorStream != null) {
+            errorMessage = getRetString(response.errorStream);
+        }else if(response.exception != null) {
+            errorMessage = response.exception.getMessage();
+        }else {
+            errorMessage = "";
+        }
+
+
+        String tag =url.split("/")[url.split("/").length-1];
+
+        JSONObject json = new JSONObject();
+        try {
+            json.put("errorMessage",errorMessage);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        ReportLogUtil.reportErrorLog(tag,tag,json.toString());
+    }
+
+    /**
+     * 上传文件
+     */
+    private void urlHttpUploadFile(final String url, final File file , final List<File> fileList, final Map<String,File> fileMap, final String fileKey, final String fileType, final Map<String,String> paramsMap, final Map<String, String> headerMap, final CallBackUtil callBack) {
+        mThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                RealResponse response = null;
+                response = new RealRequest().uploadFile(url, file,fileList,fileMap,fileKey,fileType,paramsMap,headerMap,callBack);
+                if(response.code == HttpURLConnection.HTTP_OK){
+                    callBack.onSeccess(response);
+                }else {
+                    callBack.onError(response);
+                }
+            }
+
+        });
+    }
+
+
+
+    /**
+     * get请求,将键值对凭接到url上
+     */
+    private String getUrl(String path,Map<String, String> paramsMap) {
+        if(paramsMap != null){
+            path = path+"?";
+            for (String key: paramsMap.keySet()){
+                path = path + key+"="+paramsMap.get(key)+"&";
+            }
+            path = path.substring(0,path.length()-1);
+        }
+        return path;
+    }
+
+    /**
+     * 得到post请求的body
+     */
+    private  String getPostBody(Map<String, String> params,String jsonStr) {//throws UnsupportedEncodingException {
+        if(params != null){
+            return getPostBodyFormParameMap(params);
+        }else if(!TextUtils.isEmpty(jsonStr)){
+            return jsonStr;
+        }
+        return null;
+    }
+
+
+    /**
+     * 根据键值对参数得到body
+     */
+    private  String getPostBodyFormParameMap(Map<String, String> params) {//throws UnsupportedEncodingException {
+        StringBuilder result = new StringBuilder();
+        boolean first = true;
+        try {
+            for (Map.Entry<String, String> entry : params.entrySet()) {
+                if (first)
+                    first = false;
+                else
+                    result.append("&");
+                result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
+                result.append("=");
+                result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
+            }
+            return result.toString();
+        } catch (UnsupportedEncodingException e) {
+            return null;
+        }
+
+    }
+
+    /**
+     * 得到bodyType
+     */
+    private String getPostBodyType(Map<String, String> paramsMap, String jsonStr) {
+        if(paramsMap != null){
+            //return "text/plain";不知为什么这儿总是报错。目前暂不设置(20170424)
+            return null;
+        }else if(!TextUtils.isEmpty(jsonStr)){
+            return "application/json;charset=utf-8";
+        }
+        return null;
+    }
+
+
+    /**
+     * 开启子线程,调用run方法
+     */
+    void execute(){
+        if(mThread != null){
+            mThread.start();
+        }
+    }
+
+
+    private static String getRetString(InputStream is) {
+        String buf;
+        try {
+            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
+            StringBuilder sb = new StringBuilder();
+            String line = "";
+            while ((line = reader.readLine()) != null) {
+                sb.append(line + "\n");
+            }
+            is.close();
+            buf = sb.toString();
+            return buf;
+
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+
+}

+ 289 - 0
library_xinrui/src/main/java/com/yyrh/networking/urlhttp/UrlHttpUtil.java

@@ -0,0 +1,289 @@
+package com.yyrh.networking.urlhttp;
+
+import android.app.Activity;
+import android.app.Dialog;
+
+import com.yyrh.ui.NewProgressDialogUtils;
+import com.yyrh.utils.ResourceUtil;
+import com.yyrh.utils.YYLog;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by fighting on 2017/4/24.
+ */
+
+public class UrlHttpUtil {
+    private static final String METHOD_GET = "GET";
+    private static final String METHOD_POST = "POST";
+
+    public static final String FILE_TYPE_FILE = "file/*";
+    public static final String FILE_TYPE_IMAGE = "image/*";
+    public static final String FILE_TYPE_AUDIO = "audio/*";
+    public static final String FILE_TYPE_VIDEO = "video/*";
+
+    /**
+     * get请求
+     * @param url:url
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void get(String url, CallBackUtil callBack) {
+        get(url, null, null, callBack);
+    }
+
+    /**
+     * get请求,可以传递参数
+     * @param url:url
+     * @param paramsMap:map集合,封装键值对参数
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void get(String url, Map<String, String> paramsMap, CallBackUtil callBack) {
+        get(url, paramsMap, null, callBack);
+    }
+
+    /**
+     * get请求,可以传递参数
+     * @param url:url
+     * @param paramsMap:map集合,封装键值对参数
+     * @param headerMap:map集合,封装请求头键值对
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void get(String url, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {
+        new RequestUtil(METHOD_GET, url, paramsMap, headerMap, callBack).execute();
+    }
+
+
+    /**
+     * post请求
+     * @param url:url
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+
+    public static void post(String url,  CallBackUtil callBack) {
+        post(url, null, callBack);
+    }
+
+    /**
+     * post请求,可以传递参数,无进度条
+     * @param url:url
+     * @param paramsMap:map集合,封装键值对参数
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+
+    public static void post(String url, Map<String, String> paramsMap, CallBackUtil callBack) {
+        post(url, paramsMap,null, callBack);
+    }
+
+
+    /**
+     * post请求,可以传递参数
+     * @param url:url
+     * @param paramsMap:map集合,封装键值对参数
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void post(Activity activity, String url, Map<String, String> paramsMap, final CallBackUtil callBack) {
+        YYLog.i(url + "------" + paramsMap.toString());
+
+        final Dialog newProgressDialogUtils = new NewProgressDialogUtils().show(activity,url);
+
+        post(url, paramsMap, null, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+                newProgressDialogUtils.dismiss();
+                callBack.onFailure(code,errorMessage);
+            }
+
+
+            @Override
+            public void onResponse(String response) {
+                newProgressDialogUtils.dismiss();
+                callBack.onResponse(response);
+            }
+        });
+    }
+
+    /**
+     * post请求,可以传递参数
+     * @param url:url
+     * @param paramsMap:map集合,封装键值对参数
+     * @param headerMap:map集合,封装请求头键值对
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void post(String url, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {
+        new RequestUtil(METHOD_POST,url,paramsMap,headerMap,callBack).execute();
+    }
+    /**
+     * post请求,可以传递参数
+     * @param url:url
+     * @param jsonStr:json格式的键值对参数
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void postJson(String url, String jsonStr, CallBackUtil callBack) {
+        postJson(url, jsonStr, null, callBack);
+    }
+
+    /**
+     * post请求,可以传递参数
+     * @param url:url
+     * @param jsonStr:json格式的键值对参数
+     * @param headerMap:map集合,封装请求头键值对
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void postJson(String url, String jsonStr, Map<String, String> headerMap, CallBackUtil callBack) {
+        new RequestUtil(url,jsonStr,headerMap,callBack).execute();
+    }
+
+
+
+
+    /**
+     * post请求,上传单个文件
+     * @param url:url
+     * @param file:File对象
+     * @param fileKey:上传参数时file对应的键
+     * @param fileType:File类型,是image,video,audio,file
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。还可以重写onProgress方法,得到上传进度
+     */
+    public static void uploadFile(String url, File file, String fileKey, String fileType, CallBackUtil callBack) {
+        uploadFile(url, file, fileKey,fileType, null, callBack);
+    }
+
+    /**
+     * post请求,上传单个文件
+     * @param url:url
+     * @param file:File对象
+     * @param fileKey:上传参数时file对应的键
+     * @param fileType:File类型,是image,video,audio,file
+     * @param paramsMap:map集合,封装键值对参数
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。还可以重写onProgress方法,得到上传进度
+     */
+    public static void uploadFile(String url, File file, String fileKey, String fileType, Map<String, String> paramsMap, CallBackUtil callBack) {
+        uploadFile(url, file,fileKey, fileType, paramsMap, null, callBack);
+    }
+
+    /**
+     * post请求,上传单个文件
+     * @param url:url
+     * @param file:File对象
+     * @param fileKey:上传参数时file对应的键
+     * @param fileType:File类型,是image,video,audio,file
+     * @param paramsMap:map集合,封装键值对参数
+     * @param headerMap:map集合,封装请求头键值对
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。还可以重写onProgress方法,得到上传进度
+     */
+    public static void uploadFile(String url, File file, String fileKey, String fileType, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {
+        new RequestUtil(url,file,null,null,fileKey,fileType,paramsMap,headerMap,callBack).execute();
+    }
+
+
+    /**
+     * post请求,上传多个文件,以list集合的形式
+     * @param url:url
+     * @param fileList:集合元素是File对象
+     * @param fileKey:上传参数时fileList对应的键
+     * @param fileType:File类型,是image,video,audio,file
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void uploadListFile(String url, List<File> fileList, String fileKey, String fileType, CallBackUtil callBack) {
+        uploadListFile(url, fileList, fileKey, fileType,null, callBack);
+    }
+
+    /**
+     * post请求,上传多个文件,以list集合的形式
+     * @param url:url
+     * @param fileList:集合元素是File对象
+     * @param fileKey:上传参数时fileList对应的键
+     * @param fileType:File类型,是image,video,audio,file
+     * @param paramsMap:map集合,封装键值对参数
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void uploadListFile(String url, List<File> fileList, String fileKey, String fileType, Map<String, String> paramsMap, CallBackUtil callBack) {
+        uploadListFile(url, fileList, fileKey, fileType,paramsMap, null, callBack);
+    }
+
+    /**
+     * post请求,上传多个文件,以list集合的形式
+     * @param url:url
+     * @param fileList:集合元素是File对象
+     * @param fileKey:上传参数时fileList对应的键
+     * @param fileType:File类型,是image,video,audio,file
+     * @param paramsMap:map集合,封装键值对参数
+     * @param headerMap:map集合,封装请求头键值对
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void uploadListFile(String url, List<File> fileList, String fileKey, String fileType, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {
+        new RequestUtil(url,null,fileList,null,fileKey,fileType,paramsMap,headerMap,callBack).execute();
+    }
+
+    /**
+     * post请求,上传多个文件,以map集合的形式
+     * @param url:url
+     * @param fileMap:集合key是File对象对应的键,集合value是File对象
+     * @param fileType:File类型,是image,video,audio,file
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void uploadMapFile(String url, Map<String, File> fileMap, String fileType, CallBackUtil callBack) {
+        uploadMapFile(url, fileMap, fileType, null, callBack);
+    }
+
+    /**
+     * post请求,上传多个文件,以map集合的形式
+     * @param url:url
+     * @param fileMap:集合key是File对象对应的键,集合value是File对象
+     * @param fileType:File类型,是image,video,audio,file
+     * @param paramsMap:map集合,封装键值对参数
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void uploadMapFile(String url, Map<String, File> fileMap, String fileType, Map<String, String> paramsMap, CallBackUtil callBack) {
+        uploadMapFile(url, fileMap, fileType, paramsMap, null, callBack);
+    }
+
+    /**
+     * post请求,上传多个文件,以map集合的形式
+     * @param url:url
+     * @param fileMap:集合key是File对象对应的键,集合value是File对象
+     * @param fileType:File类型,是image,video,audio,file
+     * @param paramsMap:map集合,封装键值对参数
+     * @param headerMap:map集合,封装请求头键值对
+     * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
+     */
+    public static void uploadMapFile(String url, Map<String, File> fileMap, String fileType, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {
+        new RequestUtil(url,null,null,fileMap,null,fileType,paramsMap,headerMap,callBack).execute();
+    }
+
+    /**
+     * 加载图片
+     */
+    public static void getBitmap(String url, CallBackUtil.CallBackBitmap callBack) {
+        getBitmap(url, null, callBack);
+    }
+    /**
+     * 加载图片,带参数
+     */
+    public static void getBitmap(String url,Map<String, String> paramsMap,  CallBackUtil.CallBackBitmap callBack) {
+        get(url, paramsMap, null, callBack);
+    }
+
+    /**
+     * 下载文件,不带参数
+     */
+    public static void downloadFile(String url, CallBackUtil.CallBackFile callBack) {
+        downloadFile(url,null,callBack);
+    }
+
+    /**
+     * 下载文件,带参数
+     */
+    public static void downloadFile(String url, Map<String, String> paramsMap, CallBackUtil.CallBackFile callBack) {
+        downloadFile(url, paramsMap, null, callBack);
+    }
+    /**
+     * 下载文件,带参数,带请求头
+     */
+    public static void downloadFile(String url, Map<String, String> paramsMap,Map<String, String> headerMap, CallBackUtil.CallBackFile callBack) {
+        get(url, paramsMap, headerMap, callBack);
+    }
+
+}

+ 118 - 0
library_xinrui/src/main/java/com/yyrh/pay/PaymentNotify.java

@@ -0,0 +1,118 @@
+package com.yyrh.pay;
+
+
+import android.os.Handler;
+import android.os.Message;
+
+import com.yyrh.networking.urlhttp.CallBackUtil;
+import com.yyrh.networking.urlhttp.UrlHttpUtil;
+import com.yyrh.sdk.SDKEntry;
+import com.yyrh.utils.YYLog;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Date;
+import java.util.HashMap;
+
+public class PaymentNotify extends Handler {
+    private static final int MAX_TIME = 5;
+
+    @Override
+    public void handleMessage(final Message msg) {
+        super.handleMessage(msg);
+        final HashMap<String, String> payInfo = (HashMap<String, String>) msg.obj;
+        String url = payInfo.get("url");
+       // url = "http://testmixplatformapi.yyxxgame.com:9003/client_test";
+        int times = 0;
+
+        if (payInfo.containsKey("resend_times")) {
+            times = Integer.valueOf(payInfo.get("resend_times")).intValue();
+            payInfo.remove("resend_times");
+        }
+
+        final int finalTimes = times;
+        UrlHttpUtil.post(url, new CallBackUtil.CallBackString() {
+            @Override
+            public void onFailure(int code, String errorMessage) {
+                if (finalTimes < MAX_TIME) {
+                    payInfo.put("resend_times", finalTimes + 1 + "");
+                    Message msg = new Message();
+                    msg.what = 1;
+                    msg.obj = payInfo;
+
+                    YYLog.i( "PaymentNotify-payInfo: NetWork Error" + payInfo.toString());
+
+                    switch (finalTimes) {
+
+                        case 0:
+                            sendMessageDelayed(msg, 10000);
+                            break;
+                        case 1:
+                            sendMessageDelayed(msg, 30000);
+                            break;
+                        case 2:
+                            sendMessageDelayed(msg, 60000);
+                            break;
+                        case 3:
+                            sendMessageDelayed(msg, 180000);
+                            break;
+                        case 4:
+                            sendMessageDelayed(msg, 300000);
+                            break;
+
+                    }
+                }
+            }
+
+            @Override
+            public void onResponse(String response) {
+                JSONObject json = null;
+
+                try {
+                    json = new JSONObject(response);
+
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                int code = json.optInt("code",-1);
+                if (code != 1 && finalTimes < MAX_TIME){
+                    payInfo.put("resend_times", finalTimes + 1 + "");
+                    Message msg = new Message();
+                    msg.what = 1;
+                    msg.obj = payInfo;
+
+                    YYLog.i( "PaymentNotify-payInfo:" + payInfo.toString());
+                    switch (finalTimes){
+                        case 0:
+
+                            sendMessageDelayed(msg, 10000);
+                            break;
+                        case 1:
+
+                            sendMessageDelayed(msg, 30000);
+                            break;
+                        case 2:
+
+                            sendMessageDelayed(msg, 60000);
+                            break;
+                        case 3:
+
+                            sendMessageDelayed(msg, 180000);
+                            break;
+                        case 4:
+
+                            sendMessageDelayed(msg, 300000);
+                            break;
+
+                    }
+
+                }else{
+
+                    SDKEntry.getSdkInstance().sdkCallback.onPayFinishCallback(true,"pay success");
+
+                }
+            }
+        });
+    }
+}

+ 597 - 0
library_xinrui/src/main/java/com/yyrh/sdk/SDKEntry.java

@@ -0,0 +1,597 @@
+package com.yyrh.sdk;
+
+import static com.yyrh.constant.URLConstants.RECHARGEINT;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.yyrh.advertisement.AdSdkCallback;
+import com.yyrh.advertisement.AdvertiseManager;
+import com.yyrh.constant.RoleInfo;
+import com.yyrh.constant.SDKSettings;
+import com.yyrh.easypermission.EasyPermission;
+import com.yyrh.easypermission.GrantResult;
+import com.yyrh.easypermission.Permission;
+import com.yyrh.easypermission.PermissionRequestListener;
+import com.yyrh.factory.SdkManager;
+import com.yyrh.imei.ImeiUtil;
+import com.yyrh.networking.NetRequestApi;
+import com.yyrh.sdk.callback.ExitCallback;
+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 com.yyrh.sdk.callback.PayOrderCallback;
+import com.yyrh.sdk.callback.RealNameMsgCallback;
+import com.yyrh.sdk.callback.UserPolicyCallback;
+import com.yyrh.ui.dialog.GameSplashDialog;
+import com.yyrh.utils.PermissionUtils;
+import com.yyrh.utils.ResourceUtil;
+import com.yyrh.utils.TosUtil;
+import com.yyrh.utils.Utils;
+import com.yyrh.utils.YYLog;
+import com.yythird.sdk.ChannelSDK;
+
+import org.json.JSONObject;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class SDKEntry {
+
+    private InitCallback initCall;
+    private LoginCallback loginCall;
+    private PayCallback payCall;
+    private LogoutCallback logoutCall;
+    private ExitCallback exitCall;
+    public RealNameMsgCallback realNameMsgCallback;
+    public Activity gameAct;
+
+    private UserPolicyCallback userPolicyCallback;
+    private ChannelSDK sdk = null;
+
+    private YyrhSdkManager manager = null;
+
+    private static volatile SDKEntry sdkInstance = null;
+
+    private String role_ctime = "";
+
+    private List<String> permissionList = new ArrayList<String>(Arrays.asList(Permission.READ_PHONE_STATE, Permission.WRITE_EXTERNAL_STORAGE));
+
+    //广告操作回调
+    public AdSdkCallback adSdkCallback = new AdSdkCallback() {
+        @Override
+        public void onRegisterSuccess(String msg) {
+
+            AdvertiseManager.defaultManager(gameAct).registration(gameAct, msg);
+        }
+
+        @Override
+        public void onLoginSuccess(String msg) {
+            AdvertiseManager.defaultManager(gameAct).login(gameAct, msg);
+        }
+
+        @Override
+        public void onPaySuccess(HashMap<String, Object> map) {
+            AdvertiseManager.defaultManager(gameAct).paymentFinish(gameAct, map);
+        }
+
+        @Override
+        public void onCreateOrder(HashMap<String, Object> map) {
+            AdvertiseManager.defaultManager(gameAct).callPayment(gameAct, map);
+        }
+
+        @Override
+        public void onUpLoadRoleInfo(String type, RoleInfo roleInfo) {
+            AdvertiseManager.defaultManager(gameAct).upLoadRoleInfo(gameAct, type, roleInfo);
+        }
+
+        @Override
+        public void onResume(Activity activity) {
+            AdvertiseManager.defaultManager(activity).onResume(activity);
+        }
+
+        @Override
+        public void onPause(Activity activity) {
+            AdvertiseManager.defaultManager(activity).onPause(activity);
+        }
+
+        @Override
+        public void onDestory(Activity activity) {
+            AdvertiseManager.defaultManager(activity).onDestory(activity);
+
+        }
+
+        @Override
+        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+            AdvertiseManager.defaultManager(gameAct).onRequestPermissionsResult(requestCode, permissions, grantResults);
+        }
+
+        @Override
+        public void onExitGame(Activity activity) {
+            AdvertiseManager.defaultManager(activity).onExitGame(activity);
+        }
+
+        @Override
+        public void onReportAdEvent(String event, JSONObject json) {
+            AdvertiseManager.defaultManager(gameAct).reportAdEvent(event, json);
+        }
+    };
+
+
+    //自有SDK回调
+    public SdkCallback sdkCallback = new SdkCallback() {
+        @Override
+        public void onSetChannelTagCallback(String msg) {
+
+        }
+
+        @Override
+        public void onInitCallback(boolean success, String msg) {
+            if (success) {
+                initCall.onInitSuccess(msg);
+
+            } else {
+
+                new TosUtil(gameAct, TosUtil.TOAST_ERROR, msg).show();
+
+                initCall.onInitFailed(msg);
+
+            }
+
+        }
+
+        @Override
+        public void onLoginChannelCallback(String msg) {
+            NetRequestApi.loginWithChannel(gameAct, msg, loginCall);
+        }
+
+        @Override
+        public void onLogOutCallback(String msg) {
+            logoutCall.onLogoutSuccess();
+        }
+
+        @Override
+        public void onPayFinishCallback(boolean success, String msg) {
+            if (success) {
+                payCall.onPaySuccess(msg);
+            } else {
+                payCall.onPayFailed(msg);
+            }
+        }
+
+        @Override
+        public void onExiGameCallback(boolean success, String msg) {
+            exitCall.onExit(true);
+        }
+
+        @Override
+        public void onPayExtParamCallback(HashMap<String, String> payInfo, String url) {
+            NetRequestApi.payChannelNotify(payInfo, url);
+        }
+
+        @Override
+        public void onGetChannelRealNameCallback(boolean isRealName, String report_type, String birthday) {
+            if (isRealName) {
+                NetRequestApi.recordUserRealNameInfo(gameAct, report_type, birthday);
+            } else {
+                realNameMsgCallback.onLoadRealNameMsg(false, "");
+            }
+        }
+
+        @Override
+        public void onLoginChannelFail(String msg) {
+            new TosUtil(gameAct, TosUtil.TOAST_ERROR, msg).show();
+            sdk.SDKLoginChannelFail(msg);
+        }
+
+        @Override
+        public void onLoginChannelSuccess(String msg) {
+            sdk.SDKLoginChannelSuccess(msg);
+        }
+
+        @Override
+        public void onUploadUserRealNameInfo(String report_type, String msg) {
+            NetRequestApi.upLoadUserRealNameInfo(report_type, msg);
+        }
+
+        @Override
+        public void onGetOaidCallback(final boolean isSuccess, final String oaid) {
+            gameAct.runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+
+                    if (isSuccess) {
+                        if (Build.VERSION.SDK_INT > 28) {
+                            SDKSettings.ifa_type = "2";
+                            initCall.onGetOaid(true, oaid);
+                        } else {
+                            initCall.onGetOaid(false, "");
+                        }
+                        SDKSettings.imei = oaid;
+                        Utils.setSharedPreferences("yyrh", "simulateImei", oaid, gameAct);
+                    } else {
+                        SDKSettings.imei = ImeiUtil.getImei(gameAct);
+                        initCall.onGetOaid(false, "");
+                    }
+
+                    Log.i("imei:", SDKSettings.imei);
+
+                    manager.yyrhInit(gameAct);
+
+                }
+            });
+
+        }
+
+        @Override
+        public String onGetChannelUid() {
+            return SDKSettings.loginData.channel_uid;
+        }
+
+        @Override
+        public void onShowGameExit() {
+            initCall.onShowGameExit();
+        }
+
+        @Override
+        public void onShowPolicyAgree() {
+            userPolicyCallback.onAgree();
+        }
+
+        @Override
+        public void onShowPolicyDisagree() {
+            userPolicyCallback.onDisagree();
+        }
+
+        @Override
+        public void onShowPolicyHide() {
+            userPolicyCallback.onHide();
+        }
+
+        @Override
+        public void onShowPolicyError() {
+            userPolicyCallback.onError();
+        }
+
+        @Override
+        public void onLoginSuccess(String token) {
+            YYLog.i(SDKSettings.loginData.toString());
+            loginCall.onLoginSuccess(token);
+            SDKEntry.getSdkInstance().adSdkCallback.onLoginSuccess(SDKSettings.loginData.uname);
+        }
+
+        @Override
+        public void onLoginFailed(String msg) {
+            loginCall.onLoginFailed(msg);
+        }
+
+        @Override
+        public void onLoginError(String msg) {
+            loginCall.onLoginError(msg);
+        }
+
+        @Override
+        public void realNameMsgCallback(boolean isRealName, String birthday) {
+            realNameMsgCallback.onLoadRealNameMsg(isRealName, birthday);
+        }
+
+
+    };
+
+    /**
+     * 实现单例
+     */
+    private SDKEntry() {
+    }
+
+    public static SDKEntry getSdkInstance() {
+
+        if (sdkInstance == null) {
+            synchronized (SDKEntry.class) {
+                if (sdkInstance == null) {
+                    sdkInstance = new SDKEntry();
+
+                }
+            }
+        }
+
+        return sdkInstance;
+    }
+
+    public void showPrivacyPolicy(Activity activity, UserPolicyCallback userPolicyCallback) {
+
+        this.userPolicyCallback = userPolicyCallback;
+        YyrhSdkManager.defaultManager(activity).yyrhShowPolicy(activity, userPolicyCallback);
+
+
+    }
+
+    public void initSdk(final Activity activity, final InitCallback callback, final boolean isDebug) {
+
+        this.gameAct = activity;
+        this.initCall = callback;
+        sdk = ChannelSDK.getInstance();
+        manager = YyrhSdkManager.defaultManager(activity);
+        sdk.SDKInit(activity, sdkCallback);
+
+
+        InputStream inputStream = null;
+
+        try {
+            inputStream = activity.getAssets().open("yyrh_start_image.jpg");
+        } catch (IOException e) {
+
+        }
+        if (inputStream != null) {
+            new GameSplashDialog(activity, ResourceUtil.getStyleId(activity, "hnyy_welcome_dialog")).show();
+        }
+
+
+        int checkResult;
+        if (PermissionUtils.checkIsHasPermission(activity, PermissionUtils.CODE_READ_PHONE_STATE) == 0 &&
+                PermissionUtils.checkIsHasPermission(activity, PermissionUtils.CODE_WRITE_EXTERNAL_STORAGE) == 0) {
+            checkResult = 0;
+        } else {
+            checkResult = -1;
+        }
+        switch (checkResult) {
+            case 0:
+                AdvertiseManager.defaultManager(activity).advertiseInit(activity);
+                manager.yyrhInitDevice(activity, isDebug);
+                break;
+            case -1:
+
+                String[] permissions = permissionList.toArray(new String[permissionList.size()]);
+
+                EasyPermission.with(activity)
+                        .addPermissions(permissions)          //申请打电话权限
+                        .request(new PermissionRequestListener() {
+                            @Override
+                            public void onGrant(Map<String, GrantResult> result) {
+                                //权限申请返回
+                                AdvertiseManager.defaultManager(activity).advertiseInit(activity);
+                                manager.yyrhInitDevice(activity, isDebug);
+                            }
+
+                            @Override
+                            public void onCancel(String stopPermission) {
+                                //在addRequestPermissionRationaleHandler的处理函数里面调用了NextAction.next(NextActionType.STOP,就会中断申请过程,直接回调到这里来
+
+                            }
+                        });
+                break;
+        }
+
+
+    }
+
+    public void setExtPermission(ArrayList<String> extPermission) {
+
+        if (extPermission != null) {
+            for (String permission : extPermission) {
+                permissionList.add(permission);
+            }
+        }
+
+    }
+
+    public void login(Activity activity, LoginCallback callback) {
+
+
+        this.loginCall = callback;
+
+        SdkManager.defaultManager(activity).login(activity);
+
+    }
+
+    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 (sdk.SDKGetPstatus()) {
+            SdkManager.defaultManager(activity).forcePay(activity, map);
+            return;
+        }
+        NetRequestApi.payOrderInit(RECHARGEINT, map, activity, new PayOrderCallback() {
+
+
+            @Override
+            public void onPaySuccess(HashMap<String, Object> map) {
+
+
+                adSdkCallback.onCreateOrder(map);
+                SdkManager.defaultManager(activity).pay(activity, map);
+
+            }
+
+            @Override
+            public void onPayFailed(String msg) {
+                callback.onPayFailed(msg);
+            }
+
+        });
+    }
+
+
+    public void setSDKLogoutListener(Activity activity, final LogoutCallback callback) {
+        YYLog.i("SDKLogoutListener");
+        logoutCall = callback;
+        SdkManager.defaultManager(activity).setSDKLogoutListener(activity, sdkCallback);
+    }
+
+    public void logout() {
+        YYLog.i("logout");
+        SdkManager.defaultManager(gameAct).logOut();
+    }
+
+    public void exitGame(Activity activity, final ExitCallback callback) {
+        YYLog.i("exitGame");
+        this.exitCall = callback;
+        SdkManager.defaultManager(activity).exit(activity);
+
+
+    }
+
+    public void upLoadRoleInfo(String type, Activity activity, RoleInfo roleInfo) {
+        YYLog.i("sdk uploadUserInfo");
+
+        this.role_ctime = roleInfo.getRoleCreateTime();
+        String roleId = roleInfo.getRoleId();
+        String roleName = roleInfo.getRoleName();
+        String roleLevel = roleInfo.getRoleLevel();
+        String gender = roleInfo.getGender();
+        String serverId = roleInfo.getServerId();
+        String serverName = roleInfo.getServerName();
+        String hasGold = roleInfo.getHasGold();
+        String vipLevel = roleInfo.getVipLevel();
+        String roleCreateTime = roleInfo.getRoleCreateTime();
+        String partyName = roleInfo.getPartyName();
+        String role_power = roleInfo.getRolePower();
+        String partyId = roleInfo.getPartyId();
+        String reincarnationCount = roleInfo.getReincarnationCount();
+        String charge = roleInfo.getCharge();
+        if (Utils.judgeStrNull(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)) {
+
+            YYLog.i("上报参数有空值,请检查: " + roleInfo.getAllParam());
+
+        } else {
+            YYLog.i("游戏角色信息上报sdk相关参数: " + roleInfo.getAllParam());
+
+            YyrhSdkManager.defaultManager(activity).uploadRoleInfo(type, activity, roleId, roleName, roleLevel, serverId,
+                    serverName, hasGold, vipLevel, role_power, partyId, partyName, roleCreateTime, charge);
+            SdkManager.defaultManager(activity).uploadRoleInfo(type, activity, roleInfo);
+            adSdkCallback.onUpLoadRoleInfo(type, roleInfo);
+
+        }
+    }
+
+    public void reportAdEvent(String event, JSONObject json) {
+        YYLog.i("game event :" + event + " and json: " + json.toString());
+        SdkManager.defaultManager(gameAct).reportAdEvent(event, json);
+    }
+
+    /**
+     * 生命周期
+     */
+    public void sdkOnStart(Activity activity) {
+        YYLog.i("sdk OnStart");
+        SdkManager.defaultManager(activity).sdkOnStart(activity);
+    }
+
+
+    public void sdkOnCreate(Activity activity, Bundle savedInstanceState) {
+        YYLog.i("sdk onCreate");
+
+        SdkManager.defaultManager(activity).sdkOnCreate(activity, savedInstanceState);
+    }
+
+    public void sdkOnPause(Activity activity) {
+        YYLog.i("sdk OnPause");
+        SDKEntry.getSdkInstance().adSdkCallback.onPause(activity);
+        SdkManager.defaultManager(activity).sdkOnPause(activity);
+
+
+    }
+
+    public void sdkOnResume(Activity activity) {
+        YYLog.i("sdk OnResume");
+        SDKEntry.getSdkInstance().adSdkCallback.onResume(activity);
+        SdkManager.defaultManager(activity).sdkOnResume(activity);
+
+
+    }
+
+    public void sdkOnRestart(Activity activity) {
+        YYLog.i("sdk onRestart");
+        SdkManager.defaultManager(activity).sdkOnRestart(activity);
+    }
+
+
+    public void sdkOnNewIntent(Activity acitivty, Intent intent) {
+        YYLog.i("sdk OnNewIntent");
+        SdkManager.defaultManager(acitivty).sdkOnNewIntent(acitivty, intent);
+
+    }
+
+    public void sdkOnStop(Activity activity) {
+        YYLog.i("sdk OnStop");
+        SdkManager.defaultManager(activity).sdkOnStop(activity);
+
+
+    }
+
+    public void onConfigurationChanged(Configuration newConfigs) {
+        YYLog.i("sdk onConfigurationChanged");
+        SdkManager.defaultManager(gameAct).onConfigurationChanged(newConfigs);
+    }
+
+
+    public void sdkOnDestroy(Activity activity) {
+        YYLog.i("sdk OnDestroy");
+        SDKEntry.getSdkInstance().adSdkCallback.onDestory(activity);
+        SdkManager.defaultManager(gameAct).sdkOnDestroy(activity);
+
+
+    }
+
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+        YYLog.i("sdk onRequestPermissionsResult");
+        SDKEntry.getSdkInstance().adSdkCallback.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        SdkManager.defaultManager(gameAct).onRequestPermissionsResult(requestCode, permissions, grantResults);
+    }
+
+    public void onActivityResult(Activity ac, int requestCode, int resultCode, Intent data) {
+        YYLog.i("sdk onActivityResult");
+        SdkManager.defaultManager(gameAct).onActivityResult(ac, requestCode, resultCode, data);
+
+
+    }
+
+    public void onWindowFocusChanged(Activity activity, boolean hasFocus) {
+        YYLog.i("sdk onWindowFocusChanged");
+        SdkManager.defaultManager(gameAct).onWindowFocusChanged(activity, hasFocus);
+    }
+
+
+    public void getRealNameInfo(Activity activity, RealNameMsgCallback realNameMsgCallback) {
+        this.realNameMsgCallback = realNameMsgCallback;
+        if (Utils.getTextIsNull(SDKSettings.loginData.uname)) {
+            new TosUtil(activity, TosUtil.TOAST_ERROR, activity.getString(ResourceUtil.getStringId(activity, "hnyy_login2pay"))).show();
+            return;
+        }
+        SdkManager.defaultManager(gameAct).getRealNameInfo(activity, realNameMsgCallback);
+    }
+}

+ 24 - 0
library_xinrui/src/main/java/com/yyrh/sdk/SdkCallback.java

@@ -0,0 +1,24 @@
+package com.yyrh.sdk;
+
+
+import com.yythird.base.ChannelSdkCallback;
+
+public interface SdkCallback extends ChannelSdkCallback {
+
+    void onShowPolicyAgree();
+
+    void onShowPolicyDisagree();
+
+    void onShowPolicyHide();
+
+    void onShowPolicyError();
+
+    void onLoginSuccess(String token);
+
+    void onLoginFailed(String msg);
+
+    void onLoginError(String msg);
+
+    void realNameMsgCallback(boolean isRealName, String birthday);
+
+}

+ 509 - 0
library_xinrui/src/main/java/com/yyrh/sdk/YyrhSdkManager.java

@@ -0,0 +1,509 @@
+package com.yyrh.sdk;
+
+import static com.yyrh.constant.Constants.LOGOUT;
+import static com.yyrh.constant.SDKSettings.isOpenRealName;
+import static com.yyrh.constant.SDKSettings.isVefityRealName;
+import static com.yyrh.ui.floatmenu.FloatViewManager.DESTORY_FLOAT;
+import static com.yyrh.ui.floatmenu.FloatViewManager.SHOW_FLOAT;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Build;
+import android.os.Handler;
+import android.util.Log;
+
+import com.yyrh.constant.InitConfig;
+import com.yyrh.constant.SDKSettings;
+import com.yyrh.factory.SdkManager;
+import com.yyrh.imei.ImeiUtil;
+import com.yyrh.networking.NetRequestApi;
+import com.yyrh.sdk.callback.InitCallback;
+import com.yyrh.sdk.callback.RealNameMsgCallback;
+import com.yyrh.sdk.callback.ShowPolicyCallback;
+import com.yyrh.sdk.callback.UserPolicyCallback;
+import com.yyrh.ui.activity.UseLoginActivity;
+import com.yyrh.ui.dialog.AutoLoginDialog;
+import com.yyrh.ui.dialog.CustomExitGameDialog;
+import com.yyrh.ui.dialog.EmailDialog;
+import com.yyrh.ui.dialog.PrivacyPolicyDialog;
+import com.yyrh.ui.dialog.SingleButtonDialog;
+import com.yyrh.ui.dialog.WvPageListDialog;
+import com.yyrh.ui.dialog.WvPayYyrhDialog;
+import com.yyrh.ui.floatmenu.FloatViewManager;
+import com.yyrh.ui.fragment.FragmentUtils;
+import com.yyrh.ui.userlist.DatabaseHelper;
+import com.yyrh.utils.InspectSimulator;
+import com.yyrh.utils.ResourceUtil;
+import com.yyrh.utils.Utils;
+import com.yyrh.utils.YYLog;
+import com.yythird.sdk.ChannelSDK;
+
+import java.util.HashMap;
+
+public class YyrhSdkManager {
+    private static YyrhSdkManager manager = null;
+
+
+    private Context context;
+
+
+    private YyrhSdkManager(Context context) {
+        super();
+        this.context = context;
+    }
+
+    public static YyrhSdkManager defaultManager(Context context) {
+        if (manager == null) {
+            synchronized (YyrhSdkManager.class) {
+                if (manager == null) {
+                    manager = new YyrhSdkManager(context);
+                }
+            }
+        }
+
+        return manager;
+    }
+
+    public void queryOrder(final String order, final HashMap<String, Object> payMap) {
+
+        String status = Utils.getParamCnfValuebyKey(context, "YyrhAdParam.cnf", "QUERY_ORDER");
+        if (status.equals("YES")) {
+            new Handler().postDelayed(new Runnable() {
+
+                @Override
+                public void run() {
+                    NetRequestApi.queryOrder(order, payMap);
+                }
+            }, 5000);
+        }
+
+
+    }
+
+
+    public void yyrhShowPolicy(final Activity activity, final UserPolicyCallback userPolicyCallback) {
+
+        YYLog.i("yyrhShowPolicy ");
+
+
+        String isShowPolicy = Utils.getSharedPreferences("yyrh", "yyrhShowPolicy", context);
+
+        if (isShowPolicy.equals("")) {
+
+            NetRequestApi.initAgreement(activity, new ShowPolicyCallback() {
+
+                @Override
+                public void onShow(String agreement_url) {
+                    YYLog.i("need to display the policy");
+                    new PrivacyPolicyDialog(activity, ResourceUtil.getStyleId(activity, "hnyy_base_dialog"), agreement_url,
+                            new PrivacyPolicyDialog.OnClosePageListener() {
+                                @Override
+                                public void onUserAgreePolicy() {
+
+                                    YYLog.i("User agree policy");
+
+                                    Utils.setSharedPreferences("yyrh", "yyrhShowPolicy", "1", context);
+                                    userPolicyCallback.onAgree();
+                                }
+
+                                @Override
+                                public void onUserDisagreePolicy() {
+                                    YYLog.i("User disagree policy");
+                                    userPolicyCallback.onDisagree();
+                                }
+                            }).show();
+
+
+                }
+
+                @Override
+                public void onHide() {
+                    YYLog.i(" don't need to display the policy");
+                    userPolicyCallback.onHide();
+                }
+
+                @Override
+                public void onError() {
+                    YYLog.i(" request policy error");
+                    userPolicyCallback.onError();
+                }
+            });
+
+
+        } else {
+            YYLog.i("The user has agreed to the policy");
+            userPolicyCallback.onAgree();
+        }
+
+
+    }
+
+    public void yyrhInitDevice(final Activity activity, boolean isDebug) {
+        SDKSettings.isDebug = isDebug;
+        String isdebug = Utils.GetApplicationMetaData(context, "yyrh_debug");
+        if (isdebug.equals("true")) {
+            SDKSettings.isDebug = true;
+        }
+        SDKSettings.initSetting(activity);
+
+        if (Build.VERSION.SDK_INT > 28) {
+            ChannelSDK.getInstance().SDKGetOaid();
+        } else {
+            SDKSettings.imei = ImeiUtil.getImei(context);
+            SDKEntry.getSdkInstance().sdkCallback.onGetOaidCallback(true, SDKSettings.imei);
+        }
+    }
+
+
+    public void yyrhInit(final Activity activity) {
+        NetRequestApi.init(activity, new InitCallback() {
+            @Override
+            public void onInitSuccess(String msg) {
+                SdkManager.defaultManager(activity).onInitSuccess(activity);
+                ChannelSDK.getInstance().SDKInitSuccess(msg);
+                SDKEntry.getSdkInstance().sdkCallback.onInitCallback(true, msg);
+
+            }
+
+            @Override
+            public void onInitFailed(String msg) {
+                ChannelSDK.getInstance().SDKInitFail(msg);
+                SDKEntry.getSdkInstance().sdkCallback.onInitCallback(false, msg);
+                SingleButtonDialog.Builder builder = new SingleButtonDialog.Builder(activity);
+                builder.setPositiveButton(new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        System.exit(0);
+                    }
+                });
+                builder.Create(msg).show();
+            }
+
+            @Override
+            public void onInitError(String _strError) {
+
+                ChannelSDK.getInstance().SDKInitFail(_strError);
+                SDKEntry.getSdkInstance().sdkCallback.onInitCallback(false, _strError);
+
+                SingleButtonDialog.Builder builder = new SingleButtonDialog.Builder(activity);
+                builder.setPositiveButton(new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+
+                        System.exit(0);
+
+                    }
+                });
+                builder.Create(_strError).show();
+            }
+
+            @Override
+            public void onGetOaid(boolean isSuccess, String oaid) {
+
+            }
+
+            @Override
+            public void onShowGameExit() {
+
+            }
+
+        });
+
+        SDKSettings.isSimulator = InspectSimulator.isSimulator(activity);
+        Log.i("idSimu:", SDKSettings.isSimulator);
+    }
+
+    public void yyrhLogin(Activity activity) {
+        operateFloatViewInUIThread(activity, DESTORY_FLOAT);
+        SharedPreferences sp = activity.getSharedPreferences("yyrh", Activity.MODE_PRIVATE);
+        if (!Utils.judgeStrNull(sp.getString("username", "")) &&
+                !SDKSettings.LOGINTAG.equals(LOGOUT)) {
+            autoLogin(activity);
+
+        } else if (SDKSettings.LOGINTAG.equals(LOGOUT)) {
+
+            showLoginView(activity, FragmentUtils.SDK_USER_SWITCH_ACCOUNT);
+
+        } else {
+
+            if (InitConfig.fristShowPage.equals("phone")) {
+
+                showLoginView(activity, FragmentUtils.SDK_PHONE_REGISTER_TAG);
+
+            } else {
+
+                showLoginView(activity, FragmentUtils.SDK_REGISTER_TAG);
+
+            }
+
+        }
+    }
+
+    private void showLoginView(Activity activity, int type) {
+
+
+        Intent intent = new Intent(activity, UseLoginActivity.class);
+        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+
+        intent.putExtra("fragmentTag", type);
+
+
+        intent.putExtra("orientation", activity.getRequestedOrientation());
+
+        activity.startActivity(intent);
+
+    }
+
+
+    private void autoLogin(final Activity activity) {
+        AutoLoginDialog.Builder builder = new AutoLoginDialog.Builder(activity);
+        builder.setPositiveButton(new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                //取消回调
+                dialog.dismiss();
+
+                showLoginView(activity, FragmentUtils.SDK_USER_SWITCH_ACCOUNT);
+
+            }
+        }).setCloseDialogCallback(new AutoLoginDialog.CloseDialogCallback() {
+
+            @Override
+            public void onclose() {
+
+            }
+
+            @Override
+            public void onLoginFail() {
+                showLoginView(activity, FragmentUtils.SDK_USER_SWITCH_ACCOUNT);
+            }
+        });
+
+        builder.Create().show();
+    }
+
+    public void yyrhLogout() {
+
+        SDKSettings.loginData = null;
+        final Activity activity = (Activity) context;
+
+        operateFloatViewInUIThread(activity, DESTORY_FLOAT);
+
+        SDKSettings.LOGINTAG = LOGOUT;
+        SDKEntry.getSdkInstance().sdkCallback.onLogOutCallback("Game Logout.");
+
+    }
+
+
+    public void yyrhPay(final Activity activity, final HashMap<String, Object> map) {
+
+
+        final String url = (String) map.get("url");
+        if (Utils.judgeStrNull(url)) {
+            return;
+        }
+
+        activity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                new WvPayYyrhDialog(activity, ResourceUtil.getStyleId(activity, "hnyy_base_dialog"), url, map).show();
+
+            }
+        });
+
+
+    }
+
+    public void yyrhExitGame(final Activity activity) {
+        CustomExitGameDialog.Builder builder = new CustomExitGameDialog.Builder(activity);
+        builder.setPositiveButton(new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+
+                FloatViewManager.defaultManager(activity).destroyFloat();
+
+                dialog.dismiss();
+                SDKEntry.getSdkInstance().adSdkCallback.onExitGame(activity);
+                SDKEntry.getSdkInstance().sdkCallback.onExiGameCallback(true, "Exit Game.");
+            }
+        });
+        builder.setnegativeButton(new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                dialog.dismiss();
+            }
+        });
+
+        builder.Create().show();
+    }
+
+    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);
+
+    }
+
+
+    public void saveUserLoginInfo(final Context context, final String account, String pwd, String login_token, final String token) {
+
+
+        HashMap<String, String> map = new HashMap();
+        map.put("username", account);
+        map.put("password", pwd);
+        map.put("login_token", login_token);
+        Utils.setSharedPreferences("yyrh", map, context);
+
+        String timeStamp = System.currentTimeMillis() + "";
+
+        String delete_sql = "delete from user where name = '" + account + "'";
+
+        String insert_sql = "insert into user(name,pwd,login_token,time) values('" + account
+                + "','" + pwd + "','" + login_token + "','" + timeStamp + "')";
+
+        DatabaseHelper.excuteSql(context, delete_sql);
+        DatabaseHelper.excuteSql(context, insert_sql);
+
+
+        operateRealNameDialog(token);
+
+    }
+
+    void operateRealNameDialog(final String token) {
+        if (isOpenRealName) {
+
+            if (!isVefityRealName) {
+
+                if (SDKSettings.isForceRealName) {
+
+                    new WvPageListDialog(context, ResourceUtil.getStyleId(context, "hnyy_half_black_dialog"), SDKSettings.loginData.authentication,
+                            new WvPageListDialog.OnClosePageListener() {
+                                @Override
+                                public void onClose() {
+
+                                    if (SDKSettings.loginData.rn_bd.equals("")) {
+
+                                        SDKSettings.loginData = null;
+
+                                    }
+
+                                }
+
+                                @Override
+                                public void onDissmiss() {
+                                    openEmailDialogInUIThread((Activity) context);
+                                    operateFloatViewInUIThread((Activity) context, SHOW_FLOAT);
+
+                                }
+
+
+                                @Override
+                                public void onRealNameSuccess(String birthday) {
+
+
+                                    SDKEntry.getSdkInstance().sdkCallback.onLoginSuccess(token);
+
+
+                                }
+                            }, SDKSettings.isForceRealName).show();
+                } else {
+
+                    new WvPageListDialog(context, ResourceUtil.getStyleId(context, "hnyy_half_black_dialog"), SDKSettings.loginData.authentication,
+                            new WvPageListDialog.OnClosePageListener() {
+                                @Override
+                                public void onClose() {
+
+                                    SDKEntry.getSdkInstance().sdkCallback.onLoginSuccess(token);
+
+
+                                }
+
+                                @Override
+                                public void onDissmiss() {
+                                    openEmailDialogInUIThread((Activity) context);
+                                    operateFloatViewInUIThread((Activity) context, SHOW_FLOAT);
+
+                                }
+
+
+                                @Override
+                                public void onRealNameSuccess(String birthday) {
+                                    YYLog.i("onRealNameSuccess");
+
+                                }
+                            }).show();
+
+
+                }
+
+            } else {
+
+                openEmailDialogInUIThread((Activity) context);
+                operateFloatViewInUIThread((Activity) context, SHOW_FLOAT);
+                SDKEntry.getSdkInstance().sdkCallback.onLoginSuccess(token);
+
+
+            }
+
+        } else {
+            openEmailDialogInUIThread((Activity) context);
+            operateFloatViewInUIThread((Activity) context, SHOW_FLOAT);
+            SDKEntry.getSdkInstance().sdkCallback.onLoginSuccess(token);
+        }
+    }
+
+    public void yyrhGetRealNameInfo(Activity activity, RealNameMsgCallback msgCallback) {
+
+        if (Utils.getTextIsNull(SDKSettings.loginData.rn_bd)) {
+            msgCallback.onLoadRealNameMsg(false, "");
+        } else {
+            msgCallback.onLoadRealNameMsg(true, SDKSettings.loginData.rn_bd);
+        }
+
+    }
+
+    private void operateFloatViewInUIThread(final Activity gameAct, final int status) {
+        gameAct.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                if (status == SHOW_FLOAT) {
+                    FloatViewManager.defaultManager(gameAct).showFloat();
+                } else if (status == DESTORY_FLOAT) {
+                    FloatViewManager.defaultManager(gameAct).destroyFloat();
+                }
+
+
+            }
+        });
+    }
+
+    private void openEmailDialogInUIThread(final Activity gameAct) {
+        if (Utils.judgeStrNull(SDKSettings.loginData.solo_email)) {
+            return;
+        }
+        gameAct.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+
+                new EmailDialog(context, ResourceUtil.getStyleId(context, "hnyy_half_black_dialog"), SDKSettings.loginData.solo_email).show();
+
+            }
+        });
+    }
+
+    public void onResume(Activity activity) {
+        this.context = activity;
+    }
+
+    public void onPause(Activity activity) {
+        this.context = activity;
+    }
+
+    public void onDestroy(Activity activity) {
+        this.context = activity;
+    }
+}

+ 5 - 0
library_xinrui/src/main/java/com/yyrh/sdk/callback/ExitCallback.java

@@ -0,0 +1,5 @@
+package com.yyrh.sdk.callback;
+
+public interface ExitCallback {
+    public void onExit(boolean needExit);
+}

+ 11 - 0
library_xinrui/src/main/java/com/yyrh/sdk/callback/InitCallback.java

@@ -0,0 +1,11 @@
+package com.yyrh.sdk.callback;
+
+public interface InitCallback {
+
+    public void onInitSuccess(String msg);
+    public void onInitFailed(String msg);
+    public void onInitError(String _strError);
+    public void onGetOaid(boolean isSuccess,String oaid);
+    public void onShowGameExit();
+
+}

+ 7 - 0
library_xinrui/src/main/java/com/yyrh/sdk/callback/LoginCallback.java

@@ -0,0 +1,7 @@
+package com.yyrh.sdk.callback;
+
+public interface LoginCallback {
+    public void onLoginSuccess(String token);
+    public void onLoginFailed(String msg);
+    public void onLoginError(String msg);
+}

+ 6 - 0
library_xinrui/src/main/java/com/yyrh/sdk/callback/LogoutCallback.java

@@ -0,0 +1,6 @@
+package com.yyrh.sdk.callback;
+
+public interface LogoutCallback {
+ public void onLogoutSuccess();
+ public void onLogoutFailed();
+}

+ 6 - 0
library_xinrui/src/main/java/com/yyrh/sdk/callback/PayCallback.java

@@ -0,0 +1,6 @@
+package com.yyrh.sdk.callback;
+
+public interface PayCallback {
+ public void onPaySuccess(String msg);
+ public void onPayFailed(String msg);
+}

+ 11 - 0
library_xinrui/src/main/java/com/yyrh/sdk/callback/PayOrderCallback.java

@@ -0,0 +1,11 @@
+package com.yyrh.sdk.callback;
+
+import java.util.HashMap;
+
+public interface PayOrderCallback {
+
+    public void onPaySuccess(HashMap<String, Object> map);
+    public void onPayFailed(String msg);
+
+
+}

+ 5 - 0
library_xinrui/src/main/java/com/yyrh/sdk/callback/RealNameMsgCallback.java

@@ -0,0 +1,5 @@
+package com.yyrh.sdk.callback;
+
+public interface RealNameMsgCallback {
+    public void onLoadRealNameMsg(boolean isRealName,String birthday);
+}

+ 6 - 0
library_xinrui/src/main/java/com/yyrh/sdk/callback/RegisterCallback.java

@@ -0,0 +1,6 @@
+package com.yyrh.sdk.callback;
+
+public interface RegisterCallback {
+    public void onRegisterSuccess(String token);
+    public void onRegisterFailed(String msg);
+}

+ 8 - 0
library_xinrui/src/main/java/com/yyrh/sdk/callback/ShowPolicyCallback.java

@@ -0,0 +1,8 @@
+package com.yyrh.sdk.callback;
+
+public interface ShowPolicyCallback {
+
+    public void onShow(String agreement_url);
+    public void onHide();
+    public void onError();
+}

+ 10 - 0
library_xinrui/src/main/java/com/yyrh/sdk/callback/UserPolicyCallback.java

@@ -0,0 +1,10 @@
+package com.yyrh.sdk.callback;
+
+public interface UserPolicyCallback {
+
+    public void onAgree();
+    public void onDisagree();
+    public void onHide();
+    public void onError();
+
+}

+ 99 - 0
library_xinrui/src/main/java/com/yyrh/ui/AccountLoginListView.java

@@ -0,0 +1,99 @@
+package com.yyrh.ui;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.database.sqlite.SQLiteDatabase;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.yyrh.ui.dialog.CustomExitGameDialog;
+
+import com.yyrh.ui.userlist.DatabaseHelper;
+import com.yyrh.utils.ResourceUtil;
+
+
+public class AccountLoginListView extends RelativeLayout {
+
+    public ImageView iv_account_icon;
+    public TextView tv_account_type,tv_account;
+    public Button btn_common_use,btn_delete;
+    public String password,login_token;
+    public AccountLoginListView(Context context) {
+        super(context);
+        intView(context);
+    }
+
+    public AccountLoginListView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        intView(context);
+    }
+
+    public AccountLoginListView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        intView(context);
+    }
+
+    void intView(final Context context){
+
+        LayoutInflater.from(context).inflate(ResourceUtil.getLayoutId(context,"hnyy_login_list"), this);
+        iv_account_icon = findViewById(ResourceUtil.getId(context,
+                "iv_account_icon"));
+        tv_account_type = findViewById(ResourceUtil.getId(context,
+                "tv_account_type"));
+        tv_account = findViewById(ResourceUtil.getId(context,
+                "tv_account"));
+        btn_common_use = findViewById(ResourceUtil.getId(context,
+                "btn_common_use"));
+        btn_delete = findViewById(ResourceUtil.getId(context,
+                "btn_delete"));
+        btn_delete.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+
+                CustomExitGameDialog.Builder builder = new CustomExitGameDialog.Builder(context);
+                builder.Create().show();
+                builder.setPositiveButton(new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+
+                        deleteItem(tv_account.getText().toString(),context);
+                        removeAllViews();
+
+
+                        dialog.dismiss();
+                    }
+                });
+                builder.setnegativeButton(new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+
+                        dialog.dismiss();
+                    }
+                });
+
+                builder.setTitle( context.getString(ResourceUtil.getStringId(context, "hnyy_delete_account_tip")) + tv_account.getText().toString());
+
+            }
+        });
+
+    }
+
+    private void deleteItem(String uname,Context context){
+
+
+        DatabaseHelper dbHelper = new DatabaseHelper(context);
+        SQLiteDatabase db = null;
+        db = dbHelper.getReadableDatabase();
+        String sql = "delete from user where name = '"+uname+"'";
+        //执行SQL语句
+        db.execSQL(sql);
+        db.close();
+
+    }
+
+}

+ 41 - 0
library_xinrui/src/main/java/com/yyrh/ui/MarqueTextView.java

@@ -0,0 +1,41 @@
+package com.yyrh.ui;
+
+
+import android.content.Context;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+/**
+ * Created by admin on 2017/11/10.
+ */
+
+public class MarqueTextView extends TextView {
+    public MarqueTextView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        setLineBG();
+
+    }
+
+
+
+    public MarqueTextView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setLineBG();
+    }
+
+    public MarqueTextView(Context context) {
+        super(context);
+        setLineBG();
+    }
+
+    private void setLineBG() {
+        getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG|Paint.ANTI_ALIAS_FLAG);
+        getPaint().setAntiAlias(true);
+    }
+    @Override
+
+    public boolean isFocused() {
+        return true;
+    }
+}

+ 95 - 0
library_xinrui/src/main/java/com/yyrh/ui/NewProgressDialogUtils.java

@@ -0,0 +1,95 @@
+package com.yyrh.ui;
+
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.widget.TextView;
+
+import com.yyrh.utils.ResourceUtil;
+import com.yyrh.utils.Utils;
+
+import static com.yyrh.constant.URLConstants.CHANNELLOGIN;
+import static com.yyrh.constant.URLConstants.FASTREGISTER;
+import static com.yyrh.constant.URLConstants.GETCAPTCHA;
+import static com.yyrh.constant.URLConstants.INIT;
+import static com.yyrh.constant.URLConstants.PAYMENTWAY;
+import static com.yyrh.constant.URLConstants.RECHARGEINT;
+import static com.yyrh.constant.URLConstants.REGISTERWITHPHONE;
+import static com.yyrh.constant.URLConstants.RESETPWDWITHPHONE;
+import static com.yyrh.constant.URLConstants.USERLOGIN;
+
+
+public class NewProgressDialogUtils {
+
+
+	 private String getShowMessage(String url){
+	 	String message;
+		switch (url){
+			case INIT:
+				message =  "hnyy_network_error_tip";
+				break;
+			case USERLOGIN:
+				message =  "hnyy_logging";
+			break;
+			case FASTREGISTER:
+				message =  "hnyy_registering";
+			break;
+			case CHANNELLOGIN:
+				message =  "hnyy_logging";
+				break;
+			case PAYMENTWAY:
+				message =  "hnyy_pay_init";
+				break;
+			case RECHARGEINT:
+				message =  "hnyy_pay_init";
+				break;
+			case GETCAPTCHA:
+				message =  "hnyy_get_code";
+				break;
+			case REGISTERWITHPHONE:
+				message =  "hnyy_registering";
+				break;
+			case RESETPWDWITHPHONE:
+				message =  "hnyy_resetpwd";
+				break;
+
+			default :
+				 message = "";
+			break;
+		}
+		return message;
+	}
+
+	
+	public  Dialog show(Activity _activity,final String _mesage){
+
+
+
+
+			Dialog progressDialog = new Dialog(_activity,ResourceUtil.getStyleId(_activity, "hnyy_progress_dialog"));
+			progressDialog.setContentView(ResourceUtil.getLayoutId(_activity, "hnyy_dialog_progress"));
+            progressDialog.setCancelable(false);
+            progressDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
+            TextView msg =  progressDialog.findViewById(ResourceUtil.getId(_activity, "id_tv_loadingmsg"));
+
+
+			String message = getShowMessage(_mesage);
+
+			if (!Utils.judgeStrNull(message)){
+
+				msg.setText(_activity.getString(ResourceUtil.getStringId(_activity, message)));
+
+			}
+
+
+
+
+		progressDialog.show();
+
+		return progressDialog;
+
+		
+	}
+
+
+}

+ 60 - 0
library_xinrui/src/main/java/com/yyrh/ui/PageJsInteraction.java

@@ -0,0 +1,60 @@
+package com.yyrh.ui;
+
+
+import android.webkit.JavascriptInterface;
+
+import com.yyrh.ui.dialog.BaseDialog;
+
+
+public class PageJsInteraction {
+
+    private BaseDialog baseDialog;
+    public PageJsInteraction(BaseDialog baseDialog) {
+
+        this.baseDialog =baseDialog;
+
+    }
+
+
+
+    @JavascriptInterface
+    public void zfColse() {   //提供给js调用的方法
+        this.baseDialog.zfColse();
+    }
+
+    @JavascriptInterface
+    public void usrRn(String message) {
+        this.baseDialog.usrRn(message);
+    }
+    @JavascriptInterface
+    public void showJsMsg(String message) {
+        this.baseDialog.showJsMsg(message);
+    }
+    @JavascriptInterface
+    public void modifyPwd(String message) {   //提供给js调用的方法
+
+        this.baseDialog.modifyPwd(message);
+
+    }
+
+
+    @JavascriptInterface
+    public void zfOrder(String message) {
+        this.baseDialog.zfOrder(message);
+    }
+
+    @JavascriptInterface
+    public void openq0q0(String url)  {
+        this.baseDialog.openq0q0(url);
+    }
+
+    @JavascriptInterface
+    public String webExt() {
+        return this.baseDialog.webExt();
+    }
+
+    @JavascriptInterface
+    public void switchAccount() {
+         this.baseDialog.switchAccount();
+    }
+}

部分文件因文件數量過多而無法顯示