Kaynağa Gözat

添加 元游 奇境 熙元 新瑞 SDK 四个模块

kaiweicai 2 yıl önce
ebeveyn
işleme
5e9f876e7f
100 değiştirilmiş dosya ile 7483 ekleme ve 16 silme
  1. 7 1
      demo/build.gradle
  2. 2 2
      demo/src/main/AndroidManifest.xml
  3. 1 1
      library_base/src/main/java/cn/yyxx/commsdk/Version.java
  4. 1 1
      library_channel/build.gradle
  5. 1 1
      library_channel/src/main/java/cn/yyxx/commsdk/impl/ChannelSdkImpl.java
  6. 1 1
      library_core/build.gradle
  7. 9 9
      library_core/src/main/java/cn/yyxx/commsdk/core/impl/SdkBridgeImpl.java
  8. 1 0
      library_platform/hnqj/.gitignore
  9. 81 0
      library_platform/hnqj/build.gradle
  10. 21 0
      library_platform/hnqj/buildJar.gradle
  11. 0 0
      library_platform/hnqj/consumer-rules.pro
  12. BIN
      library_platform/hnqj/libs/oaid_sdk_1.0.25.aar
  13. 180 0
      library_platform/hnqj/proguard-rules.pro
  14. 14 0
      library_platform/hnqj/src/main/AndroidManifest.xml
  15. 3 0
      library_platform/hnqj/src/main/assets/yyxx_game/yyxx_cfg.properties
  16. 165 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/SdkPlatformBridge.java
  17. 134 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/BaseLoginActivity.java
  18. 178 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/HNQJLoginActivity.java
  19. 16 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/HNQJLoginFragmentTag.java
  20. 5 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/action/IJsCallback.java
  21. 62 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/action/PageJsInteraction.java
  22. 91 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/adapter/UserListAdapter.java
  23. 161 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/AutoLoginDialog.java
  24. 93 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/CustomExitGameDialog.java
  25. 225 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/EmailDialog.java
  26. 187 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/HnPayDialog.java
  27. 90 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/JsBaseDialog.java
  28. 258 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/UserCenterDialog.java
  29. 277 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/WvPageListDialog.java
  30. 391 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/floating/DotImageView.java
  31. 839 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/floating/FloatLogoMenu.java
  32. 95 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/floating/FloatViewManager.java
  33. 53 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/BaseFragment.java
  34. 245 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserAccountLoginFragment.java
  35. 242 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserPhoneLoginFragment.java
  36. 182 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserPhoneLoginSetpwdFragment.java
  37. 268 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserRegisterFragment.java
  38. 192 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserRetrievePwdFragment.java
  39. 205 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserSwitchAccountLoginFragment.java
  40. 91 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/widget/AccountLoginListView.java
  41. 57 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/widget/TosUtil.java
  42. 398 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/impl/SdkPlatformImpl.java
  43. 69 0
      library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/msa/MsaDeviceHandler.java
  44. 11 0
      library_platform/hnqj/src/main/res/anim/qj_rotate_anim.xml
  45. 13 0
      library_platform/hnqj/src/main/res/drawable/qj_btn_account_bg.xml
  46. 13 0
      library_platform/hnqj/src/main/res/drawable/qj_btn_guest_bg.xml
  47. 7 0
      library_platform/hnqj/src/main/res/drawable/qj_checkbox_select.xml
  48. 5 0
      library_platform/hnqj/src/main/res/drawable/qj_color_white_40.xml
  49. 5 0
      library_platform/hnqj/src/main/res/drawable/qj_color_white_70.xml
  50. 6 0
      library_platform/hnqj/src/main/res/drawable/qj_common_wv_bg.xml
  51. 5 0
      library_platform/hnqj/src/main/res/drawable/qj_dialog_ios_bg.xml
  52. 9 0
      library_platform/hnqj/src/main/res/drawable/qj_edittext_bg.xml
  53. 10 0
      library_platform/hnqj/src/main/res/drawable/qj_exit_bg.xml
  54. 13 0
      library_platform/hnqj/src/main/res/drawable/qj_game_float_menu_bg.xml
  55. 11 0
      library_platform/hnqj/src/main/res/drawable/qj_hide_float_view_bg.xml
  56. 9 0
      library_platform/hnqj/src/main/res/drawable/qj_login_bg.xml
  57. 12 0
      library_platform/hnqj/src/main/res/drawable/qj_login_button_grayed_style.xml
  58. 12 0
      library_platform/hnqj/src/main/res/drawable/qj_login_button_style.xml
  59. 5 0
      library_platform/hnqj/src/main/res/drawable/qj_login_list_bg.xml
  60. 7 0
      library_platform/hnqj/src/main/res/drawable/qj_login_list_btn_red_bg.xml
  61. 8 0
      library_platform/hnqj/src/main/res/drawable/qj_login_list_btn_yellow_bg.xml
  62. 16 0
      library_platform/hnqj/src/main/res/drawable/qj_progress_drawable_white.xml
  63. 10 0
      library_platform/hnqj/src/main/res/drawable/qj_radius_white_10dp.xml
  64. 10 0
      library_platform/hnqj/src/main/res/drawable/qj_radius_white_12dp.xml
  65. 10 0
      library_platform/hnqj/src/main/res/drawable/qj_radius_white_1dp.xml
  66. 167 0
      library_platform/hnqj/src/main/res/layout/qj_account_login.xml
  67. 24 0
      library_platform/hnqj/src/main/res/layout/qj_dialog_progress.xml
  68. 45 0
      library_platform/hnqj/src/main/res/layout/qj_edittext_style.xml
  69. 48 0
      library_platform/hnqj/src/main/res/layout/qj_email_dialog.xml
  70. 80 0
      library_platform/hnqj/src/main/res/layout/qj_exit_game_dialog.xml
  71. 17 0
      library_platform/hnqj/src/main/res/layout/qj_hide_float_view.xml
  72. 45 0
      library_platform/hnqj/src/main/res/layout/qj_ios_style_dialog.xml
  73. 8 0
      library_platform/hnqj/src/main/res/layout/qj_login.xml
  74. 63 0
      library_platform/hnqj/src/main/res/layout/qj_login_list.xml
  75. 39 0
      library_platform/hnqj/src/main/res/layout/qj_p_webview.xml
  76. 205 0
      library_platform/hnqj/src/main/res/layout/qj_phone_login.xml
  77. 145 0
      library_platform/hnqj/src/main/res/layout/qj_phone_register_setpwd_dialog.xml
  78. 81 0
      library_platform/hnqj/src/main/res/layout/qj_privacy_policy_dialog.xml
  79. 25 0
      library_platform/hnqj/src/main/res/layout/qj_quick_login_bar.xml
  80. 214 0
      library_platform/hnqj/src/main/res/layout/qj_register_dialog.xml
  81. 181 0
      library_platform/hnqj/src/main/res/layout/qj_retrieve_pwd.xml
  82. 85 0
      library_platform/hnqj/src/main/res/layout/qj_switch_account_login.xml
  83. 36 0
      library_platform/hnqj/src/main/res/layout/qj_toast_style.xml
  84. 35 0
      library_platform/hnqj/src/main/res/layout/qj_user_list_item.xml
  85. 52 0
      library_platform/hnqj/src/main/res/layout/qj_usercenter_dialog.xml
  86. 45 0
      library_platform/hnqj/src/main/res/layout/qj_usercenter_portait_dialog.xml
  87. 45 0
      library_platform/hnqj/src/main/res/layout/qj_webview_common_dialog.xml
  88. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_bg.9.png
  89. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_01.png
  90. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_02.png
  91. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_03.png
  92. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_04.png
  93. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_05.png
  94. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_06.png
  95. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_07.png
  96. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_08.png
  97. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_09.png
  98. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_10.png
  99. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_11.png
  100. BIN
      library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_12.png

+ 7 - 1
demo/build.gradle

@@ -72,7 +72,13 @@ android {
 dependencies {
     implementation project(path: ':library_core')
     implementation project(path: ':library_channel')
-    implementation project(path: ':library_platform:hnyy')
+//    implementation project(path: ':library_platform:hnyy')
+
+//    implementation project(path: ':library_platform:hnqj')
+
+//    implementation project(path: ':library_platform:shxy')
+
+    implementation project(path: ':library_platform:xinrui')
 
 //    implementation project(path: ':library_channel_repository:oppo')
 

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

@@ -27,7 +27,7 @@
         <activity
             android:name=".SplashActivity"
             android:exported="true"
-            android:screenOrientation="landscape"
+            android:screenOrientation="portrait"
             android:label="@string/app_name"
             android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
             <intent-filter>
@@ -42,7 +42,7 @@
             android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
             android:exported="true"
             android:launchMode="singleTask"
-            android:screenOrientation="sensorLandscape" >
+            android:screenOrientation="landscape" >
             <intent-filter>
                 <action android:name="${applicationId}" />
                 <action android:name="android.intent.action.VIEW" />

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

@@ -5,5 +5,5 @@ package cn.yyxx.commsdk;
  * Created on 2021/12/25
  */
 public class Version {
-    public static final String VERSION_NAME = "1.0.0";
+    public static final String VERSION_NAME = "3.0.0";
 }

+ 1 - 1
library_channel/build.gradle

@@ -50,7 +50,7 @@ android.libraryVariants.all { variant ->
 ext {
 
     PUBLISH_ARTIFACT_ID = 'yyxx_comm_channel'
-    PUBLISH_VERSION = ':1.0.100'
+    PUBLISH_VERSION = ':3.0.100'
 }
 
 

+ 1 - 1
library_channel/src/main/java/cn/yyxx/commsdk/impl/ChannelSdkImpl.java

@@ -175,7 +175,7 @@ public class ChannelSdkImpl {
             ((ILifeCycle) impl).onWindowFocusChanged(activity,hasFocus);
         }
     }
-    public void onConfigurationChaged(Activity activity, Configuration newConfig){
+    public void onConfigurationChanged(Activity activity, Configuration newConfig){
         if (impl instanceof ILifeCycle) {
             ((ILifeCycle) impl).onConfigurationChanged(activity,newConfig);
         }

+ 1 - 1
library_core/build.gradle

@@ -73,7 +73,7 @@ android.libraryVariants.all { variant ->
 ext {
 
     PUBLISH_ARTIFACT_ID = 'yyxx_comm_core'
-    PUBLISH_VERSION = ':1.0.100'
+    PUBLISH_VERSION = ':3.0.100'
 }
 
 

+ 9 - 9
library_core/src/main/java/cn/yyxx/commsdk/core/impl/SdkBridgeImpl.java

@@ -65,7 +65,14 @@ public final class SdkBridgeImpl {
         }
         SdkProxyManager.call(Function.ATTACH_BASE_CONTEXT,  new Class[]{Application.class, Context.class}, new Object[]{application, context});
 
-
+        SdkProxyManager.call(Function.INIT_MSA_DEVICE_IDS, new Class[]{Context.class, IMsaDeviceCallback.class}, new Object[]{application,new IMsaDeviceCallback() {
+            @Override
+            public void onIdsRead(int code, String msg, Map<String, String> ids) {
+                if (code == 0){
+                    CommonOperationManager.getInstance().setOaid(ids.get("oaid"));
+                }
+            }
+        }});
 
 
     }
@@ -78,14 +85,7 @@ public final class SdkBridgeImpl {
         }
         SdkProxyManager.call(Function.INIT_APPLICATION,  new Class[]{Application.class}, new Object[]{application});
 
-        SdkProxyManager.call(Function.INIT_MSA_DEVICE_IDS, new Class[]{Context.class, IMsaDeviceCallback.class}, new Object[]{application,new IMsaDeviceCallback() {
-            @Override
-            public void onIdsRead(int code, String msg, Map<String, String> ids) {
-                if (code == 0){
-                    CommonOperationManager.getInstance().setOaid(ids.get("oaid"));
-                }
-            }
-        }});
+
 
     }
 

+ 1 - 0
library_platform/hnqj/.gitignore

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

+ 81 - 0
library_platform/hnqj/build.gradle

@@ -0,0 +1,81 @@
+
+plugins {
+    id 'com.android.library'
+}
+
+android {
+    compileSdk 31
+
+    defaultConfig {
+        minSdk 21
+        targetSdk 26
+
+         consumerProguardFiles "consumer-rules.pro"
+    }
+
+
+    buildTypes {
+        release {
+            minifyEnabled rootProject.ext.module.minifyEnabled
+            proguardFiles 'proguard-rules.pro'
+        }
+        debug {
+            minifyEnabled rootProject.ext.module.minifyEnabled
+            proguardFiles 'proguard-rules.pro'
+        }
+    }
+
+    buildFeatures {
+        buildConfig false
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+
+}
+
+
+
+android.libraryVariants.all { variant ->
+    if (variant.buildType.name == 'release'){
+        variant.outputs.all {
+
+            outputFileName = "$PUBLISH_ARTIFACT_ID$PUBLISH_VERSION" + ".aar"
+        }
+    }else{
+        variant.outputs.all {
+            outputFileName = "$PUBLISH_ARTIFACT_ID" + "_"+ variant.buildType.name + "$PUBLISH_VERSION" + ".aar"
+        }
+    }
+
+}
+
+
+ext {
+
+    PUBLISH_ARTIFACT_ID = 'yyxx_comm_platform_hnqj'
+    PUBLISH_VERSION = ':3.0.100'
+}
+
+
+dependencies {
+
+
+    compileOnly project(':library_base')
+
+
+    compileOnly project(':library_core')
+
+
+    compileOnly project(':library_channel')
+
+
+
+    compileOnly files('../hnqj/libs/oaid_sdk_1.0.25.aar')
+
+
+
+}
+
+apply from: 'buildJar.gradle'

+ 21 - 0
library_platform/hnqj/buildJar.gradle

@@ -0,0 +1,21 @@
+def SDK_BASENAME = "hnqj"
+def SDK_VERSION = "1.0.0"
+def SEPARATOR = "_"
+def sdkDestinationPath = "build/jar/"
+def zipFile = file('build/intermediates/aar_main_jar/release/classes.jar')
+
+static def buildTime() {
+    return new Date().format("yyyyMMddHHmm", TimeZone.getDefault())
+}
+
+task deleteBaseBuild(type: Delete) {
+    delete sdkDestinationPath
+}
+
+task makeJar(type: Jar) {
+    from zipTree(zipFile)
+    baseName = SDK_BASENAME + SEPARATOR + SDK_VERSION
+    destinationDir = file(sdkDestinationPath)
+}
+
+makeJar.dependsOn(deleteBaseBuild, build)

+ 0 - 0
library_platform/hnqj/consumer-rules.pro


BIN
library_platform/hnqj/libs/oaid_sdk_1.0.25.aar


+ 180 - 0
library_platform/hnqj/proguard-rules.pro

@@ -0,0 +1,180 @@
+# 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~7之间,默认为5,一般不做修改
+-optimizationpasses 5
+# 混合时不使用大小写混合,混合后的类名为小写
+-dontusemixedcaseclassnames
+# 指定不去忽略非公共库的类
+-dontskipnonpubliclibraryclasses
+-dontoptimize
+# 这句话能够使我们的项目混淆后产生映射文件
+# 包含有类名->混淆后类名的映射关系
+-verbose
+-ignorewarnings
+# 指定不去忽略非公共库的类成员
+-dontskipnonpubliclibraryclassmembers
+# 指定混淆是采用的算法,后面的参数是一个过滤器
+# 这个过滤器是谷歌推荐的算法,一般不做更改
+-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
+
+# 保留java与js交互注解
+-keepattributes *Annotation*
+-keepattributes *JavascriptInterface*
+#保留JavascriptInterface中的方法
+-keepclassmembers class * {
+    @android.webkit.JavascriptInterface <methods>;
+}
+
+# 保留内部类
+-keepattributes Exceptions,InnerClasses
+
+# 保留泛型
+-keepattributes Signature
+
+-keep class kotlin.** { *; }
+-keep class kotlin.Metadata { *; }
+
+-dontwarn kotlin.**
+
+-keepclassmembers class **$WhenMappings {
+    <fields>;
+}
+-keepclassmembers class kotlin.Metadata {
+    public <methods>;
+}
+
+-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
+    static void checkParameterIsNotNull(java.lang.Object, java.lang.String);
+}
+
+-keepnames class * implements java.io.Serializable
+-keepclassmembers class * implements java.io.Serializable {
+   static final long serialVersionUID;
+   private static final java.io.ObjectStreamField[] serialPersistentFields;
+   !static !transient <fields>;
+   private void writeObject(java.io.ObjectOutputStream);
+   private void readObject(java.io.ObjectInputStream);
+   java.lang.Object writeReplace();
+   java.lang.Object readResolve();
+}
+
+-keepclassmembers class **.R$* {
+    public static <fields>;
+}
+-keep class **.R$* {
+ *;
+}
+
+-keep public class * extends android.app.Activity{
+	public <fields>;
+	public <methods>;
+}
+-keep public class * extends android.app.Application{
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+
+-keep public class * extends androidx.core.app.CoreComponentFactory
+
+
+
+-keepclassmembers enum * {
+    public static **[] values();
+    public static ** valueOf(java.lang.String);
+}
+
+-keepclasseswithmembers class * {
+	public <init>(android.content.Context, android.util.AttributeSet);
+}
+
+-keepclasseswithmembers class * {
+	public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+
+-keepclasseswithmembernames class *{
+	native <methods>;
+}
+
+-keep class * implements android.os.Parcelable {
+  public static final android.os.Parcelable$Creator *;
+}
+
+-keepclasseswithmembers class * {
+    ... *JNI*(...);
+}
+
+-keepclasseswithmembernames class * {
+	... *JRI*(...);
+}
+
+-keep class **JNI* {*;}
+
+-keep class cn.yyxx.commsdk.impl.merge.platform.SdkPlatformBridge{public <fields>; public<methods>;}
+
+-keep class cn.yyxx.commsdk.impl.merge.platform.hnqj.action.**{public <fields>; public<methods>;}
+
+
+-keep class cn.yyxx.commsdk.impl.merge.platform.msa.MsaDeviceHandler{public <fields>; public<methods>;}
+
+
+
+
+-dontshrink
+
+
+# support sdk
+-keep class cn.yyxx.support.**{*;}
+
+# base sdk
+-keep class cn.qingshi.gamesdk.base.**{*;}
+
+# msa sdk
+-keep class XI.**{*;}
+-keep class com.asus.**{*;}
+-keep class com.bun.**{*;}
+-keep class com.huawei.hms.ads.identifier.**{*;}
+-keep class com.samsung.android.deviceidservice.**{*;}
+-keep class com.netease.nis.sdkwrapper.** {*;}
+-keep class com.zui.**{*;}
+-keep class org.json.**{*;}
+
+# authsdk
+-keep class com.alibaba.**{*;}
+-keep class com.cmic.**{*;}
+-keep class com.mobile.**{*;}
+-keep class com.nirvana.**{*;}
+
+# mmkv
+-keep class com.tencent.mmkv.**{*;}
+
+# zap
+-keep class com.dolin.zap.**{*;}
+
+# v4-support
+-keep class android.support.**{*;}

+ 14 - 0
library_platform/hnqj/src/main/AndroidManifest.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="cn.yyxx.commsdk.platform_hnqj">
+    <application>
+
+    <activity
+        android:name="cn.yyxx.commsdk.impl.merge.platform.hnqj.HNQJLoginActivity"
+        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
+        android:imeOptions="flagNoFullscreen|flagNoExtractUi"
+        android:launchMode="singleTask"
+        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
+        android:windowSoftInputMode="adjustResize|stateHidden|stateVisible" />
+    </application>
+</manifest>

+ 3 - 0
library_platform/hnqj/src/main/assets/yyxx_game/yyxx_cfg.properties

@@ -0,0 +1,3 @@
+YYXX_ONLINE_ENV=http://testsdkapi.yyxxgame.com
+YYXX_GCP_CODE=Y0101025
+YYXX_PLATFORM=HNQJ

+ 165 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/SdkPlatformBridge.java

@@ -0,0 +1,165 @@
+package cn.yyxx.commsdk.impl.merge.platform;
+
+import android.app.Activity;
+import android.app.Application;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+
+import org.json.JSONObject;
+
+import cn.yyxx.commsdk.base.entity.SdkOrderInfo;
+import cn.yyxx.commsdk.base.entity.SdkRoleInfo;
+import cn.yyxx.commsdk.base.entity.bean.InitBean;
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.base.internal.IMsaDeviceCallback;
+import cn.yyxx.commsdk.base.internal.feature.IApplication;
+import cn.yyxx.commsdk.base.internal.feature.IFeature;
+import cn.yyxx.commsdk.base.internal.feature.ILifeCycle;
+import cn.yyxx.commsdk.base.internal.feature.IOrder;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.impl.SdkPlatformImpl;
+
+
+public class SdkPlatformBridge implements IFeature, ILifeCycle, IApplication,IOrder {
+
+    private SdkPlatformImpl impl = null;
+
+    public SdkPlatformBridge(Context context) {
+        if (null == impl) {
+            impl = new SdkPlatformImpl(context);
+        }
+    }
+
+
+
+
+    @Override
+    public void attachBaseContext(Application application, Context context) {
+        impl.attachBaseContext(application,context);
+    }
+
+    @Override
+    public void initApplication(Application application) {
+        impl.initApplication(application);
+
+    }
+
+    @Override
+    public void initialize(Activity activity, ICallback callback) {
+        impl.initialize(activity,callback);
+    }
+
+    @Override
+    public void initializeSuccess(Activity activity, int loginStatus) {
+        impl.initializeSuccess(activity,loginStatus);
+    }
+
+    @Override
+    public void setLogoutListener(Activity activity, ICallback callback) {
+        impl.setLogoutListener(activity,callback);
+    }
+
+    @Override
+    public void login(final Activity activity, InitBean initBean, final ICallback callback) {
+        impl.login(activity,initBean,callback);
+    }
+
+    @Override
+    public void logout() {
+        impl.logout();
+    }
+
+
+
+    @Override
+    public boolean hasExitView(Activity activity) {
+        return impl.hasExitView(activity);
+    }
+
+    @Override
+    public void openExitView(Activity activity,ICallback callback) {
+        impl.openExitView(activity,callback);
+    }
+
+    @Override
+    public void uploadRoleInfo(Activity activity, String type, SdkRoleInfo roleInfo) {
+        impl.uploadRoleInfo(activity,type,roleInfo);
+    }
+
+    @Override
+    public void reportGameEvent(String event, JSONObject message) {
+        impl.reportGameEvent(event,message);
+    }
+
+    @Override
+    public void initMsaDeviceIds(Context context, IMsaDeviceCallback iMsaDeviceCallback) {
+        impl.initMsaDeviceIds(context,iMsaDeviceCallback);
+    }
+
+
+    @Override
+    public void onStart(Activity activity) {
+        impl.onStart(activity);
+    }
+
+    @Override
+    public void onResume(Activity activity) {
+        impl.onResume(activity);
+    }
+
+    @Override
+    public void onRestart(Activity activity) {
+        impl.onRestart(activity);
+    }
+
+    @Override
+    public void onPause(Activity activity) {
+        impl.onPause(activity);
+    }
+
+    @Override
+    public void onStop(Activity activity) {
+        impl.onStop(activity);
+    }
+
+    @Override
+    public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
+        impl.onActivityResult(activity,requestCode,resultCode,data);
+    }
+
+    @Override
+    public void onNewIntent(Activity activity, Intent intent) {
+        impl.onNewIntent(activity,intent);
+    }
+
+    @Override
+    public void onConfigurationChanged(Activity activity, Configuration newconfig) {
+        impl.onConfigurationChanged(activity,newconfig);
+    }
+
+    @Override
+    public void onWindowFocusChanged(Activity activity, boolean hasFocus) {
+        impl.onWindowFocusChanged(activity,hasFocus);
+    }
+
+    @Override
+    public void onDestroy(Activity activity) {
+        impl.onDestroy(activity);
+
+    }
+
+    @Override
+    public void onCreate(Activity activity, Bundle savedInstanceState) {
+        impl.onCreate(activity,savedInstanceState);
+    }
+
+    @Override
+    public void startPay(Activity activity, SdkOrderInfo sdkOrderInfo,ICallback callback) {
+        impl.startPay(activity,sdkOrderInfo,callback);
+    }
+    @Override
+    public String getChannelOrderExt() {
+        return  impl.getChannelOrderExt();
+    }
+}

+ 134 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/BaseLoginActivity.java

@@ -0,0 +1,134 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTransaction;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+
+import java.util.LinkedList;
+
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/10/25
+ */
+public class BaseLoginActivity extends FragmentActivity {
+
+    protected LinkedList<String> fragmentStack = new LinkedList<>();
+    protected String currentFragmentTag = "";
+    protected int containerId = 0;
+
+
+    public void switchFragment(String tag, Bundle bundle) {
+
+    }
+
+    public void switchFragment(Fragment fragment, String tag, Bundle bundle) {
+
+        if (fragmentStack == null) {
+            return;
+        }
+
+        if (fragmentStack.contains(tag)) {
+            //栈里最后一个与tag相同才执行删除
+            if (fragmentStack.size() > 1 && !fragmentStack.getLast().equals(tag)) {
+                fragmentStack.removeLast();
+            }
+        } else {
+            fragmentStack.add(tag);
+        }
+
+
+        if (bundle !=null ){
+            fragment.setArguments(bundle);
+        }
+
+        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+
+        Fragment tagFragment = getSupportFragmentManager().findFragmentByTag(currentFragmentTag);
+        if (tagFragment != null && !tag.equals(currentFragmentTag)) {
+            tagFragment.onPause();
+            transaction.hide(tagFragment);
+        }
+        tagFragment = getSupportFragmentManager().findFragmentByTag(tag);
+        if (tagFragment == null) {
+            transaction.add(containerId, fragment, tag);
+        } else {
+            tagFragment.onResume();
+            transaction.show(tagFragment);
+        }
+
+
+        currentFragmentTag = tag;
+        transaction.commitAllowingStateLoss();
+    }
+
+
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+            View v = getCurrentFocus();
+            if (isShouldHideInput(v, ev)) {
+
+                InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
+                if (imm != null) {
+                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
+                }
+            }
+            return super.dispatchTouchEvent(ev);
+        }
+        // 必不可少,否则所有的组件都不会有TouchEvent了
+        if (getWindow().superDispatchTouchEvent(ev)) {
+            return true;
+        }
+        return onTouchEvent(ev);
+    }
+
+    protected boolean isShouldHideInput(View v, MotionEvent event) {
+        if ((v instanceof EditText)) {
+            int[] leftTop = {0, 0};
+            //获取输入框当前的location位置
+            v.getLocationInWindow(leftTop);
+            int left = leftTop[0];
+            int top = leftTop[1];
+            int bottom = top + v.getHeight();
+            int right = left + v.getWidth();
+            // 点击的是输入框区域,保留点击EditText的事件
+            return !(event.getX() > left) || !(event.getX() < right) || !(event.getY() > top) || !(event.getY() < bottom);
+        }
+        return false;
+    }
+
+    protected void hideBar() {
+        // The UI options currently enabled are represented by a bitfield.
+        // getSystemUiVisibility() gives us that bitfield.
+        int uiOptions = getWindow().getDecorView().getSystemUiVisibility();
+        int newUiOptions = uiOptions;
+        boolean isImmersiveModeEnabled =
+                ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
+        if (!isImmersiveModeEnabled) {
+            if (Build.VERSION.SDK_INT >= 14) {
+                newUiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
+            }
+            if (Build.VERSION.SDK_INT >= 16) {
+                newUiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN;
+            }
+            if (Build.VERSION.SDK_INT >= 18) {
+                newUiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+            }
+            getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        hideBar();
+    }
+}

+ 178 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/HNQJLoginActivity.java

@@ -0,0 +1,178 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.UserAccountLoginFragment;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.UserPhoneLoginSetpwdFragment;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.UserRegisterFragment;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.UserRetrievePwdFragment;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.AutoLoginDialog;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.UserPhoneLoginFragment;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.UserSwitchAccountLoginFragment;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.impl.SdkPlatformImpl;
+import cn.yyxx.commsdk.impl.merge.user.UserSessionManager;
+import cn.yyxx.support.AndroidBug5497Workaround;
+import cn.yyxx.support.AppUtils;
+import cn.yyxx.support.ResUtils;
+
+public class HNQJLoginActivity extends BaseLoginActivity {
+
+
+
+
+    private UserAccountLoginFragment userAccountLoginFragment;
+    private UserPhoneLoginFragment userPhoneLoginFragment;
+    private UserPhoneLoginSetpwdFragment userPhoneLoginSetpwdFragment;
+    private UserRegisterFragment userRegisterFragment;
+    private UserRetrievePwdFragment userRetrievePwdFragment;
+    private UserSwitchAccountLoginFragment userSwitchAccountLoginFragment;
+
+
+
+
+
+    @Override
+    protected void onCreate(@Nullable final Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            Window window = getWindow();
+            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+
+
+            WindowManager.LayoutParams lp = getWindow().getAttributes();
+            lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
+            getWindow().setAttributes(lp);
+        }
+
+        containerId = ResourceUtil.getId(this, "qj_login_container");
+
+        initView(this);
+        if (UserSessionManager.getInstance().getLocalLastSession() != null){
+            if (SdkPlatformImpl.initConfig.isSwitchAccount){
+                switchFragment(HNQJLoginFragmentTag.PAGE_SWITCH_ACCOUNT_LOGIN,null);
+
+            }else{
+                autoLogin(this);
+            }
+
+        }else{
+            if (SdkPlatformImpl.initConfig.isShowPhoneRegFrist){
+                switchFragment(HNQJLoginFragmentTag.PAGE_PHONE_LOGIN,null);
+            }else{
+                switchFragment(HNQJLoginFragmentTag.PAGE_ACCOUNT_REGISTER,null);
+            }
+        }
+
+    }
+
+    public static void start(Activity activity, ICallback callback) {
+
+        activity.startActivity(new Intent(activity, HNQJLoginActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+    }
+
+    private void initView(Context context){
+        if (AppUtils.isLandscape(context)) {
+            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
+        }
+
+        setContentView(ResourceUtil.getLayoutId(this,"qj_login"));
+
+        if (!AppUtils.isLandscape(context)) {
+            AndroidBug5497Workaround.assistActivity(this);
+        }
+
+
+    }
+
+    @Override
+    public void switchFragment(final String tag,Bundle bundle) {
+        super.switchFragment(tag,bundle);
+       switch (tag){
+           case HNQJLoginFragmentTag.PAGE_ACCOUNT_LOGIN:
+               if (userAccountLoginFragment == null){
+                   userAccountLoginFragment = new UserAccountLoginFragment();
+               }
+               switchFragment(userAccountLoginFragment,tag,bundle);
+               break;
+           case HNQJLoginFragmentTag.PAGE_PHONE_LOGIN:
+               if (userPhoneLoginFragment == null){
+                   userPhoneLoginFragment = new UserPhoneLoginFragment();
+               }
+
+               switchFragment(userPhoneLoginFragment,tag,bundle);
+               break;
+           case HNQJLoginFragmentTag.PAGE_POHONE_SET_PASSWORD:
+               if (userPhoneLoginSetpwdFragment == null){
+                   userPhoneLoginSetpwdFragment = new UserPhoneLoginSetpwdFragment();
+               }
+
+               switchFragment(userPhoneLoginSetpwdFragment,tag,bundle);
+               break;
+           case HNQJLoginFragmentTag.PAGE_ACCOUNT_REGISTER:
+               if (userRegisterFragment == null){
+                   userRegisterFragment = new UserRegisterFragment();
+               }
+               switchFragment(userRegisterFragment,tag,bundle);
+               break;
+           case HNQJLoginFragmentTag.PAGE_RETRIEVE_PASSWORD:
+               if (userRetrievePwdFragment == null){
+                   userRetrievePwdFragment = new UserRetrievePwdFragment();
+               }
+               switchFragment(userRetrievePwdFragment,tag,bundle);
+               break;
+           case HNQJLoginFragmentTag.PAGE_SWITCH_ACCOUNT_LOGIN:
+               if (userSwitchAccountLoginFragment == null){
+                   userSwitchAccountLoginFragment = new UserSwitchAccountLoginFragment();
+               }
+               switchFragment(userSwitchAccountLoginFragment,tag,bundle);
+               break;
+
+       }
+    }
+
+    private void autoLogin(final Activity activity) {
+        AutoLoginDialog.Builder builder = new AutoLoginDialog.Builder(activity,SdkPlatformImpl.loginViewModel);
+        builder.setPositiveButton(new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                //取消回调
+                dialog.dismiss();
+
+                switchFragment(HNQJLoginFragmentTag.PAGE_SWITCH_ACCOUNT_LOGIN,null);
+
+
+            }
+        }).setCloseDialogCallback(new AutoLoginDialog.CloseDialogCallback() {
+
+
+            @Override
+            public void onLoginSuccess() {
+                if (!isFinishing()) {
+                     finish();
+                     SdkPlatformImpl.getInstance(activity).loginSuccess();
+                }
+            }
+            @Override
+            public void onLoginFail() {
+                switchFragment(HNQJLoginFragmentTag.PAGE_SWITCH_ACCOUNT_LOGIN,null);
+            }
+        });
+
+        builder.Create().show();
+    }
+
+}

+ 16 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/HNQJLoginFragmentTag.java

@@ -0,0 +1,16 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.SOURCE)
+public @interface HNQJLoginFragmentTag {
+    String PAGE_ACCOUNT_LOGIN = "UserAccountLoginFragment";
+    String PAGE_PHONE_LOGIN = "UserPhoneLoginFragment";
+    String PAGE_POHONE_SET_PASSWORD = "UserPhoneLoginSetpwdFragment";
+    String PAGE_ACCOUNT_REGISTER = "UserRegisterFragment";
+    String PAGE_RETRIEVE_PASSWORD = "UserRetrievePwdFragment";
+    String PAGE_SWITCH_ACCOUNT_LOGIN = "UserSwitchAccountLoginFragment";
+
+
+}

+ 5 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/action/IJsCallback.java

@@ -0,0 +1,5 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.action;
+
+public interface IJsCallback {
+
+}

+ 62 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/action/PageJsInteraction.java

@@ -0,0 +1,62 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.action;
+
+
+import android.webkit.JavascriptInterface;
+
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.JsBaseDialog;
+
+
+public class PageJsInteraction {
+
+    private JsBaseDialog baseDialog;
+    public PageJsInteraction(JsBaseDialog baseDialog) {
+
+        this.baseDialog =baseDialog;
+
+    }
+
+
+
+    @JavascriptInterface
+    public void zfColse() {   //提供给js调用的方法
+        this.baseDialog.zfColse();
+    }
+
+
+    @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();
+    }
+
+    @JavascriptInterface
+    public void realNameResult(String json){
+        this.baseDialog.realNameResult(json);
+    }
+}

+ 91 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/adapter/UserListAdapter.java

@@ -0,0 +1,91 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.user.UserSession;
+import cn.yyxx.commsdk.impl.merge.user.UserSessionManager;
+
+
+public class UserListAdapter extends BaseAdapter {
+	private Context context;
+	public ArrayList<UserSession> list;
+	private LayoutInflater mInflater = null;
+
+
+
+	public UserListAdapter(Context context, ArrayList<UserSession> list) {
+		this.context = context;
+		this.list = list;
+		this.mInflater = LayoutInflater.from(context);
+
+	}
+
+	@Override
+	public int getCount() {
+		// TODO Auto-generated method stub
+		return list.size();
+	}
+
+	@Override
+	public Object getItem(int position) {
+		// TODO Auto-generated method stub
+		return position;
+	}
+
+	@Override
+	public long getItemId(int position) {
+		// TODO Auto-generated method stub
+		return position;
+	}
+
+	@Override
+	public View getView(final int position, View convertView, ViewGroup parent) {
+		// TODO Auto-generated method stub
+		ViewHolder holder = null;
+		if (convertView == null) {
+			convertView = mInflater.inflate(ResourceUtil.getLayoutId(context, "qj_user_list_item"), parent,false);
+			holder = new ViewHolder();
+
+			holder.accountName = convertView
+					.findViewById(ResourceUtil.getId(context, "history_account"));
+			holder.closeItem =  convertView
+					.findViewById(ResourceUtil.getId(context, "item_close"));
+			
+			holder.closeItem.setOnClickListener(new OnClickListener() {
+				
+				@Override
+				public void onClick(View v) {
+					// TODO Auto-generated method stub
+					deleteItem(position);
+				}
+			});
+			
+			convertView.setTag(holder);
+		} else {
+			holder = (ViewHolder) convertView.getTag();
+
+		}
+		holder.accountName.setText(list.get(position).uname);
+		return convertView;
+	}
+
+	class ViewHolder {
+		TextView accountName;
+		ImageView closeItem;
+
+	}
+	private void deleteItem(int position){
+		UserSessionManager.getInstance().removeSession(list.get(position).uname);
+	}
+
+}

+ 161 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/AutoLoginDialog.java

@@ -0,0 +1,161 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Looper;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.TextView;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import cn.yyxx.commsdk.base.entity.ResultInfo;
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.LoginViewModel;
+import cn.yyxx.commsdk.impl.merge.user.UserSession;
+import cn.yyxx.commsdk.impl.merge.user.UserSessionManager;
+
+
+public class AutoLoginDialog extends Dialog {
+
+
+    private static TextView auto_login_account_text, auto_login_cancel_text;
+    private static AutoLoginDialog dialog;
+    private static Timer timer;
+
+    public AutoLoginDialog(Context context, int theme) {
+        super(context, theme);
+
+    }
+
+    public static class Builder {
+        private Context context;
+        private OnClickListener positiveButtonClickListener;
+        private CloseDialogCallback closeDialogCallback;
+
+        private LoginViewModel loginViewModel;
+
+        private UserSession lastUserSession;
+
+        public Builder(Context context, LoginViewModel loginViewModel) {
+            this.context = context;
+            this.loginViewModel = loginViewModel;
+        }
+
+        public Builder setPositiveButton(OnClickListener listener) {
+            this.positiveButtonClickListener = listener;
+            return this;
+        }
+
+        public Builder setCloseDialogCallback(CloseDialogCallback closeDialogCallback) {
+            this.closeDialogCallback = closeDialogCallback;
+            return this;
+        }
+
+
+        public void dialogDismiss() {
+            if (timer != null) {
+                timer.cancel();
+            }
+
+            dialog.dismiss();
+        }
+
+        public AutoLoginDialog Create() {
+            {
+                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+                dialog = new AutoLoginDialog(context, ResourceUtil.getStyleId(context, "qj_auto_login_dialog"));
+                View layout = inflater.inflate(ResourceUtil.getLayoutId(context, "qj_quick_login_bar"), null);
+                ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+                Window window = dialog.getWindow();
+                window.setGravity(Gravity.TOP);
+                WindowManager.LayoutParams lp = window.getAttributes();
+
+                lp.y = dp2Px(50, context);  //设置出现的高度,距离顶部
+                window.setAttributes(lp);
+
+                dialog.addContentView(layout, layoutParams);
+
+                auto_login_cancel_text = dialog.findViewById(ResourceUtil.getId(context,
+                        "auto_login_cancel_text"));
+                auto_login_account_text = dialog.findViewById(ResourceUtil.getId(context,
+                        "auto_login_account_text"));
+
+
+                if (auto_login_cancel_text != null) {
+                    auto_login_cancel_text.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            if (timer != null) {
+                                timer.cancel();
+                            }
+
+                            timer = null;
+                            positiveButtonClickListener.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
+                        }
+                    });
+                }
+
+                String enter_game_tip = context.getString(ResourceUtil.getStringId(context, "qj_enter_game_tip"));
+                lastUserSession = UserSessionManager.getInstance().getLocalLastSession();
+                String autoTip = lastUserSession.uname + enter_game_tip;
+
+                auto_login_account_text.setText(autoTip);
+                dialog.setCancelable(false);
+                timer = new Timer();
+                timer.schedule(task, 2000);
+                return dialog;
+            }
+        }
+
+        TimerTask task = new TimerTask() {
+
+            @Override
+            public void run() {
+                Looper.prepare();
+
+                dialogDismiss();
+
+                loginViewModel.accountLogin((Activity) context, lastUserSession.uname, lastUserSession.password, lastUserSession.login_token, new ICallback() {
+                    @Override
+                    public void onResult(int code, String result) {
+                        if (code == ResultInfo.CODE_SUCCESS){
+                            closeDialogCallback.onLoginSuccess();
+                        }else {
+                            closeDialogCallback.onLoginFail();
+
+                        }
+
+                    }
+                });
+
+                Looper.loop();
+            }
+
+        };
+
+
+    }
+
+    public interface CloseDialogCallback {
+        void onLoginSuccess();
+
+        void onLoginFail();
+    }
+
+    public static int dp2Px(float dp, Context mContext) {
+        return (int) TypedValue.applyDimension(
+                TypedValue.COMPLEX_UNIT_DIP,
+                dp,
+                mContext.getResources().getDisplayMetrics());
+    }
+}

+ 93 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/CustomExitGameDialog.java

@@ -0,0 +1,93 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog;
+
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.support.AppUtils;
+
+
+public class CustomExitGameDialog extends Dialog {
+
+	private	static Button bt_exit_game;
+	private static Button bt_goon_game;
+	private static TextView issure_exit;
+	private static CustomExitGameDialog dialog;
+
+	public CustomExitGameDialog(Context context, int theme) {
+		super(context, theme);
+
+	}
+	public  static class  Builder{
+		private Context context;
+		private OnClickListener positiveButtonClickListener;
+		private OnClickListener negativeButtonClickListener;
+		public Builder(Context context){ this.context = context;}
+		public Builder setPositiveButton(OnClickListener listener){
+			this.positiveButtonClickListener = listener;
+			return this;
+		}
+		public Builder setnegativeButton(OnClickListener listener){
+			negativeButtonClickListener = listener;
+			return this;
+		}
+		public void setTitle(String title){
+			issure_exit.setText(title);
+		}
+		public void  dialogDismiss(){dialog.dismiss();}
+		public CustomExitGameDialog Create(){
+			{
+				LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+				dialog = new CustomExitGameDialog(context, ResourceUtil.getStyleId(context,"qj_base_dialog"));
+
+
+				View layout =  inflater.inflate(ResourceUtil.getLayoutId(context, "qj_exit_game_dialog"),null);
+
+
+				if (!AppUtils.isLandscape(context)){
+					LinearLayout ll_exit_game = layout.findViewById(ResourceUtil.getId(context, "ll_exit_game"));
+					ll_exit_game.setScaleX(0.9f);
+					ll_exit_game.setScaleY(0.9f);
+				}
+
+				dialog.addContentView(layout,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+
+				bt_exit_game =(Button) dialog.findViewById(ResourceUtil.getId(context,
+						"find_pwd_confirm_btn"));
+				bt_goon_game = (Button) dialog.findViewById(ResourceUtil.getId(context,
+						"find_pwd_cancel_btn"));
+				if (bt_exit_game!=null){
+					bt_exit_game.setOnClickListener(new View.OnClickListener() {
+						@Override
+						public void onClick(View view) {
+							positiveButtonClickListener.onClick(dialog,DialogInterface.BUTTON_POSITIVE);
+						}
+					});
+				}
+				if (bt_goon_game!=null){
+					bt_goon_game.setOnClickListener(new View.OnClickListener() {
+						@Override
+						public void onClick(View view) {
+							negativeButtonClickListener.onClick(dialog,DialogInterface.BUTTON_NEGATIVE);
+						}
+					});
+				}
+				issure_exit = dialog.findViewById(ResourceUtil.getId(context,
+						"qj_issure_exit"));
+				return dialog;
+			}
+		}
+
+
+	}
+
+
+}

+ 225 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/EmailDialog.java

@@ -0,0 +1,225 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.webkit.DownloadListener;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.ImageView;
+
+import java.net.URISyntaxException;
+
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.action.PageJsInteraction;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.TosUtil;
+import cn.yyxx.support.AppUtils;
+
+
+public class EmailDialog extends JsBaseDialog {
+
+
+    private ImageView close_btn;
+    private Context context;
+    private WebView webView;
+    private WebSettings webSettings;
+
+    private String url;
+
+
+    public EmailDialog(Context context) {
+        super(context);
+        this.context = context;
+    }
+
+
+    public EmailDialog(Context context, int theme, String url) {
+        super(context, theme);
+        this.context = context;
+        this.url = url;
+
+    }
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+
+        if (!AppUtils.isLandscape(context)){
+
+            setContentView(ResourceUtil.getLayoutId(context,
+                    "qj_usercenter_portait_dialog"));
+
+        }else{
+            setContentView(ResourceUtil.getLayoutId(context,
+                    "qj_email_dialog"));
+        }
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            Window window = getWindow();
+            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+
+
+            WindowManager.LayoutParams lp = getWindow().getAttributes();
+            lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
+            getWindow().setAttributes(lp);
+        }
+
+
+
+        setCancelable(false);
+
+
+
+        webView = findViewById(ResourceUtil.getId(context,
+                "wb_user_info"));
+
+        close_btn = findViewById(ResourceUtil.getId(context,
+                "close_btn"));
+
+
+
+        close_btn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+
+
+
+                webView.destroy();
+                dismiss();
+
+            }
+        });
+
+        webSettings = webView.getSettings();
+        webSettings.setAllowFileAccess(true);
+        webSettings.setJavaScriptEnabled(true);
+        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
+        webSettings.setBuiltInZoomControls(false);// 设置支持缩放
+        webSettings.setDomStorageEnabled(true);
+        webView.setHorizontalScrollBarEnabled(false);//水平不显示
+        webView.setVerticalScrollBarEnabled(false); //垂直不显示
+
+        webView.addJavascriptInterface(new PageJsInteraction(this), "yyrhsdk");
+        webView.setWebViewClient(new WebViewClient(){
+            @Override
+            public void onPageFinished(WebView view, String url) {
+                super.onPageFinished(view, url);
+
+            }
+
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url) {
+
+
+
+
+                if (url.startsWith("http:") || url.startsWith("https")) {
+                    return super.shouldOverrideUrlLoading(view, url);
+                } else if (url.startsWith("mqqwpa://")) {
+
+                    Intent intent = null;
+                    try {
+                        intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
+                        context.startActivity(intent);
+                    } catch (URISyntaxException e) {
+                        e.printStackTrace();
+                    }
+
+                    webView.goBack();
+                    return true;
+
+                }else{
+                    return true;
+                }
+            }
+
+        });
+
+        webView.setDownloadListener(new DownloadListener() {
+            @Override
+            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
+                Uri uri = Uri.parse(url);
+                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+                context.startActivity(intent);
+            }
+        });
+
+
+        webView.setBackgroundColor(0);
+        webView.getBackground().setAlpha(0);
+
+
+        webView.loadUrl(url);
+    }
+
+
+
+
+
+
+    @Override
+    public void zfColse() {
+        super.zfColse();
+        dismiss();
+    }
+
+    @Override
+    public void showJsMsg(String message) {
+        super.showJsMsg(message);
+        new TosUtil(context,TosUtil.TOAST_ERROR,  message).show();
+    }
+
+
+
+    @Override
+    public void openq0q0(String url) {
+        super.openq0q0(url);
+
+        {
+            Log.i("openq0q0", url);
+            if (TextUtils.isEmpty(url)) {
+                return;
+            }
+            if (url.equals("mqqwpa://")) {
+                try {
+
+                    Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.tencent.mobileqq");
+                    context.startActivity(intent);
+
+                } catch (Exception e) {
+                    e.printStackTrace();
+
+                }
+            } else {
+                Intent intent = null;
+                try {
+                    intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
+                    context.startActivity(intent);
+                } catch (URISyntaxException e) {
+                    e.printStackTrace();
+                }
+
+            }
+
+
+        }
+    }
+
+    @Override
+    public void dismiss() {
+        super.dismiss();
+    }
+}

+ 187 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/HnPayDialog.java

@@ -0,0 +1,187 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.text.TextUtils;
+import android.view.View;
+import android.webkit.DownloadListener;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import cn.yyxx.commsdk.base.entity.ResultInfo;
+import cn.yyxx.commsdk.base.entity.SdkOrderInfo;
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.base.internal.IRequestCallback;
+import cn.yyxx.commsdk.core.network.SdkRequest;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.action.PageJsInteraction;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.TosUtil;
+import cn.yyxx.support.AppUtils;
+
+
+public class HnPayDialog extends JsBaseDialog implements View.OnClickListener{
+
+
+    private Context context;
+    private WebView webView;
+    private WebSettings webSettings;
+    private String orderId;
+    private ImageView iv_reback_close;
+    private SdkOrderInfo sdkOrderInfo;
+    private ICallback payCallBack;
+
+
+    public HnPayDialog(Context context, int theme, SdkOrderInfo sdkOrderInfo,ICallback callback) {
+        super(context, theme);
+        this.context = context;
+        this.sdkOrderInfo = sdkOrderInfo;
+        this.payCallBack = callback;
+
+    }
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(ResourceUtil.getLayoutId(context,
+                "qj_p_webview"));
+
+
+        if (!AppUtils.isLandscape(context)){
+            LinearLayout ll_p_wb = findViewById(ResourceUtil.getId(context, "ll_p_wb"));
+
+            ll_p_wb.setScaleX(0.9f);
+            ll_p_wb.setScaleY(0.9f);
+        }
+
+        iv_reback_close = findViewById(ResourceUtil.getId(context,
+                "iv_reback_close"));
+        iv_reback_close.setOnClickListener(this);
+
+        webView = findViewById(ResourceUtil.getId(context,
+                "wb_with_xd"));
+
+
+
+        webSettings = webView.getSettings();
+        webSettings.setAllowFileAccess(true);
+        webSettings.setJavaScriptEnabled(true);
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+
+        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
+        webSettings.setBuiltInZoomControls(false);// 设置支持缩放
+        webSettings.setDomStorageEnabled(true);
+        webView.addJavascriptInterface(new PageJsInteraction(this), "yyrhsdk");
+        webView.setHorizontalScrollBarEnabled(false);//水平不显示
+        webView.setVerticalScrollBarEnabled(false); //垂直不显示
+        webView.setWebChromeClient(new WebChromeClient());
+        webView.setWebViewClient(new WebViewClient(){
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url) {
+                String httpHead = url.substring(0, 5);
+                if (httpHead.equals("http:") || httpHead.equals("https")) {
+                    return super.shouldOverrideUrlLoading(view, url);
+                } else if (url.equals("yyrhsdk://pay_close")) {
+
+                    dismiss();
+
+                    return true;
+
+                } else if (url.equals("yyrhsdk://pay_success")) {
+                    dismiss();
+                    return true;
+                } else {
+                    if (httpHead.equals("yyrhsdk")) {
+
+                        return true;
+                    } else {
+                        openWXPay(url);
+                        return true;
+                    }
+                }
+            }
+
+            @Override
+            public void onPageFinished(WebView view, String url) {
+                super.onPageFinished(view, url);
+
+            }
+
+            private void openWXPay(String code_url) {
+                try {
+                    Intent it = new Intent(Intent.ACTION_VIEW);
+                    it.setData(Uri.parse(code_url));
+                    context.startActivity(it);
+                } catch (Exception e) {
+
+                }
+            }
+        });
+
+        webView.setDownloadListener(new DownloadListener() {
+            @Override
+            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
+                Uri uri = Uri.parse(url);
+                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+                context.startActivity(intent);
+            }
+        });
+
+
+        webView.loadUrl(sdkOrderInfo.getPay_web_url());
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == ResourceUtil.getId(context, "iv_reback_close")) {
+            dismiss();
+
+        }
+    }
+
+    @Override
+    public void dismiss() {
+        super.dismiss();
+        if (!TextUtils.isEmpty(orderId)){
+            new Handler().postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    SdkRequest.getInstance().queryOrder(context, orderId, sdkOrderInfo.getQuery_params(), new IRequestCallback() {
+                        @Override
+                        public void onResponse(ResultInfo resultInfo) {
+                            payCallBack.onResult(resultInfo.code,resultInfo.data);
+                         }
+                    });
+                }
+            },5000);
+
+        }
+    }
+
+
+    @Override
+    public void zfOrder(String message) {
+        super.zfOrder(message);
+        orderId = message;
+    }
+
+    @Override
+    public void zfColse() {
+        super.zfColse();
+        dismiss();
+    }
+
+    @Override
+    public void showJsMsg(String message) {
+        super.showJsMsg(message);
+        new TosUtil(context,TosUtil.TOAST_ERROR,  message).show();
+    }
+}

+ 90 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/JsBaseDialog.java

@@ -0,0 +1,90 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog;
+
+
+import android.app.Dialog;
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import cn.yyxx.commsdk.Version;
+import cn.yyxx.commsdk.base.utils.Logger;
+import cn.yyxx.support.AppUtils;
+
+
+public class JsBaseDialog extends Dialog {
+
+
+    public JsBaseDialog(@NonNull Context context) {
+        super(context);
+    }
+
+    public JsBaseDialog(@NonNull Context context, int themeResId) {
+        super(context, themeResId);
+    }
+
+    protected JsBaseDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
+        super(context, cancelable, cancelListener);
+    }
+
+    public void zfColse() {   //提供给js调用的方法
+        Logger.i("zfColse");
+    }
+
+
+
+    public void showJsMsg(String message) {
+        Logger.i("showJsMsg:" + message);
+    }
+
+    public void modifyPwd(String message) {
+        Logger.i("modifyPwd:" + message);
+    }
+
+    public void zfOrder(String message) {   //提供给js调用的方法
+        Logger.i("zfOrder:" + message);
+    }
+
+    public void openq0q0(String url)  {
+
+        Logger.i("openq0q0:" + url);
+
+    }
+    public void switchAccount()  {
+
+        Logger.i("switchAccount");
+
+    }
+
+    public String webExt(){
+
+        JSONObject json = new JSONObject();
+
+
+        try {
+            if (AppUtils.isLandscape(getContext())){
+
+                json.put("orientation","landscape");
+
+            }else{
+
+                json.put("orientation","portrait");
+
+            }
+
+            json.put("version", Version.VERSION_NAME);
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        Logger.i("webExt : " + json.toString());
+        return json.toString();
+    }
+
+    public void realNameResult(String json){
+        Logger.i("realNameResult:"+ json);
+    }
+}

+ 258 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/UserCenterDialog.java

@@ -0,0 +1,258 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.webkit.DownloadListener;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.ImageView;
+
+import java.net.URISyntaxException;
+
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.action.PageJsInteraction;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.TosUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.impl.SdkPlatformImpl;
+import cn.yyxx.support.AppUtils;
+
+
+public class UserCenterDialog extends JsBaseDialog {
+
+
+    private ImageView close_btn,loading;
+    private Context context;
+    private WebView webView;
+    private WebSettings webSettings;
+
+    private String url;
+    public OnClosePageListener listener;
+
+    public UserCenterDialog(Context context) {
+        super(context);
+        this.context = context;
+    }
+
+
+    public UserCenterDialog(Context context, int theme, String url) {
+        super(context, theme);
+        this.context = context;
+
+        this.url = url;
+
+    }
+
+    public UserCenterDialog(Context context, int theme, String url, OnClosePageListener listener) {
+        super(context, theme);
+        this.context = context;
+
+        this.url = url;
+        this.listener = listener;
+    }
+    public UserCenterDialog(Context context, int theme, String url, OnClosePageListener listener, boolean isHiddenClose) {
+        super(context, theme);
+        this.context = context;
+
+        this.url = url;
+        this.listener = listener;
+
+    }
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if (!AppUtils.isLandscape(context)){
+            setContentView(ResourceUtil.getLayoutId(context,
+                    "qj_usercenter_portait_dialog"));
+            getWindow().getAttributes().gravity = Gravity.CENTER;
+        }else{
+            setContentView(ResourceUtil.getLayoutId(context,
+                    "qj_usercenter_dialog"));
+            getWindow().getAttributes().gravity = Gravity.LEFT;
+        }
+
+
+        setCancelable(false);
+        webView = findViewById(ResourceUtil.getId(context,
+                "wb_user_info"));
+
+        close_btn = findViewById(ResourceUtil.getId(context,
+                "close_btn"));
+
+
+
+        close_btn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+
+                if (listener != null){
+                    listener.onClose();
+                }
+
+                webView.destroy();
+                dismiss();
+
+            }
+        });
+
+        loading = findViewById(ResourceUtil.getId(context, "iv_loading"));
+        Animation rotateAnimation = AnimationUtils.loadAnimation(context, ResourceUtil.getAnimId(context, "qj_rotate_anim"));
+        loading.startAnimation(rotateAnimation);
+
+        webSettings = webView.getSettings();
+        webSettings.setAllowFileAccess(true);
+        webSettings.setJavaScriptEnabled(true);
+        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
+        webSettings.setBuiltInZoomControls(false);// 设置支持缩放
+        webSettings.setDomStorageEnabled(true);
+        webView.setHorizontalScrollBarEnabled(false);//水平不显示
+        webView.setVerticalScrollBarEnabled(false); //垂直不显示
+
+
+        webView.addJavascriptInterface(new PageJsInteraction(this), "yyrhsdk");
+        webView.setWebViewClient(new WebViewClient(){
+            @Override
+            public void onPageFinished(WebView view, String url) {
+                super.onPageFinished(view, url);
+                loading.clearAnimation();
+                loading.setVisibility(View.GONE);
+            }
+
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url) {
+
+
+
+
+                if (url.startsWith("http:") || url.startsWith("https")) {
+                    return super.shouldOverrideUrlLoading(view, url);
+                } else if (url.startsWith("mqqwpa://")) {
+
+                    Intent intent = null;
+                    try {
+                        intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
+                        context.startActivity(intent);
+                    } catch (URISyntaxException e) {
+                        e.printStackTrace();
+                    }
+
+                    webView.goBack();
+                    return true;
+
+                }else{
+                    return true;
+                }
+            }
+
+        });
+
+        webView.setDownloadListener(new DownloadListener() {
+            @Override
+            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
+                Uri uri = Uri.parse(url);
+                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+                context.startActivity(intent);
+            }
+        });
+
+
+        webView.setBackgroundColor(0);
+        webView.getBackground().setAlpha(0);
+
+
+        webView.loadUrl(url);
+    }
+
+
+
+
+    public interface OnClosePageListener {
+         void onClose();
+         void onDissmiss();
+         void onRealNameSuccess(String birthday);
+    }
+
+
+
+    @Override
+    public void zfColse() {
+        super.zfColse();
+        if (listener != null){
+            listener.onClose();
+        }
+        dismiss();
+    }
+
+
+    @Override
+    public void modifyPwd(String message) {
+        super.modifyPwd(message);
+     }
+
+    @Override
+    public void showJsMsg(String message) {
+        super.showJsMsg(message);
+        new TosUtil(context,TosUtil.TOAST_ERROR,  message).show();
+    }
+
+
+
+
+    @Override
+    public void openq0q0(String url) {
+        super.openq0q0(url);
+
+        {
+            Log.i("openq0q0", url);
+
+            if (TextUtils.isEmpty(url)) {
+                return;
+            }
+            if (url.equals("mqqwpa://")) {
+                try {
+
+                    Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.tencent.mobileqq");
+                    context.startActivity(intent);
+
+                } catch (Exception e) {
+                    e.printStackTrace();
+
+                }
+            } else {
+                Intent intent = null;
+                try {
+                    intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
+                    context.startActivity(intent);
+                } catch (URISyntaxException e) {
+                    e.printStackTrace();
+                }
+
+            }
+
+
+        }
+    }
+
+    @Override
+    public void switchAccount() {
+        super.switchAccount();
+        dismiss();
+        SdkPlatformImpl.getInstance(context).logout();
+    }
+
+
+
+    @Override
+    public void dismiss() {
+        super.dismiss();
+    }
+}

+ 277 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/dialog/WvPageListDialog.java

@@ -0,0 +1,277 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.webkit.DownloadListener;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import java.net.URISyntaxException;
+
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.action.PageJsInteraction;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.TosUtil;
+import cn.yyxx.support.AppUtils;
+
+public class WvPageListDialog extends JsBaseDialog {
+
+
+    private ImageView close_btn,loading;
+    private Context context;
+    private WebView webView;
+    private WebSettings webSettings;
+
+    private String url;
+    public OnClosePageListener listener;
+    private boolean isHiddenClo = false;
+
+    public WvPageListDialog(Context context, int theme, String url) {
+        super(context, theme);
+        this.context = context;
+        this.url = url;
+    }
+
+    public WvPageListDialog(Context context, int theme, String url, OnClosePageListener listener) {
+        super(context, theme);
+        this.context = context;
+
+        this.url = url;
+        this.listener = listener;
+    }
+    public WvPageListDialog(Context context, int theme, String url, OnClosePageListener listener, boolean isHiddenClose) {
+        super(context, theme);
+        this.context = context;
+
+        this.url = url;
+        this.listener = listener;
+        this.isHiddenClo = isHiddenClose;
+    }
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+            setContentView(ResourceUtil.getLayoutId(context,
+                    "qj_webview_common_dialog"));
+
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            Window window = getWindow();
+            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+
+
+            WindowManager.LayoutParams lp = getWindow().getAttributes();
+            lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
+            getWindow().setAttributes(lp);
+        }
+
+
+            setCancelable(false);
+
+
+
+        if (!AppUtils.isLandscape(context)){
+
+            LinearLayout ll_webview_common = findViewById(ResourceUtil.getId(context, "ll_webview_common"));
+            ll_webview_common.setScaleX(0.9f);
+            ll_webview_common.setScaleY(0.9f);
+
+        }
+
+        webView = findViewById(ResourceUtil.getId(context,
+                "wb_user_info"));
+
+        close_btn = findViewById(ResourceUtil.getId(context,
+                "close_btn"));
+
+        loading = findViewById(ResourceUtil.getId(context, "qj_loading"));
+        Animation rotateAnimation = AnimationUtils.loadAnimation(context, ResourceUtil.getAnimId(context, "qj_rotate_anim"));
+        loading.startAnimation(rotateAnimation);
+
+        close_btn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+
+                if (listener != null){
+                    listener.onClose();
+                }
+
+                webView.destroy();
+                dismiss();
+
+            }
+        });
+        if (isHiddenClo){
+            close_btn.setVisibility(View.GONE);
+        }
+
+        webSettings = webView.getSettings();
+        webSettings.setAllowFileAccess(true);
+        webSettings.setJavaScriptEnabled(true);
+        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
+        webSettings.setBuiltInZoomControls(false);// 设置支持缩放
+        webSettings.setDomStorageEnabled(true);
+        webView.setHorizontalScrollBarEnabled(false);//水平不显示
+        webView.setVerticalScrollBarEnabled(false); //垂直不显示
+
+        webView.addJavascriptInterface(new PageJsInteraction(this), "yyrhsdk");
+        webView.setWebViewClient(new WebViewClient(){
+            @Override
+            public void onPageFinished(WebView view, String url) {
+                super.onPageFinished(view, url);
+                loading.clearAnimation();
+                loading.setVisibility(View.GONE);
+            }
+
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url) {
+
+
+                if (url.startsWith("http:") || url.startsWith("https")) {
+                    return super.shouldOverrideUrlLoading(view, url);
+                } else if (url.startsWith("mqqwpa://")) {
+
+                    Intent intent = null;
+                    try {
+                        intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
+                        context.startActivity(intent);
+                    } catch (URISyntaxException e) {
+                        e.printStackTrace();
+                    }
+
+                    webView.goBack();
+                    return true;
+
+                }else{
+                    return true;
+                }
+            }
+
+        });
+
+        webView.setDownloadListener(new DownloadListener() {
+            @Override
+            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
+                Uri uri = Uri.parse(url);
+                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+                context.startActivity(intent);
+            }
+        });
+
+
+        webView.setBackgroundColor(0);
+        webView.getBackground().setAlpha(0);
+
+        webView.loadUrl(url);
+    }
+
+
+
+
+    public interface OnClosePageListener {
+         void onClose();
+         void onDissmiss();
+         void onRealNameSuccess();
+    }
+
+
+
+    @Override
+    public void zfColse() {
+        super.zfColse();
+        if (listener != null){
+            listener.onClose();
+        }
+        dismiss();
+    }
+
+    @Override
+    public void showJsMsg(String message) {
+        super.showJsMsg(message);
+        new TosUtil(context,TosUtil.TOAST_ERROR,  message).show();
+    }
+
+
+    @Override
+    public void modifyPwd(String message) {
+        super.modifyPwd(message);
+
+
+
+    }
+
+
+    @Override
+    public void openq0q0(String url) {
+        super.openq0q0(url);
+
+
+            if (TextUtils.isEmpty(url)) {
+                return;
+            }
+
+            if (url.equals("mqqwpa://")) {
+                try {
+
+                    Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.tencent.mobileqq");
+                    context.startActivity(intent);
+
+                } catch (Exception e) {
+                    e.printStackTrace();
+
+                }
+            } else {
+                Intent intent = null;
+                try {
+                    intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
+                    context.startActivity(intent);
+                } catch (URISyntaxException e) {
+                    e.printStackTrace();
+                }
+
+            }
+
+
+
+    }
+
+    @Override
+    public void dismiss() {
+        super.dismiss();
+
+        if (listener != null){
+            listener.onDissmiss();
+        }
+
+
+    }
+
+    @Override
+    public void realNameResult(String json) {
+        super.realNameResult(json);
+//        try {
+//
+//            SDKSettings.loginData.rn_si = new JSONObject(json).optString("si");
+//            listener.onRealNameSuccess();
+//
+//        } catch (JSONException e) {
+//            e.printStackTrace();
+//        }
+
+
+    }
+}

+ 391 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/floating/DotImageView.java

@@ -0,0 +1,391 @@
+/*
+ * Copyright (c) 2016, Shanghai YUEWEN Information Technology Co., Ltd.
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ *  Neither the name of Shanghai YUEWEN Information Technology Co., Ltd. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SHANGHAI YUEWEN INFORMATION TECHNOLOGY CO., LTD. AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.floating;
+
+import android.animation.Animator;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Camera;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+
+
+/**
+ * Created by wengyiming on 2017/7/21.
+ */
+
+/**
+ * 00%=FF(不透明)    5%=F2    10%=E5    15%=D8    20%=CC    25%=BF    30%=B2    35%=A5    40%=99    45%=8c    50%=7F
+ * 55%=72    60%=66    65%=59    70%=4c    75%=3F    80%=33    85%=21    90%=19    95%=0c    100%=00(全透明)
+ */
+public class DotImageView extends View {
+    private static final String TAG = DotImageView.class.getSimpleName();
+    public static final int NORMAL = 0;//不隐藏
+    public static final int HIDE_LEFT = 1;//左边隐藏
+    public static final int HIDE_RIGHT = 2;//右边隐藏
+    private Paint mPaint;//用于画anything
+
+    private Paint mPaintBg;//用于画anything
+    private String dotNum = null;//红点数字
+    private float mAlphValue;//透明度动画值
+    private float mRolateValue = 1f;//旋转动画值
+    private boolean inited = false;//标记透明动画是否执行过,防止因onreseme 切换导致重复执行
+
+
+    private Bitmap mBitmap;//logo
+    private final int mLogoBackgroundRadius = dip2px(25);//logo的灰色背景圆的半径
+    private final int mLogoWhiteRadius = dip2px(20);//logo的白色背景的圆的半径
+    private final int mRedPointRadiusWithNum = dip2px(6);//红点圆半径
+    private final int mRedPointRadius = dip2px(3);//红点圆半径
+    private final int mRedPointOffset = dip2px(10);//红点对logo的偏移量,比如左红点就是logo中心的 x - mRedPointOffset
+
+    private boolean isDraging = false;//是否 绘制旋转放大动画,只有 非停靠边缘才绘制
+    private float scaleOffset;//放大偏移值
+    private ValueAnimator mDragingValueAnimator;//放大、旋转 属性动画
+    private LinearInterpolator mLinearInterpolator = new LinearInterpolator();//通用用加速器
+    public boolean mDrawDarkBg = true;//是否绘制黑色背景,当菜单关闭时,才绘制灰色背景
+    private static final float hideOffset = 0.5f;//往左右隐藏多少宽度的偏移值, 隐藏宽度的0.4
+    private static final float hideOffsetAlpha = 0.5f;//往左右隐藏多少宽度的偏移值, 隐藏宽度的0.4
+    private Camera mCamera;//camera用于执行3D动画
+
+    private boolean mDrawNum = false;//只绘制红点还是红点+白色数字
+
+    private int mStatus = NORMAL;//0 正常,1 左,2右,3 中间方法旋转
+    private int mLastStatus = mStatus;
+    private Matrix mMatrix;
+    private boolean mIsResetPosition;
+
+    private int mBgColor = 0x99000000;
+
+
+    public void setBgColor(int bgColor) {
+        mBgColor = bgColor;
+    }
+
+
+    public void setDrawNum(boolean drawNum) {
+        this.mDrawNum = drawNum;
+    }
+
+    public void setDrawDarkBg(boolean drawDarkBg) {
+        mDrawDarkBg = drawDarkBg;
+        invalidate();
+    }
+
+    public int getStatus() {
+        return mStatus;
+    }
+
+
+    public void setStatus(int status) {
+        this.mStatus = status;
+        isDraging = false;
+        if (this.mStatus != NORMAL) {
+            setDrawNum(mDrawNum);
+            this.mDrawDarkBg = true;
+        }
+        invalidate();
+
+    }
+
+    public void setBitmap(Bitmap bitmap) {
+        mBitmap = bitmap;
+    }
+
+    public DotImageView(Context context, Bitmap bitmap) {
+        super(context);
+        this.mBitmap = bitmap;
+        init();
+    }
+
+
+    public DotImageView(Context context) {
+        super(context);
+        init();
+    }
+
+    public DotImageView(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public DotImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    private void init() {
+        mPaint = new Paint();
+        mPaint.setAntiAlias(true);
+        mPaint.setTextSize(sp2px(10));
+        mPaint.setStyle(Paint.Style.FILL);
+
+        mPaintBg = new Paint();
+        mPaintBg.setAntiAlias(true);
+        mPaintBg.setStyle(Paint.Style.FILL);
+        mPaintBg.setColor(mBgColor);//60% 黑色背景 (透明度 40%)
+
+        mCamera = new Camera();
+        mMatrix = new Matrix();
+    }
+
+    /**
+     * 这个方法是否有优化空间
+     */
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        int wh = mLogoBackgroundRadius * 2;
+        setMeasuredDimension(wh, wh);
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        float centryX = getWidth() / 2;
+        float centryY = getHeight() / 2;
+        canvas.save();//保存一份快照,方便后面恢复
+        mCamera.save();
+        setAlpha(1.0f);
+        if (mStatus == NORMAL) {
+            if (mLastStatus != NORMAL) {
+                canvas.restore();//恢复画布的原始快照
+                mCamera.restore();
+            }
+
+            if (isDraging) {
+
+                //如果当前是拖动状态则放大并旋转
+               // canvas.scale((scaleOffset + 1f), (scaleOffset + 1f), getWidth() / 2, getHeight() / 2);
+                if (mIsResetPosition) {
+                    //手指拖动后离开屏幕复位时使用 x轴旋转 3d动画
+                    mCamera.save();
+                    mCamera.rotateX(720 * scaleOffset);//0-720度 最多转两圈
+                    mCamera.getMatrix(mMatrix);
+
+                    mMatrix.preTranslate(-getWidth() / 2, -getHeight() / 2);
+                    mMatrix.postTranslate(getWidth() / 2, getHeight() / 2);
+                    canvas.concat(mMatrix);
+                    mCamera.restore();
+                } else {
+                    //手指拖动且手指未离开屏幕则使用 绕图心2d旋转动画
+                    canvas.rotate(60 * mRolateValue, getWidth() / 2, getHeight() / 2);
+                }
+            }
+
+
+        } else if (mStatus == HIDE_LEFT) {
+            canvas.translate(-getWidth() * hideOffset, 0);
+            canvas.rotate(0, getWidth() / 2, getHeight() / 2);
+            setAlpha(hideOffsetAlpha);
+
+        } else if (mStatus == HIDE_RIGHT) {
+            canvas.translate(getWidth() * hideOffset, 0);
+            canvas.rotate(0, getWidth() / 2, getHeight() / 2);
+            setAlpha(hideOffsetAlpha);
+        }
+        canvas.save();
+        if (!isDraging) {
+            if (mDrawDarkBg) {
+                mPaintBg.setColor(Color.TRANSPARENT);
+                canvas.drawCircle(centryX, centryY, mLogoBackgroundRadius, mPaintBg);
+                // 60% 白色 (透明度 40%)
+                mPaint.setColor(0x99ffffff);
+            } else {
+                //100% 白色背景 (透明度 0%)
+                mPaint.setColor(0xFFFFFFFF);
+            }
+            if (mAlphValue != 0) {
+                mPaint.setAlpha((int) (mAlphValue * 255));
+            }
+            canvas.drawCircle(centryX, centryY, mLogoWhiteRadius, mPaint);
+        }
+
+        canvas.restore();
+        //100% 白色背景 (透明度 0%)
+        mPaint.setColor(0xFFFFFFFF);
+        int left = (int) (centryX - mBitmap.getWidth() / 2);
+        int top = (int) (centryY - mBitmap.getHeight() / 2);
+        canvas.drawBitmap(mBitmap, left, top, mPaint);
+
+
+        if (!TextUtils.isEmpty(dotNum)) {
+            int readPointRadus = (mDrawNum ? mRedPointRadiusWithNum : mRedPointRadius);
+            mPaint.setColor(Color.RED);
+            if (mStatus == HIDE_LEFT) {
+                canvas.drawCircle(centryX + mRedPointOffset, centryY - mRedPointOffset, readPointRadus, mPaint);
+                if (mDrawNum) {
+                    mPaint.setColor(Color.WHITE);
+                    canvas.drawText(dotNum, centryX + mRedPointOffset - getTextWidth(dotNum, mPaint) / 2, centryY - mRedPointOffset + getTextHeight(dotNum, mPaint) / 2, mPaint);
+                }
+            } else if (mStatus == HIDE_RIGHT) {
+                canvas.drawCircle(centryX - mRedPointOffset, centryY - mRedPointOffset, readPointRadus, mPaint);
+                if (mDrawNum) {
+                    mPaint.setColor(Color.WHITE);
+                    canvas.drawText(dotNum, centryX - mRedPointOffset - getTextWidth(dotNum, mPaint) / 2, centryY - mRedPointOffset + getTextHeight(dotNum, mPaint) / 2, mPaint);
+                }
+            } else {
+                if (mLastStatus == HIDE_LEFT) {
+                    canvas.drawCircle(centryX + mRedPointOffset, centryY - mRedPointOffset, readPointRadus, mPaint);
+                    if (mDrawNum) {
+                        mPaint.setColor(Color.WHITE);
+                        canvas.drawText(dotNum, centryX + mRedPointOffset - getTextWidth(dotNum, mPaint) / 2, centryY - mRedPointOffset + getTextHeight(dotNum, mPaint) / 2, mPaint);
+                    }
+                } else if (mLastStatus == HIDE_RIGHT) {
+                    canvas.drawCircle(centryX - mRedPointOffset, centryY - mRedPointOffset, readPointRadus, mPaint);
+                    if (mDrawNum) {
+                        mPaint.setColor(Color.WHITE);
+                        canvas.drawText(dotNum, centryX - mRedPointOffset - getTextWidth(dotNum, mPaint) / 2, centryY - mRedPointOffset + getTextHeight(dotNum, mPaint) / 2, mPaint);
+                    }
+                }
+            }
+        }
+        mLastStatus = mStatus;
+    }
+
+
+    public void setDotNum(int num, Animator.AnimatorListener l) {
+        if (!inited) {
+            startAnim(num, l);
+        } else {
+            refreshDot(num);
+        }
+    }
+
+    public void refreshDot(int num) {
+        if (num > 0) {
+            String dotNumTmp = String.valueOf(num);
+            if (!TextUtils.equals(dotNum, dotNumTmp)) {
+                dotNum = dotNumTmp;
+                invalidate();
+            }
+        } else {
+            dotNum = null;
+        }
+    }
+
+    public void startAnim(final int num, Animator.AnimatorListener l) {
+        ValueAnimator valueAnimator = ValueAnimator.ofFloat(1.f, 0.6f, 1f, 0.6f);
+        valueAnimator.setInterpolator(mLinearInterpolator);
+        valueAnimator.setDuration(3000);
+        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator animation) {
+                mAlphValue = (float) animation.getAnimatedValue();
+                invalidate();
+
+            }
+        });
+        valueAnimator.addListener(l);
+        valueAnimator.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                inited = true;
+                refreshDot(num);
+                mAlphValue = 0;
+
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+                mAlphValue = 0;
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+
+            }
+        });
+        valueAnimator.start();
+    }
+
+    public void setDraging(boolean draging, float offset, boolean isResetPosition) {
+        isDraging = draging;
+        this.mIsResetPosition = isResetPosition;
+        if (offset > 0 && offset != this.scaleOffset) {
+            this.scaleOffset = offset;
+        }
+        if (isDraging && mStatus == NORMAL) {
+            if (mDragingValueAnimator != null) {
+                if (mDragingValueAnimator.isRunning()) return;
+            }
+            mDragingValueAnimator = ValueAnimator.ofFloat(0, 6f, 12f, 0f);
+            mDragingValueAnimator.setInterpolator(mLinearInterpolator);
+            mDragingValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                @Override
+                public void onAnimationUpdate(ValueAnimator animation) {
+                    mRolateValue = (float) animation.getAnimatedValue();
+                    invalidate();
+                }
+            });
+            mDragingValueAnimator.addListener(new Animator.AnimatorListener() {
+                @Override
+                public void onAnimationStart(Animator animation) {
+
+                }
+
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    isDraging = false;
+                    mIsResetPosition = false;
+                }
+
+                @Override
+                public void onAnimationCancel(Animator animation) {
+
+                }
+
+                @Override
+                public void onAnimationRepeat(Animator animation) {
+
+                }
+            });
+            mDragingValueAnimator.setDuration(1000);
+            mDragingValueAnimator.start();
+        }
+    }
+
+    private int dip2px(float dipValue) {
+        final float scale = getContext().getResources().getDisplayMetrics().density;
+        return (int) (dipValue * scale + 0.5f);
+    }
+
+    private int sp2px(float spValue) {
+        final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity;
+        return (int) (spValue * fontScale + 0.5f);
+    }
+
+    private float getTextHeight(String text, Paint paint) {
+        Rect rect = new Rect();
+        paint.getTextBounds(text, 0, text.length(), rect);
+        return rect.height() / 1.1f;
+    }
+
+    private float getTextWidth(String text, Paint paint) {
+        return paint.measureText(text);
+    }
+}

+ 839 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/floating/FloatLogoMenu.java

@@ -0,0 +1,839 @@
+/*
+ * Copyright (c) 2016, Shanghai YUEWEN Information Technology Co., Ltd.
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ *  Neither the name of Shanghai YUEWEN Information Technology Co., Ltd. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SHANGHAI YUEWEN INFORMATION TECHNOLOGY CO., LTD. AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.floating;
+
+import android.animation.Animator;
+import android.animation.ValueAnimator;
+import android.app.Activity;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.graphics.Bitmap;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.CountDownTimer;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnTouchListener;
+import android.view.WindowManager;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
+import android.widget.LinearLayout;
+
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.CustomExitGameDialog;
+
+
+/**
+ * Created by wengyiming on 2017/7/20.
+ */
+public class FloatLogoMenu {
+
+
+
+
+
+    /**
+     * 记录 logo 停放的位置,以备下次恢复
+     */
+    private static final String LOCATION_X = "hintLocation";
+    private static final String LOCATION_Y = "locationY";
+
+    /**
+     * 悬浮球 坐落 左 右 标记
+     */
+    public static final int LEFT = 0;
+    public static final int RIGHT = 1;
+
+    /**
+     * 记录系统状态栏的高度
+     */
+    private int mStatusBarHeight;
+    /**
+     * 记录当前手指位置在屏幕上的横坐标值
+     */
+    private float mXInScreen;
+
+    /**
+     * 记录当前手指位置在屏幕上的纵坐标值
+     */
+    private float mYInScreen;
+
+    /**
+     * 记录手指按下时在屏幕上的横坐标的值
+     */
+    private float mXDownInScreen;
+
+    /**
+     * 记录手指按下时在屏幕上的纵坐标的值
+     */
+    private float mYDownInScreen;
+
+    /**
+     * 记录手指按下时在小悬浮窗的View上的横坐标的值
+     */
+    private float mXInView;
+
+    /**
+     * 记录手指按下时在小悬浮窗的View上的纵坐标的值
+     */
+    private float mYinview;
+
+    /**
+     * 记录屏幕的宽度
+     */
+    private int mScreenWidth,screenHeigth;
+
+    /**
+     * 来自 activity 的 wManager
+     */
+    private WindowManager wManager;
+
+
+    /**
+     * 为 wManager 设置 LayoutParams
+     */
+    private WindowManager.LayoutParams wmParams,wmParams2;
+
+    /**
+     * 带透明度动画、旋转、放大的悬浮球
+     */
+    private DotImageView mFloatLogo;
+
+
+    /**
+     * 用于 定时 隐藏 logo的定时器
+     */
+    private CountDownTimer mHideTimer;
+
+
+    /**
+     * float menu的高度
+     */
+    private Handler mHandler = new Handler(Looper.getMainLooper());
+
+
+    /**
+     * 悬浮窗左右移动到默认位置 动画的 加速器
+     */
+    private Interpolator mLinearInterpolator = new LinearInterpolator();
+
+    /**
+     * 标记是否拖动中
+     */
+    private boolean isDraging = false;
+
+    /**
+     * 用于恢复悬浮球的location的属性动画值
+     */
+    private int mResetLocationValue;
+
+    private LinearLayout ll_hide;
+
+
+
+    private boolean isShowing = false;
+
+    /**
+     * 手指离开屏幕后 用于恢复 悬浮球的 logo 的左右位置
+     */
+    private Runnable updatePositionRunnable = new Runnable() {
+        @Override
+        public void run() {
+            isDraging = true;
+            checkPosition();
+
+        }
+    };
+
+
+
+    /**
+     * 这个事件用于处理移动、自定义点击或者其它事情,return true可以保证onclick事件失效
+     */
+    private OnTouchListener touchListener = new OnTouchListener() {
+        @Override
+        public boolean onTouch(View v, MotionEvent event) {
+            switch (event.getAction()) {
+                case MotionEvent.ACTION_DOWN:
+                    floatEventDown(event);
+                    break;
+                case MotionEvent.ACTION_MOVE:
+                    floatEventMove(event);
+                    break;
+                case MotionEvent.ACTION_UP:
+                    floatEventUp();
+                case MotionEvent.ACTION_CANCEL:
+                    floatEventCancel();
+                    break;
+            }
+            return true;
+        }
+    };
+
+
+    private View  createHideView(Context context){
+         hideView = LayoutInflater.from(context).inflate(ResourceUtil.getLayoutId(context,
+                "qj_hide_float_view"), null);
+        ll_hide = hideView.findViewById(ResourceUtil.getId(context,
+                "ll_hide"));
+        return hideView;
+    }
+
+
+
+
+
+
+    /**
+     * R.drawable.game_logo
+     *
+     * @param floatItems
+     */
+    private Bitmap mLogoRes;
+
+    /**
+     * 用于显示在 mActivity 上的 mActivity
+     */
+    private Context mActivity;
+
+
+
+
+    /**
+     * 停靠默认位置
+     */
+    private int mDefaultLocation = RIGHT;
+
+
+    /**
+     * 悬浮窗 坐落 位置
+     */
+    private int mHintLocation = mDefaultLocation;
+
+
+
+
+    private ValueAnimator valueAnimator;
+
+
+    private View hideView;
+
+    private  OnFloatClickListener mListener;
+
+    private FloatLogoMenu(Builder builder) {
+
+
+        mLogoRes = builder.mLogoRes;
+        mActivity = builder.mActivity;
+
+        mDefaultLocation = builder.mDefaultLocation;
+        mListener = builder.listener;
+
+
+
+        if (mLogoRes == null) {
+            throw new IllegalArgumentException("No logo found,you can setLogo/showWithLogo to set a FloatLogo ");
+        }
+
+
+        initFloatWindow();
+        initTimer();
+        initFloat();
+
+    }
+
+
+    /**
+     * 初始化悬浮球 window
+     */
+    private void initFloatWindow() {
+        wmParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT,
+                WindowManager.LayoutParams.WRAP_CONTENT,
+                WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
+                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+                        | WindowManager.LayoutParams.FLAG_FULLSCREEN,
+                PixelFormat.TRANSLUCENT);
+
+
+
+        if (mActivity instanceof Activity) {
+            Activity activity = (Activity) mActivity;
+            wManager = activity.getWindowManager();
+            //类似dialog,寄托在activity的windows上,activity关闭时需要关闭当前float
+            wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL;
+
+
+        } else {
+            wManager = (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE);
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+                if (Build.VERSION.SDK_INT > 23) {
+                    //在android7.1以上系统需要使用TYPE_PHONE类型 配合运行时权限
+                    wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
+                } else {
+                    wmParams.type =WindowManager.LayoutParams.TYPE_TOAST;
+                }
+            } else {
+                wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
+            }
+        }
+        DisplayMetrics dm = new DisplayMetrics();
+        wManager.getDefaultDisplay().getMetrics(dm);
+        mScreenWidth = dm.widthPixels;
+        screenHeigth = dm.heightPixels;
+
+        //判断状态栏是否显示 如果不显示则statusBarHeight为0
+        mStatusBarHeight = dp2Px(0, mActivity);
+
+        wmParams.format = PixelFormat.RGBA_8888;
+        wmParams.gravity = Gravity.LEFT | Gravity.TOP;
+
+
+
+
+        wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+        | WindowManager.LayoutParams.FLAG_FULLSCREEN;
+        mHintLocation = getSetting(LOCATION_X, mDefaultLocation);
+        int defaultY = ((screenHeigth - mStatusBarHeight) / 2) / 3;
+        int y = getSetting(LOCATION_Y, defaultY);
+        if (mHintLocation == LEFT) {
+            wmParams.x = 0;
+        } else {
+            wmParams.x = mScreenWidth;
+        }
+
+
+        if (y != 0 && y != defaultY) {
+            wmParams.y = y;
+        } else {
+            wmParams.y = defaultY;
+        }
+
+        wmParams.alpha = 1;
+        wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
+        wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
+
+
+
+        wmParams2 = new WindowManager.LayoutParams();
+        wmParams2.format = PixelFormat.RGBA_8888;
+        wmParams2.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+        wmParams2.width = WindowManager.LayoutParams.WRAP_CONTENT;
+        wmParams2.height = WindowManager.LayoutParams.WRAP_CONTENT;
+        wmParams2.y=-screenHeigth / 4;
+        wmParams2.gravity = Gravity.CENTER_HORIZONTAL;
+        wmParams2.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL;
+    }
+
+
+    /**
+     * 初始化悬浮球
+     */
+    private void initFloat() {
+
+        mFloatLogo = new DotImageView(mActivity, mLogoRes);
+        mFloatLogo.setLayoutParams(new WindowManager.LayoutParams(dp2Px(50, mActivity), dp2Px(50, mActivity)));
+        mFloatLogo.setDrawDarkBg(true);
+        mFloatLogo.setVisibility(View.GONE);
+        mFloatLogo.setOnTouchListener(touchListener);//恢复touch事件
+
+
+        try {
+
+            hideView = createHideView(mActivity);
+
+
+
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+        mHideTimer.start();
+    }
+
+
+    /**
+     * 初始化 隐藏悬浮球的定时器
+     */
+    private void initTimer() {
+        mHideTimer = new CountDownTimer(2000, 10) {        //悬浮窗超过5秒没有操作的话会自动隐藏
+            @Override
+            public void onTick(long millisUntilFinished) {
+
+
+            }
+
+            @Override
+            public void onFinish() {
+
+                if (!isDraging) {
+                    if (mHintLocation == LEFT) {
+                        mFloatLogo.setStatus(DotImageView.HIDE_LEFT);
+                        mFloatLogo.setDrawDarkBg(true);
+                    } else {
+                        mFloatLogo.setStatus(DotImageView.HIDE_RIGHT);
+                        mFloatLogo.setDrawDarkBg(true);
+                    }
+
+                }
+            }
+        };
+    }
+
+
+
+
+    /**
+     * 悬浮窗touch事件的 down 事件
+     */
+    private void floatEventDown(MotionEvent event) {
+        isDraging = false;
+        mHideTimer.cancel();
+        if (mFloatLogo.getStatus() != DotImageView.NORMAL) {
+            mFloatLogo.setStatus(DotImageView.NORMAL);
+        }
+        if (!mFloatLogo.mDrawDarkBg) {
+            mFloatLogo.setDrawDarkBg(true);
+        }
+        if (mFloatLogo.getStatus() != DotImageView.NORMAL) {
+            mFloatLogo.setStatus(DotImageView.NORMAL);
+        }
+        mXInView = event.getX();
+        mYinview = event.getY();
+        mXDownInScreen = event.getRawX();
+        mYDownInScreen = event.getRawY();
+        mXInScreen = event.getRawX();
+        mYInScreen = event.getRawY();
+
+        hideView.setVisibility(View.VISIBLE);
+    }
+
+    /**
+     * 悬浮窗touch事件的 move 事件
+     */
+    private void floatEventMove(MotionEvent event) {
+        mXInScreen = event.getRawX();
+        mYInScreen = event.getRawY();
+
+
+        //连续移动的距离超过3则更新一次视图位置
+        if (Math.abs(mXInScreen - mXDownInScreen) > mFloatLogo.getWidth() / 4 || Math.abs(mYInScreen - mYDownInScreen) > mFloatLogo.getWidth() / 4) {
+            wmParams.x = (int) (mXInScreen - mXInView);
+            wmParams.y = (int) (mYInScreen - mYinview) - mFloatLogo.getHeight() / 2;
+            updateViewPosition(); // 手指移动的时候更新小悬浮窗的位置
+            double a = mScreenWidth / 2;
+            float offset = (float) ((a - (Math.abs(wmParams.x - a))) / a);
+            mFloatLogo.setDraging(isDraging, offset, false);
+        } else {
+            isDraging = false;
+            mFloatLogo.setDraging(false, 0, true);
+        }
+
+
+
+        float x = wmParams.x;
+        float y = wmParams.y;
+        float XMinPoint = mScreenWidth / 2 - hideView.getWidth();
+        float XMaxPoint = mScreenWidth / 2 + hideView.getWidth();
+        float YMinPoint = screenHeigth / 4 - hideView.getHeight() - mStatusBarHeight;
+
+        float YMaxPoint = screenHeigth / 4   - mStatusBarHeight;
+
+        if (x >= XMinPoint && x <= XMaxPoint && y >=YMinPoint && y <= YMaxPoint){
+
+            ll_hide.setBackgroundResource(ResourceUtil.getDrawableId(mActivity, "qj_hide_float_view_bg"));
+
+        }else {
+            ll_hide.setBackgroundResource(ResourceUtil.getDrawableId(mActivity, "qj_text_black"));
+        }
+
+    }
+
+
+
+
+    private void floatEventUp() {
+
+
+
+        float x = wmParams.x;
+        float y = wmParams.y;
+        float RawX = mScreenWidth / 2 - hideView.getWidth();
+        float RawX1 = mScreenWidth / 2 + hideView.getWidth();
+        float RawY = screenHeigth / 4 - hideView.getHeight() - mStatusBarHeight;
+
+        float RawY1 = screenHeigth / 4   - mStatusBarHeight;
+
+        hideView.setVisibility(View.GONE);
+
+        if (x >= RawX && x <= RawX1 && y >=RawY && y <= RawY1){
+
+
+
+
+            CustomExitGameDialog.Builder builder = new CustomExitGameDialog.Builder(mActivity);
+            builder.Create().show();
+            builder.setPositiveButton(new DialogInterface.OnClickListener() {
+                @Override
+                public void onClick(DialogInterface dialog, int which) {
+
+                    hideFloat();
+
+
+                    dialog.dismiss();
+                }
+            });
+            builder.setnegativeButton(new DialogInterface.OnClickListener() {
+                @Override
+                public void onClick(DialogInterface dialog, int which) {
+
+                    dialog.dismiss();
+                }
+            });
+            builder.setTitle(mActivity.getString(ResourceUtil.getStringId(mActivity, "qj_close_float_view_tip")));
+
+        }
+
+
+
+    }
+    /**
+     * 悬浮窗touch事件的 up 事件
+     */
+    private void floatEventCancel() {
+        if (mXInScreen < mScreenWidth / 2) {   //在左边
+            mHintLocation = LEFT;
+        } else {                   //在右边
+            mHintLocation = RIGHT;
+        }
+        if (valueAnimator == null) {
+            valueAnimator = ValueAnimator.ofInt(64);
+            valueAnimator.setInterpolator(mLinearInterpolator);
+            valueAnimator.setDuration(1000);
+            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                @Override
+                public void onAnimationUpdate(ValueAnimator animation) {
+                    mResetLocationValue = (int) animation.getAnimatedValue();
+                    mHandler.post(updatePositionRunnable);
+                }
+            });
+
+            valueAnimator.addListener(new Animator.AnimatorListener() {
+                @Override
+                public void onAnimationStart(Animator animation) {
+
+                }
+
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    if (Math.abs(wmParams.x) < 0) {
+                        wmParams.x = 0;
+                    } else if (Math.abs(wmParams.x) > mScreenWidth) {
+                        wmParams.x = mScreenWidth;
+                    }
+                    updateViewPosition();
+                    isDraging = false;
+                    mFloatLogo.setDraging(false, 0, true);
+                    mHideTimer.start();
+                }
+
+                @Override
+                public void onAnimationCancel(Animator animation) {
+                    if (Math.abs(wmParams.x) < 0) {
+                        wmParams.x = 0;
+                    } else if (Math.abs(wmParams.x) > mScreenWidth) {
+                        wmParams.x = mScreenWidth;
+                    }
+
+                    updateViewPosition();
+                    isDraging = false;
+                    mFloatLogo.setDraging(false, 0, true);
+                    mHideTimer.start();
+
+                }
+
+                @Override
+                public void onAnimationRepeat(Animator animation) {
+
+                }
+            });
+        }
+        if (!valueAnimator.isRunning()) {
+            valueAnimator.start();
+        }
+
+//        //这里需要判断如果如果手指所在位置和logo所在位置在一个宽度内则不移动,
+        if (Math.abs(mXInScreen - mXDownInScreen) > mFloatLogo.getWidth() / 5 || Math.abs(mYInScreen - mYDownInScreen) > mFloatLogo.getHeight() / 5) {
+            isDraging = false;
+
+        }else {
+            if (isDraging)
+                return;
+            if (mListener != null)  mListener.onClick();
+
+        }
+
+    }
+
+
+    /**
+     * 用于检查并更新悬浮球的位置
+     */
+    private void checkPosition() {
+        if (wmParams.x > 0 && wmParams.x < mScreenWidth) {
+            if (mHintLocation == LEFT) {
+                wmParams.x = wmParams.x - mResetLocationValue;
+            } else {
+                wmParams.x = wmParams.x + mResetLocationValue;
+            }
+            updateViewPosition();
+            double a = mScreenWidth / 2;
+            float offset = (float) ((a - (Math.abs(wmParams.x - a))) / a);
+            mFloatLogo.setDraging(isDraging, offset, true);
+            return;
+        }
+
+
+        if (Math.abs(wmParams.x) < 0) {
+            wmParams.x = 0;
+        } else if (Math.abs(wmParams.x) > mScreenWidth) {
+            wmParams.x = mScreenWidth;
+        }
+        if (valueAnimator.isRunning()) {
+            valueAnimator.cancel();
+        }
+
+
+        updateViewPosition();
+        isDraging = false;
+
+
+    }
+
+
+
+
+    /**
+     * 更新悬浮窗在屏幕中的位置。
+     */
+    private void updateViewPosition() {
+        isDraging = true;
+        try {
+            wManager.updateViewLayout(mFloatLogo, wmParams);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void show() {
+
+        if (isShowing) return;;
+
+            try {
+                if (wManager != null && wmParams != null && mFloatLogo != null) {
+
+
+                    wManager.addView(hideView, wmParams2);
+                    wManager.addView(mFloatLogo, wmParams);
+
+                    mFloatLogo.setVisibility(View.VISIBLE);
+                    isShowing = true;
+
+                }
+                if (mHideTimer != null) {
+                    mHideTimer.start();
+                } else {
+                    initTimer();
+                    mHideTimer.start();
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+    }
+
+
+
+    /**
+     * 隐藏悬浮窗
+     */
+    public void hideFloat() {
+        if (!isShowing) return;
+        //记录上次的位置logo的停放位置,以备下次恢复
+        saveSetting(LOCATION_X, mHintLocation);
+        saveSetting(LOCATION_Y, wmParams.y);
+        mFloatLogo.clearAnimation();
+        try {
+            mHideTimer.cancel();
+
+            wManager.removeViewImmediate(mFloatLogo);
+            wManager.removeViewImmediate(hideView);
+
+            isDraging = false;
+
+            isShowing = false;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+    /**
+     * 移除所有悬浮窗 释放资源
+     */
+    public void destoryFloat() {
+        //记录上次的位置logo的停放位置,以备下次恢复
+        saveSetting(LOCATION_X, mHintLocation);
+        saveSetting(LOCATION_Y, wmParams.y);
+        mFloatLogo.clearAnimation();
+        try {
+            mHideTimer.cancel();
+
+            wManager.removeViewImmediate(mFloatLogo);
+            wManager.removeViewImmediate(hideView);
+
+
+            isDraging = false;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+
+
+
+    /**
+     * 用于保存悬浮球的位置记录
+     *
+     * @param key          String
+     * @param defaultValue int
+     * @return int
+     */
+    private int getSetting(String key, int defaultValue) {
+        try {
+            SharedPreferences sharedata = mActivity.getSharedPreferences("floatLogo", 0);
+            return sharedata.getInt(key, defaultValue);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return defaultValue;
+    }
+
+    /**
+     * 用于保存悬浮球的位置记录
+     *
+     * @param key   String
+     * @param value int
+     */
+    public void saveSetting(String key, int value) {
+        try {
+            SharedPreferences.Editor sharedata = mActivity.getSharedPreferences("floatLogo", 0).edit();
+            sharedata.putInt(key, value);
+            sharedata.apply();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static int dp2Px(float dp, Context mContext) {
+        return (int) TypedValue.applyDimension(
+                TypedValue.COMPLEX_UNIT_DIP,
+                dp,
+                mContext.getResources().getDisplayMetrics());
+    }
+
+
+
+
+
+    public static final class Builder {
+
+
+        private Bitmap mLogoRes;
+        private int mDefaultLocation;
+
+        private Context mActivity;
+
+        private  OnFloatClickListener listener;
+
+        private FloatLogoMenu floatLogoMenu;
+
+        public Builder setBgDrawable(Drawable drawable) {
+
+            return this;
+        }
+
+        public Builder() {
+        }
+
+
+
+        public Builder logo(Bitmap val) {
+            mLogoRes = val;
+            return this;
+        }
+
+        public Builder withActivity(Activity val) {
+            mActivity = val;
+            return this;
+        }
+
+
+
+        public Builder defaultLocation(int val) {
+            mDefaultLocation = val;
+            return this;
+        }
+
+
+
+        public Builder setOnFloatClickListener(OnFloatClickListener onClickFloatListener) {
+            listener = onClickFloatListener;
+            return this;
+        }
+
+
+        public void show() {
+            if (floatLogoMenu == null){
+                floatLogoMenu = new FloatLogoMenu(this);
+            }
+            floatLogoMenu.show();
+        }
+        public void hide(){
+            if (floatLogoMenu != null){
+
+                floatLogoMenu.hideFloat();
+            }
+
+        }
+        public void release(){
+            if (floatLogoMenu != null){
+                floatLogoMenu.destoryFloat();
+            }
+        }
+    }
+    public interface OnFloatClickListener {
+        void onClick();
+    }
+
+}

+ 95 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/floating/FloatViewManager.java

@@ -0,0 +1,95 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.floating;
+
+
+import static cn.yyxx.commsdk.base.constants.Constants.CLICK_INTERVAL;
+
+import android.app.Activity;
+import android.graphics.BitmapFactory;
+
+import cn.yyxx.commsdk.core.entity.SdkLoginInfo;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.UserCenterDialog;
+
+public class FloatViewManager {
+
+    private static FloatViewManager manager = null;
+
+
+
+    private FloatLogoMenu.Builder builder;
+
+
+    private long clickLoginTime = 0L;
+
+
+    private FloatViewManager(Activity activity) {
+        initView(activity);
+    }
+
+
+
+    public static FloatViewManager getInstance(Activity activity) {
+
+
+        if (manager == null) {
+            synchronized (FloatViewManager.class) {
+                if (manager == null) {
+                    manager = new FloatViewManager(activity);
+                }
+            }
+        }
+
+        return manager;
+    }
+
+    public void initView(final Activity activity){
+
+        if (builder == null) {
+
+            builder = new FloatLogoMenu.Builder()
+                    .withActivity(activity)
+                    .logo(BitmapFactory.decodeResource(activity.getResources(), ResourceUtil.getMipmapId(activity,"qj_float_icon")))
+                    .setBgDrawable(activity.getResources().getDrawable(ResourceUtil.getDrawableId(activity,"qj_game_float_menu_bg")))
+                    .defaultLocation(FloatLogoMenu.LEFT)
+                    .setOnFloatClickListener(new FloatLogoMenu.OnFloatClickListener() {
+                        @Override
+                        public void onClick() {
+
+                            if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
+
+                                return;
+                            }
+
+                            clickLoginTime = System.currentTimeMillis();
+                            new UserCenterDialog(activity,ResourceUtil.getStyleId(activity,"qj_half_black_dialog"), SdkLoginInfo.getInstance().user_center).show();
+                        }
+                    });
+
+
+
+
+        }
+    }
+
+    public void showFloat() {
+
+        builder.show();
+    }
+
+
+    public void hideFloat() {
+        if (builder != null){
+            builder.hide();
+        }
+
+    }
+
+    public void releaseFloat(){
+
+        if (builder != null){
+            builder.release();
+        }
+    }
+
+
+}

+ 53 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/BaseFragment.java

@@ -0,0 +1,53 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageButton;
+
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.HNQJLoginActivity;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.WvPageListDialog;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.impl.SdkPlatformImpl;
+
+public class BaseFragment extends android.support.v4.app.Fragment implements View.OnClickListener {
+    private ImageButton btn_kefu;
+    public HNQJLoginActivity loginImpl;
+
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        btn_kefu = view.findViewById(ResourceUtil.getId(getActivity(),"btn_kefu"));
+        if (btn_kefu != null){
+            btn_kefu.setOnClickListener(this);
+            if (!SdkPlatformImpl.initConfig.isShowKf){
+                btn_kefu.setVisibility(View.GONE);
+            }
+        }
+
+
+        if (getActivity() instanceof HNQJLoginActivity) {
+            loginImpl = (HNQJLoginActivity) getActivity();
+        }
+
+    }
+
+
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == ResourceUtil.getId(getActivity(), "btn_kefu")){
+
+            if (!TextUtils.isEmpty(SdkPlatformImpl.initConfig.service_center)){
+
+                new WvPageListDialog(getActivity(),ResourceUtil.getStyleId(getActivity(),"qj_base_dialog"), SdkPlatformImpl.initConfig.service_center).show();
+
+            }
+
+
+
+        }
+    }
+}

+ 245 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserAccountLoginFragment.java

@@ -0,0 +1,245 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment;
+
+
+import static cn.yyxx.commsdk.base.constants.Constants.CLICK_INTERVAL;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.text.method.HideReturnsTransformationMethod;
+import android.text.method.PasswordTransformationMethod;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+import cn.yyxx.commsdk.base.entity.ResultInfo;
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.TosUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.HNQJLoginFragmentTag;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.adapter.UserListAdapter;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.impl.SdkPlatformImpl;
+import cn.yyxx.commsdk.impl.merge.user.UserSession;
+import cn.yyxx.commsdk.impl.merge.user.UserSessionManager;
+
+public class UserAccountLoginFragment extends BaseFragment {
+
+    private EditText reg_account_edit,reg_pwd_edit;
+    private ImageView down_btn,iv_show_pwd;
+    private ImageButton close_btn;
+    private Button reg_compete_btn;
+    private TextView tv_fofget_pwd;
+    private boolean isShowPwd = false;
+
+
+     private ListView account_listview;
+
+
+    private ImageView showListView;
+
+    private boolean isShowList = false;
+
+    private TextView list_text;
+
+    private long clickLoginTime = 0L;
+
+    private UserListAdapter userListAdapter;
+
+    private String login_token;
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(ResourceUtil.getLayoutId(getActivity(),"qj_account_login"), container, false);
+        view.setClickable(true);
+        return view;
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        reg_account_edit = view.findViewById(ResourceUtil.getId(getActivity(),"reg_account_edit"));
+        reg_pwd_edit= view.findViewById(ResourceUtil.getId(getActivity(),"reg_pwd_edit"));
+
+        down_btn = view.findViewById(ResourceUtil.getId(getActivity(),"down_btn"));
+        down_btn.setOnClickListener(this);
+
+        iv_show_pwd = view.findViewById(ResourceUtil.getId(getActivity(),"iv_show_pwd"));
+        iv_show_pwd.setOnClickListener(this);
+
+
+        list_text  = view.findViewById(ResourceUtil.getId(getActivity(), "list_text"));
+
+        account_listview  =  view.findViewById(ResourceUtil.getId(getActivity(), "account_listview"));
+
+
+        showListView = view.findViewById(ResourceUtil.getId(getActivity(), "down_btn"));
+        showListView.setOnClickListener(this);
+
+        reg_compete_btn = view.findViewById(ResourceUtil.getId(getActivity(),"reg_compete_btn"));
+        reg_compete_btn.setOnClickListener(this);
+
+        tv_fofget_pwd = view.findViewById(ResourceUtil.getId(getActivity(),"tv_fofget_pwd"));
+        tv_fofget_pwd.setOnClickListener(this);
+
+
+        close_btn = view.findViewById(ResourceUtil.getId(getActivity(),"close_btn"));
+        close_btn.setOnClickListener(this);
+
+        if (getData() != null){
+
+            userListAdapter  = new UserListAdapter(getActivity(),getData());
+            account_listview.setAdapter(userListAdapter);
+            account_listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+                @Override
+                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
+                    reg_account_edit.setText(userListAdapter.list.get(i).uname);
+                    reg_pwd_edit.setText(userListAdapter.list.get(i).password);
+                    login_token = userListAdapter.list.get(i).login_token;
+                    hideListView();
+                }
+            });
+
+            reg_account_edit.setText(userListAdapter.list.get(0).uname);
+            reg_pwd_edit.setText(userListAdapter.list.get(0).password);
+        }
+
+
+    }
+
+    private void showListView() {
+        if (getData() == null) {
+            list_text.setVisibility(View.VISIBLE);
+        } else {
+            account_listview.setVisibility(View.VISIBLE);
+            list_text.setVisibility(View.GONE);
+
+        }
+        isShowList = true;
+
+
+    }
+
+    private void hideListView() {
+        account_listview.setVisibility(View.GONE);
+        list_text.setVisibility(View.GONE);
+        isShowList = false;
+        showListView.setImageResource(ResourceUtil.getMipmapId(getActivity(), "qj_arrow_normal"));
+    }
+
+    private ArrayList<UserSession> getData() {
+
+        return UserSessionManager.getInstance().getLocalSession();
+
+    }
+
+    @Override
+    public void onClick(View v) {
+        super.onClick(v);
+        int id = v.getId();
+        if (id == ResourceUtil.getId(getActivity(), "reg_compete_btn")){
+            if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
+
+                return;
+            }
+            clickLoginTime = System.currentTimeMillis();
+            startLogin(reg_account_edit.getText().toString(), reg_pwd_edit.getText().toString());
+
+        }else if(id == ResourceUtil.getId(getActivity(), "down_btn")){
+            /*	显示缓存账号	*/
+            if (!isShowList) {
+                showListView.setImageResource(ResourceUtil.getMipmapId(getActivity(), "qj_arrow_select"));
+                showListView();
+            } else {
+
+                showListView.setImageResource(ResourceUtil.getMipmapId(getActivity(), "qj_arrow_normal"));
+                hideListView();
+            }
+
+        }else if(id == ResourceUtil.getId(getActivity(), "iv_show_pwd")){
+
+            if (!isShowPwd) {
+                isShowPwd = true;
+                reg_pwd_edit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
+                iv_show_pwd.setImageResource(ResourceUtil.getMipmapId(getActivity(), "qj_open_eye"));
+            } else {
+                isShowPwd = false;
+                reg_pwd_edit.setTransformationMethod(PasswordTransformationMethod.getInstance());
+                iv_show_pwd.setImageResource(ResourceUtil.getMipmapId(getActivity(), "qj_close_eye"));
+            }
+
+
+        }else if(id == ResourceUtil.getId(getActivity(), "close_btn")){
+
+            loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_PHONE_LOGIN,null);
+
+        }else if(id == ResourceUtil.getId(getActivity(), "tv_fofget_pwd")){
+
+            loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_RETRIEVE_PASSWORD,null);
+
+        }
+
+
+    }
+
+
+    private void startLogin(final String account, final String pwd) {
+        if (TextUtils.isEmpty(account)){
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR, getString(ResourceUtil.getStringId(getActivity(), "qj_band_need_account"))).show();
+
+            return;
+        }
+        if (TextUtils.isEmpty(pwd)){
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR, getString(ResourceUtil.getStringId(getActivity(), "qj_band_need_pwd"))).show();
+
+            return;
+        }
+
+        if(account.length()<6)
+        {
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR, getString(ResourceUtil.getStringId(getActivity(), "qj_account_limit_6"))).show();
+
+            return;
+        }
+        if(pwd.length()<6)
+        {
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR, getString(ResourceUtil.getStringId(getActivity(), "qj_pwd_limit_6"))).show();
+
+            return;
+        }
+
+
+        SdkPlatformImpl.loginViewModel.accountLogin(getActivity(), account, pwd, login_token, new ICallback() {
+            @Override
+            public void onResult(int code, String result) {
+                if (code == ResultInfo.CODE_SUCCESS){
+
+                    if (!getActivity().isFinishing()) {
+                        getActivity().finish();
+
+                        SdkPlatformImpl.getInstance(getActivity()).loginSuccess();
+
+                    }
+
+                 }else{
+                    new TosUtil(getActivity(),TosUtil.TOAST_ERROR, result).show();
+
+                }
+            }
+        });
+
+
+
+    }
+
+
+}

+ 242 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserPhoneLoginFragment.java

@@ -0,0 +1,242 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment;
+
+
+import static cn.yyxx.commsdk.base.constants.Constants.CLICK_INTERVAL;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import cn.yyxx.commsdk.base.entity.ResultInfo;
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.base.internal.PhoneLoginCallBack;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.HNQJLoginFragmentTag;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.TosUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.WvPageListDialog;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.impl.SdkPlatformImpl;
+
+
+public class UserPhoneLoginFragment extends BaseFragment {
+
+
+    private EditText et_user_phone,et_user_code;
+    private CheckBox cb_register;
+    private TextView tv_tip,tv_private_policy;
+    private Button btn_get_code,btn_account_login,btn_guest_register,btn_reg_compete;
+    private CodeVerifyTimeCount codeVerifyTimeCount;
+    private long clickLoginTime = 0L;
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(ResourceUtil.getLayoutId(getActivity(),"qj_phone_login"), container, false);
+        view.setClickable(true);
+        return view;
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        et_user_phone = view.findViewById(ResourceUtil.getId(getActivity(),"et_user_phone"));
+        et_user_code = view.findViewById(ResourceUtil.getId(getActivity(),"et_user_code"));
+        cb_register = view.findViewById(ResourceUtil.getId(getActivity(),"cb_register"));
+
+        tv_tip = view.findViewById(ResourceUtil.getId(getActivity(),"tv_tip"));
+        tv_tip.setOnClickListener(this);
+        tv_private_policy = view.findViewById(ResourceUtil.getId(getActivity(),"tv_private_policy"));
+        tv_private_policy.setOnClickListener(this);
+        btn_get_code = view.findViewById(ResourceUtil.getId(getActivity(),"btn_get_code"));
+        btn_get_code.setOnClickListener(this);
+        btn_account_login = view.findViewById(ResourceUtil.getId(getActivity(),"btn_account_login"));
+        btn_account_login.setOnClickListener(this);
+        btn_guest_register = view.findViewById(ResourceUtil.getId(getActivity(),"btn_guest_register"));
+        btn_guest_register.setOnClickListener(this);
+        btn_reg_compete = view.findViewById(ResourceUtil.getId(getActivity(),"btn_reg_compete"));
+        btn_reg_compete.setOnClickListener(this);
+
+
+
+
+    }
+
+    @Override
+    public void onClick(View v) {
+        super.onClick(v);
+        int id = v.getId();
+        if(id == ResourceUtil.getId(getActivity(), "tv_tip")){
+
+            new WvPageListDialog(getActivity(),ResourceUtil.getStyleId(getActivity(),"qj_base_dialog"), SdkPlatformImpl.initConfig.agreement_user).show();
+
+        }else if(id == ResourceUtil.getId(getActivity(), "tv_private_policy")){
+
+            new WvPageListDialog(getActivity(),ResourceUtil.getStyleId(getActivity(),"qj_base_dialog"), SdkPlatformImpl.initConfig.agreement_privacy).show();
+
+
+        }else if(id == ResourceUtil.getId(getActivity(), "btn_reg_compete")){
+
+            if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
+
+                return;
+            }
+            clickLoginTime = System.currentTimeMillis();
+
+            phoneLoginWithSms(getActivity());
+
+        }else if(id == ResourceUtil.getId(getActivity(), "btn_get_code")){
+
+            String phone =  et_user_phone.getText().toString();
+
+            if (phone.length() < 10) {
+
+                new TosUtil(getActivity(),TosUtil.TOAST_ERROR, getString(ResourceUtil.getStringId(getActivity(), "qj_pls_input_right_phone"))).show();
+
+                return;
+
+            }
+            getPhoneCaptcha(getActivity(),phone,"register");
+
+        }else if(id == ResourceUtil.getId(getActivity(), "btn_account_login")){
+
+            loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_ACCOUNT_LOGIN,null);
+
+
+        }else if(id == ResourceUtil.getId(getActivity(), "btn_guest_register")){
+
+            loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_ACCOUNT_REGISTER,null);
+
+
+        }
+
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (codeVerifyTimeCount != null){
+            codeVerifyTimeCount.cancel();
+        }
+
+    }
+
+    private void phoneLoginWithSms(final Activity activity){
+        final String code = et_user_code.getText().toString();
+        final String account = et_user_phone.getText().toString();
+
+
+        if(account.length() < 10 || TextUtils.isEmpty(account))
+        {
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR,getString(ResourceUtil.getStringId(getActivity(), "qj_pls_input_right_phone"))).show();
+
+            return;
+        }
+
+        if(code.length() < 4 || TextUtils.isEmpty(code))
+        {
+
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR, getString(ResourceUtil.getStringId(getActivity(), "qj_pls_input_right_code"))).show();
+
+            return;
+        }
+
+        if (!cb_register.isChecked()){
+
+            new TosUtil(getActivity(), TosUtil.TOAST_ERROR,getString(ResourceUtil.getStringId(getActivity(), "qj_pls_checked_reg_tip"))).show();
+
+            return;
+
+        }
+
+        SdkPlatformImpl.loginViewModel.phoneLoginWithSms(getActivity(), account, code, new PhoneLoginCallBack() {
+
+            @Override
+            public void onPhoneLoginSuccess(String msg) {
+
+
+                    if (!getActivity().isFinishing()) {
+                        getActivity().finish();
+                        SdkPlatformImpl.getInstance(activity).loginSuccess();
+                    }
+
+            }
+
+            @Override
+            public void onPhoneLoginFailed(String msg) {
+
+                new TosUtil(getActivity(), TosUtil.TOAST_ERROR, msg).show();
+
+            }
+
+            @Override
+            public void onPhoneNewLogin() {
+                Bundle bundle = new Bundle();
+                bundle.putString("account",account);
+                bundle.putString("code",code);
+                loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_POHONE_SET_PASSWORD,bundle);
+            }
+        });
+
+    }
+
+
+    private void  getPhoneCaptcha(Activity activity, String phoneNum, String action){
+        SdkPlatformImpl.loginViewModel.getPhoneCaptcha(activity, phoneNum, action, new ICallback() {
+            @Override
+            public void onResult(int code, String result) {
+                if (code == ResultInfo.CODE_SUCCESS){
+                    getCodeSuccess();
+                }else{
+                    new TosUtil(getActivity(), TosUtil.TOAST_ERROR, result).show();
+                }
+            }
+        });
+    }
+    private void getCodeSuccess() {
+        btn_get_code.setEnabled(false);
+        btn_get_code.setText("60s");
+
+        codeVerifyTimeCount = new CodeVerifyTimeCount(60000, 1000);
+        codeVerifyTimeCount.start();
+    }
+
+    class CodeVerifyTimeCount extends CountDownTimer {
+
+        public CodeVerifyTimeCount(long millisInFuture, long countDownInterval) {
+            super(millisInFuture, countDownInterval);
+            // TODO Auto-generated constructor stub
+        }
+
+        @Override
+        public void onTick(long millisUntilFinished) {
+            // TODO Auto-generated method stub
+            btn_get_code.setText(millisUntilFinished / 1000 + "s");
+
+        }
+
+        @Override
+        public void onFinish() {
+            // TODO Auto-generated method stub
+            btn_get_code.setEnabled(true);
+
+            btn_get_code.setText(ResourceUtil.getStringId(getActivity(), "qj_get_phone_code"));
+        }
+
+    }
+
+
+
+
+
+
+
+}

+ 182 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserPhoneLoginSetpwdFragment.java

@@ -0,0 +1,182 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment;
+
+
+import static cn.yyxx.commsdk.base.constants.Constants.CLICK_INTERVAL;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.TextView;
+
+import cn.yyxx.commsdk.base.entity.ResultInfo;
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.base.utils.Logger;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.HNQJLoginFragmentTag;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.WvPageListDialog;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.TosUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.impl.SdkPlatformImpl;
+
+
+public class UserPhoneLoginSetpwdFragment extends BaseFragment {
+
+
+    private EditText reg_pwd_edit;
+    private CheckBox cb_register;
+    private TextView tv_tip,tv_private_policy;
+    private Button reg_compete_btn;
+    private ImageButton close_btn;
+    private long clickLoginTime = 0L;
+
+    private String account,code;
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(ResourceUtil.getLayoutId(getActivity(),"qj_phone_register_setpwd_dialog"), container, false);
+        view.setClickable(true);
+
+        Bundle bundle = getArguments();
+        account = bundle.getString("account");
+        code = bundle.getString("code");
+        return view;
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        reg_pwd_edit = view.findViewById(ResourceUtil.getId(getActivity(),"reg_pwd_edit"));
+
+        cb_register = view.findViewById(ResourceUtil.getId(getActivity(),"cb_register"));
+
+        tv_tip = view.findViewById(ResourceUtil.getId(getActivity(),"tv_tip"));
+        tv_tip.setOnClickListener(this);
+
+        tv_private_policy = view.findViewById(ResourceUtil.getId(getActivity(),"tv_private_policy"));
+        tv_private_policy.setOnClickListener(this);
+
+        reg_compete_btn = view.findViewById(ResourceUtil.getId(getActivity(),"reg_compete_btn"));
+        reg_compete_btn.setOnClickListener(this);
+
+
+        close_btn = view.findViewById(ResourceUtil.getId(getActivity(),"close_btn"));
+
+        close_btn.setOnClickListener(this);
+    }
+
+    @Override
+    public void onClick(View v) {
+        super.onClick(v);
+        int id = v.getId();
+        if(id == ResourceUtil.getId(getActivity(), "tv_tip")){
+
+            new WvPageListDialog(getActivity(),ResourceUtil.getStyleId(getActivity(),"qj_base_dialog"), SdkPlatformImpl.initConfig.agreement_user).show();
+
+        }else if(id == ResourceUtil.getId(getActivity(), "tv_private_policy")){
+
+            new WvPageListDialog(getActivity(),ResourceUtil.getStyleId(getActivity(),"qj_base_dialog"), SdkPlatformImpl.initConfig.agreement_privacy).show();
+
+        }else if(id == ResourceUtil.getId(getActivity(), "reg_compete_btn")){
+
+            if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
+
+                Logger.i("调用登录接口太频繁,拦截此次操作");
+
+                return;
+            }
+            clickLoginTime = System.currentTimeMillis();
+
+            registerWithPhone(getActivity());
+
+        }else if(id == ResourceUtil.getId(getActivity(), "close_btn")){
+
+            loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_PHONE_LOGIN,null);
+
+        }
+
+
+
+    }
+
+
+
+    private void registerWithPhone(final Activity activity){
+
+        final String pwd = reg_pwd_edit.getText().toString();
+
+
+        if(account.length() < 10 || TextUtils.isEmpty(account))
+        {
+
+            new TosUtil(getActivity(), TosUtil.TOAST_ERROR,getString(ResourceUtil.getStringId(getActivity(), "qj_pls_input_right_phone"))).show();
+
+            return;
+        }
+        if(pwd.length() < 6 || TextUtils.isEmpty(pwd))
+        {
+
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR, getString(ResourceUtil.getStringId(getActivity(), "qj_pwd_limit_6"))).show();
+
+            return;
+        }
+        if(code.length() < 4 || TextUtils.isEmpty(code))
+        {
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR, getString(ResourceUtil.getStringId(getActivity(), "qj_pls_input_right_code"))).show();
+
+            return;
+        }
+
+        if (!cb_register.isChecked()){
+
+            new TosUtil(getActivity(), TosUtil.TOAST_ERROR,getString(ResourceUtil.getStringId(getActivity(), "qj_pls_checked_reg_tip"))).show();
+
+
+            return;
+
+        }
+
+        SdkPlatformImpl.loginViewModel.setPassword(activity, account, pwd, code, new ICallback() {
+            @Override
+            public void onResult(int code, String result) {
+                if (code == ResultInfo.CODE_SUCCESS){
+                    if (!getActivity().isFinishing()) {
+                        getActivity().finish();
+                        SdkPlatformImpl.getInstance(activity).loginSuccess();
+
+                    }
+
+                }else{
+
+                    new TosUtil(getActivity(),TosUtil.TOAST_ERROR, result).show();
+
+                }
+
+            }
+        });
+
+    }
+
+
+
+
+
+
+    public interface PhoneRegisterCallback {
+
+        void onRegisterSuccess(String msg);
+        void onRegisterFailed(String msg);
+
+
+    }
+
+
+
+}

+ 268 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserRegisterFragment.java

@@ -0,0 +1,268 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment;
+
+
+
+import static cn.yyxx.commsdk.base.constants.Constants.CLICK_INTERVAL;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.text.method.HideReturnsTransformationMethod;
+import android.text.method.PasswordTransformationMethod;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.Random;
+
+import cn.yyxx.commsdk.base.entity.ResultInfo;
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.TosUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.HNQJLoginFragmentTag;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.WvPageListDialog;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.impl.SdkPlatformImpl;
+
+
+public class UserRegisterFragment extends BaseFragment {
+    private EditText reg_account_edit,reg_pwd_edit;
+    private ImageView iv_clear_text,iv_show_pwd;
+    private TextView tv_tip,tv_private_policy;
+    private Button reg_compete_btn,btn_phone_register,btn_account_login;
+    private ImageButton close_btn;
+    private CheckBox cb_register;
+    private boolean isShowPwd = true;
+    private long clickLoginTime = 0L;
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(ResourceUtil.getLayoutId(getActivity(),"qj_register_dialog"), container, false);
+        view.setClickable(true);
+
+        return view;
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        reg_account_edit = view.findViewById(ResourceUtil.getId(getActivity(),"reg_account_edit"));
+
+
+        reg_pwd_edit= view.findViewById(ResourceUtil.getId(getActivity(),"reg_pwd_edit"));
+
+
+        reg_account_edit.setText(getRandomName(7));
+
+        reg_pwd_edit.setText(getRandom(7));
+
+
+        cb_register= view.findViewById(ResourceUtil.getId(getActivity(),"cb_register"));
+
+        iv_clear_text = view.findViewById(ResourceUtil.getId(getActivity(),"iv_clear_text"));
+        iv_clear_text.setOnClickListener(this);
+
+        iv_show_pwd = view.findViewById(ResourceUtil.getId(getActivity(),"iv_show_pwd"));
+        iv_show_pwd.setOnClickListener(this);
+
+        tv_tip = view.findViewById(ResourceUtil.getId(getActivity(),"tv_tip"));
+        tv_tip.setOnClickListener(this);
+
+        tv_private_policy = view.findViewById(ResourceUtil.getId(getActivity(),"tv_private_policy"));
+        tv_private_policy.setOnClickListener(this);
+
+        reg_compete_btn = view.findViewById(ResourceUtil.getId(getActivity(),"reg_compete_btn"));
+        reg_compete_btn.setOnClickListener(this);
+
+        btn_phone_register = view.findViewById(ResourceUtil.getId(getActivity(),"btn_phone_register"));
+        btn_phone_register.setOnClickListener(this);
+
+        btn_account_login = view.findViewById(ResourceUtil.getId(getActivity(),"btn_account_login"));
+        btn_account_login.setOnClickListener(this);
+
+
+        close_btn = view.findViewById(ResourceUtil.getId(getActivity(),"close_btn"));
+        close_btn.setOnClickListener(this);
+
+    }
+
+    @Override
+    public void onClick(View v) {
+        super.onClick(v);
+        int id = v.getId();
+        if (id == ResourceUtil.getId(getActivity(), "reg_compete_btn")){
+            if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
+                return;
+            }
+            clickLoginTime = System.currentTimeMillis();
+            startRegister(reg_account_edit.getText().toString(), reg_pwd_edit.getText().toString());
+        }else if(id == ResourceUtil.getId(getActivity(), "iv_clear_text")){
+            reg_account_edit.setText("");
+        }else if(id == ResourceUtil.getId(getActivity(), "iv_show_pwd")){
+
+            if (isShowPwd) {
+
+                isShowPwd = false;
+                reg_pwd_edit.setTransformationMethod(PasswordTransformationMethod.getInstance());
+                iv_show_pwd.setImageResource(ResourceUtil.getMipmapId(getActivity(), "qj_close_eye"));
+
+
+            } else {
+                isShowPwd = true;
+                reg_pwd_edit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
+                iv_show_pwd.setImageResource(ResourceUtil.getMipmapId(getActivity(), "qj_open_eye"));
+            }
+
+        }else if(id == ResourceUtil.getId(getActivity(), "tv_tip")){
+
+
+            new WvPageListDialog(getActivity(),ResourceUtil.getStyleId(getActivity(),"qj_base_dialog"), SdkPlatformImpl.initConfig.agreement_user).show();
+
+
+        }else if(id == ResourceUtil.getId(getActivity(), "tv_private_policy")){
+
+            new WvPageListDialog(getActivity(),ResourceUtil.getStyleId(getActivity(),"qj_base_dialog"), SdkPlatformImpl.initConfig.agreement_privacy).show();
+
+
+        }else if(id == ResourceUtil.getId(getActivity(), "btn_phone_register")){
+
+            loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_PHONE_LOGIN,null);
+
+        }else if(id == ResourceUtil.getId(getActivity(), "btn_account_login")){
+
+            loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_ACCOUNT_LOGIN,null);
+
+        }else if(id == ResourceUtil.getId(getActivity(), "close_btn")){
+
+                loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_PHONE_LOGIN,null);
+
+        }
+    }
+
+
+
+
+
+    private void startRegister( String account,  String pwd) {
+        if (!cb_register.isChecked()){
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR,  getActivity().getString(ResourceUtil.getStringId(getActivity(), "hnqj_pls_checked_reg_tip"))).show();
+
+            return;
+        }
+        if (TextUtils.isEmpty(account)){
+
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR,  getActivity().getString(ResourceUtil.getStringId(getActivity(), "qj_band_need_account"))).show();
+
+
+            return;
+        }
+
+        if (TextUtils.isEmpty(pwd)){
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR,  getActivity().getString(ResourceUtil.getStringId(getActivity(), "qj_band_need_pwd"))).show();
+            return;
+        }
+
+        if (isNumeric(account)){
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR,  getActivity().getString(ResourceUtil.getStringId(getActivity(), "qj_acount_not_only_number"))).show();
+            return;
+
+        }
+
+        if (account.length() < 6 || pwd.length() > 20) {
+
+            new TosUtil(getActivity(),TosUtil.TOAST_ERROR,  getActivity().getString(ResourceUtil.getStringId(getActivity(), "qj_regist_account_error"))).show();
+
+
+            return;
+        }
+
+        if (pwd.length() < 6 || pwd.length() > 20) {
+
+            new TosUtil(getActivity(), TosUtil.TOAST_ERROR, getActivity().getString(ResourceUtil.getStringId(getActivity(), "qj_regist_pwd_error"))).show();
+            return;
+        }
+
+        SdkPlatformImpl.loginViewModel.accountRegister(getActivity(), account, pwd, new ICallback() {
+            @Override
+            public void onResult(int code, String result) {
+                if (code == ResultInfo.CODE_SUCCESS){
+
+                    if (!getActivity().isFinishing()) {
+                        getActivity().finish();
+                        SdkPlatformImpl.getInstance(getActivity()).loginSuccess();
+
+                    }
+
+                }else{
+                    new TosUtil(getActivity(), TosUtil.TOAST_ERROR, result).show();
+
+                    reg_account_edit.setText(getRandomName(7));
+                }
+            }
+        });
+
+
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+
+        reg_account_edit.setText(getRandomName(7));
+
+
+    }
+
+    public static String getRandomName(int length){
+        Random r = new Random();
+
+        String randomName = "";
+
+
+        for (int i = 0; i < 3; ++i) {
+            int temp = r.nextInt(52);
+
+            char x = (char) (temp < 26 ? temp + 97 : (temp % 26) + 65);
+
+            randomName += x;
+
+        }
+
+
+        for (int i = 0; i < length; i++) {
+            randomName += String.valueOf(r.nextInt(10));
+        }
+
+
+        return randomName;
+
+    }
+
+      String getRandom(int length) {
+        String val = "";
+        Random random = new Random();
+        for (int i = 0; i < length; i++) {
+            val += String.valueOf(random.nextInt(10));
+        }
+        return val;
+    }
+
+     boolean isNumeric(String str){
+        for (int i = str.length();--i>=0;){
+            if (!Character.isDigit(str.charAt(i))){
+                return false;
+            }
+        }
+        return true;
+    }
+
+}

+ 192 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserRetrievePwdFragment.java

@@ -0,0 +1,192 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.TextView;
+
+import cn.yyxx.commsdk.base.entity.ResultInfo;
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.HNQJLoginFragmentTag;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.WvPageListDialog;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.TosUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.impl.SdkPlatformImpl;
+
+public class UserRetrievePwdFragment extends BaseFragment {
+
+    private EditText et_user_phone,et_user_code,et_user_pwd;
+    private Button btn_get_code,reg_compete_btn;
+    private ImageButton close_btn;
+
+    private TextView tv_tip_2;
+
+    private TimeCount timer;
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(ResourceUtil.getLayoutId(getActivity(),"qj_retrieve_pwd"), container, false);
+        view.setClickable(true);
+
+        return view;
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        et_user_phone = view.findViewById(ResourceUtil.getId(getActivity(), "et_user_phone"));
+        et_user_code = view.findViewById(ResourceUtil.getId(getActivity(), "et_user_code"));
+        et_user_pwd  = view.findViewById(ResourceUtil.getId(getActivity(), "et_user_pwd"));
+        btn_get_code  = view.findViewById(ResourceUtil.getId(getActivity(), "btn_get_code"));
+        reg_compete_btn  = view.findViewById(ResourceUtil.getId(getActivity(), "reg_compete_btn"));
+
+        tv_tip_2 = view.findViewById(ResourceUtil.getId(getActivity(), "tv_tip_2"));
+        tv_tip_2.setOnClickListener(this);
+        close_btn  = view.findViewById(ResourceUtil.getId(getActivity(), "close_btn"));
+
+        btn_get_code.setOnClickListener(this);
+        close_btn.setOnClickListener(this);
+        reg_compete_btn.setOnClickListener(this);
+
+        timer = new TimeCount(60000, 1000);
+    }
+
+    @Override
+    public void onClick(View v) {
+        super.onClick(v);
+
+        int id = v.getId();
+        if (id == ResourceUtil.getId(getActivity(), "btn_get_code")) {
+            String phone =  et_user_phone.getText().toString();
+
+            if (phone.length() < 10) {
+                new TosUtil(getActivity(),TosUtil.TOAST_ERROR, getString(ResourceUtil.getStringId(getActivity(), "qj_pls_input_right_phone"))).show();
+                return;
+            }
+            getPhoneCaptcha(getActivity(),phone,"modify_pwd");
+        }else if (id == ResourceUtil.getId(getActivity(), "reg_compete_btn")) {
+            String phone =  et_user_phone.getText().toString();
+            String code = et_user_code.getText().toString();
+            String pwd = et_user_pwd.getText().toString();
+            if (phone.length() < 10) {
+
+                new TosUtil(getActivity(),TosUtil.TOAST_ERROR,getString(ResourceUtil.getStringId(getActivity(), "qj_pls_input_right_phone"))).show();
+
+                return;
+            }
+            if(code.length() < 4 || TextUtils.isEmpty(code))
+            {
+                new TosUtil(getActivity(),TosUtil.TOAST_ERROR,getString(ResourceUtil.getStringId(getActivity(), "qj_pls_input_right_code"))).show();
+
+
+                return;
+            }
+            if(pwd.length() < 6 || TextUtils.isEmpty(pwd))
+            {
+                new TosUtil(getActivity(),TosUtil.TOAST_ERROR, getString(ResourceUtil.getStringId(getActivity(), "qj_pwd_limit_6"))).show();
+
+                return;
+            }
+            resetPwdWithPhone(getActivity(),phone,code,pwd);
+
+        }else if (id == ResourceUtil.getId(getActivity(), "close_btn")) {
+
+            loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_ACCOUNT_LOGIN,null);
+
+        }else if (id == ResourceUtil.getId(getActivity(), "tv_tip_2")) {
+
+            new WvPageListDialog(getActivity(),ResourceUtil.getStyleId(getActivity(),"qj_half_black_dialog"), SdkPlatformImpl.initConfig.service_center).show();
+
+        }
+
+    }
+
+
+    private void  getPhoneCaptcha(Activity activity, String phoneNum, String action){
+        SdkPlatformImpl.loginViewModel.getPhoneCaptcha(activity, phoneNum, action, new ICallback() {
+            @Override
+            public void onResult(int code, String result) {
+                if (code == ResultInfo.CODE_SUCCESS){
+                    getCodeSuccess();
+                }else{
+                    new TosUtil(getActivity(), TosUtil.TOAST_ERROR, result).show();
+                }
+            }
+        });
+    }
+
+
+    private void getCodeSuccess() {
+        btn_get_code.setEnabled(false);
+        btn_get_code.setText("60s");
+
+
+        timer.start();
+    }
+
+    class TimeCount extends CountDownTimer {
+
+        public TimeCount(long millisInFuture, long countDownInterval) {
+            super(millisInFuture, countDownInterval);
+            // TODO Auto-generated constructor stub
+        }
+
+        @Override
+        public void onTick(long millisUntilFinished) {
+            // TODO Auto-generated method stub
+            btn_get_code.setText(millisUntilFinished / 1000 + "s");
+
+        }
+
+        @Override
+        public void onFinish() {
+            // TODO Auto-generated method stub
+            btn_get_code.setEnabled(true);
+            btn_get_code.setText(ResourceUtil.getStringId(getActivity(), "qj_get_phone_code"));
+        }
+
+    }
+    public interface ResetPwdCallback {
+
+        void onResetSuccess(String msg);
+        void onResetFailed(String msg);
+
+
+    }
+
+    private void resetPwdWithPhone(final Activity activity, final String phoneNum, String code, final String pwd) {
+        SdkPlatformImpl.loginViewModel.resetPassword(activity,phoneNum,pwd,code, new ICallback() {
+            @Override
+            public void onResult(int code, String result) {
+                if (code == ResultInfo.CODE_SUCCESS){
+
+                    new TosUtil(getActivity(),TosUtil.TOAST_GREEN,  result).show();
+
+                    loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_ACCOUNT_LOGIN,null);
+                }else{
+                    new TosUtil(getActivity(),TosUtil.TOAST_ERROR,  result).show();
+                }
+            }
+        });
+    }
+
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (timer != null){
+            timer.cancel();
+        }
+
+    }
+}

+ 205 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/UserSwitchAccountLoginFragment.java

@@ -0,0 +1,205 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment;
+
+
+import static cn.yyxx.commsdk.base.constants.Constants.CLICK_INTERVAL;
+
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+import cn.yyxx.commsdk.base.entity.ResultInfo;
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.HNQJLoginFragmentTag;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.AccountLoginListView;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.TosUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.impl.SdkPlatformImpl;
+import cn.yyxx.commsdk.impl.merge.user.UserSession;
+import cn.yyxx.commsdk.impl.merge.user.UserSessionManager;
+
+public class UserSwitchAccountLoginFragment extends BaseFragment{
+
+    private TextView ib_edit_account,tv_other_login_type;
+
+    private AccountLoginListView all_item_1,all_item_2,all_item_3;
+
+
+    private boolean isEditStatus = false;
+
+    private long clickLoginTime = 0L;
+
+    @Nullable
+    @Override
+    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
+        View view = inflater.inflate(ResourceUtil.getLayoutId(getActivity(),"qj_switch_account_login"), container, false);
+        view.setClickable(true);
+        return view;
+
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        ib_edit_account = view.findViewById(ResourceUtil.getId(getActivity(),"ib_edit_account"));
+
+
+        all_item_1 = view.findViewById(ResourceUtil.getId(getActivity(),"all_item_1"));
+        all_item_2 = view.findViewById(ResourceUtil.getId(getActivity(),"all_item_2"));
+        all_item_3 = view.findViewById(ResourceUtil.getId(getActivity(),"all_item_3"));
+        all_item_1.setOnClickListener(this);
+        all_item_2.setOnClickListener(this);
+        all_item_3.setOnClickListener(this);
+        all_item_3.btn_common_use.setVisibility(View.GONE);
+
+
+        ib_edit_account.setOnClickListener(this);
+
+        tv_other_login_type = view.findViewById(ResourceUtil.getId(getActivity(),
+                "tv_other_login_type"));
+        tv_other_login_type.setOnClickListener(this);
+
+        getTopThirdUserInfo();
+
+    }
+
+    @Override
+    public void onClick(View v) {
+        super.onClick(v);
+        int id = v.getId();
+        if (id == ResourceUtil.getId(getActivity(), "ib_edit_account")) {
+            if (isEditStatus){
+
+                Drawable nav_up=getResources().getDrawable(ResourceUtil.getMipmapId(getActivity(),"qj_edit_account"));
+                nav_up.setBounds(0, 0, nav_up.getMinimumWidth(), nav_up.getMinimumHeight());
+                ib_edit_account.setCompoundDrawables(null, null, nav_up, null);
+                ib_edit_account.setText("");
+                isEditStatus = false;
+
+                all_item_1.btn_common_use.setVisibility(View.VISIBLE);
+                all_item_2.btn_common_use.setVisibility(View.VISIBLE);
+
+                all_item_1.btn_delete.setVisibility(View.GONE);
+                all_item_2.btn_delete.setVisibility(View.GONE);
+                all_item_3.btn_delete.setVisibility(View.GONE);
+
+
+                all_item_1.setClickable(true);
+                all_item_2.setClickable(true);
+                all_item_3.setClickable(true);
+
+            }else{
+                ib_edit_account.setCompoundDrawables(null, null, null, null);
+
+
+                ib_edit_account.setText(ResourceUtil.getStringId(getActivity(),"qj_commit_edit"));
+                isEditStatus = true;
+                all_item_1.btn_delete.setVisibility(View.VISIBLE);
+                all_item_2.btn_delete.setVisibility(View.VISIBLE);
+                all_item_3.btn_delete.setVisibility(View.VISIBLE);
+
+                all_item_1.btn_common_use.setVisibility(View.GONE);
+                all_item_2.btn_common_use.setVisibility(View.GONE);
+
+
+                all_item_1.setClickable(false);
+                all_item_2.setClickable(false);
+                all_item_3.setClickable(false);
+            }
+
+        }else  if (id == ResourceUtil.getId(getActivity(), "all_item_1")) {
+
+            startLogin(all_item_1.tv_account.getText().toString(),all_item_1.password,all_item_1.login_token);
+
+
+        }else  if (id == ResourceUtil.getId(getActivity(), "all_item_2")) {
+
+            startLogin(all_item_2.tv_account.getText().toString(),all_item_2.password,all_item_2.login_token);
+
+        }else  if (id == ResourceUtil.getId(getActivity(), "all_item_3")) {
+
+            startLogin(all_item_3.tv_account.getText().toString(),all_item_3.password,all_item_3.login_token);
+
+        }else  if (id == ResourceUtil.getId(getActivity(), "tv_other_login_type")) {
+            loginImpl.switchFragment(HNQJLoginFragmentTag.PAGE_PHONE_LOGIN,null);
+        }
+    }
+
+    private void startLogin(final String account, final String pwd,final String login_token){
+        if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
+
+            return;
+        }
+        clickLoginTime = System.currentTimeMillis();
+
+        SdkPlatformImpl.loginViewModel.accountLogin(getActivity(),account, pwd,login_token, new ICallback(){
+            @Override
+            public void onResult(int code, String result) {
+                if (code == ResultInfo.CODE_SUCCESS){
+                    if (!getActivity().isFinishing()) {
+                        getActivity().finish();
+                        SdkPlatformImpl.getInstance(getActivity()).loginSuccess();
+
+                    }
+
+                }else{
+
+                    new TosUtil(getActivity(),TosUtil.TOAST_ERROR, result).show();
+
+                }
+            }
+        });
+
+    }
+
+    private void getTopThirdUserInfo() {
+
+        ArrayList<UserSession> sessions =  UserSessionManager.getInstance().getLocalSessionLimit3();
+
+        for (int i=0;i<sessions.size();i++){
+
+            if (i == 0){
+
+                setAccountLoginListView(all_item_1,sessions.get(i));
+
+            }else if(i == 1){
+
+                setAccountLoginListView(all_item_2,sessions.get(i));
+
+
+            }else if(i == 2){
+
+                setAccountLoginListView(all_item_3,sessions.get(i));
+
+            }
+        }
+
+    }
+
+    private void setAccountLoginListView(AccountLoginListView accountLoginListView,UserSession user){
+        accountLoginListView.setVisibility(View.VISIBLE);
+        accountLoginListView.tv_account.setText(user.uname);
+        accountLoginListView.password = user.password;
+        accountLoginListView.login_token = user.login_token;
+        if (isNumeric(user.uname)){
+            accountLoginListView.tv_account_type.setText(ResourceUtil.getStringId(getActivity(),"qj_phone_login_user"));
+            accountLoginListView.iv_account_icon.setImageResource(ResourceUtil.getMipmapId(getActivity(), "qj_phone_user"));
+        }
+
+    }
+
+
+    boolean isNumeric(String str){
+        for (int i = str.length();--i>=0;){
+            if (!Character.isDigit(str.charAt(i))){
+                return false;
+            }
+        }
+        return true;
+    }
+}

+ 91 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/widget/AccountLoginListView.java

@@ -0,0 +1,91 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget;
+
+import android.content.Context;
+import android.content.DialogInterface;
+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 cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.CustomExitGameDialog;
+import cn.yyxx.commsdk.impl.merge.user.UserSessionManager;
+
+
+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,"qj_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, "qj_delete_account_tip")) + tv_account.getText().toString());
+
+            }
+        });
+
+    }
+
+    private void deleteItem(String uname,Context context){
+
+
+        UserSessionManager.getInstance().removeSession(uname);
+
+    }
+
+}

+ 57 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/fragment/widget/TosUtil.java

@@ -0,0 +1,57 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget;
+
+import android.content.Context;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+
+
+public class TosUtil {
+
+    private Toast mToast;
+    private TextView mTextView;
+    private ImageView mImageView;
+    public static String TOAST_GREEN = "green";
+    public static String TOAST_ERROR = "error";
+    public TosUtil(Context context, String color, String msg) {
+
+
+        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+        View view = inflater.inflate(ResourceUtil.getLayoutId(context, "qj_toast_style"), null);
+
+
+        mTextView = view.findViewById(ResourceUtil.getId(context, "toast_text"));
+        mTextView.setText(msg);
+
+        mImageView = view.findViewById(ResourceUtil.getId(context, "toast_iv"));
+        if (color.equals(TOAST_GREEN)) {
+            mImageView.setImageResource(ResourceUtil.getMipmapId(context, "qj_tips_success"));
+        }
+        else {
+            mImageView.setImageResource(ResourceUtil.getMipmapId(context, "qj_tips_error"));
+        }
+
+        if (mToast == null) {
+            mToast = new Toast(context);
+
+        }
+
+        mToast.setDuration(Toast.LENGTH_SHORT);
+        mToast.setView(view);
+        mToast.setGravity(Gravity.CENTER,0,0);
+    }
+
+
+    public void show() {
+        mToast.show();
+
+    }
+
+
+}

+ 398 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/hnqj/impl/SdkPlatformImpl.java

@@ -0,0 +1,398 @@
+package cn.yyxx.commsdk.impl.merge.platform.hnqj.impl;
+
+import android.app.Activity;
+import android.app.Application;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.concurrent.TimeUnit;
+
+import cn.yyxx.commsdk.base.entity.ResultInfo;
+import cn.yyxx.commsdk.base.entity.SdkOrderInfo;
+import cn.yyxx.commsdk.base.entity.SdkRoleInfo;
+import cn.yyxx.commsdk.base.entity.bean.InitBean;
+import cn.yyxx.commsdk.base.internal.ICallback;
+import cn.yyxx.commsdk.base.internal.IMsaDeviceCallback;
+import cn.yyxx.commsdk.base.internal.IRequestCallback;
+import cn.yyxx.commsdk.base.internal.feature.IApplication;
+import cn.yyxx.commsdk.base.internal.feature.IFeature;
+import cn.yyxx.commsdk.base.internal.feature.ILifeCycle;
+import cn.yyxx.commsdk.base.internal.feature.IOrder;
+import cn.yyxx.commsdk.base.utils.Logger;
+import cn.yyxx.commsdk.core.entity.SdkLoginInfo;
+import cn.yyxx.commsdk.core.network.SdkRequest;
+import cn.yyxx.commsdk.core.utils.ResourceUtil;
+import cn.yyxx.commsdk.impl.merge.LoginViewModel;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.HNQJLoginActivity;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.CustomExitGameDialog;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.EmailDialog;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.HnPayDialog;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.dialog.WvPageListDialog;
+import cn.yyxx.commsdk.impl.merge.platform.hnqj.floating.FloatViewManager;
+import cn.yyxx.commsdk.impl.merge.platform.msa.MsaDeviceHandler;
+import cn.yyxx.support.scheduler.ScheduledWorker;
+
+public class SdkPlatformImpl implements IFeature, ILifeCycle, IApplication, IOrder {
+    public static InitBean initConfig = null ;
+
+    private static SdkPlatformImpl manager;
+
+
+    private  ICallback logoutCallback;
+
+
+
+
+    public static LoginViewModel loginViewModel;
+
+    public static ScheduledWorker sScheduledWorker = null;
+
+
+    private static Activity activity;
+
+    public SdkPlatformImpl(Context context){
+
+    }
+
+
+    @Override
+    public void attachBaseContext(Application application, Context context) {
+
+    }
+
+    @Override
+    public void initApplication(Application application) {
+
+    }
+
+    @Override
+    public void initialize(Activity activity, ICallback callback) {
+        this.activity = activity;
+    }
+
+    @Override
+    public void initializeSuccess(Activity activity, int loginStatus) {
+        this.activity = activity;
+    }
+
+    @Override
+    public void setLogoutListener(Activity activity, ICallback callback) {
+        logoutCallback = callback;
+    }
+
+    @Override
+    public void login(final Activity activity, InitBean initBean, final ICallback callback) {
+        initConfig  = initBean;
+        loginViewModel = new LoginViewModel(callback);
+        HNQJLoginActivity.start(activity,callback);
+    }
+
+    @Override
+    public void logout() {
+        SdkLoginInfo.getInstance().reset();
+        hideFloat();
+        initConfig.isSwitchAccount = true;
+
+        if (sScheduledWorker != null) {
+            sScheduledWorker.cancel();
+            SdkRequest.getInstance().uploadUserOnlineAction(activity, "0", SdkLoginInfo.getInstance().rn_si, new IRequestCallback() {
+                @Override
+                public void onResponse(ResultInfo resultInfo) {
+                    if (resultInfo.code == ResultInfo.CODE_SUCCESS){
+                        Logger.i("上报角色在线状态成功");
+                    }else{
+                        Logger.i("上报角色在线状态失败");
+                    }
+                }
+            });
+        }
+    }
+
+
+
+    @Override
+    public boolean hasExitView(Activity activity) {
+        return true;
+    }
+
+    @Override
+    public void openExitView(final Activity activity, final ICallback callback) {
+        if (hasExitView(activity)){
+
+            CustomExitGameDialog.Builder builder = new CustomExitGameDialog.Builder(activity);
+            builder.setPositiveButton(new DialogInterface.OnClickListener() {
+                @Override
+                public void onClick(DialogInterface dialog, int which) {
+
+                    callback.onResult(ResultInfo.CODE_SUCCESS,activity.getString(ResourceUtil.getStringId(activity,"qj_exit_game")));
+                    dialog.dismiss();
+                }
+            });
+            builder.setnegativeButton(new DialogInterface.OnClickListener() {
+                @Override
+                public void onClick(DialogInterface dialog, int which) {
+
+                    callback.onResult(ResultInfo.CODE_FAIL,activity.getString(ResourceUtil.getStringId(activity,"qj_continue_game")));
+
+                    dialog.dismiss();
+                }
+            });
+
+            builder.Create().show();
+        }else{
+            callback.onResult(ResultInfo.CODE_SUCCESS,activity.getString(ResourceUtil.getStringId(activity,"qj_open_cp_exit_view")));
+        }
+    }
+
+    @Override
+    public void uploadRoleInfo(Activity activity, String type, SdkRoleInfo roleInfo) {
+
+    }
+
+    @Override
+    public void reportGameEvent(String event, JSONObject message) {
+
+    }
+
+    @Override
+    public void initMsaDeviceIds(Context context, IMsaDeviceCallback iMsaDeviceCallback) {
+        MsaDeviceHandler.initMsaDeviceIds(context,iMsaDeviceCallback);
+    }
+
+
+    public static SdkPlatformImpl getInstance(Context context){
+        if (manager == null) {
+            synchronized (SdkPlatformImpl.class) {
+                if (manager == null) {
+                    manager = new SdkPlatformImpl(context);
+                }
+            }
+        }
+        return manager;
+    }
+
+    @Override
+    public void onStart(Activity activity) {
+
+    }
+
+    @Override
+    public void onResume(Activity activity) {
+
+    }
+
+    @Override
+    public void onRestart(Activity activity) {
+
+    }
+
+    @Override
+    public void onPause(Activity activity) {
+
+    }
+
+    @Override
+    public void onStop(Activity activity) {
+
+    }
+
+    @Override
+    public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
+
+    }
+
+    @Override
+    public void onNewIntent(Activity activity, Intent intent) {
+
+    }
+
+    @Override
+    public void onConfigurationChanged(Activity activity, Configuration newconfig) {
+
+    }
+
+    @Override
+    public void onWindowFocusChanged(Activity activity, boolean hasFocus) {
+
+    }
+
+    @Override
+    public void onDestroy(Activity activity) {
+        releaseFloat();
+        if (sScheduledWorker != null) {
+            sScheduledWorker.cancel();
+        }
+    }
+
+    @Override
+    public void onCreate(Activity activity, Bundle savedInstanceState) {
+
+    }
+
+
+    public void showFloat(){
+        if (!initConfig.isOpenFloatView){
+            return ;
+        }
+        activity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                FloatViewManager.getInstance(activity).showFloat();
+            }
+        });
+
+    }
+    public void hideFloat(){
+
+        activity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                FloatViewManager.getInstance(activity).hideFloat();
+            }
+        });
+    }
+    public void releaseFloat(){
+
+        activity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                FloatViewManager.getInstance(activity).releaseFloat();
+            }
+        });
+
+    }
+
+    public void loginSuccess(){
+        operateRealNameDialog(activity);
+    }
+
+    @Override
+    public void startPay(Activity activity, SdkOrderInfo sdkOrderInfo, final ICallback callback) {
+
+        if (!TextUtils.isEmpty(sdkOrderInfo.getPay_web_url())){
+
+            new HnPayDialog(activity, ResourceUtil.getStyleId(activity, "qj_base_dialog"), sdkOrderInfo, new ICallback() {
+                @Override
+                public void onResult(int code, String result) {
+                    if (code  == ResultInfo.CODE_SUCCESS){
+                        try {
+                            JSONObject json = new JSONObject(result);
+                            int order_status = json.optInt("order_status",0);
+                            if (order_status == ResultInfo.CODE_SUCCESS){
+                                callback.onResult(ResultInfo.CODE_SUCCESS,"支付成功");
+                            }else{
+
+                                callback.onResult(ResultInfo.CODE_FAIL,"支付取消");
+
+                            }
+                        } catch (JSONException e) {
+                            e.printStackTrace();
+                        }
+                    }else{
+
+                        callback.onResult(ResultInfo.CODE_ERROR,"订单查询失败");
+
+                    }
+                }
+            }).show();
+
+        }
+
+    }
+
+    void operateRealNameDialog(Activity activity){
+        if (initConfig.isOpenRealName && !SdkLoginInfo.getInstance().isVefityRealName){
+
+                new WvPageListDialog(activity, ResourceUtil.getStyleId(activity, "qj_half_black_dialog"), SdkLoginInfo.getInstance().authentication,
+                        new WvPageListDialog.OnClosePageListener() {
+                            @Override
+                            public void onClose() {
+
+                            }
+
+                            @Override
+                            public void onDissmiss() {
+
+                                startLoginOperation();
+                            }
+
+
+                            @Override
+                            public void onRealNameSuccess() {
+
+
+                            }
+                        }, initConfig.isForceRealName).show();
+
+
+        }else{
+
+            startLoginOperation();
+        }
+    }
+
+    void startLoginOperation(){
+        showFloat();
+        loginViewModel.mImplCallback.onResult(ResultInfo.CODE_SUCCESS,SdkLoginInfo.getInstance().token);
+        startRoleOnlineWorker();
+        openEmailDialog();
+    }
+    void openEmailDialog(){
+        if (TextUtils.isEmpty(SdkLoginInfo.getInstance().solo_email)) {
+            return;
+        }
+        activity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+
+                new EmailDialog(activity, ResourceUtil.getStyleId(activity, "qj_half_black_dialog"), SdkLoginInfo.getInstance().solo_email).show();
+
+            }
+        });
+    }
+
+    private void startRoleOnlineWorker(){
+        if (TextUtils.isEmpty(SdkLoginInfo.getInstance().rn_si)){
+            Logger.i(" rn_si is null");
+            return;
+        }
+        if (sScheduledWorker == null) {
+            sScheduledWorker = new ScheduledWorker(1);
+        }
+        sScheduledWorker.cancel();
+        int time = initConfig.rn_bh;
+        Logger.i(" ------ 开始防沉迷计时任务  : " + time);
+        sScheduledWorker.invokeAtFixedRate(new Runnable() {
+            @Override
+            public void run() {
+
+                Logger.i(" ------ 用户角色心跳 ------");
+
+                SdkRequest.getInstance().uploadUserOnlineAction(activity, "2", SdkLoginInfo.getInstance().rn_si, new IRequestCallback() {
+                    @Override
+                    public void onResponse(ResultInfo resultInfo) {
+                        if (resultInfo.code == ResultInfo.CODE_SUCCESS){
+                            Logger.i("上报角色在线状态成功");
+                        }else{
+                            Logger.i("上报角色在线状态失败");
+                        }
+                    }
+                });
+
+            }
+        }, time, time, TimeUnit.SECONDS);
+    }
+
+
+    @Override
+    public String getChannelOrderExt() {
+        return "";
+    }
+}

+ 69 - 0
library_platform/hnqj/src/main/java/cn/yyxx/commsdk/impl/merge/platform/msa/MsaDeviceHandler.java

@@ -0,0 +1,69 @@
+package cn.yyxx.commsdk.impl.merge.platform.msa;
+
+import android.content.Context;
+
+import com.bun.miitmdid.core.ErrorCode;
+import com.bun.miitmdid.core.MdidSdkHelper;
+import com.bun.miitmdid.interfaces.IIdentifierListener;
+import com.bun.miitmdid.interfaces.IdSupplier;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import cn.yyxx.commsdk.base.internal.IMsaDeviceCallback;
+import cn.yyxx.commsdk.base.utils.Logger;
+
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/04/23
+ */
+public class MsaDeviceHandler {
+
+    private static final String VERSION = "1.0.25";
+
+    public static String oaid = "";
+    public static String vaid = "";
+    public static String aaid = "";
+
+    public static void initMsaDeviceIds(Context context, final IMsaDeviceCallback callback) {
+        Logger.i("attach msa sdk , version : " + VERSION);
+
+
+        int code = MdidSdkHelper.InitSdk(context, true, new IIdentifierListener() {
+            @Override
+            public void OnSupport(boolean isSupport, IdSupplier idSupplier) {
+                if (isSupport) {
+                    Map<String, String> ids = new HashMap<>();
+                    oaid = idSupplier.getOAID();
+                    vaid = idSupplier.getVAID();
+                    aaid = idSupplier.getAAID();
+                    ids.put("oaid", oaid);
+                    ids.put("vaid", vaid);
+                    ids.put("aaid", aaid);
+                    callback.onIdsRead(0, "获取MsaIds成功", ids);
+                } else {
+                    callback.onIdsRead(-1, "不支持的设备", null);
+                }
+            }
+        });
+
+        switch (code) {
+            case ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT:
+                callback.onIdsRead(-1, "不支持的设备", null);
+                break;
+            case ErrorCode.INIT_ERROR_LOAD_CONFIGFILE:
+                callback.onIdsRead(-1, "加载配置文件出错", null);
+                break;
+            case ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT:
+                callback.onIdsRead(-1, "不支持的设备厂商", null);
+                break;
+            case ErrorCode.INIT_ERROR_RESULT_DELAY:
+                Logger.e("initMsaDeviceIds : 获取接口是异步的,结果会在回调中返回,回调执行的回调可能在工作线程");
+                break;
+            case ErrorCode.INIT_HELPER_CALL_ERROR:
+                callback.onIdsRead(-1, "反射调用出错", null);
+                break;
+        }
+    }
+}

+ 11 - 0
library_platform/hnqj/src/main/res/anim/qj_rotate_anim.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <rotate
+        android:duration="1000"
+        android:fromDegrees="0"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:repeatCount="infinite"
+        android:interpolator="@android:anim/linear_interpolator"
+        android:toDegrees="360" />
+</set>

+ 13 - 0
library_platform/hnqj/src/main/res/drawable/qj_btn_account_bg.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+
+
+    <stroke android:width="1dp" android:color="@color/qj_text_orange_color"/>
+    <corners
+        android:radius="30dp"
+
+        />
+
+
+</shape>

+ 13 - 0
library_platform/hnqj/src/main/res/drawable/qj_btn_guest_bg.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+
+
+    <stroke android:width="1dp" android:color="@color/qj_text_light_orange_color"/>
+    <corners
+        android:radius="30dp"
+
+        />
+
+
+</shape>

+ 7 - 0
library_platform/hnqj/src/main/res/drawable/qj_checkbox_select.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:drawable="@mipmap/qj_checkbox_select" android:state_checked="true"/>
+    <item android:drawable="@mipmap/qj_checkbox_unselect" android:state_checked="false"/>
+
+</selector>

+ 5 - 0
library_platform/hnqj/src/main/res/drawable/qj_color_white_40.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/qj_white_40" />
+    <corners android:radius="8dp" />
+</shape>

+ 5 - 0
library_platform/hnqj/src/main/res/drawable/qj_color_white_70.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/qj_white_70" />
+    <corners android:radius="8dp" />
+</shape>

+ 6 - 0
library_platform/hnqj/src/main/res/drawable/qj_common_wv_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/qj_white_83" />
+    <corners android:radius="8dp" />
+    <stroke android:width="0.5dp" android:color="@color/qj_deepgrey"/>
+</shape>

+ 5 - 0
library_platform/hnqj/src/main/res/drawable/qj_dialog_ios_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
+    <solid android:color="@color/qj_white"/>
+    <corners android:radius="10dp"/>
+</shape>

+ 9 - 0
library_platform/hnqj/src/main/res/drawable/qj_edittext_bg.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <solid android:color="@color/qj_white" />
+
+
+    <corners android:radius="20dp" />
+
+</shape>

+ 10 - 0
library_platform/hnqj/src/main/res/drawable/qj_exit_bg.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <solid android:color="@color/qj_white_83" />
+
+    <stroke android:width="0.5dp" android:color="@color/qj_deepgrey"/>
+    <corners android:radius="10dp" />
+
+
+</shape>

+ 13 - 0
library_platform/hnqj/src/main/res/drawable/qj_game_float_menu_bg.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/qj_white"/>
+    <stroke
+        android:width="1px"
+        android:color="@color/qj_green_line"/>
+    <corners
+        android:bottomLeftRadius="50dp"
+        android:bottomRightRadius="50dp"
+        android:topLeftRadius="50dp"
+        android:topRightRadius="50dp"/>
+
+</shape>

+ 11 - 0
library_platform/hnqj/src/main/res/drawable/qj_hide_float_view_bg.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+
+
+        <solid android:color="@color/qj_hide_view_orange" />
+
+         <corners android:radius="10dp"/>
+
+
+</shape>

+ 9 - 0
library_platform/hnqj/src/main/res/drawable/qj_login_bg.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <solid android:color="@color/qj_white_83" />
+
+      <corners android:radius="10dp" />
+
+
+</shape>

+ 12 - 0
library_platform/hnqj/src/main/res/drawable/qj_login_button_grayed_style.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+
+
+
+
+        <solid android:color="@color/qj_text_hint_color" />
+        <corners android:topLeftRadius="17dp" android:topRightRadius="17dp" android:bottomLeftRadius="17dp" android:bottomRightRadius="17dp" />
+
+
+</shape>

+ 12 - 0
library_platform/hnqj/src/main/res/drawable/qj_login_button_style.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+
+
+
+
+        <gradient android:type="linear" android:useLevel="true" android:startColor="@color/qj_text_light_orange_color" android:endColor="@color/qj_text_deep_orange_color" android:angle="180" />
+        <corners android:topLeftRadius="17dp" android:topRightRadius="17dp" android:bottomLeftRadius="17dp" android:bottomRightRadius="17dp" />
+
+
+</shape>

+ 5 - 0
library_platform/hnqj/src/main/res/drawable/qj_login_list_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/qj_white" />
+    <corners android:radius="6dp" />
+</shape>

+ 7 - 0
library_platform/hnqj/src/main/res/drawable/qj_login_list_btn_red_bg.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/qj_account_list_red" />
+    <corners
+        android:radius="70dp"
+        />
+</shape>

+ 8 - 0
library_platform/hnqj/src/main/res/drawable/qj_login_list_btn_yellow_bg.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/qj_account_list_yellow" />
+    <corners
+        android:topLeftRadius="20dp"
+        android:bottomLeftRadius="20dp"
+        />
+</shape>

+ 16 - 0
library_platform/hnqj/src/main/res/drawable/qj_progress_drawable_white.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<animation-list android:oneshot="false"
+                xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_01" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_02" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_03" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_04" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_05" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_06" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_07" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_08" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_09" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_10" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_11" />
+    <item android:duration="83" android:drawable="@mipmap/qj_ic_loading_white_12" />
+</animation-list>

+ 10 - 0
library_platform/hnqj/src/main/res/drawable/qj_radius_white_10dp.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <solid android:color="@color/qj_white" />
+
+    <stroke android:width="0.5dp" android:color="@color/qj_deepgrey"/>
+    <corners android:radius="10dp" />
+
+
+</shape>

+ 10 - 0
library_platform/hnqj/src/main/res/drawable/qj_radius_white_12dp.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <solid android:color="@color/qj_white" />
+
+    <stroke android:width="1dp" android:color="@color/qj_deepgrey"/>
+    <corners android:radius="12dp" />
+
+
+</shape>

+ 10 - 0
library_platform/hnqj/src/main/res/drawable/qj_radius_white_1dp.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <solid android:color="@color/qj_white" />
+
+    <stroke android:width="0.5dp" android:color="@color/qj_deepgrey"/>
+    <corners android:radius="10dp" />
+
+
+</shape>

+ 167 - 0
library_platform/hnqj/src/main/res/layout/qj_account_login.xml

@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="360dp"
+    android:layout_height="280dp"
+    android:layout_gravity="center"
+    android:background="@drawable/qj_login_bg"
+    >
+    <RelativeLayout
+        android:id="@+id/rl1"
+        android:layout_width="match_parent"
+        android:layout_height="52dp"
+        >
+
+        <ImageButton
+            android:id="@+id/close_btn"
+            android:layout_width="26dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="30dp"
+            android:layout_alignParentLeft="true"
+            android:src="@mipmap/qj_reback"
+            android:background="@color/qj_transparent"
+            />
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:layout_centerInParent= "true"
+            android:background="@mipmap/qj_account_login_text"
+
+            />
+        <ImageButton
+            android:id="@+id/btn_kefu"
+            android:layout_width="26dp"
+            android:layout_height="match_parent"
+            android:layout_marginRight="30dp"
+            android:layout_centerVertical="true"
+            android:layout_alignParentRight="true"
+            android:src="@mipmap/qj_kefu"
+            android:background="@color/qj_transparent"
+            />
+
+    </RelativeLayout>
+    <RelativeLayout
+        android:id="@+id/ll1"
+        android:layout_below="@+id/rl1"
+        android:layout_width="300dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:layout_centerInParent="true" >
+
+
+        <EditText
+            android:id="@+id/reg_account_edit"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:background="@drawable/qj_edittext_bg"
+            android:digits="0123456789abcdefghijgklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+            android:drawableLeft="@mipmap/qj_account_login"
+            android:drawablePadding="10dp"
+            android:gravity="center_vertical"
+            android:hint="@string/qj_input_your_account"
+            android:maxLength="20"
+            android:maxLines="1"
+            android:paddingLeft="20dp"
+            android:textColorHint="@color/qj_text_hint_color"
+            android:textSize="14dp"
+            android:textColor="@color/qj_text_black"/>
+
+        <ImageView
+            android:id="@+id/down_btn"
+            android:layout_alignRight="@+id/reg_account_edit"
+            android:layout_width="45dp"
+            android:layout_height="40dp"
+            android:src="@mipmap/qj_arrow_normal"
+            android:padding="15dp"
+            android:layout_marginRight="3dp"
+            />
+
+        <EditText
+            android:id="@+id/reg_pwd_edit"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_below="@id/reg_account_edit"
+            android:layout_marginTop="16dp"
+            android:background="@drawable/qj_edittext_bg"
+            android:digits="0123456789abcdefghijgklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+            android:drawableLeft="@mipmap/qj_lock"
+            android:drawablePadding="10dp"
+            android:gravity="center_vertical"
+            android:hint="@string/qj_input_your_pwd"
+            android:inputType="textPassword"
+            android:maxLength="20"
+            android:maxLines="1"
+            android:paddingLeft="20dp"
+            android:textColorHint="@color/qj_text_hint_color"
+            android:textSize="14dp"
+            android:textColor="@color/qj_text_black"/>
+
+        <ImageView
+            android:id="@+id/iv_show_pwd"
+            android:layout_below="@id/reg_account_edit"
+            android:layout_marginTop="15dp"
+            android:layout_alignRight="@+id/reg_pwd_edit"
+            android:layout_width="40dp"
+            android:layout_height="40dp"
+            android:src="@mipmap/qj_close_eye"
+            android:padding="10dp"
+            android:layout_marginRight="5dp"
+            />
+
+
+        <Button
+            android:id="@+id/reg_compete_btn"
+            android:layout_width="300dp"
+            android:layout_height="40dp"
+            android:layout_below="@id/iv_show_pwd"
+
+            android:layout_marginTop="15dp"
+            android:background="@drawable/qj_login_button_style"
+            android:layout_centerHorizontal="true"
+            android:text="@string/qj_login"
+            android:textColor="@color/qj_white"
+            android:textSize="16sp" />
+    </RelativeLayout>
+
+    <TextView
+        android:id="@+id/tv_fofget_pwd"
+        android:layout_marginTop="15dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/qj_forget_pwd"
+        android:textSize="16sp"
+        android:textColor="@color/qj_text_orange_color"
+        android:layout_centerHorizontal="true"
+        android:layout_below="@id/ll1"
+        />
+
+
+    <ListView
+        android:layout_marginTop="102dp"
+        android:layout_centerHorizontal="true"
+        android:id="@+id/account_listview"
+        android:layout_width="300dp"
+        android:layout_height="160dp"
+        android:divider="@null"
+        android:visibility="gone"
+        />
+
+
+    <TextView
+        android:id="@+id/list_text"
+        android:layout_width="300dp"
+        android:layout_height="40dp"
+        android:gravity="center_vertical"
+        android:layout_centerHorizontal="true"
+        android:background="@drawable/qj_radius_white_10dp"
+        android:paddingLeft="10dp"
+        android:text="@string/qj_no_record"
+        android:layout_marginTop="105dp"
+        android:visibility="gone"
+        android:textSize="18sp"
+        android:textColor="@color/qj_text_black"
+
+        />
+
+
+</RelativeLayout>

+ 24 - 0
library_platform/hnqj/src/main/res/layout/qj_dialog_progress.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:background="@mipmap/qj_ic_loading_bg"
+              android:gravity="center"
+              android:orientation="vertical"
+              android:padding="16.0dip" >
+
+    <ProgressBar
+            android:layout_width="30.0dip"
+            android:layout_height="30.0dip"
+            android:indeterminateDrawable="@drawable/qj_progress_drawable_white" />
+
+    <TextView
+            android:id="@+id/id_tv_loadingmsg"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:layout_marginTop="8.0dip"
+            android:textColor="#fff"
+            android:textSize="16.0dip" />
+
+</LinearLayout>

+ 45 - 0
library_platform/hnqj/src/main/res/layout/qj_edittext_style.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+xmlns:android="http://schemas.android.com/apk/res/android"
+android:id="@+id/ll1"
+android:layout_below="@+id/rl1"
+android:layout_width="300dp"
+android:layout_height="wrap_content"
+    android:background="@drawable/qj_edittext_bg"
+    >
+
+    <ImageView
+        android:id="@+id/iv_left_view"
+        android:layout_width="18dp"
+        android:layout_height="20dp"
+        android:background="@mipmap/qj_account_login"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="13dp"
+        />
+
+    <EditText
+        android:layout_toRightOf="@id/iv_left_view"
+        android:id="@+id/et_input"
+        android:layout_width="225dp"
+        android:layout_height="40dp"
+        android:layout_marginLeft="10dp"
+        android:background="@null"
+        android:digits="0123456789abcdefghijgklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+        android:gravity="center_vertical"
+        android:hint="@string/qj_input_your_account"
+        android:maxLength="20"
+        android:maxLines="1"
+        android:textColorHint="@color/qj_text_hint_color"
+        android:textSize="16dp"
+        android:textColor="@color/qj_text_black"/>
+    <Button
+        android:layout_toRightOf="@+id/et_input"
+        android:id="@+id/btn_right_view"
+        android:layout_width="13dp"
+        android:layout_height="13dp"
+        android:layout_marginLeft="5dp"
+        android:background="@mipmap/qj_close"
+        android:layout_centerVertical="true"
+        />
+
+</RelativeLayout>

+ 48 - 0
library_platform/hnqj/src/main/res/layout/qj_email_dialog.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="460dp"
+    android:layout_height="300dp"
+    android:background="@drawable/qj_common_wv_bg"
+    android:orientation="vertical"
+    android:id="@+id/ll_webview_common"
+    android:padding="5dp"
+    >
+
+    <RelativeLayout
+        android:id="@+id/rl1"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        >
+
+
+        <WebView
+            android:id="@+id/wb_user_info"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:background="@drawable/qj_common_wv_bg"
+            />
+
+
+        <ImageView
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:layout_centerInParent="true"
+            android:id="@+id/qj_loading"
+            android:background="@mipmap/qj_loading"/>
+        <ImageView
+            android:id="@+id/close_btn"
+            android:layout_width="28dp"
+            android:layout_height="28dp"
+
+            android:src="@mipmap/qj_close"
+            android:layout_alignParentRight="true"
+            android:layout_marginRight="15dp"
+            android:layout_marginTop="15dp"
+            android:padding="6dp"
+            />
+    </RelativeLayout>
+
+
+
+</LinearLayout>

+ 80 - 0
library_platform/hnqj/src/main/res/layout/qj_exit_game_dialog.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/ll_exit_game"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:background="@drawable/qj_exit_bg"
+
+    android:orientation="vertical" >
+
+    <LinearLayout
+        android:layout_width="320dp"
+        android:layout_height="150dp"
+        android:layout_gravity="center"
+
+        android:orientation="vertical" >
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="55dp"
+            android:gravity="center"
+            android:text="@string/qj_title_tip"
+            android:textColor="@color/qj_text_black"
+            android:textSize="18sp"
+            />
+        <TextView
+            android:id="@+id/qj_issure_exit"
+            android:layout_width="match_parent"
+            android:layout_height="45dp"
+            android:gravity="center_horizontal"
+            android:text="@string/qj_issure_exit"
+            android:textColor="@color/qj_text_black"
+            android:textSize="16sp" />
+        <View
+
+            android:layout_width="match_parent"
+            android:layout_height="0.5dp"
+            android:background="@color/qj_deepgrey"
+            />
+
+        <LinearLayout
+            android:layout_width="320dp"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:orientation="horizontal">
+
+
+            <Button
+                android:id="@+id/find_pwd_cancel_btn"
+                android:layout_width="159.5dp"
+                android:layout_height="match_parent"
+                android:background="@color/qj_transparent"
+                android:gravity="center"
+                android:text="@string/qj_cancel"
+                android:textAllCaps="false"
+                android:textColor="@color/qj_text_black"
+                android:textSize="15sp" />
+
+            <View
+
+                android:layout_width="0.5dp"
+                android:layout_height="match_parent"
+                android:background="@color/qj_deepgrey" />
+
+            <Button
+                android:id="@+id/find_pwd_confirm_btn"
+                android:layout_width="159.5dp"
+                android:layout_height="match_parent"
+
+                android:background="@color/qj_transparent"
+
+                android:gravity="center"
+                android:text="@string/qj_sure"
+                android:textAllCaps="false"
+                android:textColor="@color/qj_text_orange_color"
+                android:textSize="15sp" />
+        </LinearLayout>
+    </LinearLayout>
+
+</LinearLayout>

+ 17 - 0
library_platform/hnqj/src/main/res/layout/qj_hide_float_view.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical" android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:id="@+id/ll_hide"
+    android:visibility="gone"
+    android:background="@color/qj_text_black">
+    <TextView
+        android:layout_width="130dp"
+        android:layout_height="40dp"
+        android:drawableLeft="@mipmap/qj_hide_float_eye_view"
+        android:paddingLeft="5dp"
+        android:textColor="@color/qj_white"
+        android:text="@string/qj_close_float_view"
+        android:gravity="center"/>
+    
+</LinearLayout>

+ 45 - 0
library_platform/hnqj/src/main/res/layout/qj_ios_style_dialog.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@drawable/qj_dialog_ios_bg">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="20dp"
+        android:gravity="center_horizontal"
+        android:orientation="vertical">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="@color/qj_black"
+            android:textSize="16sp"
+            android:textStyle="bold"
+            android:text="@string/qj_title_tip"/>
+
+        <TextView
+            android:id="@+id/content"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:textColor="@color/qj_black"
+            android:textSize="12sp"
+            android:text="@string/qj_network_error_tip"/>
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1px"
+        android:background="@color/qj_dialog_line"/>
+
+    <TextView
+        android:id="@+id/confirm"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:gravity="center"
+        android:layout_gravity="center_horizontal"
+        android:textColor="@color/qj_blues"
+        android:textSize="16sp"
+        android:text="@string/qj_confirm"/>
+    </LinearLayout>

+ 8 - 0
library_platform/hnqj/src/main/res/layout/qj_login.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/qj_login_container"
+    android:background="@color/qj_transparent_background"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</FrameLayout>

+ 63 - 0
library_platform/hnqj/src/main/res/layout/qj_login_list.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="300dp"
+    android:layout_height="43dp"
+    android:background="@drawable/qj_login_list_bg"
+    >
+    <ImageView
+        android:id="@+id/iv_account_icon"
+        android:layout_width="28dp"
+        android:layout_height="28dp"
+        android:background="@mipmap/qj_account_user"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="10dp"
+        />
+    <TextView
+        android:id="@+id/tv_account_type"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/qj_account_login_user"
+        android:textColor="@color/qj_text_black"
+        android:layout_toRightOf="@id/iv_account_icon"
+        android:layout_marginLeft="10dp"
+        android:layout_marginTop="5dp"
+        android:textSize="12dp"
+        />
+    <TextView
+        android:id="@+id/tv_account"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+
+        android:layout_toRightOf="@id/iv_account_icon"
+        android:layout_below="@+id/tv_account_type"
+        android:textSize="12dp"
+        android:textColor="@color/qj_text_orange_color"
+        android:layout_marginLeft="10dp"
+
+        />
+        <Button
+            android:id="@+id/btn_common_use"
+            android:layout_width="40dp"
+            android:layout_height="20dp"
+            android:background="@drawable/qj_login_list_btn_yellow_bg"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true"
+            android:text="@string/qj_common_use"
+            android:textColor="@color/qj_white"
+            android:textSize="11dp"
+
+            />
+    <Button
+        android:id="@+id/btn_delete"
+        android:layout_width="55dp"
+        android:layout_height="22dp"
+        android:background="@drawable/qj_login_list_btn_red_bg"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:text="@string/qj_delete_use"
+        android:textColor="@color/qj_white"
+        android:textSize="11dp"
+        android:layout_marginRight="10dp"
+        android:visibility="gone"
+        />
+</RelativeLayout>

+ 39 - 0
library_platform/hnqj/src/main/res/layout/qj_p_webview.xml

@@ -0,0 +1,39 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="360dp"
+    android:layout_height="320dp"
+    android:gravity="center"
+    android:background="@drawable/qj_radius_white_10dp"
+    android:orientation="vertical"
+    android:id="@+id/ll_p_wb"
+    >
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="20dp"
+            android:layout_weight="1.0"
+            android:orientation="horizontal">
+
+            <WebView
+                android:id="@+id/wb_with_xd"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:scrollbars="none"
+                android:layout_margin="10dp"
+                />
+
+            <ImageView
+                android:id="@+id/iv_reback_close"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="15dp"
+                android:layout_marginRight="5dp"
+                android:padding="10dp"
+                android:src="@mipmap/qj_close"
+                android:layout_alignParentRight="true"
+
+                />
+
+        </RelativeLayout>
+
+
+    </LinearLayout>
+

+ 205 - 0
library_platform/hnqj/src/main/res/layout/qj_phone_login.xml

@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="360dp"
+    android:layout_height="280dp"
+    android:background="@drawable/qj_login_bg"
+    android:layout_gravity="center"
+    android:orientation="vertical">
+
+    <RelativeLayout
+        android:id="@+id/rl1"
+        android:layout_width="match_parent"
+        android:layout_height="52dp"
+        >
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:layout_centerInParent= "true"
+            android:background="@mipmap/qj_logo"
+
+            />
+
+        <ImageButton
+            android:id="@+id/btn_kefu"
+            android:layout_width="26dp"
+            android:layout_height="match_parent"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true"
+            android:layout_marginRight="30dp"
+            android:src="@mipmap/qj_kefu"
+            android:background="@color/qj_transparent"/>
+
+    </RelativeLayout>
+    <RelativeLayout
+        android:id="@+id/rl2"
+        android:layout_below="@id/rl1"
+        android:layout_width="300dp"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
+        >
+        <EditText
+            android:id="@+id/et_user_phone"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:background="@drawable/qj_edittext_bg"
+            android:drawableLeft="@mipmap/qj_phone"
+            android:drawablePadding="20dp"
+            android:hint="@string/qj_input_phone_number"
+            android:textColorHint="@color/qj_text_hint_color"
+            android:paddingLeft="20dp"
+            android:textSize="16sp"
+            android:maxLength="20"
+            android:digits="0123456789"
+            android:layout_centerHorizontal="true"
+            android:textColor="@color/qj_text_black"
+            />
+        <EditText
+            android:id="@+id/et_user_code"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_marginTop="11dp"
+            android:background="@drawable/qj_edittext_bg"
+            android:drawableLeft="@mipmap/qj_code"
+            android:drawablePadding="20dp"
+            android:hint="@string/qj_input_code"
+            android:textColorHint="@color/qj_text_hint_color"
+            android:paddingLeft="20dp"
+            android:textSize="16sp"
+            android:maxLength="10"
+            android:digits="0123456789"
+            android:layout_below="@id/et_user_phone"
+            android:layout_alignLeft="@id/et_user_phone"
+            android:textColor="@color/qj_text_black"
+            />
+
+        <View
+            android:layout_width="1dp"
+            android:layout_height="20dp"
+            android:layout_marginTop="21dp"
+            android:background="@color/qj_text_hint_color"
+            android:layout_toLeftOf="@id/btn_get_code"
+            android:layout_below="@id/et_user_phone"
+
+            />
+        <Button
+            android:id="@+id/btn_get_code"
+            android:layout_width="110dp"
+            android:layout_height="40dp"
+            android:layout_marginTop="10dp"
+            android:background="@null"
+            android:textColor="@color/qj_text_orange_color"
+            android:textSize="16sp"
+
+            android:text="@string/qj_get_phone_code"
+            android:gravity="center"
+            android:layout_below="@id/et_user_phone"
+            android:layout_alignRight="@id/et_user_phone"
+            />
+
+        <RelativeLayout
+            android:id="@+id/reg_tip_ll"
+            android:layout_width="300dp"
+            android:layout_height="35dp"
+            android:layout_below="@+id/et_user_code"
+            android:gravity="center_vertical">
+
+            <CheckBox
+                android:id="@+id/cb_register"
+                style="@style/qj_checkbox_style"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="23dp"
+                android:checked="true"
+                android:gravity="left|center" />
+
+            <TextView
+                android:id="@+id/tv_agree_tip"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="10dp"
+                android:layout_toRightOf="@id/cb_register"
+                android:gravity="center"
+                android:text="@string/qj_agreement_tip"
+                android:textColor="@color/qj_text_black"
+                android:textSize="11.3sp" />
+
+            <TextView
+                android:id="@+id/tv_tip"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_toRightOf="@id/tv_agree_tip"
+                android:gravity="center"
+                android:text="@string/qj_agree_register_tip"
+                android:textColor="@color/qj_text_orange_color"
+                android:textSize="11.3sp" />
+
+            <TextView
+                android:id="@+id/tv_and_tip"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_toRightOf="@id/tv_tip"
+                android:gravity="center"
+                android:text="@string/qj_and"
+                android:textColor="@color/qj_text_black"
+                android:textSize="11.3sp" />
+
+            <TextView
+                android:id="@+id/tv_private_policy"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_toRightOf="@id/tv_and_tip"
+                android:gravity="center|left"
+                android:text="@string/qj_private_policy"
+                android:textColor="@color/qj_text_orange_color"
+                android:textSize="11.3sp" />
+        </RelativeLayout>
+
+        <Button
+            android:id="@+id/btn_reg_compete"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_centerHorizontal="true"
+            android:layout_gravity="center_horizontal"
+            android:background="@drawable/qj_login_button_style"
+            android:text="@string/qj_register"
+            android:textSize="16sp"
+            android:textColor="@color/qj_white"
+            android:minHeight="1dp"
+            android:minWidth="1dp"
+            android:gravity="center"
+            android:layout_below="@id/reg_tip_ll"
+            />
+
+    </RelativeLayout>
+
+    <Button
+        android:id="@+id/btn_account_login"
+        android:layout_width="120dp"
+        android:layout_height="35dp"
+        android:layout_below="@id/rl2"
+        android:layout_alignLeft="@id/rl2"
+        android:layout_marginTop="10dp"
+        android:background="@drawable/qj_btn_account_bg"
+        android:drawableLeft="@mipmap/qj_account_login"
+        android:paddingLeft="15dp"
+        android:text="@string/qj_account_login"
+        android:textColor="@color/qj_text_orange_color"
+        android:textSize="16sp" />
+
+    <Button
+        android:id="@+id/btn_guest_register"
+        android:layout_width="120dp"
+        android:layout_height="35dp"
+        android:layout_below="@id/rl2"
+        android:layout_alignRight="@id/rl2"
+        android:layout_marginTop="10dp"
+        android:background="@drawable/qj_btn_guest_bg"
+        android:drawableLeft="@mipmap/qj_guest_login"
+        android:paddingLeft="15dp"
+        android:text="@string/qj_guset_login"
+        android:textColor="@color/qj_text_light_orange_color"
+        android:textSize="16sp" />
+
+</RelativeLayout>

+ 145 - 0
library_platform/hnqj/src/main/res/layout/qj_phone_register_setpwd_dialog.xml

@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="360dp"
+    android:layout_height="280dp"
+    android:background="@drawable/qj_login_bg"
+    android:layout_gravity="center"
+    >
+
+    <RelativeLayout
+        android:id="@+id/rl1"
+        android:layout_width="match_parent"
+        android:layout_height="60dp">
+
+        <ImageButton
+            android:id="@+id/close_btn"
+            android:layout_width="26dp"
+            android:layout_height="match_parent"
+            android:layout_centerVertical="true"
+            android:layout_marginLeft="30dp"
+            android:src="@mipmap/qj_reback"
+            android:background="@color/qj_transparent"/>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            android:text="@string/qj_set_pwd"
+            android:textColor="@color/qj_gray"
+            android:textSize="19sp" />
+
+        <ImageButton
+            android:id="@+id/btn_kefu"
+            android:layout_width="26dp"
+            android:layout_height="match_parent"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true"
+            android:layout_marginRight="30dp"
+            android:src="@mipmap/qj_kefu"
+            android:background="@color/qj_transparent" />
+
+    </RelativeLayout>
+
+
+
+
+
+
+        <EditText
+
+            android:id="@+id/reg_pwd_edit"
+            android:layout_width="300dp"
+            android:layout_height="40dp"
+            android:background="@drawable/qj_edittext_bg"
+            android:hint="@string/qj_set_pwd"
+            android:textColorHint="@color/qj_text_hint_color"
+            android:digits="0123456789abcdefghijgklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+            android:maxLength="20"
+            android:maxLines="1"
+            android:textSize="14dp"
+            android:gravity="center_vertical"
+            android:textColor="@color/qj_text_black"
+            android:layout_below="@+id/rl1"
+            android:layout_centerInParent="true"
+            android:layout_marginTop="30dp"
+            android:drawableLeft="@mipmap/qj_lock"
+            android:drawablePadding="5dp"
+            android:paddingLeft="10dp"
+
+            />
+
+
+
+    <RelativeLayout
+        android:id="@+id/reg_tip_ll"
+        android:layout_width="300dp"
+        android:layout_height="35dp"
+        android:layout_marginTop="30dp"
+        android:layout_below="@+id/reg_compete_btn"
+        android:gravity="center"
+        android:layout_centerInParent="true"
+        >
+        <CheckBox
+            android:id="@+id/cb_register"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="20dp"
+            android:checked="true"
+            android:gravity="left|center"
+            style="@style/qj_checkbox_style"
+             />
+        <TextView
+            android:id="@+id/tv_agree_tip"
+            android:layout_toRightOf="@id/cb_register"
+            android:layout_marginLeft="10dp"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textSize="11.2sp"
+            android:text="@string/qj_agreement_tip"
+            android:textColor="@color/qj_text_black"/>
+        <TextView
+            android:id="@+id/tv_tip"
+           android:layout_toRightOf="@id/tv_agree_tip"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textSize="11.2sp"
+            android:text="@string/qj_agree_register_tip"
+            android:textColor="@color/qj_text_deep_orange_color"/>
+        <TextView
+            android:id="@+id/tv_and_tip"
+            android:layout_toRightOf="@id/tv_tip"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textSize="11.2sp"
+            android:text="@string/qj_and"
+            android:textColor="@color/qj_text_black"/>
+        <TextView
+            android:id="@+id/tv_private_policy"
+            android:layout_toRightOf="@id/tv_and_tip"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center|left"
+            android:textSize="11.2sp"
+            android:text="@string/qj_private_policy"
+            android:textColor="@color/qj_text_deep_orange_color"/>
+    </RelativeLayout>
+
+
+    <Button
+        android:id="@+id/reg_compete_btn"
+        android:layout_width="300dp"
+        android:layout_height="40dp"
+        android:layout_below="@id/reg_pwd_edit"
+        android:layout_gravity="center_horizontal"
+        android:background="@drawable/qj_login_button_style"
+        android:layout_centerHorizontal="true"
+        android:text="@string/qj_register"
+        android:textColor="@color/qj_white"
+        android:textSize="16sp"
+        android:layout_marginTop="20dp"/>
+
+
+</RelativeLayout>

+ 81 - 0
library_platform/hnqj/src/main/res/layout/qj_privacy_policy_dialog.xml

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="360dp"
+    android:layout_height="280dp"
+    android:background="@drawable/qj_color_white_70"
+    android:orientation="vertical"
+    android:id="@+id/ll_private_policy"
+    >
+
+
+<RelativeLayout
+    android:layout_width="match_parent"
+    android:layout_height="0dp"
+    android:layout_weight="7"
+    android:layout_marginTop="10dp"
+    android:layout_marginLeft="2dp"
+    android:layout_marginRight="2dp"
+    >
+        <WebView
+            android:id="@+id/wb_user_info"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:background="@color/qj_transparent"
+            />
+
+    <ImageView
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:layout_centerInParent="true"
+            android:id="@+id/qj_loading"
+            android:background="@mipmap/qj_loading"/>
+</RelativeLayout>
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="3"
+        android:orientation="horizontal"
+        >
+        <View
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            />
+        <Button
+
+            android:id="@+id/btn_disagree"
+            android:layout_width="0dp"
+            android:layout_height="30dp"
+            android:layout_weight="2"
+            android:layout_gravity="center"
+            android:text="@string/qj_disagreement"
+            android:textColor="@color/qj_text_orange_color"
+            android:background="@drawable/qj_btn_account_bg"/>
+        <View
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            />
+        <View
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            />
+
+        <Button
+            android:id="@+id/btn_agree"
+            android:layout_width="0dp"
+            android:layout_height="30dp"
+            android:layout_weight="2"
+            android:layout_gravity="center"
+            android:background="@drawable/qj_login_button_style"
+            android:textColor="@color/qj_white"
+            android:text="@string/qj_agreement"/>
+        <View
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            />
+    </LinearLayout>
+</LinearLayout>

+ 25 - 0
library_platform/hnqj/src/main/res/layout/qj_quick_login_bar.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal" android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/qj_color_white_40"
+    android:padding="14dp"
+    >
+
+    <TextView
+        android:id="@+id/auto_login_account_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="yx12589647896257,"
+        android:textColor="@color/qj_text_black"
+        android:textSize="14sp" />
+
+    <TextView
+        android:id="@+id/auto_login_cancel_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/qj_switch_account"
+        android:textColor="@color/qj_text_deep_orange_color"
+        android:textSize="14sp"
+        />
+</LinearLayout>

+ 214 - 0
library_platform/hnqj/src/main/res/layout/qj_register_dialog.xml

@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="360dp"
+    android:layout_height="280dp"
+    android:layout_gravity="center"
+    android:background="@drawable/qj_login_bg"
+    >
+
+    <RelativeLayout
+        android:id="@+id/rl1"
+        android:layout_width="match_parent"
+        android:layout_height="52dp">
+
+        <ImageButton
+            android:id="@+id/close_btn"
+            android:layout_width="26dp"
+            android:layout_height="match_parent"
+            android:layout_centerVertical="true"
+            android:layout_marginLeft="30dp"
+            android:src="@mipmap/qj_reback"
+            android:background="@color/qj_transparent"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            android:background="@mipmap/qj_guest_login_text"
+            android:gravity="center"
+
+            />
+
+        <ImageButton
+            android:id="@+id/btn_kefu"
+            android:layout_width="26dp"
+            android:layout_height="match_parent"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true"
+            android:layout_marginRight="30dp"
+            android:src="@mipmap/qj_kefu"
+            android:background="@color/qj_transparent" />
+
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:id="@+id/ll1"
+        android:layout_below="@+id/rl1"
+        android:layout_width="300dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="5dp"
+        android:layout_centerInParent="true" >
+
+
+        <EditText
+            android:id="@+id/reg_account_edit"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:background="@drawable/qj_edittext_bg"
+            android:digits="0123456789abcdefghijgklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+            android:drawableLeft="@mipmap/qj_account_login"
+            android:drawablePadding="10dp"
+            android:gravity="center_vertical"
+            android:hint="@string/qj_input_your_account"
+            android:maxLength="20"
+            android:maxLines="1"
+            android:paddingLeft="20dp"
+            android:textColorHint="@color/qj_text_hint_color"
+            android:textSize="14dp"
+            android:textColor="@color/qj_text_black"/>
+
+        <ImageView
+            android:id="@+id/iv_clear_text"
+            android:layout_width="40dp"
+            android:layout_height="40dp"
+            android:layout_alignRight="@id/reg_account_edit"
+            android:layout_marginRight="3dp"
+            android:padding="15dp"
+            android:src="@mipmap/qj_close" />
+
+        <EditText
+            android:layout_below="@id/reg_account_edit"
+            android:id="@+id/reg_pwd_edit"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:background="@drawable/qj_edittext_bg"
+            android:paddingLeft="20dp"
+            android:drawableLeft="@mipmap/qj_lock"
+            android:drawablePadding="10dp"
+            android:hint="@string/qj_input_your_pwd"
+            android:textColorHint="@color/qj_text_hint_color"
+            android:digits="0123456789abcdefghijgklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+            android:maxLength="20"
+            android:maxLines="1"
+            android:textSize="14dp"
+            android:layout_marginTop="10dp"
+            android:gravity="center_vertical"
+            android:textColor="@color/qj_text_black"
+            />
+
+        <ImageView
+            android:id="@+id/iv_show_pwd"
+            android:layout_below="@id/reg_account_edit"
+            android:layout_marginTop="10dp"
+            android:layout_alignRight="@+id/reg_pwd_edit"
+            android:layout_width="40dp"
+            android:layout_height="40dp"
+            android:src="@mipmap/qj_open_eye"
+            android:padding="10dp"
+            android:layout_marginRight="5dp"
+            />
+
+    </RelativeLayout>
+    <RelativeLayout
+        android:id="@+id/reg_tip_ll"
+        android:layout_width="300dp"
+        android:layout_height="35dp"
+        android:layout_alignRight="@id/ll1"
+        android:layout_below="@+id/ll1"
+        android:gravity="center_vertical"
+        >
+        <CheckBox
+            android:id="@+id/cb_register"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="20dp"
+            android:checked="true"
+            android:gravity="left|center"
+            style="@style/qj_checkbox_style"
+             />
+        <TextView
+            android:id="@+id/tv_agree_tip"
+            android:layout_toRightOf="@id/cb_register"
+            android:layout_marginLeft="10dp"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textSize="11.2sp"
+            android:text="@string/qj_agreement_tip"
+            android:textColor="@color/qj_text_black"/>
+        <TextView
+            android:id="@+id/tv_tip"
+           android:layout_toRightOf="@id/tv_agree_tip"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textSize="11.2sp"
+            android:text="@string/qj_agree_register_tip"
+            android:textColor="@color/qj_text_orange_color"/>
+        <TextView
+            android:id="@+id/tv_and_tip"
+            android:layout_toRightOf="@id/tv_tip"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textSize="11.2sp"
+            android:text="@string/qj_and"
+            android:textColor="@color/qj_text_black"/>
+        <TextView
+            android:id="@+id/tv_private_policy"
+            android:layout_toRightOf="@id/tv_and_tip"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="center|left"
+            android:textSize="11.2sp"
+            android:text="@string/qj_private_policy"
+            android:textColor="@color/qj_text_orange_color"/>
+    </RelativeLayout>
+
+
+    <Button
+        android:id="@+id/reg_compete_btn"
+        android:layout_width="300dp"
+        android:layout_height="40dp"
+        android:layout_below="@id/reg_tip_ll"
+        android:layout_gravity="center_horizontal"
+        android:background="@drawable/qj_login_button_style"
+        android:layout_centerHorizontal="true"
+        android:text="@string/qj_login"
+        android:textColor="@color/qj_white"
+        android:textSize="16sp" />
+
+    <Button
+        android:id="@+id/btn_phone_register"
+        android:layout_width="120dp"
+        android:layout_height="35dp"
+        android:layout_below="@id/reg_compete_btn"
+        android:layout_alignLeft="@id/reg_tip_ll"
+        android:layout_marginTop="10dp"
+        android:background="@drawable/qj_btn_account_bg"
+        android:drawableLeft="@mipmap/qj_phone"
+        android:paddingLeft="15dp"
+        android:text="@string/qj_phone_register"
+        android:textColor="@color/qj_text_orange_color"
+        android:textSize="16sp" />
+
+    <Button
+        android:id="@+id/btn_account_login"
+        android:layout_width="120dp"
+        android:layout_height="35dp"
+        android:layout_below="@id/reg_compete_btn"
+        android:layout_alignRight="@id/reg_tip_ll"
+        android:layout_marginTop="10dp"
+        android:background="@drawable/qj_btn_guest_bg"
+        android:drawableLeft="@mipmap/qj_account_login"
+        android:paddingLeft="15dp"
+        android:text="@string/qj_has_account"
+        android:textColor="@color/qj_text_light_orange_color"
+        android:textSize="16sp" />
+
+
+
+
+
+
+</RelativeLayout>

+ 181 - 0
library_platform/hnqj/src/main/res/layout/qj_retrieve_pwd.xml

@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="360dp"
+    android:layout_height="280dp"
+    android:background="@drawable/qj_login_bg"
+    android:layout_gravity="center"
+    android:orientation="vertical">
+
+    <RelativeLayout
+        android:id="@+id/rl1"
+        android:layout_width="match_parent"
+        android:layout_height="52dp"
+        >
+
+        <ImageButton
+            android:id="@+id/close_btn"
+            android:layout_width="26dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="30dp"
+            android:layout_centerVertical="true"
+            android:src="@mipmap/qj_reback"
+            android:background="@color/qj_transparent"
+            />
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:layout_centerInParent= "true"
+            android:background="@mipmap/qj_retrieve_pwd_text"
+
+            />
+        <ImageButton
+            android:id="@+id/btn_kefu"
+            android:layout_width="26dp"
+            android:layout_height="match_parent"
+            android:layout_marginRight="30dp"
+            android:layout_centerVertical="true"
+            android:layout_alignParentRight="true"
+            android:src="@mipmap/qj_kefu"
+            android:background="@color/qj_transparent"
+            />
+
+    </RelativeLayout>
+    <RelativeLayout
+        android:layout_width="300dp"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal">
+        <EditText
+            android:id="@+id/et_user_phone"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:background="@drawable/qj_edittext_bg"
+            android:drawableLeft="@mipmap/qj_phone"
+            android:drawablePadding="20dp"
+            android:hint="@string/qj_input_phone_number"
+            android:textColorHint="@color/qj_text_hint_color"
+            android:paddingLeft="10dp"
+            android:textSize="16sp"
+            android:maxLength="20"
+            android:digits="0123456789"
+            android:layout_centerHorizontal="true"
+            android:textColor="@color/qj_text_black"
+            />
+        <EditText
+            android:id="@+id/et_user_code"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_marginTop="11dp"
+            android:background="@drawable/qj_edittext_bg"
+            android:drawableLeft="@mipmap/qj_code"
+            android:drawablePadding="20dp"
+            android:hint="@string/qj_input_code"
+            android:textColorHint="@color/qj_text_hint_color"
+            android:paddingLeft="10dp"
+            android:textSize="16sp"
+            android:maxLength="10"
+            android:digits="0123456789"
+            android:layout_below="@id/et_user_phone"
+            android:layout_alignLeft="@id/et_user_phone"
+            android:textColor="@color/qj_text_black"
+
+            />
+
+        <View
+            android:layout_width="1dp"
+            android:layout_height="20dp"
+            android:layout_marginTop="21dp"
+            android:background="@color/qj_text_hint_color"
+            android:layout_toLeftOf="@id/btn_get_code"
+            android:layout_below="@id/et_user_phone"
+
+            />
+        <Button
+            android:id="@+id/btn_get_code"
+            android:layout_width="110dp"
+            android:layout_height="40dp"
+            android:layout_marginTop="10dp"
+            android:background="@null"
+            android:textColor="@color/qj_text_orange_color"
+            android:textSize="16sp"
+
+            android:text="@string/qj_get_phone_code"
+            android:gravity="center"
+            android:layout_below="@id/et_user_phone"
+            android:layout_alignRight="@id/et_user_phone"
+            />
+
+        <EditText
+            android:id="@+id/et_user_pwd"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:background="@drawable/qj_edittext_bg"
+            android:drawableLeft="@mipmap/qj_lock"
+            android:textColorHint="@color/qj_text_hint_color"
+            android:drawablePadding="20dp"
+            android:hint="@string/qj_input_new_pwd"
+            android:paddingLeft="12dp"
+            android:textSize="16sp"
+            android:maxLength="20"
+            android:digits="0123456789abcdefghijgklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+            android:layout_centerHorizontal="true"
+            android:layout_marginTop="11dp"
+            android:layout_below="@id/et_user_code"
+            android:layout_alignLeft="@id/et_user_code"
+            android:inputType="textPassword"
+            android:textColor="@color/qj_text_black"
+            />
+
+        <Button
+            android:id="@+id/reg_compete_btn"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_centerHorizontal="true"
+            android:layout_gravity="center_horizontal"
+            android:background="@drawable/qj_login_button_style"
+            android:text="@string/qj_find_pwd_phone"
+            android:textSize="16sp"
+            android:textColor="@color/qj_white"
+            android:minHeight="1dp"
+            android:minWidth="1dp"
+            android:gravity="center"
+            android:layout_below="@id/et_user_pwd"
+            android:layout_marginTop="11dp"
+            />
+        <TextView
+            android:id="@+id/tv_tip_1"
+            android:layout_marginTop="8dp"
+            android:layout_below="@id/reg_compete_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="20dp"
+            android:gravity="center"
+            android:layout_marginLeft="40dp"
+            android:text="@string/qj_forget_pwd_tip"
+            android:textColor="@color/qj_text_black"
+
+            />
+        <TextView
+            android:id="@+id/tv_tip_2"
+            android:layout_marginTop="8dp"
+            android:layout_below="@id/reg_compete_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="20dp"
+            android:gravity="center"
+            android:text="@string/qj_contact_tip"
+            android:textColor="@color/qj_text_orange_color"
+            android:layout_toRightOf="@id/tv_tip_1"
+            android:clickable="true"
+            />
+        <TextView
+            android:layout_marginTop="8dp"
+            android:layout_below="@id/reg_compete_btn"
+            android:layout_width="wrap_content"
+            android:layout_height="20dp"
+            android:gravity="center"
+            android:text="@string/qj_get_back_tip"
+            android:layout_toRightOf="@id/tv_tip_2"
+            android:textColor="@color/qj_text_black"
+
+            />
+    </RelativeLayout>
+</LinearLayout>

+ 85 - 0
library_platform/hnqj/src/main/res/layout/qj_switch_account_login.xml

@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="360dp"
+    android:layout_height="280dp"
+    android:background="@drawable/qj_login_bg"
+    android:layout_gravity="center"
+    >
+
+    <RelativeLayout
+        android:id="@+id/rl1"
+        android:layout_width="match_parent"
+        android:layout_height="50dp">
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:layout_centerInParent= "true"
+            android:background="@mipmap/qj_logo"
+            />
+
+    </RelativeLayout>
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="30dp"
+        android:text="@string/qj_select_account"
+        android:layout_below="@id/rl1"
+        android:layout_marginLeft="30dp"
+        android:textSize="17sp"
+        android:gravity="center"
+        android:textColor="@color/qj_text_black"
+        />
+
+    <TextView
+        android:id="@+id/ib_edit_account"
+        android:layout_width="wrap_content"
+        android:layout_height="30dp"
+        android:layout_below="@id/rl1"
+        android:layout_alignRight="@id/rl1"
+        android:layout_marginRight="30dp"
+        android:drawableRight="@mipmap/qj_edit_account"
+        android:gravity="center"
+        android:textColor="@color/qj_account_edit_color"
+        android:textSize="17sp" />
+    <cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.AccountLoginListView
+        android:id="@+id/all_item_1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/ib_edit_account"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="3dp"
+        android:visibility="gone"
+        />
+    <cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.AccountLoginListView
+        android:id="@+id/all_item_2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/all_item_1"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="10dp"
+        android:visibility="gone"
+        />
+    <cn.yyxx.commsdk.impl.merge.platform.hnqj.fragment.widget.AccountLoginListView
+        android:id="@+id/all_item_3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/all_item_2"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="10dp"
+        android:visibility="gone"
+        />
+
+    <TextView
+        android:id="@+id/tv_other_login_type"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="10dp"
+        android:layout_marginBottom="15dp"
+        android:text="@string/qj_other_login_type"
+        android:textColor="@color/qj_text_orange_color"
+        android:textSize="16sp" />
+</RelativeLayout>

+ 36 - 0
library_platform/hnqj/src/main/res/layout/qj_toast_style.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:gravity="center"
+    >
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="46dp"
+        android:background="@drawable/qj_radius_white_1dp"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/toast_iv"
+            android:layout_width="22dp"
+            android:layout_height="22dp"
+            android:layout_marginLeft="10dp"
+            android:layout_gravity="center_vertical"
+             />
+
+        <TextView
+            android:id="@+id/toast_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:maxLines="1"
+            android:layout_marginLeft="10dp"
+            android:layout_marginRight="10dp"
+            android:layout_gravity="center_vertical"
+            android:textColor="#666666"
+            android:textSize="15dp"/>
+    </LinearLayout>
+
+</LinearLayout>

+ 35 - 0
library_platform/hnqj/src/main/res/layout/qj_user_list_item.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="40dp"
+    android:background="@color/qj_white_90"
+    android:id="@+id/rl_item"
+    >
+
+    <TextView
+        android:id="@+id/history_account"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="20dp"
+        android:textSize="18sp"
+        android:textColor="@color/qj_text_black"
+         />
+
+    <ImageView
+        android:id="@+id/item_close"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_marginRight="10dp"
+        android:layout_centerVertical="true"
+        android:src="@mipmap/qj_close"
+        android:padding="10dp"/>
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_alignParentBottom="true"
+        android:background="@color/qj_deepgrey"
+
+        />
+</RelativeLayout>

+ 52 - 0
library_platform/hnqj/src/main/res/layout/qj_usercenter_dialog.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    >
+
+
+
+    <RelativeLayout
+        android:id="@+id/rl1"
+        android:layout_width="520dp"
+        android:layout_height="match_parent"
+
+        >
+
+
+        <WebView
+            android:id="@+id/wb_user_info"
+            android:layout_width="387dp"
+            android:layout_height="match_parent"
+            android:layout_marginTop="22dp"
+            android:layout_marginBottom="22dp"
+            android:layout_centerVertical="true"
+            android:background="@drawable/qj_common_wv_bg"
+            />
+
+        <ImageView
+            android:id="@+id/iv_loading"
+            android:layout_width="21dp"
+            android:layout_height="21dp"
+            android:layout_centerVertical="true"
+            android:layout_marginLeft="184dp"
+            android:background="@mipmap/qj_loading" />
+
+
+        <ImageView
+            android:id="@+id/close_btn"
+            android:layout_width="25dp"
+            android:layout_height="25dp"
+            android:layout_toRightOf="@id/wb_user_info"
+            android:background="@mipmap/qj_usercenter_close"
+            android:layout_marginTop="15dp"
+            android:layout_marginLeft="15dp"
+
+
+            />
+    </RelativeLayout>
+
+
+
+</LinearLayout>

+ 45 - 0
library_platform/hnqj/src/main/res/layout/qj_usercenter_portait_dialog.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:id="@+id/ll_webview_common"
+    >
+
+
+
+    <RelativeLayout
+        android:id="@+id/rl1"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+
+        >
+
+
+        <WebView
+            android:id="@+id/wb_user_info"
+            android:layout_width="350dp"
+            android:layout_height="320dp"
+            android:layout_centerInParent="true"
+            android:layout_marginTop="25dp"
+            android:layout_marginBottom="25dp"
+            android:background="@drawable/qj_common_wv_bg" />
+
+
+        <ImageView
+            android:id="@+id/close_btn"
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:layout_alignRight="@id/wb_user_info"
+            android:layout_alignTop="@id/wb_user_info"
+            android:layout_marginTop="8dp"
+            android:layout_marginRight="8dp"
+            android:src="@mipmap/qj_close"
+            android:padding="8dp"
+
+            />
+    </RelativeLayout>
+
+
+
+</LinearLayout>

+ 45 - 0
library_platform/hnqj/src/main/res/layout/qj_webview_common_dialog.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="360dp"
+    android:layout_height="280dp"
+    android:orientation="vertical"
+    android:id="@+id/ll_webview_common"
+    >
+
+    <RelativeLayout
+        android:id="@+id/rl1"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        >
+
+
+        <WebView
+            android:id="@+id/wb_user_info"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:background="@drawable/qj_common_wv_bg" />
+
+
+        <ImageView
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:layout_centerInParent="true"
+            android:id="@+id/qj_loading"
+            android:background="@mipmap/qj_loading"/>
+        <ImageView
+            android:id="@+id/close_btn"
+            android:layout_width="28dp"
+            android:layout_height="28dp"
+
+            android:src="@mipmap/qj_close"
+            android:layout_alignParentRight="true"
+            android:layout_marginRight="15dp"
+            android:layout_marginTop="15dp"
+            android:padding="6dp"
+            />
+    </RelativeLayout>
+
+
+
+</LinearLayout>

BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_bg.9.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_01.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_02.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_03.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_04.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_05.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_06.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_07.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_08.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_09.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_10.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_11.png


BIN
library_platform/hnqj/src/main/res/mipmap-hdpi/qj_ic_loading_white_12.png


Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor