Selaa lähdekoodia

created wanyue-edu

LC-DIY2020SZCPE\Administrator 4 vuotta sitten
commit
2d4ce120cb
100 muutettua tiedostoa jossa 21531 lisäystä ja 0 poistoa
  1. 14 0
      .gitignore
  2. 1 0
      .idea/.name
  3. 116 0
      .idea/codeStyles/Project.xml
  4. 5 0
      .idea/codeStyles/codeStyleConfig.xml
  5. 21 0
      .idea/encodings.xml
  6. 27 0
      .idea/gradle.xml
  7. 36 0
      .idea/inspectionProfiles/Project_Default.xml
  8. 65 0
      .idea/jarRepositories.xml
  9. 9 0
      .idea/misc.xml
  10. 12 0
      .idea/runConfigurations.xml
  11. 1 0
      app/.gitignore
  12. 71 0
      app/build.gradle
  13. 21 0
      app/proguard-rules.pro
  14. BIN
      app/release/app-release.apk
  15. 1 0
      app/release/output.json
  16. BIN
      app/release/教育1.1.2.apk
  17. 109 0
      app/src/main/AndroidManifest.xml
  18. 32 0
      app/src/main/java/com/wanyue/education/EducationApplication.java
  19. 57 0
      app/src/main/java/com/wanyue/education/InitHelper.java
  20. 96 0
      app/src/main/java/com/wanyue/education/LaunchActivity.java
  21. 71 0
      app/src/main/java/com/wanyue/education/wxapi/WXEntryActivity.java
  22. 46 0
      app/src/main/java/com/wanyue/education/wxapi/WXPayEntryActivity.java
  23. 9 0
      app/src/main/res/drawable/bg_launcher.xml
  24. 170 0
      app/src/main/res/drawable/ic_launcher_background.xml
  25. 16 0
      app/src/main/res/layout/activity_launch.xml
  26. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  27. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  28. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.png
  29. BIN
      app/src/main/res/mipmap-xhdpi/screen.png
  30. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  31. BIN
      app/src/main/res/mipmap-xxhdpi/screen.png
  32. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  33. BIN
      app/src/main/res/mipmap-xxxhdpi/screen.png
  34. 6 0
      app/src/main/res/values/colors.xml
  35. 3 0
      app/src/main/res/values/strings.xml
  36. 13 0
      app/src/main/res/values/styles.xml
  37. 5 0
      app/src/main/res/xml/network_security_config.xml
  38. 43 0
      build.gradle
  39. 1 0
      common/.gitignore
  40. 115 0
      common/build.gradle
  41. BIN
      common/libs/AndroidPicker-1.5.6.jar
  42. BIN
      common/libs/TencentLocationSdk_v6.2.5.3.jar
  43. BIN
      common/libs/TencentMapSDK_1.2.8.1.jar
  44. BIN
      common/libs/alipaySdk-20180601.jar
  45. BIN
      common/libs/commons-io-1.4.jar
  46. 25 0
      common/proguard-rules.pro
  47. 47 0
      common/src/main/AndroidManifest.xml
  48. 14250 0
      common/src/main/assets/city.json
  49. 651 0
      common/src/main/java/com/wanyue/common/CommonAppConfig.java
  50. 85 0
      common/src/main/java/com/wanyue/common/CommonAppContext.java
  51. 199 0
      common/src/main/java/com/wanyue/common/Constants.java
  52. 32 0
      common/src/main/java/com/wanyue/common/HtmlConfig.java
  53. 291 0
      common/src/main/java/com/wanyue/common/activity/AbsActivity.java
  54. 243 0
      common/src/main/java/com/wanyue/common/activity/BaseActivity.java
  55. 64 0
      common/src/main/java/com/wanyue/common/activity/ErrorActivity.java
  56. 283 0
      common/src/main/java/com/wanyue/common/activity/WebViewActivity.java
  57. 105 0
      common/src/main/java/com/wanyue/common/adapter/CommonShareAdapter.java
  58. 90 0
      common/src/main/java/com/wanyue/common/adapter/ImChatFaceAdapter.java
  59. 97 0
      common/src/main/java/com/wanyue/common/adapter/ImChatFacePagerAdapter.java
  60. 101 0
      common/src/main/java/com/wanyue/common/adapter/RefreshAdapter.java
  61. 45 0
      common/src/main/java/com/wanyue/common/adapter/ViewPagerAdapter.java
  62. 66 0
      common/src/main/java/com/wanyue/common/adapter/base/BaseMutiRecyclerAdapter.java
  63. 69 0
      common/src/main/java/com/wanyue/common/adapter/base/BaseReclyViewHolder.java
  64. 109 0
      common/src/main/java/com/wanyue/common/adapter/base/BaseRecyclerAdapter.java
  65. 25 0
      common/src/main/java/com/wanyue/common/adapter/radio/CheckEntity.java
  66. 7 0
      common/src/main/java/com/wanyue/common/adapter/radio/IRadioChecker.java
  67. 99 0
      common/src/main/java/com/wanyue/common/adapter/radio/RadioAdapter.java
  68. 360 0
      common/src/main/java/com/wanyue/common/api/CommonAPI.java
  69. 48 0
      common/src/main/java/com/wanyue/common/bean/AreaBean.java
  70. 36 0
      common/src/main/java/com/wanyue/common/bean/ChargeSuccessBean.java
  71. 151 0
      common/src/main/java/com/wanyue/common/bean/ChatAnchorParam.java
  72. 164 0
      common/src/main/java/com/wanyue/common/bean/ChatAudienceParam.java
  73. 143 0
      common/src/main/java/com/wanyue/common/bean/ChatGiftBean.java
  74. 190 0
      common/src/main/java/com/wanyue/common/bean/ChatReceiveGiftBean.java
  75. 96 0
      common/src/main/java/com/wanyue/common/bean/CoinBean.java
  76. 55 0
      common/src/main/java/com/wanyue/common/bean/CoinPayBean.java
  77. 39 0
      common/src/main/java/com/wanyue/common/bean/ConditionLevel.java
  78. 403 0
      common/src/main/java/com/wanyue/common/bean/ConfigBean.java
  79. 5 0
      common/src/main/java/com/wanyue/common/bean/DataListner.java
  80. 6 0
      common/src/main/java/com/wanyue/common/bean/ExportNamer.java
  81. 25 0
      common/src/main/java/com/wanyue/common/bean/FansUserBean.java
  82. 33 0
      common/src/main/java/com/wanyue/common/bean/LevelBean.java
  83. 25 0
      common/src/main/java/com/wanyue/common/bean/LiveInfo.java
  84. 72 0
      common/src/main/java/com/wanyue/common/bean/SimpleUserBean.java
  85. 92 0
      common/src/main/java/com/wanyue/common/bean/TxLocationBean.java
  86. 103 0
      common/src/main/java/com/wanyue/common/bean/TxLocationPoiBean.java
  87. 467 0
      common/src/main/java/com/wanyue/common/bean/UserBean.java
  88. 73 0
      common/src/main/java/com/wanyue/common/bean/UserItemBean.java
  89. 52 0
      common/src/main/java/com/wanyue/common/bean/XingZuoBean.java
  90. 68 0
      common/src/main/java/com/wanyue/common/bean/commit/BaseObservableField.java
  91. 52 0
      common/src/main/java/com/wanyue/common/bean/commit/CommitEntity.java
  92. 13 0
      common/src/main/java/com/wanyue/common/bean/commit/ObservableInteager.java
  93. 13 0
      common/src/main/java/com/wanyue/common/bean/commit/ObservableLong.java
  94. 13 0
      common/src/main/java/com/wanyue/common/bean/commit/ObservableString.java
  95. 27 0
      common/src/main/java/com/wanyue/common/business/JumpInterceptor.java
  96. 150 0
      common/src/main/java/com/wanyue/common/business/TimeModel.java
  97. 185 0
      common/src/main/java/com/wanyue/common/business/acmannger/ActivityMannger.java
  98. 5 0
      common/src/main/java/com/wanyue/common/business/acmannger/ReleaseListner.java
  99. 192 0
      common/src/main/java/com/wanyue/common/custom/AppBarLayoutBehavior.java
  100. 0 0
      common/src/main/java/com/wanyue/common/custom/BigPageTitleView.java

+ 14 - 0
.gitignore

@@ -0,0 +1,14 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx

+ 1 - 0
.idea/.name

@@ -0,0 +1 @@
+Education

+ 116 - 0
.idea/codeStyles/Project.xml

@@ -0,0 +1,116 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <codeStyleSettings language="XML">
+      <indentOptions>
+        <option name="CONTINUATION_INDENT_SIZE" value="4" />
+      </indentOptions>
+      <arrangement>
+        <rules>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:android</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:id</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:name</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>name</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>style</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>ANDROID_ATTRIBUTE_ORDER</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>.*</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+        </rules>
+      </arrangement>
+    </codeStyleSettings>
+  </code_scheme>
+</component>

+ 5 - 0
.idea/codeStyles/codeStyleConfig.xml

@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
+  </state>
+</component>

+ 21 - 0
.idea/encodings.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/app/src/main/res/mipmap-xxhdpi/screen.png" charset="GBK" />
+    <file url="file://$PROJECT_DIR$/app/src/main/res/xml" charset="GBK" />
+    <file url="file://$PROJECT_DIR$/common/src/main/java/com/wanyue/common/CommonAppConfig.java" charset="GBK" />
+    <file url="file://$PROJECT_DIR$/im" charset="GBK" />
+    <file url="file://$PROJECT_DIR$/im/libs/jcore-android-1.2.7.jar" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/im/libs/jpush-android-3.1.8.jar" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/im/src/main/java/com/wanyue/im/receiver/JPushReceiver.java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/im/src/main/java/com/wanyue/im/utils/ImPushUtil.java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/im/src/main/jniLibs/arm64-v8a/libjcore127.so" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/im/src/main/jniLibs/armeabi-v7a/libjcore127.so" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/im/src/main/res/mipmap-mdpi/btn_to_user.png" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/main/src/main/res/color/fg_btn_login_code.xml" charset="GBK" />
+    <file url="file://$PROJECT_DIR$/main/src/main/res/mipmap-mdpi/icon_main_tab_home_00.png" charset="GBK" />
+    <file url="file://$PROJECT_DIR$/main/src/main/res/mipmap-mdpi/icon_main_tab_home_01.png" charset="GBK" />
+    <file url="file://$PROJECT_DIR$/main/src/main/res/values/arrays.xml" charset="GBK" />
+    <file url="PROJECT" charset="UTF-8" />
+  </component>
+</project>

+ 27 - 0
.idea/gradle.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="testRunner" value="PLATFORM" />
+        <option name="distributionType" value="DEFAULT_WRAPPED" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+            <option value="$PROJECT_DIR$/common" />
+            <option value="$PROJECT_DIR$/detail" />
+            <option value="$PROJECT_DIR$/im" />
+            <option value="$PROJECT_DIR$/inside" />
+            <option value="$PROJECT_DIR$/main" />
+            <option value="$PROJECT_DIR$/mob" />
+            <option value="$PROJECT_DIR$/shop" />
+          </set>
+        </option>
+        <option name="resolveModulePerSourceSet" value="false" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>

+ 36 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,36 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="TOP_LEVEL_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="INNER_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="METHOD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
+        </value>
+      </option>
+      <option name="FIELD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="IGNORE_DEPRECATED" value="false" />
+      <option name="IGNORE_JAVADOC_PERIOD" value="true" />
+      <option name="IGNORE_DUPLICATED_THROWS" value="false" />
+      <option name="IGNORE_POINT_TO_ITSELF" value="false" />
+      <option name="myAdditionalJavadocTags" value="date" />
+    </inspection_tool>
+  </profile>
+</component>

+ 65 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven3" />
+      <option name="name" value="maven3" />
+      <option name="url" value="https://oss.sonatype.org/content/repositories/snapshots" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven2" />
+      <option name="name" value="maven2" />
+      <option name="url" value="https://dl.bintray.com/tencentqcloudterminal/maven" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven5" />
+      <option name="name" value="maven5" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven" />
+      <option name="name" value="maven" />
+      <option name="url" value="https://maven.google.com" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="BintrayJCenter" />
+      <option name="name" value="BintrayJCenter" />
+      <option name="url" value="https://jcenter.bintray.com/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven4" />
+      <option name="name" value="maven4" />
+      <option name="url" value="https://jitpack.io" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="Google" />
+      <option name="name" value="Google" />
+      <option name="url" value="https://dl.google.com/dl/android/maven2/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="E:\Professional\AndroidSDK\extras\google\m2repository" />
+      <option name="name" value="E:\Professional\AndroidSDK\extras\google\m2repository" />
+      <option name="url" value="file:/E:/Professional/AndroidSDK/extras/google/m2repository" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="E:\Professional\AndroidSDK\extras\m2repository" />
+      <option name="name" value="E:\Professional\AndroidSDK\extras\m2repository" />
+      <option name="url" value="file:/E:/Professional/AndroidSDK/extras/m2repository" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="E:\Professional\AndroidSDK\extras\android\m2repository" />
+      <option name="name" value="E:\Professional\AndroidSDK\extras\android\m2repository" />
+      <option name="url" value="file:/E:/Professional/AndroidSDK/extras/android/m2repository" />
+    </remote-repository>
+  </component>
+</project>

+ 9 - 0
.idea/misc.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="Android" />
+  </component>
+</project>

+ 12 - 0
.idea/runConfigurations.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>

+ 1 - 0
app/.gitignore

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

+ 71 - 0
app/build.gradle

@@ -0,0 +1,71 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion rootProject.ext.android.compileSdkVersion
+    buildToolsVersion rootProject.ext.android.buildToolsVersion
+
+    signingConfigs {
+        release {
+            keyAlias 'phonelive'
+            keyPassword 'phonelive'
+            storeFile file('../education.jks')
+            storePassword 'phonelive'
+        }
+    }
+
+
+    defaultConfig {
+        applicationId rootProject.ext.android.applicationId
+        minSdkVersion rootProject.ext.android.minSdkVersion
+        targetSdkVersion rootProject.ext.android.targetSdkVersion
+        versionCode rootProject.ext.android.versionCode
+        versionName rootProject.ext.android.versionName
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        manifestPlaceholders = rootProject.ext.manifestPlaceholders
+
+        multiDexEnabled true
+        ndk {
+            abiFilters "armeabi-v7a","arm64-v8a"
+        }
+        javaCompileOptions {
+            annotationProcessorOptions {
+                arguments = [AROUTER_MODULE_NAME: project.getName()]
+            }
+        }
+    }
+
+
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+        debug {
+            signingConfig signingConfigs.release
+        }
+    }
+}
+
+
+
+
+dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+    api 'com.android.support.constraint:constraint-layout:1.1.3'
+    api 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'
+    api 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.1'
+    api 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'
+    annotationProcessor rootProject.ext.dependencies["butterknife-compiler"]
+    annotationProcessor rootProject.ext.dependencies["arouter-compiler"]
+
+    api project(':main')
+
+    api 'com.github.moduth:blockcanary-android:1.1.0'
+     // 如果只想在debug包看到弹出notification
+    debugApi 'com.github.moduth:blockcanary-ui:1.1.0'
+}

+ 21 - 0
app/proguard-rules.pro

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

BIN
app/release/app-release.apk


+ 1 - 0
app/release/output.json

@@ -0,0 +1 @@
+[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":13,"versionName":"1.1.2","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]

BIN
app/release/教育1.1.2.apk


+ 109 - 0
app/src/main/AndroidManifest.xml

@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.wanyue.education">
+
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+    <uses-permission android:name="android.permission.BLUETOOTH" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-feature android:name="android.hardware.Camera"/>
+    <uses-feature android:name="android.hardware.camera.autofocus" />
+    <uses-permission android:name="android.permission.INTERNET"/>
+    <uses-permission android:name="android.permission.WAKE_LOCK"/>
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
+    <uses-permission android:name="android.permission.NETWORK_PROVIDER"/>
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
+    <uses-permission android:name="android.permission.VIBRATE"/>
+    <uses-permission android:name="android.permission.CAMERA"/>
+    <uses-permission android:name="android.permission.FLASHLIGHT"/>
+    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
+    <uses-permission android:name="android.permission.GET_TASKS"/>
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
+    <uses-permission android:name="android.permission.REORDER_TASKS"/>
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
+    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
+    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
+    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
+    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
+    <uses-permission android:name="com.android.vending.BILLING" />
+    <application
+        android:allowBackup="true"
+        android:name=".EducationApplication"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher"
+        android:supportsRtl="true"
+        android:largeHeap="true"
+        android:networkSecurityConfig="@xml/network_security_config"
+        android:theme="@style/AppTheme">
+        <activity android:name=".LaunchActivity"
+            android:theme="@style/TranslucentAppTheme"
+            >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <meta-data
+            android:name="android.max_aspect"
+            android:value="2.4" />
+
+        <!--微信登录回调页面-->
+        <activity
+            android:name=".wxapi.WXEntryActivity"
+            android:exported="true"
+            android:launchMode="singleTop"
+            android:theme="@android:style/Theme.Translucent.NoTitleBar"
+            />
+        <!--微信支付回调页面-->
+        <activity
+            android:name=".wxapi.WXPayEntryActivity"
+            android:exported="true"
+            android:launchMode="singleTop"
+            android:theme="@android:style/Theme.Translucent.NoTitleBar"
+            />
+
+
+        <!--腾讯地图定位-->
+        <meta-data
+            android:name="TencentMapSDK"
+            android:value="${txMapAppKey}"/>
+        <meta-data
+            android:name="TencentMapAppSecret"
+            android:value="${txMapAppSecret}"/>
+        <!-- 腾讯bugly -->
+        <meta-data
+            android:name="BUGLY_APPID"
+            android:value="${buglyAppId}"/>
+        <meta-data
+            android:name="BUGLY_APP_CHANNEL"
+            android:value="com.wanyueyuedan.phonelive"/>
+        <meta-data
+            android:name="BUGLY_ENABLE_DEBUG"
+            android:value="true"/>
+        <!-- 腾讯bugly end-->
+
+        <!--友盟统计-->
+        <meta-data
+            android:name="UMENG_APPKEY"
+            android:value="${umengAppKey}"/>
+        <meta-data
+            android:name="UMENG_CHANNEL"
+            android:value="com.wanyueyuedan.phonelive"/>
+        <!--友盟统计 end-->
+
+        <!--服务器地址-->
+        <meta-data
+            android:name="SERVER_HOST"
+            android:value="${serverHost}"/>
+    </application>
+
+</manifest>

+ 32 - 0
app/src/main/java/com/wanyue/education/EducationApplication.java

@@ -0,0 +1,32 @@
+package com.wanyue.education;
+
+import com.bumptech.glide.Glide;
+import com.squareup.leakcanary.LeakCanary;
+import com.wanyue.common.CommonAppContext;
+import com.wanyue.common.utils.L;
+import com.wanyue.common.utils.ResourceUtil;
+
+public class EducationApplication extends CommonAppContext {
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        InitHelper initHelper=new InitHelper();
+        initHelper.startInit(this);
+    }
+
+    /*低内存的时候释放掉GLide的缓存*/
+    @Override
+    public void onLowMemory() {
+        super.onLowMemory();
+        Glide.get(getApplicationContext()).clearMemory();
+        ResourceUtil.clearAllDrawable();
+        L.e("onLowMemory==");
+    }
+
+    @Override
+    public void onTrimMemory(int level) {
+        super.onTrimMemory(level);
+        Glide.get(getApplicationContext()).trimMemory(level);
+        L.e("onTrimMemory==");
+    }
+}

+ 57 - 0
app/src/main/java/com/wanyue/education/InitHelper.java

@@ -0,0 +1,57 @@
+package com.wanyue.education;
+
+import android.app.Application;
+import android.content.Context;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.github.moduth.blockcanary.BlockCanary;
+import com.github.moduth.blockcanary.BlockCanaryContext;
+import com.mob.MobSDK;
+import com.squareup.leakcanary.LeakCanary;
+import com.tencent.bugly.crashreport.CrashReport;
+import com.wanyue.common.CommonAppConfig;
+import com.wanyue.common.server.observer.DefaultObserver;
+import com.wanyue.common.utils.L;
+import com.wanyue.common.utils.SystemUtil;
+import com.wanyue.im.utils.ImPushUtil;
+import java.util.concurrent.TimeUnit;
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+
+public class InitHelper {
+
+    public void startInit(final Application context){
+        Observable.timer(1, TimeUnit.SECONDS).
+                observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new DefaultObserver<Long>() {
+                    @Override
+                    public void onNext(Long aLong) {
+                        init(context);
+                    }
+                });
+    }
+
+    private  void init(Application context){
+        boolean isDebug= SystemUtil.isApkInDebug(context);
+        L.setDeBug(isDebug);
+        //初始化腾讯bugly
+        CrashReport.initCrashReport(context);
+        CrashReport.setAppVersion(context, CommonAppConfig.getVersion());
+        //初始化ShareSdk
+        MobSDK.init(context);
+        //初始化极光推送
+        //初始化极光推送
+        ImPushUtil.getInstance().init(context);
+        //ImMessageUtil.getInstance().init();
+        //初始化 ARouter
+        if (isDebug) {
+            ARouter.openLog();
+            ARouter.openDebug();
+            LeakCanary.install(context);
+            if (LeakCanary.isInAnalyzerProcess(context)) {
+                return;
+            }
+        }
+        ARouter.init(EducationApplication.sInstance);
+
+    }
+}

+ 96 - 0
app/src/main/java/com/wanyue/education/LaunchActivity.java

@@ -0,0 +1,96 @@
+package com.wanyue.education;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.widget.ImageView;
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.bumptech.glide.Glide;
+import com.wanyue.common.CommonAppConfig;
+import com.wanyue.common.activity.BaseActivity;
+import com.wanyue.common.api.CommonAPI;
+import com.wanyue.common.bean.ConfigBean;
+import com.wanyue.common.custom.viewanimator.ViewAnimator;
+import com.wanyue.common.glide.ImgLoader;
+import com.wanyue.common.server.observer.DefaultObserver;
+import com.wanyue.common.utils.RouteUtil;
+import com.wanyue.main.view.activity.StudyStageActivity;
+import java.util.concurrent.TimeUnit;
+import butterknife.BindView;
+import io.reactivex.Observable;
+import io.reactivex.ObservableSource;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.functions.Function;
+
+@Route(path = RouteUtil.PATH_LAUNCHER)
+public class LaunchActivity extends BaseActivity {
+    @BindView(R.id.img_cover)
+    ImageView mImgCover;
+    @Override
+    public void init() {
+        Intent intent = getIntent();
+        if (!isTaskRoot()
+                && intent != null
+                && intent.hasCategory(Intent.CATEGORY_LAUNCHER)
+                && intent.getAction() != null
+                && intent.getAction().equals(Intent.ACTION_MAIN)) {
+            finish();
+            return;
+        }
+        ImgLoader.display(this,R.mipmap.screen,mImgCover);
+        startLauncherAnim();
+        startLauncher();
+        //SystemUtil.setSystemUIVisible(this,false);
+    }
+
+
+
+    private  ViewAnimator mViewAnimator;
+    private void startLauncherAnim() {
+        mViewAnimator=ViewAnimator.animate(mImgCover).alpha(0,1).duration(500).start();
+    }
+
+    /*开始启动方法*/
+    private void startLauncher() {
+        /*倒计时开始*/
+        Observable.timer(1, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread()).flatMap(new Function<Long, ObservableSource<ConfigBean>>() {
+            @Override
+            public ObservableSource<ConfigBean> apply(Long aLong) throws Exception {
+                return CommonAPI.getConfig();
+            }
+        }).compose(this.bindUntilOnDestoryEvent())
+                .subscribe(new DefaultObserver<ConfigBean>() {
+            @Override
+            public void onNext(ConfigBean configBean) {
+                if(CommonAppConfig.isNoGradeId()){
+                    startActivity(StudyStageActivity.class);
+                }else{
+                    RouteUtil.forwardMain(LaunchActivity.this);
+                }
+                finish();
+            }
+        });
+    }
+
+    /*判断是否登录了*/
+    private boolean checkLogined() {
+        String uid= CommonAppConfig.getUid();
+        String token=CommonAppConfig.getToken();
+        return !TextUtils.isEmpty(uid)&&!TextUtils.isEmpty(token);
+    }
+
+    @Override
+    public int getLayoutId() {
+        return R.layout.activity_launch;
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if(mViewAnimator!=null){
+           mViewAnimator.cancel();
+        }
+    }
+}

+ 71 - 0
app/src/main/java/com/wanyue/education/wxapi/WXEntryActivity.java

@@ -0,0 +1,71 @@
+/*
+ * 官网地站:http://www.mob.com
+ * 技术支持QQ: 4006852216
+ * 官方微信:ShareSDK   (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
+ *
+ * Copyright (c) 2013年 mob.com. All rights reserved.
+ */
+
+package com.wanyue.education.wxapi;
+
+import android.content.Intent;
+import android.widget.Toast;
+
+import com.tencent.mm.opensdk.constants.ConstantsAPI;
+import com.tencent.mm.opensdk.modelbase.BaseResp;
+import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram;
+
+import cn.sharesdk.wechat.utils.WXAppExtendObject;
+import cn.sharesdk.wechat.utils.WXMediaMessage;
+import cn.sharesdk.wechat.utils.WechatHandlerActivity;
+
+/** 微信客户端回调activity示例 */
+public class WXEntryActivity extends WechatHandlerActivity {
+
+	/**
+	 * 处理微信发出的向第三方应用请求app message
+	 * <p>
+	 * 在微信客户端中的聊天页面有“添加工具”,可以将本应用的图标添加到其中
+	 * 此后点击图标,下面的代码会被执行。Demo仅仅只是打开自己而已,但你可
+	 * 做点其他的事情,包括根本不打开任何页面
+	 */
+	@Override
+	public void onGetMessageFromWXReq(WXMediaMessage msg) {
+//		if (msg != null) {
+//			Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName());
+//			startActivity(iLaunchMyself);
+//		}
+	}
+
+	/**
+	 * 处理微信向第三方应用发起的消息
+	 * <p>
+	 * 此处用来接收从微信发送过来的消息,比方说本demo在wechatpage里面分享
+	 * 应用时可以不分享应用文件,而分享一段应用的自定义信息。接受方的微信
+	 * 客户端会通过这个方法,将这个信息发送回接收方手机上的本demo中,当作
+	 * 回调。
+	 * <p>
+	 * 本Demo只是将信息展示出来,但你可做点其他的事情,而不仅仅只是Toast
+	 */
+	@Override
+	public void onShowMessageFromWXReq(WXMediaMessage msg) {
+		if (msg != null && msg.mediaObject != null
+				&& (msg.mediaObject instanceof WXAppExtendObject)) {
+			WXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject;
+			Toast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show();
+		}
+	}
+
+
+
+	public void onResp(BaseResp resp) {
+		if (resp.getType() == ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM) {
+			WXLaunchMiniProgram.Resp launchMiniProResp = (WXLaunchMiniProgram.Resp) resp;
+			String extraData =launchMiniProResp.extMsg; //对应小程序组件 <button open-type="launchApp"> 中的 app-parameter 属性
+
+			Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
+
+			this.startActivity(intent);
+		}
+	}
+}

+ 46 - 0
app/src/main/java/com/wanyue/education/wxapi/WXPayEntryActivity.java

@@ -0,0 +1,46 @@
+package com.wanyue.education.wxapi;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import com.tencent.mm.opensdk.modelbase.BaseReq;
+import com.tencent.mm.opensdk.modelbase.BaseResp;
+import com.tencent.mm.opensdk.openapi.IWXAPI;
+import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
+import com.wanyue.common.pay.wx.WxApiWrapper;
+
+import org.greenrobot.eventbus.EventBus;
+
+
+/**
+ * 微信支付的回调页面
+ */
+public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
+
+    private IWXAPI api;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        api = WxApiWrapper.getInstance().getWxApi();
+        api.handleIntent(getIntent(), this);
+    }
+
+    @Override
+    protected void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        setIntent(intent);
+        api.handleIntent(intent, this);
+    }
+
+    @Override
+    public void onReq(BaseReq req) {
+    }
+
+    @Override
+    public void onResp(BaseResp resp) {
+        EventBus.getDefault().post(resp);
+        finish();
+    }
+
+}

+ 9 - 0
app/src/main/res/drawable/bg_launcher.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <bitmap
+            android:scaleType="centerCrop"
+            android:src="@mipmap/screen"
+            android:tileMode="disabled" />
+    </item>
+</layer-list>

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

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

+ 16 - 0
app/src/main/res/layout/activity_launch.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".LaunchActivity">
+
+    <ImageView
+        android:id="@+id/img_cover"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="centerCrop"
+        android:alpha="0"
+        />
+
+</FrameLayout>

BIN
app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xhdpi/screen.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xxhdpi/screen.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xxxhdpi/screen.png


+ 6 - 0
app/src/main/res/values/colors.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="colorPrimary">#008577</color>
+    <color name="colorPrimaryDark">#00574B</color>
+    <color name="colorAccent">#D81B60</color>
+</resources>

+ 3 - 0
app/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">万岳教育</string>
+</resources>

+ 13 - 0
app/src/main/res/values/styles.xml

@@ -0,0 +1,13 @@
+<resources>
+    <style name="TranslucentAppTheme" parent="AppTheme">
+        <item name="android:navigationBarColor">@color/transparent</item>
+        <item name="android:statusBarColor">@color/transparent</item>
+    </style>
+
+  <!--  <item name="android:windowAnimationStyle">@null</item>
+    &lt;!&ndash;设置窗口的背景为透明,设置透明背景必须要设置此项&ndash;&gt;
+    <item name="android:windowBackground">@color/transparent</item>
+    &lt;!&ndash;设置窗口的背景是否为半透明,设置透明背景必须要设置此项&ndash;&gt;
+    <item name="android:windowIsTranslucent">false</item>
+    设置状态栏的背景为半透明-->
+</resources>

+ 5 - 0
app/src/main/res/xml/network_security_config.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<network-security-config>             
+    <base-config cleartextTrafficPermitted="true"/> 
+
+</network-security-config>

+ 43 - 0
build.gradle

@@ -0,0 +1,43 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+apply from: "config.gradle"
+
+buildscript {
+    repositories {
+        maven {
+            url "https://maven.google.com"
+        }
+        google()
+        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+        maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
+
+        jcenter()
+
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:3.2.0'
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+        classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0'
+    }
+}
+
+allprojects {
+    repositories {
+        google()
+        maven {
+            url "https://maven.google.com"
+        }
+        maven{
+            url "https://dl.bintray.com/tencentqcloudterminal/maven"
+        }
+        maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
+
+        maven { url "https://jitpack.io" }
+        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+        jcenter()
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}

+ 1 - 0
common/.gitignore

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

+ 115 - 0
common/build.gradle

@@ -0,0 +1,115 @@
+apply plugin: 'com.android.library'
+apply plugin: 'com.jakewharton.butterknife'
+
+android {
+    compileSdkVersion rootProject.ext.android.compileSdkVersion
+    buildToolsVersion rootProject.ext.android.buildToolsVersion
+
+    defaultConfig {
+        minSdkVersion rootProject.ext.android.minSdkVersion
+        targetSdkVersion rootProject.ext.android.targetSdkVersion
+        versionCode rootProject.ext.android.versionCode
+        versionName rootProject.ext.android.versionName
+        ndk {
+            abiFilters "armeabi-v7a","arm64-v8a"
+        }
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+    aaptOptions {
+        cruncherEnabled = false
+        useNewCruncher = false
+    }
+}
+repositories {
+    flatDir {
+        dirs 'libs','../libs'
+    }
+}
+dependencies {
+    api fileTree(include: ['*.jar'], dir: 'libs')
+    api rootProject.ext.dependencies["appcompat-v7"]
+    api rootProject.ext.dependencies["recyclerview-v7"]
+    api rootProject.ext.dependencies["cardview-v7"]
+    api rootProject.ext.dependencies["design"]
+    api rootProject.ext.dependencies["multidex"]
+    api files('libs/commons-io-1.4.jar')
+    //okHttp网络请求
+    api rootProject.ext.dependencies["okhttp"]
+    //OkGo 是对okHttp的封装
+    api rootProject.ext.dependencies["okgo"]
+    //OkGo上传下载扩展库
+    api rootProject.ext.dependencies["okserver"]
+    //fastJson解析json
+    api rootProject.ext.dependencies["fastjson"]
+    //eventbus事件总线
+    api rootProject.ext.dependencies["eventbus"]
+    //使用Glide加载图片
+    api rootProject.ext.dependencies["glide"]
+    //一个基于Glide的transformation库,拥有裁剪,着色,模糊,滤镜等多种转换效果
+    api rootProject.ext.dependencies["glide-transformations"]
+    //带圆角,边框的的ImageView
+    api rootProject.ext.dependencies["roundedimageview"]
+    //gif库,播放礼物gif用
+    api rootProject.ext.dependencies["gif-drawable"]
+    //svga播放器
+    api rootProject.ext.dependencies["SVGAPlayer"]
+    //七牛云存储
+    api rootProject.ext.dependencies["qiniu-sdk"]
+    //腾讯云存储
+    api rootProject.ext.dependencies["tencent-cosxml"]
+    //微信sdk,支付登录分享
+    api rootProject.ext.dependencies["tencent-wechat-sdk"]
+    //腾讯bugly
+    api rootProject.ext.dependencies["tencent-bugly"]
+    //友盟统计
+    api rootProject.ext.dependencies["umeng-common"]
+    //友盟统计
+    api rootProject.ext.dependencies["umeng-analytics"]
+    //图片裁剪
+    api rootProject.ext.dependencies["ucrop"]
+    //轮播图
+    api rootProject.ext.dependencies["banner"]
+    //鲁班
+    api rootProject.ext.dependencies["Luban"]
+    //支付宝sdk
+    api files('libs/alipaySdk-20180601.jar')
+    //腾讯定位,地图sdk
+    api files('libs/TencentLocationSdk_v6.2.5.3.jar')
+    api files('libs/TencentMapSDK_1.2.8.1.jar')
+    //下拉刷新上拉加载
+    api rootProject.ext.dependencies["smartRefreshLayout"]
+    //ViewPager指示器
+    api rootProject.ext.dependencies["magicIndicator"]
+    //shareSDK
+    api project(':mob')
+
+    //一个Picker控件,选择日期,城市用
+    api files('libs/AndroidPicker-1.5.6.jar')
+    //阿里 ARouter
+    api rootProject.ext.dependencies["arouter"]
+    //流式布局 flowlayout
+    api rootProject.ext.dependencies["flowlayout"]
+    //api 'com.squareup.leakcanary:leakcanary-android:1.6.3'
+    //谷歌支付
+    //api 'com.google.firebase:firebase-messaging:18.0.0'
+    api 'com.android.billingclient:billing:1.1'
+    api 'com.android.support.constraint:constraint-layout:1.1.3'
+    api 'io.reactivex.rxjava2:rxandroid:2.0.1'
+    api 'io.reactivex.rxjava2:rxjava:2.1.7'
+    api 'com.trello.rxlifecycle2:rxlifecycle:2.1.0'
+    api 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
+    api 'com.readystatesoftware.chuck:library:1.0.4'
+    api 'com.lzy.net:okrx2:2.0.2'
+    api 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50'
+    api 'com.jakewharton:butterknife:8.8.1'
+    annotationProcessor rootProject.ext.dependencies["butterknife-compiler"]
+    debugApi 'com.squareup.leakcanary:leakcanary-android:1.6.3'
+    releaseApi 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3'
+    api 'com.jeremyliao:live-event-bus:1.5.7'
+    compile 'io.github.meetsl:SCardView:1.0'
+}

BIN
common/libs/AndroidPicker-1.5.6.jar


BIN
common/libs/TencentLocationSdk_v6.2.5.3.jar


BIN
common/libs/TencentMapSDK_1.2.8.1.jar


BIN
common/libs/alipaySdk-20180601.jar


BIN
common/libs/commons-io-1.4.jar


+ 25 - 0
common/proguard-rules.pro

@@ -0,0 +1,25 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/macpro/Library/Android/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# 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

+ 47 - 0
common/src/main/AndroidManifest.xml

@@ -0,0 +1,47 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.wanyue.common">
+
+    <application
+        android:allowBackup="true"
+        >
+        <activity
+            android:name=".activity.WebViewActivity"
+            android:screenOrientation="portrait"
+            android:launchMode="singleTop"
+            />
+
+        <activity
+            android:name="com.yalantis.ucrop.UCropActivity"
+            android:screenOrientation="portrait"
+            />
+
+        <!--Android 7.0 拍照要用这个-->
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="com.wanyue.education.fileprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths"/>
+        </provider>
+
+        <!--支付宝-->
+        <activity
+            android:name="com.alipay.sdk.app.H5PayActivity"
+            android:configChanges="orientation|keyboardHidden|navigation|screenSize"
+            android:exported="false"
+            android:screenOrientation="portrait"
+            android:windowSoftInputMode="adjustResize|stateHidden">
+        </activity>
+        <activity
+            android:name="com.alipay.sdk.app.H5AuthActivity"
+            android:configChanges="orientation|keyboardHidden|navigation"
+            android:exported="false"
+            android:screenOrientation="portrait"
+            android:windowSoftInputMode="adjustResize|stateHidden">
+        </activity>
+        <!--支付宝 end-->
+    </application>
+
+</manifest>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 14250 - 0
common/src/main/assets/city.json


+ 651 - 0
common/src/main/java/com/wanyue/common/CommonAppConfig.java

@@ -0,0 +1,651 @@
+package com.wanyue.common;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Environment;
+import android.text.TextUtils;
+import android.util.SparseArray;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.jeremyliao.liveeventbus.LiveEventBus;
+import com.wanyue.common.bean.ConfigBean;
+import com.wanyue.common.bean.LevelBean;
+import com.wanyue.common.bean.UserBean;
+import com.wanyue.common.bean.UserItemBean;
+import com.wanyue.common.utils.L;
+import com.wanyue.common.utils.SpUtil;
+import com.wanyue.common.utils.StringUtil;
+import com.wanyue.common.utils.SystemUtil;
+import com.wanyue.common.utils.VersionUtil;
+import com.wanyue.common.utils.WordUtil;
+
+import org.greenrobot.eventbus.EventBus;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by cxf on 2017/8/4.
+ */
+
+public class CommonAppConfig {
+    //域名
+    public static final String HOST = getMetaDataString("SERVER_HOST");
+    //外部sd卡
+    public static final String DCMI_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath();
+    //内部存储 /data/data/<application package>/files目录
+    public static final String INNER_PATH = CommonAppContext.sInstance.getFilesDir().getAbsolutePath();
+    //文件夹名字
+    private static final String DIR_NAME = "yunbaoEd";
+    //保存视频的时候,在sd卡存储短视频的路径DCIM下
+    public static final String VIDEO_PATH = DCMI_PATH + "/" + DIR_NAME + "/video/";
+    public static final String DOWN_LOAD_PATH = DCMI_PATH + "/" + DIR_NAME + "/download/";
+
+    public static final String VIDEO_RECORD_TEMP_PATH = VIDEO_PATH + "recordParts";
+    //下载贴纸的时候保存的路径
+    public static final String VIDEO_TIE_ZHI_PATH = DCMI_PATH + "/" + DIR_NAME + "/tieZhi/";
+    //下载音乐的时候保存的路径
+    public static final String MUSIC_PATH = DCMI_PATH + "/" + DIR_NAME + "/music/";
+    //拍照时图片保存路径
+    public static final String CAMERA_IMAGE_PATH = DCMI_PATH + "/" + DIR_NAME + "/camera/";
+    public static final String GIF_PATH = INNER_PATH + "/gif/";
+    //QQ登录是否与PC端互通
+    public static final boolean QQ_LOGIN_WITH_PC = true;
+    public static final boolean APP_IS_YUNBAO_SELF = false;
+
+    public static final String APP_VERSION = VersionUtil.getVersion();//app版本号
+    public static final String SYSTEM_MODEL = android.os.Build.MODEL;//手机型号
+    public static final String SYSTEM_RELEASE = android.os.Build.VERSION.RELEASE;//手机系统版本号
+    public static int TX_IM_APP_Id;
+
+    private static int windowWidth;
+    private static int windowHeight;
+
+    private static int statuBarHeight;
+    private static int navigationBarHeight;
+
+    public static final String NOT_LOGIN_UID="0";
+
+    private CommonAppConfig() {
+
+    }
+
+    private static String mUid;
+    private static String mToken;
+    private static ConfigBean mConfig;
+    private static double mLng;
+    private static double mLat;
+    private static String mProvince;//省
+    private static String mCity;//市
+    private static String mDistrict;//区
+    private static UserBean mUserBean;
+    private static String mVersion;
+    private static boolean mLoginIM;//IM是否登录了
+    private static Boolean mLaunched;//App是否启动了
+    private static Long mLaunchTime;//MainActivity打开的时间戳,极光IM用到
+    private static String mJPushAppKey;//极光推送的AppKey
+    private static List<UserItemBean> mUserItemList;//个人中心功能列表
+    private static SparseArray<LevelBean> mLevelMap;
+    private static SparseArray<LevelBean> mAnchorLevelMap;
+    private static String mTxMapAppKey;//腾讯定位,地图的AppKey
+    private static String mTxMapAppSecret;//腾讯地图的AppSecret
+    private static boolean mFrontGround;
+    private static String mAppName;
+    private static Boolean mTiBeautyEnable;//是否使用萌颜 true使用萌颜 false 使用基础美颜
+
+    private static String mGradeName;
+    private static String mGradeId;
+
+    public static String getUid() {
+        if (TextUtils.isEmpty(mUid)) {
+            String[] uidAndToken = SpUtil.getInstance()
+                    .getMultiStringValue(new String[]{SpUtil.UID, SpUtil.TOKEN});
+            if (uidAndToken != null) {
+                if (!TextUtils.isEmpty(uidAndToken[0]) && !TextUtils.isEmpty(uidAndToken[1])) {
+                    mUid = uidAndToken[0];
+                    mToken = uidAndToken[1];
+                }
+            }
+        }
+
+        if(mUid==null){
+            mUid=NOT_LOGIN_UID;
+        }
+
+        return mUid;
+    }
+
+
+    public static int getIntegerUid(){
+        String uid=getUid();
+        if(StringUtil.isInt(uid)){
+           return Integer.parseInt(uid);
+        }
+        return 0;
+    }
+
+
+    public static String getToken() {
+        return mToken;
+    }
+
+    public static String getCoinName() {
+        ConfigBean configBean = getConfig();
+        if (configBean != null) {
+            return configBean.getCoinName();
+        }
+        return Constants.DIAMONDS;
+    }
+
+    public static String getVotesName() {
+        ConfigBean configBean = getConfig();
+        if (configBean != null) {
+            return configBean.getVotesName();
+        }
+        return Constants.VOTES;
+    }
+
+    public static ConfigBean getConfig() {
+        if (mConfig == null) {
+            String configString = SpUtil.getInstance().getStringValue(SpUtil.CONFIG);
+            if (!TextUtils.isEmpty(configString)) {
+                mConfig = JSON.parseObject(configString, ConfigBean.class);
+            }
+        }
+        return mConfig;
+    }
+
+    public static void setConfig(ConfigBean config) {
+        if(config!=null){
+         mConfig = config;
+         SpUtil.getInstance().setStringValue(SpUtil.CONFIG,JSON.toJSONString(config));
+        }
+
+    }
+
+    /**
+     * 经度
+     */
+    public static double getLng() {
+        if (mLng == 0) {
+            String lng = SpUtil.getInstance().getStringValue(SpUtil.LOCATION_LNG);
+            if (!TextUtils.isEmpty(lng)) {
+                try {
+                    mLng = Double.parseDouble(lng);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return mLng;
+    }
+
+
+    /**
+     * 纬度
+     */
+
+    public static double getLat() {
+        if (mLat == 0) {
+            String lat = SpUtil.getInstance().getStringValue(SpUtil.LOCATION_LAT);
+            if (!TextUtils.isEmpty(lat)) {
+                try {
+                    mLat = Double.parseDouble(lat);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return mLat;
+    }
+
+    /**
+     * 省
+     */
+    public static String getProvince() {
+        if (TextUtils.isEmpty(mProvince)) {
+            mProvince = SpUtil.getInstance().getStringValue(SpUtil.LOCATION_PROVINCE);
+        }
+        return mProvince == null ? "" : mProvince;
+    }
+
+    /**
+     * 市
+     */
+    public static String getCity() {
+        if (TextUtils.isEmpty(mCity)) {
+            mCity = SpUtil.getInstance().getStringValue(SpUtil.LOCATION_CITY);
+        }
+        return mCity == null ? "" : mCity;
+    }
+
+    /**
+     * 区
+     */
+    public static String getDistrict() {
+        if (TextUtils.isEmpty(mDistrict)) {
+            mDistrict = SpUtil.getInstance().getStringValue(SpUtil.LOCATION_DISTRICT);
+        }
+        return mDistrict == null ? "" : mDistrict;
+    }
+
+    public static void setUserBean(UserBean bean) {
+        if(bean!=null){
+            mUserBean = bean;
+            SpUtil.getInstance().setStringValue(SpUtil.USER_INFO,JSON.toJSONString(mUserBean));
+        }
+    }
+
+    public static UserBean getUserBean() {
+        if (mUserBean == null) {
+            String userBeanJson = SpUtil.getInstance().getStringValue(SpUtil.USER_INFO);
+            if (!TextUtils.isEmpty(userBeanJson)) {
+                mUserBean = JSON.parseObject(userBeanJson, UserBean.class);
+            }
+        }
+        return mUserBean;
+    }
+
+
+    public static boolean isSelf(UserBean userBean){
+        if(userBean!=null&&getUserBean()!=null){
+            return  getUserBean().equals(userBean);
+        }
+        return false;
+    }
+
+    /**
+     * 设置萌颜是否可用
+     */
+    public static void setTiBeautyEnable(boolean tiBeautyEnable) {
+        mTiBeautyEnable = tiBeautyEnable;
+        SpUtil.getInstance().setBooleanValue(SpUtil.TI_BEAUTY_ENABLE, tiBeautyEnable);
+    }
+
+    public static boolean isTiBeautyEnable() {
+        if (mTiBeautyEnable == null) {
+            mTiBeautyEnable = SpUtil.getInstance().getBooleanValue(SpUtil.TI_BEAUTY_ENABLE);
+        }
+        return mTiBeautyEnable;
+    }
+
+    /**
+     * 设置登录信息
+     */
+    public static void setLoginInfo(String uid, String token, boolean save) {
+        L.e("登录成功", "uid------>" + uid);
+        L.e("登录成功", "token------>" + token);
+        mUid = uid;
+        mToken = token;
+        if (save) {
+            Map<String, String> map = new HashMap<>();
+            map.put(SpUtil.UID, uid);
+            map.put(SpUtil.TOKEN, token);
+            SpUtil.getInstance().setMultiStringValue(map);
+        }
+    }
+
+    /**
+     * 清除登录信息
+     */
+    public static void clearLoginInfo() {
+        mUid = null;
+        mToken = null;
+        mLoginIM = false;
+        SpUtil.getInstance().removeValue(
+                SpUtil.UID, SpUtil.TOKEN, SpUtil.USER_INFO, SpUtil.TX_IM_USER_SIGN, SpUtil.IM_LOGIN
+        );
+    }
+
+
+    /**
+     * 设置位置信息
+     *
+     * @param lng      经度
+     * @param lat      纬度
+     * @param province 省
+     * @param city     市
+     */
+    public static  void setLocationInfo(double lng, double lat, String province, String city, String district) {
+        mLng = lng;
+        mLat = lat;
+        mProvince = province;
+        mCity = city;
+        mDistrict = district;
+        Map<String, String> map = new HashMap<>();
+        map.put(SpUtil.LOCATION_LNG, String.valueOf(lng));
+        map.put(SpUtil.LOCATION_LAT, String.valueOf(lat));
+        map.put(SpUtil.LOCATION_PROVINCE, province);
+        map.put(SpUtil.LOCATION_CITY, city);
+        map.put(SpUtil.LOCATION_DISTRICT, district);
+        SpUtil.getInstance().setMultiStringValue(map);
+    }
+
+    /**
+     * 清除定位信息
+     */
+    public static  void clearLocationInfo() {
+        mLng = 0;
+        mLat = 0;
+        mProvince = null;
+        mCity = null;
+        mDistrict = null;
+        SpUtil.getInstance().removeValue(
+                SpUtil.LOCATION_LNG,
+                SpUtil.LOCATION_LAT,
+                SpUtil.LOCATION_PROVINCE,
+                SpUtil.LOCATION_CITY,
+                SpUtil.LOCATION_DISTRICT);
+
+    }
+
+
+    public static  boolean isLoginIM() {
+        return mLoginIM;
+    }
+
+    public static  void setLoginIM(boolean loginIM) {
+        mLoginIM = loginIM;
+    }
+
+    /**
+     * 获取版本号
+     */
+    public static  String getVersion() {
+        if (TextUtils.isEmpty(mVersion)) {
+            try {
+                PackageManager manager = CommonAppContext.sInstance.getPackageManager();
+                PackageInfo info = manager.getPackageInfo(CommonAppContext.sInstance.getPackageName(), 0);
+                mVersion = info.versionName;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return mVersion;
+    }
+
+    /**
+     * 获取App名称
+     */
+    public static  String getAppName() {
+        if (TextUtils.isEmpty(mAppName)) {
+            mAppName = WordUtil.getString(R.string.app_name);
+        }
+        return mAppName;
+    }
+
+
+    /**
+     * 获取MetaData中的极光AppKey
+     */
+    public static String getJPushAppKey() {
+        if (mJPushAppKey == null) {
+            mJPushAppKey = getMetaDataString("JPUSH_APPKEY");
+        }
+        return mJPushAppKey;
+    }
+
+
+    /**
+     * 获取MetaData中的腾讯定位,地图的AppKey
+     *
+     * @return
+     */
+    public static  String getTxMapAppKey() {
+        if (mTxMapAppKey == null) {
+            mTxMapAppKey = getMetaDataString("TencentMapSDK");
+        }
+        return mTxMapAppKey;
+    }
+
+
+    /**
+     * 获取MetaData中的腾讯定位,地图的AppSecret
+     *
+     * @return
+     */
+    public static String getTxMapAppSecret() {
+        if (mTxMapAppSecret == null) {
+            mTxMapAppSecret = getMetaDataString("TencentMapAppSecret");
+        }
+        return mTxMapAppSecret;
+    }
+
+
+    public static String getMetaDataString(String key) {
+        String res = null;
+        try {
+            ApplicationInfo appInfo = CommonAppContext.sInstance.getPackageManager().getApplicationInfo(CommonAppContext.sInstance.getPackageName(), PackageManager.GET_META_DATA);
+            res = appInfo.metaData.getString(key);
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+        }
+        return res;
+    }
+
+
+    /**
+     * 个人中心功能列表
+     */
+    public static  List<UserItemBean> getUserItemList() {
+        if (mUserItemList == null || mUserItemList.size() == 0) {
+            String userBeanJson = SpUtil.getInstance().getStringValue(SpUtil.USER_INFO);
+            if (!TextUtils.isEmpty(userBeanJson)) {
+                JSONObject obj = JSON.parseObject(userBeanJson);
+                if (obj != null) {
+                    setUserItemList(obj.getString("list"));
+                }
+            }
+        }
+        return mUserItemList;
+    }
+
+
+    public static void setUserItemList(String listString) {
+        if (!TextUtils.isEmpty(listString)) {
+            try {
+                mUserItemList = JSON.parseArray(listString, UserItemBean.class);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+    /**
+     * 保存用户等级信息
+     */
+    public static void setLevel(String levelJson) {
+        if (TextUtils.isEmpty(levelJson)) {
+            return;
+        }
+        List<LevelBean> list = JSON.parseArray(levelJson, LevelBean.class);
+        if (list == null || list.size() == 0) {
+            return;
+        }
+        if (mLevelMap == null) {
+            mLevelMap = new SparseArray<>();
+        }
+        mLevelMap.clear();
+        for (LevelBean bean : list) {
+            mLevelMap.put(bean.getLevel(), bean);
+        }
+    }
+
+    /**
+     * 保存主播等级信息
+     */
+    public static  void setAnchorLevel(String anchorLevelJson) {
+        if (TextUtils.isEmpty(anchorLevelJson)) {
+            return;
+        }
+        List<LevelBean> list = JSON.parseArray(anchorLevelJson, LevelBean.class);
+        if (list == null || list.size() == 0) {
+            return;
+        }
+        if (mAnchorLevelMap == null) {
+            mAnchorLevelMap = new SparseArray<>();
+        }
+        mAnchorLevelMap.clear();
+        for (LevelBean bean : list) {
+            mAnchorLevelMap.put(bean.getLevel(), bean);
+        }
+    }
+
+    /**
+     * 获取用户等级
+     */
+    public static LevelBean getLevel(int level) {
+        if (mLevelMap == null) {
+            String configString = SpUtil.getInstance().getStringValue(SpUtil.CONFIG);
+            if (!TextUtils.isEmpty(configString)) {
+                JSONObject obj = JSON.parseObject(configString);
+                setLevel(obj.getString("level"));
+            }
+        }
+
+        if (mLevelMap == null) {
+            return null;
+        }
+        int size = mLevelMap.size();
+        if (size == 0) {
+            return null;
+        }
+        return mLevelMap.get(level);
+    }
+
+
+    public static String getGradeName() {
+        if(TextUtils.isEmpty(mGradeName)){
+            mGradeName=SpUtil.getInstance().getStringValue("GradeName");
+        }
+        return mGradeName;
+    }
+
+    public static void setGradeName(String gradeName) {
+        if(!TextUtils.isEmpty(gradeName)){
+           CommonAppConfig.mGradeName = gradeName;
+           SpUtil.getInstance().setStringValue("GradeName",gradeName);
+        }
+    }
+
+
+    public static String getGradeId() {
+        if(TextUtils.isEmpty(mGradeId)){
+           mGradeId=SpUtil.getInstance().getStringValue("GradeId");
+           if(TextUtils.isEmpty(mGradeId)){
+             mGradeId="0";
+           }
+        }
+        return mGradeId;
+    }
+
+    public static boolean isNoGradeId(){
+        return StringUtil.equals(getGradeId(),"0");
+    }
+
+    public static void setGradeId(String id){
+        setGradeId(id,true);
+    }
+    public static void setGradeId(String id,boolean needNotify){
+        if(!TextUtils.isEmpty(id)){
+            SpUtil.getInstance().setStringValue("GradeId",id);
+            CommonAppConfig.mGradeId = id;
+            if(needNotify){
+               LiveEventBus.get(Constants.EVENT_GRADE).post(true);
+            }
+        }
+    }
+
+
+
+    /**
+     * 判断某APP是否安装
+     */
+    public static boolean isAppExist(String packageName) {
+        if (!TextUtils.isEmpty(packageName)) {
+            PackageManager manager = CommonAppContext.sInstance.getPackageManager();
+            List<PackageInfo> list = manager.getInstalledPackages(0);
+            for (PackageInfo info : list) {
+                if (packageName.equalsIgnoreCase(info.packageName)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+
+    public static  boolean isLaunched() {
+        if (mLaunched == null) {
+            mLaunched = SpUtil.getInstance().getBooleanValue(SpUtil.APP_LAUNCHED);
+        }
+        return mLaunched;
+    }
+
+    public static  void setLaunched(boolean launched) {
+        mLaunched = launched;
+        SpUtil.getInstance().setBooleanValue(SpUtil.APP_LAUNCHED, launched);
+    }
+
+
+    public static  Long getLaunchTime() {
+        if (mLaunchTime == null) {
+            mLaunched = SpUtil.getInstance().getBooleanValue(SpUtil.APP_LAUNCHED);
+        }
+        return mLaunchTime;
+    }
+
+    public static  void setLaunchTime(Long launchTime) {
+        SpUtil.getInstance().setLongValue(SpUtil.APP_LAUNCHED_TIME, launchTime);
+        mLaunchTime = launchTime;
+    }
+
+    //app是否在前台
+    public static  boolean isFrontGround() {
+        return mFrontGround;
+    }
+
+    //app是否在前台
+    public static void setFrontGround(boolean frontGround) {
+        mFrontGround = frontGround;
+    }
+
+    public static int statuBarHeight() {
+        if(statuBarHeight==0){
+           statuBarHeight=SystemUtil.getStatusBarHeight(CommonAppContext.sInstance);
+        }
+        return statuBarHeight;
+    }
+
+    public static int navigationBarHeight() {
+        if(navigationBarHeight==0){
+            navigationBarHeight=SystemUtil.getNavigationBarHeight(CommonAppContext.sInstance);
+        }
+        return navigationBarHeight;
+    }
+
+    public static int getWindowWidth() {
+        if(windowWidth==0){
+            windowWidth= SystemUtil.getWindowsPixelWidth(CommonAppContext.sInstance);
+        }
+        return windowWidth;
+    }
+
+    public static int getWindowHeight() {
+        if(windowHeight==0){
+            windowHeight= SystemUtil.getWindowsPixelHeight(CommonAppContext.sInstance);
+        }
+        return windowHeight;
+    }
+
+    public static boolean isLogin() {
+      if (NOT_LOGIN_UID.equals(getUid()) || TextUtils.isEmpty(mToken)) {
+            return false;
+       }
+        return true;
+    }
+
+}

+ 85 - 0
common/src/main/java/com/wanyue/common/CommonAppContext.java

@@ -0,0 +1,85 @@
+package com.wanyue.common;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.multidex.MultiDex;
+import android.support.multidex.MultiDexApplication;
+import com.wanyue.common.http.CommonHttpUtil;
+import com.wanyue.common.utils.L;
+import com.wanyue.common.utils.UMengUtil;
+
+/**
+ * Created by cxf on 2017/8/3.
+ */
+
+public class CommonAppContext extends MultiDexApplication {
+
+    public static CommonAppContext sInstance;
+    private int mCount;
+    private boolean mFront;//是否前台
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        sInstance = this;
+        //初始化Http
+       CommonHttpUtil.init();
+       CommonAppConfig.getWindowWidth();
+       CommonAppConfig.getWindowHeight();
+       registerActivityLifecycleCallbacks();
+    }
+
+    @Override
+    protected void attachBaseContext(Context base) {
+        MultiDex.install(this);
+        super.attachBaseContext(base);
+    }
+
+
+    private void registerActivityLifecycleCallbacks() {
+        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
+            @Override
+            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
+            }
+            @Override
+            public void onActivityStarted(Activity activity) {
+                mCount++;
+                if (!mFront) {
+                    mFront = true;
+                    L.e("AppContext------->处于前台");
+                    CommonAppConfig.setFrontGround(true);
+                }
+            }
+            @Override
+            public void onActivityResumed(Activity activity) {
+            }
+            @Override
+            public void onActivityPaused(Activity activity) {
+
+            }
+            @Override
+            public void onActivityStopped(Activity activity) {
+                    mCount--;
+                if (mCount == 0) {
+                    mFront = false;
+                    L.e("AppContext------->处于后台");
+                    CommonAppConfig.setFrontGround(false);
+                }
+            }
+            @Override
+            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
+
+            }
+            @Override
+            public void onActivityDestroyed(Activity activity) {
+
+            }
+        });
+    }
+
+    public int getResourceColor(int res){
+       return getResources().getColor(res);
+    }
+
+}

+ 199 - 0
common/src/main/java/com/wanyue/common/Constants.java

@@ -0,0 +1,199 @@
+package com.wanyue.common;
+
+/**
+ * Created by cxf on 2018/6/7.
+ */
+
+public class Constants {
+    public static final String URL = "url";
+    public static final String PAYLOAD = "payload";
+    public static final String DATA = "data";
+    public static final String TYPE = "type";
+    public static final String ICON_ID = "icon_id";
+    public static final String POSITION = "position";
+    public static final String COVER = "cover";
+
+    public static final String TO_UID = "toUid";
+    public static final String FROM = "from";
+    public static final String TIP = "tip";
+    public static final String FIRST_LOGIN = "firstLogin";
+    public static final String USER_BEAN = "userBean";
+    public static final String COIN_NAME = "coinName";
+    public static final String LIVE_UID = "liveUid";
+    public static final String FOLLOW = "follow";
+    public static final String BLACK = "black";
+    public static final String IM_FROM_HOME = "imFromUserHome";
+    public static final String ROLE = "role";
+    public static final String ROOM_ID = "room_id";
+    public static final String CALL_TYPE = "call_type";
+
+    public static final String VIDEO_COMMENT_BEAN = "videoCommnetBean";
+    public static final String VIDEO_FACE_OPEN = "videoOpenFace";
+    public static final String VIDEO_FACE_HEIGHT = "videoFaceHeight";
+
+    public static final String DIAMONDS = "云币";
+    public static final String VOTES = "映票";
+    public static final String PAY_ALI_NOT_ENABLE = "支付宝未接入";
+    public static final String PAY_WX_NOT_ENABLE = "微信支付未接入";
+    public static final String PAY_ALL_NOT_ENABLE = "未开启支付";
+    public static final String PAY_TYPE_COIN = "0";//余额支付
+    public static final String PAY_TYPE_ALI = "1";//支付宝支付
+    public static final String PAY_TYPE_WX = "2";//微信宝支付
+    public static final String PAY_TYPE_GOOGLE = "4";//google支付
+    public static final String PAY_TYPE_TEST = "5";//模拟支付
+
+
+    public static final String PAY_BUY_COIN_ALI = "Charge.GetOrder";
+    public static final String PAY_BUY_COIN_WX = "Charge.getWxOrder";
+    public static final String PAY_VIP_COIN_ALI = "Vip.GetAliOrder";
+    public static final String PAY_VIP_COIN_WX = "Vip.GetWxOrder";
+
+    public static final String PACKAGE_NAME_ALI = "com.eg.android.AlipayGphone";//支付宝的包名
+    public static final String PACKAGE_NAME_WX = "com.tencent.mm";//微信的包名
+    public static final String PACKAGE_NAME_QQ = "com.tencent.mobileqq";//QQ的包名
+    public static final String LAT = "lat";
+    public static final String LNG = "lng";
+    public static final String ADDRESS = "address";
+    public static final String SCALE = "scale";
+    public static final String SELECT_IMAGE_PATH = "selectedImagePath";
+    public static final String COPY_PREFIX = "copy://";
+    public static final String SHARE_PREFIX = "shareagent://";
+
+    public static final String GIF_GIFT_PREFIX = "gif_gift_";
+
+    //主播在线类型
+    public static final int LINE_TYPE_OFF = 0;//离线
+    public static final int LINE_TYPE_DISTURB = 1;//勿扰
+    public static final int LINE_TYPE_CHAT = 2;//在聊
+    public static final int LINE_TYPE_ON = 3;//在线
+
+
+    //提现账号类型,1表示支付宝,2表示微信,3表示银行卡
+    public static final int CASH_ACCOUNT_ALI = 1;
+    public static final int CASH_ACCOUNT_WX = 2;
+    public static final int CASH_ACCOUNT_BANK = 3;
+    public static final String CASH_ACCOUNT_ID = "cashAccountID";
+    public static final String CASH_ACCOUNT = "cashAccount";
+    public static final String CASH_ACCOUNT_TYPE = "cashAccountType";
+
+
+
+    public static final int DYNAMIC_IMG_MAX_NUM = 9;
+    public static final int DYNAMIC_VOICE_MIN_TIME = 3;
+
+    public static final String MOB_QQ = "qq";
+    public static final String MOB_QQ_ZATION = "QQ";
+    public static final String MOB_QZONE = "qzone";
+    public static final String MOB_WX = "wx";
+    public static final String MOB_WX_PYQ = "wchat";
+    public static final String MOB_FACEBOOK = "Facebook";
+    public static final String MOB_TWITTER = "twitter";
+    public static final String MOB_PHONE = "phone";
+
+
+
+    public static final String AUTH_STATUS = "authStatus";//认证状态
+    public static final int AUTH_IMAGE_MAX_SIZE = 6;//MAX_SIZE 认证时候上传图片最大张数
+
+    public static final String CHAT_TYPE = "chatType";//通话类型 1视频 2语音
+    public static final byte CHAT_TYPE_VIDEO = 1;//通话类型 视频
+    public static final byte CHAT_TYPE_AUDIO = 2;//通话类型 语音
+    public static final byte CHAT_TYPE_NONE = 0;//通话类型 全部
+
+    public static final String CHAT_PARAM_AUD = "chatParamAud";
+    public static final String CHAT_PARAM_ANC = "chatParamAnc";
+    public static final String CHAT_PARAM_TYPE = "chatParamType";
+    public static final String CHAT_SESSION_ID = "chatSessionId";
+    public static final int CHAT_PARAM_TYPE_AUD = 1;
+    public static final int CHAT_PARAM_TYPE_ANC = 2;
+
+
+    public static final String MAIN_SEX = "mainHomeSex";
+    public static final byte MAIN_SEX_NONE = 0;
+    public static final byte MAIN_SEX_MALE = 1;
+    public static final byte MAIN_SEX_FAMALE = 2;
+
+    public static final String IM_MSG_ADMIN = "administrator";
+
+
+    public static final String SKILL_BEAN = "skillBean";
+    public static final String SKILL_ID = "skillId";
+    public static final String NICKNAME = "nickname";
+    public static final String ADDR = "addr";
+    public static final String INTEREST = "interest";
+    public static final String SIGN = "sign";
+    public static final String JOB = "job";
+    public static final String UP_WHEAT = "upWheat";
+    public static final String SCHOOL = "school";
+    public static final String VOICE = "voice";
+    public static final String VOICE_DURATION = "voiceDuration";
+    public static final String VOICE_FROM = "voice_from";
+    public static final int VOICE_FROM_USER = 0;
+    public static final int VOICE_FROM_SKILL = 1;
+    public static final String ORDER_ID = "orderId";
+    public static final String ORDER_BEAN = "orderBean";
+    public static final String ORDER_ANCHOR = "orderAnchor";
+
+    public static final String LANG_EN = "en";
+    public static final String LANG_ZH = "zh-cn";
+
+    public static final int MAX_PHOTO_LENGTH=9;
+    public static final int EMPTY_TYPE=11;
+
+    public static final int DYNAMIC_PHOTO=1;
+    public static final int DYNAMIC_VIDEO=2;
+    public static final int DYNAMIC_VOICE=3;
+
+    public static final int ROLE_ANTHOR=1;
+    public static final int ROLE_AUDIENCE=2;
+    public static final int ROLE_HOST=3;
+
+    public static final String KEY_PHONE="phone";
+    public static final String KEY_PWD="pwd";
+
+    public static final String SOCKET_CHAT="SendMsg";
+
+    public static final String SOCKET_PPT="setPPT"; //操作ppt
+    public static final String SOCKET_WHITE_BROAD="setWhite";//设置操作白板权限
+    public static final String SOCKET_LIVE_CONTROLLER="setLiveModel";//设置上麦状态
+    public static final String SOCKET_SHARE_SCREEN="ShareScreen";//设置共享屏幕
+
+    public static final String SOCKET_SHUT_USER="Shutup";//禁言
+    public static final String SOCKET_KICK="Kick";//踢人
+    public static final String SOCKET_SHUT_ALL="roomShutup";//全体禁言
+    public static final String SOCKET_ROBANS="robans";//抢答
+    public static final String SOCKET_EXAM="exam";//答题
+
+    public static final String SOCKET_CHANGE_MODE="changeMode";//改变直播状态
+
+    public static final String SOCKET_SYSTEM_NOT="SystemNot"; //系统通知
+    public static final String SOCKET_LINKMIC="LinkMic"; //连麦
+    public static final String SOCKET_END_LIVE="StartEndLive";
+    public static final String SOCKET_ROOM_ENTER="enter";
+
+
+    public static final int SOCKET_WHAT_CONN = 0;
+    public static final int SOCKET_WHAT_DISCONN = 2;
+    public static final int SOCKET_WHAT_BROADCAST = 1;
+
+    public static final String KEY_DIALOG="dialog";
+    public static final String KEY_LISTNER="listner";
+
+    public static final String KEY_POSITON="sitid";
+    public static final String KEY_TITLE="title";
+    public static final String KEY_STATUS="status";
+    public static final String KEY_ID="id";
+    public static final String KEY_METHOD="method";
+    public static final String KEY_TINT="tint";
+
+
+    public static final String COPY = "copy";
+    public static final String KEY_CLASS = "key_class";
+    public static final int JPUSH_TYPE_MESSAGE =1 ;
+    public static final String PUSH_ID ="push_id" ;
+
+    public static final String EVENT_GRADE ="push_id" ;
+
+
+
+}

+ 32 - 0
common/src/main/java/com/wanyue/common/HtmlConfig.java

@@ -0,0 +1,32 @@
+package com.wanyue.common;
+
+/**
+ * Created by cxf on 2018/10/15.
+ */
+
+public class HtmlConfig {
+    //登录即代表同意服务和隐私条款
+    public static final String LOGIN_PRIVCAY = CommonAppConfig.HOST + "/appapi/page/detail?id=3";
+    //提现记录
+    public static final String CASH_RECORD = CommonAppConfig.HOST + "/appapi/cash/index?";
+    //支付宝课程支付回调
+    public static final String ALI_PAY_URL = CommonAppConfig.HOST + "/appapi/cartpay/notify_ali";
+    //微信课程支付回调
+    public static final String ALI_WX_URL = CommonAppConfig.HOST + "/appapi/coursepay/notify_wx";
+    //视频分享地址
+    public static final String SHARE_VIDEO = CommonAppConfig.HOST + "/Appapi/Video/share?id=";
+
+    //关于我们
+    public static final String ABOUT_US = CommonAppConfig.HOST + "/appapi/page/detail?id=1";
+    //联系我们
+    public static final String CONNECT_US = CommonAppConfig.HOST + "/appapi/page/detail?id=2";
+
+    //谷歌支付充值回调地址
+    public static final String GOOGLE_PAY_COIN_URL = CommonAppConfig.HOST + "/appapi/google/notify";
+    //谷歌支付下单回调地址
+    public static final String GOOGLE_PAY_ORDER_URL = CommonAppConfig.HOST + "/appapi/Orderback/notify_google";
+
+
+
+
+}

+ 291 - 0
common/src/main/java/com/wanyue/common/activity/AbsActivity.java

@@ -0,0 +1,291 @@
+package com.wanyue.common.activity;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;
+import com.wanyue.common.R;
+import com.wanyue.common.business.acmannger.ActivityMannger;
+import com.wanyue.common.interfaces.LifeCycleListener;
+import com.wanyue.common.utils.ClickUtil;
+import com.wanyue.common.utils.HeybroadHelper;
+import com.wanyue.common.utils.L;
+import com.wanyue.common.utils.LanguageUtil;
+import com.wanyue.common.utils.SystemUtil;
+import com.wanyue.common.utils.UMengUtil;
+import java.util.ArrayList;
+import java.util.List;
+
+
+
+@Deprecated()
+public abstract class AbsActivity extends RxAppCompatActivity {
+
+    protected String mTag;
+    protected Context mContext;
+    protected List<LifeCycleListener> mLifeCycleListeners;
+
+    @Override
+    protected void attachBaseContext(Context newBase) {
+        super.attachBaseContext(LanguageUtil.attachBaseContext(newBase));
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        L.e("当前AbsActivity="+this.getClass().getName());
+        mTag = this.getClass().getSimpleName();
+        setStatusBar();
+        setContentView(getLayoutId());
+        mContext = this;
+        mLifeCycleListeners = new ArrayList<>();
+        main(savedInstanceState);
+        if (mLifeCycleListeners != null) {
+            for (LifeCycleListener listener : mLifeCycleListeners) {
+                listener.onCreate();
+            }
+        }
+        addToActivityMannger();
+
+    }
+
+    public void addToActivityMannger(){
+      ActivityMannger.getInstance().addActivity(this);
+    }
+
+
+
+    public void removToAcitivyMannger(){
+        ActivityMannger.getInstance().removeActivity(this);
+    }
+
+    protected abstract int getLayoutId();
+
+    protected void main(Bundle savedInstanceState) {
+        main();
+    }
+
+    protected void main() {
+
+    }
+
+    protected boolean isStatusBarWhite() {
+        return false;
+    }
+
+    protected void setTitle(String title) {
+        TextView titleView = (TextView) findViewById(R.id.titleView);
+        if (titleView != null) {
+            titleView.setText(title);
+        }
+    }
+
+
+     public void setOnClickListener(int id, View.OnClickListener clickListener){
+        View view=findViewById(id);
+        if(view!=null){
+            view.setOnClickListener(clickListener);
+        }
+     }
+
+
+
+    public TextView setRightTitle(String rightTitle){
+        TextView titleView =  findViewById(R.id.tv_right_title);
+        if(titleView!=null){
+          titleView.setText(rightTitle);
+        }
+        return titleView;
+    }
+
+
+    public void setTabBackGroudColor(String rightTitle){
+       View flTab= findViewById(R.id.fl_tab);
+       if(flTab!=null){
+           flTab.setBackgroundColor(Color.parseColor(rightTitle));
+       }
+    }
+
+
+    protected void setTitleById(int title) {
+        TextView titleView = (TextView) findViewById(R.id.titleView);
+        if (titleView != null) {
+            titleView.setText(title);
+        }
+    }
+
+    protected void setBackImageResoure(int resourceId){
+       ImageView imageView=findViewById(R.id.btn_back);
+       if(imageView!=null){
+         imageView.setImageResource(resourceId);
+       }
+    }
+
+
+
+
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                View view = getCurrentFocus();
+                HeybroadHelper.hideKeyboard(ev, view, AbsActivity.this);//调用方法判断是否需要隐藏键盘
+                break;
+
+            default:
+                break;
+        }
+        return super.dispatchTouchEvent(ev);
+    }
+
+
+    public void backClick(View v) {
+        if (v.getId() == R.id.btn_back) {
+            onBackPressed();
+        }
+    }
+
+    protected boolean canClick() {
+        return ClickUtil.canClick();
+    }
+
+
+    /**
+     * 设置透明状态栏
+     */
+    private void setStatusBar() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            Window window = getWindow();
+            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+            if (isStatusBarWhite()) {
+                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+            } else {
+                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
+            }
+            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+            window.setStatusBarColor(0);
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        removToAcitivyMannger();
+        if (mLifeCycleListeners != null) {
+            for (LifeCycleListener listener : mLifeCycleListeners) {
+                listener.onDestroy();
+            }
+            mLifeCycleListeners.clear();
+            mLifeCycleListeners = null;
+        }
+        super.onDestroy();
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        /*这两个方法的顺序千万不能变化*/
+        launchfirstOntherStack();
+        setIsBackGround();
+        if (mLifeCycleListeners != null) {
+            for (LifeCycleListener listener : mLifeCycleListeners) {
+                listener.onStart();
+            }
+        }
+    }
+
+    private void launchfirstOntherStack(){
+      ActivityMannger.getInstance().launchOntherStackToTopActivity(true,this);
+    }
+
+    public void setIsBackGround() {
+     ActivityMannger.getInstance().setBackGround(SystemUtil.isBackground(this));
+    }
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+        if (mLifeCycleListeners != null) {
+            for (LifeCycleListener listener : mLifeCycleListeners) {
+                listener.onReStart();
+            }
+        }
+    }
+
+
+    protected <T extends Activity> void startActivity(Class<T>cs){
+        startActivity(new Intent(this,cs));
+    }
+
+    protected <T extends Activity> void startActivityForResult(Class<T>cs,int requestCode){
+        startActivityForResult(new Intent(this,cs),requestCode);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (mLifeCycleListeners != null) {
+            for (LifeCycleListener listener : mLifeCycleListeners) {
+                listener.onResume();
+            }
+        }
+        //友盟统计
+        UMengUtil.onResume(this);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        if (mLifeCycleListeners != null) {
+            for (LifeCycleListener listener : mLifeCycleListeners) {
+                listener.onPause();
+            }
+        }
+        //友盟统计
+        UMengUtil.onPause(this);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        if (mLifeCycleListeners != null) {
+            for (LifeCycleListener listener : mLifeCycleListeners) {
+                listener.onStop();
+            }
+        }
+        setIsBackGround();
+    }
+
+    public void addLifeCycleListener(LifeCycleListener listener) {
+        if (mLifeCycleListeners != null && listener != null) {
+            mLifeCycleListeners.add(listener);
+        }
+    }
+
+    public void addAllLifeCycleListener(List<LifeCycleListener> listeners) {
+        if (mLifeCycleListeners != null && listeners != null) {
+            mLifeCycleListeners.addAll(listeners);
+        }
+    }
+
+    public void removeLifeCycleListener(LifeCycleListener listener) {
+        if (mLifeCycleListeners != null) {
+            mLifeCycleListeners.remove(listener);
+        }
+    }
+
+
+
+    @Override
+    public void finish() {
+        super.finish();
+    }
+}

+ 243 - 0
common/src/main/java/com/wanyue/common/activity/BaseActivity.java

@@ -0,0 +1,243 @@
+package com.wanyue.common.activity;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+import com.trello.rxlifecycle2.LifecycleTransformer;
+import com.trello.rxlifecycle2.android.ActivityEvent;
+import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;
+import com.wanyue.common.CommonAppConfig;
+import com.wanyue.common.R;
+import com.wanyue.common.business.acmannger.ActivityMannger;
+import com.wanyue.common.proxy.ViewProxyMannger;
+import com.wanyue.common.utils.ClickUtil;
+import com.wanyue.common.utils.HeybroadHelper;
+import com.wanyue.common.utils.L;
+import com.wanyue.common.utils.SystemUtil;
+import com.wanyue.common.utils.WordUtil;
+import butterknife.ButterKnife;
+import io.reactivex.Observable;
+
+/*为了不破坏旧代码的结构,重新定义了一个基类*/
+public abstract class BaseActivity extends RxAppCompatActivity {
+
+    protected ViewProxyMannger mViewProxyMannger;
+    protected Context mContext;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+
+        super.onCreate(savedInstanceState);
+        mContext=this;
+        if(isTransparentStatusBar()){
+          SystemUtil.setTransparentStatusBar(this);
+        }
+
+        setContentView(getLayoutId());
+        setStatusHeight();
+        if(shouldBindButterKinfe()){
+           ButterKnife.bind(this);
+        }
+        View backView=findViewById(R.id.btn_back);
+        if(backView!=null){
+            backView.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    clickBack();
+                }
+            });
+        }
+        addToActivityMannger();
+        init();
+    }
+
+    protected boolean isTransparentStatusBar() {
+        return true;
+    }
+
+    public void addToActivityMannger(){
+        ActivityMannger.getInstance().addActivity(this);
+    }
+    public void removToAcitivyMannger(){
+        ActivityMannger.getInstance().removeActivity(this);
+    }
+
+
+    /*有些界面因为不需要butternife所以可以进行修改,不让他进行绑定,减少辅助类的生成*/
+    protected boolean shouldBindButterKinfe() {
+        return true;
+    }
+
+    /*标记rootView根据手机屏幕状态栏的高度设置高度的padding*/
+    public void setDefaultStatusBarPadding(){
+        View view=findViewById(R.id.rootView);
+        if(view==null){
+            return;
+        }
+        int statusHeight=CommonAppConfig.statuBarHeight();
+        view.setPadding(view.getPaddingLeft(),statusHeight,view.getPaddingRight(),view.getPaddingBottom());
+    }
+    /*根据不同手机的状态栏设置高度*/
+    private void setStatusHeight() {
+
+        FrameLayout  mFlTab=findViewById(R.id.vp_tab);
+        int statusBarHeight= CommonAppConfig.statuBarHeight();
+        if(statusBarHeight!=0&&mFlTab!=null){
+           mFlTab.setPadding(0,statusBarHeight,0,0);
+        }
+    }
+
+    public abstract void init();
+
+    @Override
+    public void finish() {
+        super.finish();
+        if(mViewProxyMannger!=null){
+           mViewProxyMannger.onFinish();
+        }
+    }
+
+
+
+    /*设置标题*/
+    public void setTabTitle(int tabTitle){
+       setTabTitle(WordUtil.getString(tabTitle));
+    }
+
+
+    /*绑定生命周期在销毁的时候,以下两种都可以用,效果是一样的*/
+    public <T> Observable<T> bindClycleInOnDestory(Observable<T>observable) {
+        return observable.compose(this.<T>bindUntilEvent(ActivityEvent.DESTROY));
+    }
+
+    /*绑定生命周期在销毁的时候,*/
+    public final <T> LifecycleTransformer<T> bindUntilOnDestoryEvent() {
+        return bindUntilEvent(ActivityEvent.DESTROY);
+    }
+
+
+    /*设置标题*/
+    public void setTabTitle(String tabTitle){
+        TextView  mTitleView=findViewById(R.id.titleView);
+        if(mTitleView!=null){
+            mTitleView.setText(tabTitle);
+        }
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (mViewProxyMannger != null && mViewProxyMannger.onBackPressed()) {
+            return;
+        }
+        super.onBackPressed();
+    }
+
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+    }
+
+    public abstract int getLayoutId();
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (mViewProxyMannger != null) {
+            mViewProxyMannger.onActivityResult(requestCode, resultCode, data);
+        }
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        if (mViewProxyMannger != null) {
+            mViewProxyMannger.onStart();
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (mViewProxyMannger != null) {
+            mViewProxyMannger.onResume();
+        }
+    }
+
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                View view = getCurrentFocus();
+                HeybroadHelper.hideKeyboard(ev, view, BaseActivity.this);//调用方法判断是否需要隐藏键盘
+                break;
+
+            default:
+                break;
+        }
+        return super.dispatchTouchEvent(ev);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        if (mViewProxyMannger != null) {
+            mViewProxyMannger.onPause();
+        }
+        if(isFinishing()){
+           releaseOpportunity();
+        }
+    }
+
+
+
+    protected void releaseOpportunity(){
+        if (mViewProxyMannger != null) {
+            mViewProxyMannger.releaseOpportunity();
+        }
+    }
+
+
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        L.e("onStop==="+getClass().getSimpleName());
+        if (mViewProxyMannger != null) {
+            mViewProxyMannger.onStop();
+        }
+    }
+
+    public ViewProxyMannger getViewProxyMannger() {
+        if (mViewProxyMannger == null) {
+            mViewProxyMannger = new ViewProxyMannger(this);
+        }
+        return mViewProxyMannger;
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (mViewProxyMannger != null) {
+            mViewProxyMannger.onDestroy();
+        }
+        removToAcitivyMannger();
+    }
+
+    public void startActivity(Class<? extends Activity>cs){
+        Intent intent=new Intent(this,cs);
+        startActivity(intent);
+
+    }
+
+
+    public void clickBack() {
+        onBackPressed();
+    }
+}

+ 64 - 0
common/src/main/java/com/wanyue/common/activity/ErrorActivity.java

@@ -0,0 +1,64 @@
+package com.wanyue.common.activity;
+
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.TextView;
+import com.wanyue.common.CommonAppContext;
+import com.wanyue.common.R;
+import com.wanyue.common.utils.ToastUtil;
+import com.wanyue.common.utils.WordUtil;
+
+/**
+ * Created by cxf on 2018/8/29.
+ * 服务器Home.getConfig接口有时候返回的数据无法解析,导致崩溃,
+ * 这个类是用来收集服务器返回的错误的信息的
+ */
+
+public class ErrorActivity extends AbsActivity {
+
+    public static void forward(String title, String errorInfo) {
+        Intent intent = new Intent(CommonAppContext.sInstance, ErrorActivity.class);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.putExtra("title", title);
+        intent.putExtra("error", errorInfo);
+        CommonAppContext.sInstance.startActivity(intent);
+    }
+
+    private TextView mTextView;
+    private String mErrorInfo;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_error;
+    }
+
+    @Override
+    protected void main() {
+        Intent intent = getIntent();
+        String title = intent.getStringExtra("title");
+        mErrorInfo = intent.getStringExtra("error");
+        setTitle(title);
+        mTextView = (TextView) findViewById(R.id.text);
+        mTextView.setText(mErrorInfo);
+        findViewById(R.id.btn_copy).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                copyError();
+            }
+        });
+    }
+
+    private void copyError() {
+        if (TextUtils.isEmpty(mErrorInfo)) {
+            return;
+        }
+        ClipboardManager clipboardManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
+        ClipData clipData = ClipData.newPlainText("text", mErrorInfo);
+        clipboardManager.setPrimaryClip(clipData);
+        ToastUtil.show(WordUtil.getString(R.string.copy_success));
+    }
+}

+ 283 - 0
common/src/main/java/com/wanyue/common/activity/WebViewActivity.java

@@ -0,0 +1,283 @@
+package com.wanyue.common.activity;
+
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.provider.MediaStore;
+import android.support.annotation.RequiresApi;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import com.wanyue.common.CommonAppConfig;
+import com.wanyue.common.Constants;
+import com.wanyue.common.HtmlConfig;
+import com.wanyue.common.R;
+import com.wanyue.common.bean.ConfigBean;
+import com.wanyue.common.dialog.CommonShareDialogFragment;
+import com.wanyue.common.mob.MobShareUtil;
+import com.wanyue.common.mob.ShareData;
+import com.wanyue.common.utils.DpUtil;
+import com.wanyue.common.utils.L;
+import com.wanyue.common.utils.LanguageUtil;
+import com.wanyue.common.utils.StringUtil;
+import com.wanyue.common.utils.ToastUtil;
+import com.wanyue.common.utils.WordUtil;
+
+/**
+ * Created by cxf on 2018/9/25.
+ */
+
+public class WebViewActivity extends AbsActivity {
+
+    private ProgressBar mProgressBar;
+    private WebView mWebView;
+    private final int CHOOSE = 100;//Android 5.0以下的
+    private final int CHOOSE_ANDROID_5 = 200;//Android 5.0以上的
+    private ValueCallback<Uri> mValueCallback;
+    private ValueCallback<Uri[]> mValueCallback2;
+    private String mShareCode;
+    private MobShareUtil mMobShareUtil;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_webview;
+    }
+
+    @Override
+    protected void main() {
+        String url = getIntent().getStringExtra(Constants.URL);
+        L.e("H5--->" + url);
+        LinearLayout rootView = (LinearLayout) findViewById(R.id.rootView);
+        mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
+        mWebView = new WebView(mContext);
+        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+        params.topMargin = DpUtil.dp2px(1);
+        mWebView.setLayoutParams(params);
+        mWebView.setOverScrollMode(View.OVER_SCROLL_NEVER);
+        rootView.addView(mWebView);
+        mWebView.setWebViewClient(new WebViewClient() {
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url) {
+                L.e("H5-------->" + url);
+                if (url.startsWith(Constants.COPY_PREFIX)) {
+                    String content = url.substring(Constants.COPY_PREFIX.length());
+                    if (!TextUtils.isEmpty(content)) {
+                        copy(content);
+                    }
+                } else if (url.startsWith(Constants.SHARE_PREFIX)) {
+                    String content = url.substring(Constants.SHARE_PREFIX.length());
+                    if (!TextUtils.isEmpty(content)) {
+                        mShareCode = content;
+                        openShareWindow();
+                    }
+                } else {
+                    view.loadUrl(url);
+                }
+                return true;
+            }
+
+            @Override
+            public void onPageFinished(WebView view, String url) {
+                setTitle(view.getTitle());
+            }
+        });
+        mWebView.setWebChromeClient(new WebChromeClient() {
+            @Override
+            public void onProgressChanged(WebView view, int newProgress) {
+                if (newProgress == 100) {
+                    mProgressBar.setVisibility(View.GONE);
+                } else {
+                    mProgressBar.setProgress(newProgress);
+                }
+            }
+            //以下是在各个Android版本中 WebView调用文件选择器的方法
+            // For Android < 3.0
+            public void openFileChooser(ValueCallback<Uri> valueCallback) {
+                openImageChooserActivity(valueCallback);
+            }
+            // For Android  >= 3.0
+            public void openFileChooser(ValueCallback valueCallback, String acceptType) {
+                openImageChooserActivity(valueCallback);
+            }
+
+            //For Android  >= 4.1
+            public void openFileChooser(ValueCallback<Uri> valueCallback,
+                                        String acceptType, String capture) {
+                openImageChooserActivity(valueCallback);
+            }
+
+            // For Android >= 5.0
+            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+            @Override
+            public boolean onShowFileChooser(WebView webView,
+                                             ValueCallback<Uri[]> filePathCallback,
+                                             FileChooserParams fileChooserParams) {
+                mValueCallback2 = filePathCallback;
+                Intent intent = fileChooserParams.createIntent();
+                startActivityForResult(intent, CHOOSE_ANDROID_5);
+                return true;
+            }
+        });
+        mWebView.getSettings().setJavaScriptEnabled(true);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
+        }
+        mWebView.loadUrl(url);
+    }
+
+
+    private void openImageChooserActivity(ValueCallback<Uri> valueCallback) {
+        mValueCallback = valueCallback;
+        Intent intent = new Intent();
+        if (Build.VERSION.SDK_INT < 19) {
+            intent.setAction(Intent.ACTION_GET_CONTENT);
+        } else {
+            intent.setAction(Intent.ACTION_PICK);
+            intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
+        }
+        intent.setType("image/*");
+        startActivityForResult(Intent.createChooser(intent, WordUtil.getString(R.string.choose_flie)), CHOOSE);
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
+        super.onActivityResult(requestCode, resultCode, intent);
+        switch (requestCode) {
+            case CHOOSE://5.0以下选择图片后的回调
+                processResult(resultCode, intent);
+                break;
+            case CHOOSE_ANDROID_5://5.0以上选择图片后的回调
+                processResultAndroid5(resultCode, intent);
+                break;
+        }
+    }
+
+    private void processResult(int resultCode, Intent intent) {
+        if (mValueCallback == null) {
+            return;
+        }
+        if (resultCode == RESULT_OK && intent != null) {
+            Uri result = intent.getData();
+            mValueCallback.onReceiveValue(result);
+        } else {
+            mValueCallback.onReceiveValue(null);
+        }
+        mValueCallback = null;
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+    private void processResultAndroid5(int resultCode, Intent intent) {
+        if (mValueCallback2 == null) {
+            return;
+        }
+        if (resultCode == RESULT_OK && intent != null) {
+            mValueCallback2.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
+        } else {
+            mValueCallback2.onReceiveValue(null);
+        }
+        mValueCallback2 = null;
+    }
+
+    protected boolean canGoBack() {
+        return mWebView != null && mWebView.canGoBack();
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (isNeedExitActivity()) {
+            finish();
+        } else {
+            if (canGoBack()) {
+                mWebView.goBack();
+            } else {
+                finish();
+            }
+        }
+    }
+
+
+    private boolean isNeedExitActivity() {
+        if (mWebView != null) {
+            String url = mWebView.getUrl();
+            if (!TextUtils.isEmpty(url)) {
+                return url.contains("auth/index")//实名认证成功页面
+                        || url.contains("skillauth/apply");//技能申请提交成功页面
+
+            }
+        }
+        return false;
+    }
+
+    public static void forward(Context context, String url, boolean addArgs) {
+        if (addArgs) {
+            url = StringUtil.contact(url,"&lang=", LanguageUtil.getInstance().getLanguage());
+            url = StringUtil.contact(url, "&uid=", CommonAppConfig.getUid(), "&token=", CommonAppConfig.getToken());
+        }
+        Intent intent = new Intent(context, WebViewActivity.class);
+        intent.putExtra(Constants.URL, url);
+        context.startActivity(intent);
+    }
+
+    public static void forward(Context context, String url) {
+        forward(context, url, true);
+    }
+
+    @Override
+    public void onDestroy() {
+        if (mWebView != null) {
+            ViewGroup parent = (ViewGroup) mWebView.getParent();
+            if (parent != null) {
+                parent.removeView(mWebView);
+            }
+            mWebView.destroy();
+        }
+        super.onDestroy();
+    }
+
+    /**
+     * 复制到剪贴板
+     */
+
+    private void copy(String content) {
+        ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
+        ClipData clipData = ClipData.newPlainText("text", content);
+        cm.setPrimaryClip(clipData);
+        ToastUtil.show(getString(R.string.copy_success));
+    }
+    /**
+     * 分享
+     */
+
+    private void openShareWindow() {
+        CommonShareDialogFragment fragment = new CommonShareDialogFragment();
+        fragment.setActionListener(new CommonShareDialogFragment.ActionListener() {
+            @Override
+            public void onItemClick(String type) {
+                ConfigBean configBean = CommonAppConfig.getConfig();
+                ShareData data = new ShareData();
+                data.setTitle(configBean.getAgentShareTitle());
+                data.setDes(configBean.getAgentShareDes());
+                data.setImgUrl(CommonAppConfig.getUserBean().getAvatarThumb());
+                String webUrl =  mShareCode;
+                data.setWebUrl(webUrl);
+                if (mMobShareUtil == null) {
+                    mMobShareUtil = new MobShareUtil();
+                }
+                mMobShareUtil.execute(type, data, null);
+            }
+        });
+                fragment.show(getSupportFragmentManager(), "CommonShareDialogFragment");
+    }
+
+}

+ 105 - 0
common/src/main/java/com/wanyue/common/adapter/CommonShareAdapter.java

@@ -0,0 +1,105 @@
+package com.wanyue.common.adapter;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.wanyue.common.CommonAppConfig;
+import com.wanyue.common.Constants;
+import com.wanyue.common.bean.ConfigBean;
+import com.wanyue.common.interfaces.OnItemClickListener;
+import com.wanyue.common.mob.MobBean;
+import com.wanyue.common.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by cxf on 2018/10/19.
+ * 直播分享
+ */
+
+public class CommonShareAdapter extends RecyclerView.Adapter<CommonShareAdapter.Vh> {
+
+    private List<MobBean> mList;
+    private LayoutInflater mInflater;
+    private View.OnClickListener mOnClickListener;
+    private OnItemClickListener<MobBean> mOnItemClickListener;
+
+    public CommonShareAdapter(Context context) {
+        mList = new ArrayList<>();
+        ConfigBean configBean = CommonAppConfig.getConfig();
+        if (configBean != null) {
+            List<MobBean> list = MobBean.getLiveShareTypeList(configBean.getShareType());
+            mList.addAll(list);
+        }
+
+
+        mInflater = LayoutInflater.from(context);
+        mOnClickListener = new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Object tag = v.getTag();
+                if (tag != null) {
+                    if (mOnItemClickListener != null) {
+                        mOnItemClickListener.onItemClick((MobBean) tag, 0);
+                    }
+                }
+            }
+        };
+    }
+    public void addLink(){
+        MobBean linkBean = new MobBean();
+        linkBean.setType(Constants.COPY);
+        linkBean.setName(R.string.copy_link);
+        linkBean.setIcon1(R.mipmap.icon_live_link);
+        mList.add(linkBean);
+    }
+
+
+
+
+    public void setOnItemClickListener(OnItemClickListener<MobBean> onItemClickListener) {
+        mOnItemClickListener = onItemClickListener;
+    }
+
+    @NonNull
+    @Override
+    public Vh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        return new Vh(mInflater.inflate(R.layout.item_live_share, parent, false));
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull Vh vh, int position) {
+        vh.setData(mList.get(position));
+    }
+
+    @Override
+    public int getItemCount() {
+        return mList.size();
+    }
+
+    class Vh extends RecyclerView.ViewHolder {
+
+        ImageView mIcon;
+        TextView mName;
+
+        public Vh(View itemView) {
+            super(itemView);
+            mIcon = (ImageView) itemView.findViewById(R.id.icon);
+            mName = (TextView) itemView.findViewById(R.id.name);
+            itemView.setOnClickListener(mOnClickListener);
+        }
+
+        void setData(MobBean bean) {
+            itemView.setTag(bean);
+            mIcon.setImageResource(bean.getIcon1());
+            mName.setText(bean.getName());
+        }
+    }
+}

+ 90 - 0
common/src/main/java/com/wanyue/common/adapter/ImChatFaceAdapter.java

@@ -0,0 +1,90 @@
+package com.wanyue.common.adapter;
+
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import com.wanyue.common.utils.FaceUtil;
+import com.wanyue.common.R;
+import com.wanyue.common.interfaces.OnFaceClickListener;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+/**
+ * Created by cxf on 2018/7/11.
+ * 聊天表情的RecyclerView Adapter
+ */
+
+public class ImChatFaceAdapter extends RecyclerView.Adapter<ImChatFaceAdapter.Vh> {
+
+    private List<String> mList;
+    private LayoutInflater mInflater;
+    private View.OnClickListener mOnClickListener;
+
+    public ImChatFaceAdapter(List<String> list, LayoutInflater inflater, final OnFaceClickListener onFaceClickListener) {
+        mList = list;
+        mInflater = inflater;
+        mOnClickListener = new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Object tag = v.getTag();
+                if (tag != null && onFaceClickListener != null) {
+                    String str = (String) v.getTag();
+                    if (!TextUtils.isEmpty(str)) {
+                        if ("<".equals(str)) {
+                            onFaceClickListener.onFaceDeleteClick();
+                        } else {
+                            onFaceClickListener.onFaceClick(str, v.getId());
+                        }
+                    }
+                }
+            }
+        };
+    }
+
+    @NotNull
+    @Override
+    public Vh onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
+        return new Vh(mInflater.inflate(R.layout.item_list_face, parent, false));
+    }
+
+    @Override
+    public void onBindViewHolder(Vh vh, int position) {
+        vh.setData(mList.get(position));
+    }
+
+    @Override
+    public int getItemCount() {
+        return mList.size();
+    }
+
+    class Vh extends RecyclerView.ViewHolder {
+
+        ImageView mImageView;
+
+        public Vh(View itemView) {
+            super(itemView);
+            mImageView = (ImageView) itemView;
+            mImageView.setOnClickListener(mOnClickListener);
+        }
+
+        void setData(String str) {
+            mImageView.setTag(str);
+            if (!TextUtils.isEmpty(str)) {
+                if ("<".equals(str)) {
+                    mImageView.setImageResource(R.mipmap.icon_face_delete);
+                } else {
+                    int imgRes = FaceUtil.getFaceImageRes(str);
+                    mImageView.setId(imgRes);
+                    mImageView.setImageResource(imgRes);
+                }
+            }else{
+                mImageView.setClickable(false);
+            }
+        }
+    }
+}

+ 97 - 0
common/src/main/java/com/wanyue/common/adapter/ImChatFacePagerAdapter.java

@@ -0,0 +1,97 @@
+package com.wanyue.common.adapter;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.support.v4.view.PagerAdapter;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import com.wanyue.common.utils.FaceUtil;
+import com.wanyue.common.R;
+import com.wanyue.common.interfaces.OnFaceClickListener;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by cxf on 2018/7/11.
+ * 聊天表情的ViewPager Adapter
+ */
+
+public class ImChatFacePagerAdapter extends PagerAdapter {
+
+    private List<View> mViewList;
+    private  int mFaceCount = 20;//每页20个表情
+
+    public ImChatFacePagerAdapter(Context context, int faceCount,OnFaceClickListener onFaceClickListener) {
+        mFaceCount=faceCount;
+        LayoutInflater inflater = LayoutInflater.from(context);
+
+        mViewList = new ArrayList<>();
+        List<String> faceList = FaceUtil.getFaceList();
+        int fromIndex = 0;
+        int size = faceList.size();
+        int pageCount = size / mFaceCount;
+        if (size % mFaceCount > 0) {
+            pageCount++;
+            for (int i = 0, count = pageCount * mFaceCount - size; i < count; i++) {
+                faceList.add("");
+            }
+        }
+        int spanCount=mFaceCount/3;
+        for (int i = 0; i < pageCount; i++) {
+            RecyclerView recyclerView = (RecyclerView) inflater.inflate(R.layout.view_chat_face_page, null, false);
+            recyclerView.setHasFixedSize(true);
+            recyclerView.setLayoutManager(new GridLayoutManager(context, spanCount, GridLayoutManager.VERTICAL, false));
+            int endIndex = fromIndex + mFaceCount;
+            List<String> list = new ArrayList<>();
+            for (int j = fromIndex; j < endIndex; j++) {
+                list.add(faceList.get(j));
+            }
+            list.add("<");
+            recyclerView.setAdapter(new ImChatFaceAdapter(list, inflater, onFaceClickListener));
+            mViewList.add(recyclerView);
+            fromIndex = endIndex;
+        }
+    }
+
+
+
+
+
+    @Override
+    public int getCount() {
+        return mViewList.size();
+    }
+
+    @Override
+    public boolean isViewFromObject(@Nullable View view, @Nullable Object object) {
+        return view == object;
+    }
+
+    @NotNull
+    @Override
+    public Object instantiateItem(@Nullable ViewGroup container, int position) {
+        View view = mViewList.get(position);
+        container.addView(view);
+        return view;
+    }
+
+
+    @Override
+    public void destroyItem(@Nullable ViewGroup container, int position, @Nullable Object object) {
+        container.removeView(mViewList.get(position));
+    }
+
+    public int getFaceCount() {
+        return mFaceCount;
+    }
+
+    public void setFaceCount(int faceCount) {
+        mFaceCount = faceCount;
+    }
+}

+ 101 - 0
common/src/main/java/com/wanyue/common/adapter/RefreshAdapter.java

@@ -0,0 +1,101 @@
+package com.wanyue.common.adapter;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+
+import com.wanyue.common.interfaces.OnItemClickListener;
+import com.wanyue.common.utils.ClickUtil;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by cxf on 2018/6/7.
+ */
+
+public abstract class RefreshAdapter<T> extends RecyclerView.Adapter {
+
+    protected Context mContext;
+    protected List<T> mList;
+    protected LayoutInflater mInflater;
+    protected RecyclerView mRecyclerView;
+    protected OnItemClickListener<T> mOnItemClickListener;
+
+    public RefreshAdapter(Context context) {
+        this(context, new ArrayList<T>());
+    }
+
+    public RefreshAdapter(Context context, List<T> list) {
+        mList = list;
+        mContext = context;
+        mInflater = LayoutInflater.from(mContext);
+        setHasStableIds(true);
+    }
+
+    @Override
+    public int getItemCount() {
+        if (mList != null) {
+            return mList.size();
+        }
+        return 0;
+    }
+
+    public void setOnItemClickListener(OnItemClickListener<T> onItemClickListener) {
+        mOnItemClickListener = onItemClickListener;
+    }
+
+    @Override
+    public void onAttachedToRecyclerView(@NotNull RecyclerView recyclerView) {
+        mRecyclerView = recyclerView;
+    }
+
+    public RecyclerView getRecyclerView() {
+        return mRecyclerView;
+    }
+
+    public void setList(List<T> list) {
+        if (mList != null) {
+            mList.clear();
+            mList.addAll(list);
+        }
+    }
+
+    public void refreshData(List<T> list) {
+        if (mRecyclerView != null && list != null) {
+            mList.clear();
+            mList.addAll(list);
+            notifyDataSetChanged();
+        }
+    }
+
+    public void insertList(List<T> list) {
+        if (mRecyclerView != null && mList != null && list != null && list.size() > 0) {
+            int p = mList.size();
+            mList.addAll(list);
+            notifyItemRangeInserted(p, list.size());
+        }
+    }
+
+    public void clearData() {
+        if (mRecyclerView != null && mList != null) {
+            mList.clear();
+            notifyDataSetChanged();
+        }
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    protected boolean canClick() {
+        return ClickUtil.canClick();
+    }
+
+    public List<T> getList() {
+        return mList;
+    }
+}

+ 45 - 0
common/src/main/java/com/wanyue/common/adapter/ViewPagerAdapter.java

@@ -0,0 +1,45 @@
+package com.wanyue.common.adapter;
+
+import android.support.annotation.NonNull;
+import android.support.v4.view.PagerAdapter;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.List;
+
+/**
+ * Created by cxf on 2018/9/22.
+ */
+
+public class ViewPagerAdapter extends PagerAdapter {
+
+    private List<? extends View> mViewList;
+
+    public ViewPagerAdapter(List<? extends View> list) {
+        mViewList = list;
+    }
+
+    @Override
+    public int getCount() {
+        return mViewList.size();
+    }
+
+    @Override
+    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
+        return view == object;
+    }
+
+    @NonNull
+    @Override
+    public Object instantiateItem(@NonNull ViewGroup container, int position) {
+        View view = mViewList.get(position);
+        container.addView(view);
+        return view;
+    }
+
+    @Override
+    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
+        container.removeView(mViewList.get(position));
+    }
+
+}

+ 66 - 0
common/src/main/java/com/wanyue/common/adapter/base/BaseMutiRecyclerAdapter.java

@@ -0,0 +1,66 @@
+package com.wanyue.common.adapter.base;
+
+import android.support.v7.widget.RecyclerView;
+import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.chad.library.adapter.base.entity.MultiItemEntity;
+import com.wanyue.common.custom.refresh.RxRefreshView;
+import com.wanyue.common.utils.ListUtil;
+
+import java.util.List;
+
+public abstract class BaseMutiRecyclerAdapter<T extends MultiItemEntity, K  extends BaseViewHolder > extends BaseMultiItemQuickAdapter<T, K> implements RxRefreshView.DataAdapter<T> {
+    public BaseMutiRecyclerAdapter(List<T> data) {
+        super(data);
+    }
+
+    @Override
+    public void setData(List<T> data) {
+        setNewData(data);
+        notifyDataSetChanged();
+    }
+
+
+    @Override
+    public void appendData(List<T> data) {
+        if(mData!=null){
+            addData(data);
+        }else{
+            setData(data);
+        }
+    }
+
+
+    @Override
+    public void appendData(int index, List<T> data) {
+        if(data!=null){
+            addData(index,data);
+        }else{
+            setData(data);
+        }
+    }
+
+
+    public T getLastData(){
+        return ListUtil.haveData(mData) ?mData.get(mData.size()-1):null;
+    }
+
+    public int size(){
+        return mData==null?0:mData.size();
+    }
+
+    @Override
+    public List<T> getArray() {
+        return mData;
+    }
+
+    @Override
+    public RecyclerView.Adapter returnRecyclerAdapter() {
+        return this;
+    }
+
+    @Override
+    public void notifyReclyDataChange() {
+        notifyDataSetChanged();
+    }
+}

+ 69 - 0
common/src/main/java/com/wanyue/common/adapter/base/BaseReclyViewHolder.java

@@ -0,0 +1,69 @@
+package com.wanyue.common.adapter.base;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.wanyue.common.glide.ImgLoader;
+import java.io.File;
+
+public  class BaseReclyViewHolder extends BaseViewHolder {
+        public BaseReclyViewHolder(View view) {
+            super(view);
+        }
+        public void setImageUrl(String url, int id){
+            ImageView imageView=getView(id);
+            if(imageView==null|| TextUtils.isEmpty(url)){
+                return;
+            }
+            ImgLoader.display(imageView.getContext(),url,imageView);
+        }
+
+    public void setImageResouceId(int resoureId,int id){
+        ImageView imageView=getView(id);
+        if(imageView==null ){
+            return;
+        }
+
+        ImgLoader.display(imageView.getContext(),resoureId,imageView);
+    }
+
+
+    public void setImageDrawable(int resoureId,int id){
+        ImageView imageView=getView(id);
+        if(imageView==null ){
+            return;
+        }
+        ImgLoader.display(imageView.getContext(),resoureId,imageView);
+    }
+
+    public void setVideoThumb(String url,int id){
+        ImageView imageView=getView(id);
+        if(imageView==null||TextUtils.isEmpty(url) ){
+            return;
+        }
+        ImgLoader.displayVideoThumb(imageView.getContext(),url,imageView);
+    }
+
+
+
+
+
+    public void setVideoThumbRemote(String url,int id){
+        ImageView imageView=getView(id);
+        if(imageView==null||TextUtils.isEmpty(url) ){
+            return;
+        }
+        ImgLoader.displayVideoThumbRemote(imageView.getContext(),url,imageView);
+    }
+
+
+    public void setImageResouceFile(File file, int id){
+        ImageView imageView=getView(id);
+        if(imageView==null ){
+            return;
+        }
+        ImgLoader.display(imageView.getContext(),file,imageView);
+    }
+
+    }

+ 109 - 0
common/src/main/java/com/wanyue/common/adapter/base/BaseRecyclerAdapter.java

@@ -0,0 +1,109 @@
+package com.wanyue.common.adapter.base;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.ViewGroup;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.wanyue.common.custom.refresh.RxRefreshView;
+import com.wanyue.common.utils.ListUtil;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public abstract class BaseRecyclerAdapter<T,E extends BaseReclyViewHolder> extends BaseQuickAdapter<T,E> implements RxRefreshView.DataAdapter<T> {
+    public Context context;
+    private DataChangeListner<T> dataChangeListner;
+
+
+    public BaseRecyclerAdapter(List<T> data) {
+        super(data);
+        setLayoutId();
+    }
+
+    @NotNull
+    @Override
+    public E onCreateViewHolder(ViewGroup parent, int viewType) {
+        E e=super.onCreateViewHolder(parent, viewType);
+        bindContext(parent.getContext());
+        return e;
+    }
+    public void bindContext(Context context) {
+    this.context=context;
+    }
+
+
+
+    @Override
+    public void setData(List<T> data) {
+        if(dataChangeListner!=null){
+            dataChangeListner.change(data);
+        }
+        mData = data;
+        notifyDataSetChanged();
+    }
+    public void setLayoutId() {
+        mLayoutResId = getLayoutId();
+    }
+
+    public abstract int getLayoutId();
+
+    @Override
+    public void appendData(List<T> data) {
+        if(mData!=null){
+            addData(data);
+        }else{
+            setData(data);
+        }
+    }
+    @Override
+    public void appendData(int index, List<T> data) {
+        if(mData!=null){
+            addData(index,data);
+        }else{
+            setData(data);
+        }
+    }
+
+
+
+
+    public T getLastData(){
+       return ListUtil.haveData(mData) ?mData.get(mData.size()-1):null;
+    }
+
+    @Override
+    public int getItemCount() {
+        return mData==null?0:super.getItemCount();
+    }
+
+    public int size(){
+        return mData==null?0:mData.size();
+    }
+    @Override
+    public void notifyReclyDataChange() {
+        notifyDataSetChanged();
+    }
+    @Override
+    public List<T> getArray() {
+
+        return mData;
+    }
+
+
+    @Override
+    public RecyclerView.Adapter returnRecyclerAdapter() {
+        return this;
+    }
+
+    /*监听数据源的内存地址变化*/
+    public void setDataChangeListner(DataChangeListner<T> dataChangeListner) {
+        this.dataChangeListner = dataChangeListner;
+    }
+
+
+
+    public interface DataChangeListner<T>{
+        public void change(List<T>t);
+    }
+}

+ 25 - 0
common/src/main/java/com/wanyue/common/adapter/radio/CheckEntity.java

@@ -0,0 +1,25 @@
+package com.wanyue.common.adapter.radio;
+
+public class CheckEntity implements IRadioChecker{
+    private String name;
+    private String id;
+
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+    @Override
+    public String getContent() {
+        return name;
+    }
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+}

+ 7 - 0
common/src/main/java/com/wanyue/common/adapter/radio/IRadioChecker.java

@@ -0,0 +1,7 @@
+package com.wanyue.common.adapter.radio;
+
+public interface IRadioChecker {
+    public String getContent();
+    public String getId();
+
+}

+ 99 - 0
common/src/main/java/com/wanyue/common/adapter/radio/RadioAdapter.java

@@ -0,0 +1,99 @@
+package com.wanyue.common.adapter.radio;
+
+import android.view.View;
+import android.widget.Checkable;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.tencent.cos.xml.utils.StringUtils;
+import com.wanyue.common.R;
+import com.wanyue.common.adapter.base.BaseReclyViewHolder;
+import com.wanyue.common.adapter.base.BaseRecyclerAdapter;
+import com.wanyue.common.utils.ListUtil;
+import com.wanyue.common.utils.StringUtil;
+import java.util.List;
+
+public class RadioAdapter<T extends IRadioChecker> extends BaseRecyclerAdapter<T, BaseReclyViewHolder> {
+    private Checkable selectCheckAble;
+    private int selectPosition=-1;
+
+    public RadioAdapter(List<T> data) {
+        super(data);
+        setOnItemClickListener(onItemClickListener);
+    }
+    @Override
+    public int getLayoutId() {
+        return R.layout.item_recly_radio;
+    }
+
+    @Override
+    protected void convert(BaseReclyViewHolder helper, IRadioChecker item) {
+        helper.setText(contentViewId(),item.getContent());
+        Checkable checkable=helper.getView(checkId());
+        int position=helper.getLayoutPosition();
+        if(selectPosition==position&&(selectCheckAble==null||selectCheckAble!=checkable)){
+           setCheck(checkable,position);
+        }
+    }
+
+
+
+    private OnItemClickListener onItemClickListener=new OnItemClickListener() {
+        @Override
+        public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
+            Checkable checkable= view.findViewById(checkId());
+            setCheck(checkable,position);
+
+        }
+    };
+
+    private void setCheck(Checkable checkable, int position) {
+        if(selectCheckAble!=null&&selectCheckAble!=checkable){
+            selectCheckAble.setChecked(false);
+        }
+        selectCheckAble=checkable;
+        checkable.setChecked(true);
+        selectPosition=position;
+    }
+
+    @Override
+    public void setData(List<T> data) {
+        super.setData(data);
+
+    }
+
+    public int contentViewId(){
+        return R.id.tv_content;
+    }
+    public int checkId(){
+        return R.id.check_image;
+    }
+
+    public T getSelectData(){
+        if(selectPosition==-1) {
+            return null;
+        }
+        return ListUtil.safeGetData(mData,selectPosition);
+    }
+
+    public int setDefaultSelect(String id){
+        if(!ListUtil.haveData(mData)|| StringUtils.isEmpty(id)){
+            return -1;
+        }
+        int size=mData.size();
+        for(int i=0;i<size;i++){
+          if(StringUtil.equals(mData.get(i).getId(),id)){
+              selectPosition=i;
+              break;
+          }
+        }
+        notifyItemChanged(selectPosition);
+        return selectPosition;
+    }
+
+    public String getId(){
+        if(size()==0||selectPosition==-1) {
+            return null;
+        }
+        return mData.get(selectPosition).getId();
+    }
+
+}

+ 360 - 0
common/src/main/java/com/wanyue/common/api/CommonAPI.java

@@ -0,0 +1,360 @@
+package com.wanyue.common.api;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.bumptech.glide.RequestManager;
+import com.lzy.okgo.OkGo;
+import com.lzy.okgo.callback.StringCallback;
+import com.lzy.okgo.model.Response;
+import com.lzy.okgo.request.GetRequest;
+import com.wanyue.common.CommonAppConfig;
+import com.wanyue.common.R;
+import com.wanyue.common.activity.ErrorActivity;
+import com.wanyue.common.bean.ConfigBean;
+import com.wanyue.common.bean.TxLocationPoiBean;
+import com.wanyue.common.event.BlackEvent;
+import com.wanyue.common.event.FollowEvent;
+import com.wanyue.common.http.CommonHttpConsts;
+import com.wanyue.common.http.CommonHttpUtil;
+import com.wanyue.common.http.HttpCallback;
+import com.wanyue.common.http.HttpClient;
+import com.wanyue.common.http.JsonBean;
+import com.wanyue.common.interfaces.CommonCallback;
+import com.wanyue.common.server.MapBuilder;
+import com.wanyue.common.server.RequestFactory;
+import com.wanyue.common.server.entity.Data;
+import com.wanyue.common.utils.JsonUtil;
+import com.wanyue.common.utils.L;
+import com.wanyue.common.utils.MD5Util;
+import com.wanyue.common.utils.ResourceUtil;
+import com.wanyue.common.utils.SpUtil;
+import com.wanyue.common.utils.ToastUtil;
+import com.wanyue.common.utils.WordUtil;
+import org.greenrobot.eventbus.EventBus;
+import java.util.List;
+import java.util.Map;
+
+import io.reactivex.Observable;
+import io.reactivex.ObservableEmitter;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.functions.Consumer;
+import io.reactivex.functions.Function;
+
+public class CommonAPI {
+    /**
+     * 使用腾讯定位sdk获取 位置信息
+     *
+     * @param lng 经度
+     * @param lat 纬度
+     * @param poi 是否要查询POI
+     */
+    public static void getAddressInfoByTxLocaitonSdk(final double lng, final double lat, final int poi, int pageIndex, String tag, final HttpCallback commonCallback) {
+        String txMapAppKey = CommonAppConfig.getTxMapAppKey();
+        String s = "/ws/geocoder/v1/?get_poi=" + poi + "&key=" + txMapAppKey + "&location=" + lat + "," + lng
+                + "&poi_options=address_format=short;radius=1000;page_size=20;page_index=" + pageIndex + ";policy=5" + CommonAppConfig.getTxMapAppSecret();
+        String sign = MD5Util.getMD5(s);
+        GetRequest getRequest= OkGo.<String>get("https://apis.map.qq.com/ws/geocoder/v1/")
+                .params("location", lat + "," + lng)
+                .params("get_poi", poi)
+                .params("poi_options", "address_format=short;radius=1000;page_size=20;page_index=" + pageIndex + ";policy=5")
+                .params("key", txMapAppKey)
+                .params("sig", sign)
+                .tag(tag);
+
+        L.e("getRequest=="+getRequest.getParams().toString());
+        getRequest.execute(new StringCallback() {
+            @Override
+            public void onSuccess(Response<String> response) {
+                JSONObject obj = JSON.parseObject(response.body());
+                if (obj != null && commonCallback != null) {
+                    commonCallback.onSuccess(obj.getIntValue("status"), "", new String[]{obj.getString("result")});
+                }
+            }
+            @Override
+            public void onError(Response<String> response) {
+                super.onError(response);
+                if (commonCallback != null) {
+                    commonCallback.onError();
+                }
+            }
+
+            @Override
+            public void onFinish() {
+                super.onFinish();
+                if (commonCallback != null) {
+                    commonCallback.onFinish();
+                }
+            }
+        });
+    }
+
+    /*转化为rxjava流的形式*/
+    public static Observable<List<TxLocationPoiBean>> obseverAddressInfoByTxLocaitonSdk(final int poi, final int pageIndex, final  String tag){
+        return Observable.create(new ObservableOnSubscribe<List<TxLocationPoiBean>>() {
+            @Override
+            public void subscribe(final ObservableEmitter<List<TxLocationPoiBean>> e) throws Exception {
+                getAddressInfoByTxLocaitonSdk(CommonAppConfig.getLng(), CommonAppConfig.getLat(), poi, pageIndex, tag, new HttpCallback() {
+                    @Override
+                    public void onSuccess(int code, String msg, String[] info) {
+                        if(code==0&&info.length>0){
+                            List<TxLocationPoiBean>list= JsonUtil.getJsonToList(JsonUtil.getString(info[0],"pois"),TxLocationPoiBean.class);
+                            e.onNext(list);
+                        }
+                        e.onComplete();
+                    }
+                    @Override
+                    public void onError() {
+                        super.onError();
+                        e.onComplete();
+                    }
+                });
+            }
+        });
+    }
+
+    /**
+     * 使用腾讯地图API进行搜索
+     *
+     * @param lng 经度
+     * @param lat 纬度
+     */
+    public static void searchAddressInfoByTxLocaitonSdk(final double lng, final double lat, String keyword, int pageIndex, final HttpCallback commonCallback) {
+
+        String txMapAppKey = CommonAppConfig.getTxMapAppKey();
+        String s = "/ws/place/v1/search?boundary=nearby(" + lat + "," + lng + ",1000)&key=" + txMapAppKey + "&keyword=" + keyword + "&orderby=_distance&page_index=" + pageIndex +
+                "&page_size=20" + CommonAppConfig.getTxMapAppSecret();
+        String sign = MD5Util.getMD5(s);
+        OkGo.<String>get("https://apis.map.qq.com/ws/place/v1/search")
+                .params("keyword", keyword)
+                .params("boundary", "nearby(" + lat + "," + lng + ",1000)&orderby=_distance&page_size=20&page_index=" + pageIndex)
+                .params("key", txMapAppKey)
+                .params("sig", sign)
+                .tag(CommonHttpConsts.GET_MAP_SEARCH)
+                .execute(new StringCallback() {
+                    @Override
+                    public void onSuccess(Response<String> response) {
+                        JSONObject obj = JSON.parseObject(response.body());
+                        if (obj != null && commonCallback != null) {
+                            commonCallback.onSuccess(obj.getIntValue("status"), "", new String[]{obj.getString("data")});
+                        }
+                    }
+
+                    @Override
+                    public void onError(Response<String> response) {
+                        super.onError(response);
+                        if (commonCallback != null) {
+                            commonCallback.onError();
+                        }
+                    }
+
+                    @Override
+                    public void onFinish() {
+                        super.onFinish();
+                        if (commonCallback != null) {
+                            commonCallback.onFinish();
+                        }
+                    }
+                });
+    }
+
+
+    /**
+     * 获取config
+     */
+    public static Observable<ConfigBean> getConfig() {
+       return RequestFactory.getRequestManager().valueGet("Home.getConfig",null,ConfigBean.class,false).
+               doOnNext(new Consumer<ConfigBean>() {
+           @Override
+           public void accept(ConfigBean configBean) throws Exception {
+               CommonAppConfig.setConfig(configBean);
+           }
+       });
+    }
+
+
+    /**
+     * QQ登录的时候 获取unionID 与PC端互通的时候用
+     */
+    public static void getQQLoginUnionID(String accessToken, final CommonCallback<String> commonCallback) {
+        OkGo.<String>get("https://graph.qq.com/oauth2.0/me?access_token=" + accessToken + "&unionid=1")
+                .tag(CommonHttpConsts.GET_QQ_LOGIN_UNION_ID)
+                .execute(new StringCallback() {
+                    @Override
+                    public void onSuccess(Response<String> response) {
+                        if (commonCallback != null) {
+                            String data = response.body();
+                            data = data.substring(data.indexOf("{"), data.lastIndexOf("}") + 1);
+                            L.e("getQQLoginUnionID------>" + data);
+                            JSONObject obj = JSON.parseObject(data);
+                            commonCallback.callback(obj.getString("unionid"));
+                        }
+                    }
+                });
+    }
+
+    /**
+     * 关注别人 或 取消对别人的关注的接口
+     */
+    public static Observable<Integer> setAttention(final String touid,final boolean isShowMsg) {
+        Map<String,Object>map=MapBuilder.factory().addBaseParm().put("touid",touid).build();
+        return RequestFactory.getRequestManager().originalRequest("User.setAttent",map).map(new Function<Data<JSONObject>, Integer>() {
+            @Override
+            public Integer apply(Data<JSONObject> jsonObjectData) throws Exception {
+                if(isShowMsg){
+                 ToastUtil.show(jsonObjectData.getMsg());
+                }
+
+                JSONObject jsonObject=jsonObjectData.getInfo_0();
+                int isattent=jsonObject.getIntValue("isattent");
+                EventBus.getDefault().post(new FollowEvent(touid,isattent));
+                return isattent;
+            }
+        });
+    }
+
+    /**
+     * 充值页面,我的钻石
+     */
+
+    public static void getBalance(HttpCallback callback) {
+        HttpClient.getInstance().get("Charge.getBalance", CommonHttpConsts.GET_BALANCE)
+                .params("uid", CommonAppConfig.getUid())
+                .params("token", CommonAppConfig.getToken())
+                .params("type", 1)
+                .execute(callback);
+    }
+
+
+    /**
+     * 用支付宝充值 的时候在服务端生成订单号
+     *
+     * @param callback
+     */
+    public static void getAliOrder(String parmas, HttpCallback callback) {
+        HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_ALI_ORDER)
+                .execute(callback);
+    }
+
+    /**
+     * 用微信支付充值 的时候在服务端生成订单号
+     *
+     * @param callback
+     */
+    public static void getWxOrder(String parmas, HttpCallback callback) {
+        HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_WX_ORDER)
+                .execute(callback);
+    }
+
+    /**
+     * 用谷歌支付充值 的时候在服务端生成订单号
+     *
+     * @param callback
+     */
+    public static void getGoogleOrder(String changeid, String coin, String money, HttpCallback callback) {
+        HttpClient.getInstance().get("Charge.GetGoogleOrder", CommonHttpConsts.GET_GOOGLE_ORDER)
+                .params("uid", CommonAppConfig.getUid())
+                .params("token", CommonAppConfig.getToken())
+                .params("changeid", changeid)
+                .params("coin", coin)
+                .params("money", money)
+                .execute(callback);
+    }
+
+    /**
+     * google支付回调
+     */
+
+    public static void checkGooglePay(String callbackUrl, String OriginalJson, String Signature, String OrderId, String order, HttpCallback callback) {
+        OkGo.<JsonBean>post(callbackUrl)
+                .params("signed_data", OriginalJson)
+                .params("signature", Signature)
+                .params("google_orderid", OrderId)
+                .params("orderid", order)
+                .execute(callback);
+    }
+
+
+    //不做任何操作的HttpCallback
+    public static final HttpCallback NO_CALLBACK = new HttpCallback() {
+        @Override
+        public void onSuccess(int code, String msg, String[] info) {
+
+        }
+    };
+
+    /**
+     * 上传文件 获取七牛云token的接口
+     */
+    public static void getUploadQiNiuToken(HttpCallback callback) {
+        HttpClient.getInstance().get("Upload.getQiniuToken", CommonHttpConsts.GET_UPLOAD_QI_NIU_TOKEN)
+                .params("uid", CommonAppConfig.getUid())
+                .params("token", CommonAppConfig.getToken())
+                .execute(callback);
+    }
+
+    /**
+     * 把自己的位置信息上传到服务器
+     *
+     * @param lng
+     * @param lat
+     */
+
+    public static void setLocaiton(double lng, double lat) {
+        HttpClient.getInstance().get("User.SetLocal", CommonHttpConsts.SET_LOCAITON)
+                .params("uid", CommonAppConfig.getUid())
+                .params("token", CommonAppConfig.getToken())
+                .params("lng", lng)
+                .params("lat", lat)
+                .execute(NO_CALLBACK);
+    }
+
+
+    /**
+     * 获取语音价格说明
+     */
+    public static void getVoicePriceTip(HttpCallback callback) {
+        HttpClient.getInstance().get("User.GetVoiceInfo", CommonHttpConsts.GET_VOICE_PRICE_TIP)
+                .params("uid", CommonAppConfig.getUid())
+                .params("token", CommonAppConfig.getToken())
+                .execute(callback);
+    }
+
+
+    /**
+     * 拉黑对方, 解除拉黑
+     */
+    public static void setBlack(final String toUid) {
+        HttpClient.getInstance().get("User.setBlack", CommonHttpConsts.SET_BLACK)
+                .params("uid", CommonAppConfig.getUid())
+                .params("token", CommonAppConfig.getToken())
+                .params("touid", toUid)
+                .execute(new HttpCallback() {
+                    @Override
+                    public void onSuccess(int code, String msg, String[] info) {
+                        if (code == 0 && info.length > 0) {
+                            EventBus.getDefault().post(new BlackEvent(toUid, JSON.parseObject(info[0]).getIntValue("isblack")));
+                        }
+                        ToastUtil.show(msg);
+                    }
+                });
+    }
+
+    /**
+     * 获取黑名单
+     */
+    public static void getBlackList(HttpCallback callback) {
+        HttpClient.getInstance().get("User.getBlackList", CommonHttpConsts.GET_BLACK_LIST)
+                .params("uid", CommonAppConfig.getUid())
+                .params("token", CommonAppConfig.getToken())
+                .execute(callback);
+    }
+    public static void cancel(String tag){
+        HttpClient.getInstance().cancel(tag);
+    }
+
+    public static Observable<Boolean> checkToken(){
+        Map<String,Object>map=MapBuilder.factory().build();
+        return RequestFactory.getRequestManager().commit("User.Iftoken",map,true);
+    }
+
+}

+ 48 - 0
common/src/main/java/com/wanyue/common/bean/AreaBean.java

@@ -0,0 +1,48 @@
+package com.wanyue.common.bean;
+
+import org.jetbrains.annotations.NotNull;
+
+public class AreaBean {
+    private String province;
+    private String city;
+    private String county;
+
+    public AreaBean(String province, String city, String county) {
+        this.province = province;
+        this.city = city;
+        this.county = county;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+    public String getCity() {
+        return city;
+    }
+    public void setCity(String city) {
+        this.city = city;
+    }
+    public String getCounty() {
+        return county;
+    }
+    public void setCounty(String county) {
+        this.county = county;
+    }
+    @NotNull
+    @Override
+    public String toString() {
+        StringBuilder builder=new StringBuilder();
+        try {
+            builder.append(province).append(" ")
+                    .append(city).append(" ")
+                    .append(county).append(" ");
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return builder.toString();
+    }
+}

+ 36 - 0
common/src/main/java/com/wanyue/common/bean/ChargeSuccessBean.java

@@ -0,0 +1,36 @@
+package com.wanyue.common.bean;
+
+/**
+ * Created by cxf on 2019/4/23.
+ */
+
+public class ChargeSuccessBean {
+
+    private String avatar;
+    private String nickname;
+    private String coin;
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    public String getCoin() {
+        return coin;
+    }
+
+    public void setCoin(String coin) {
+        this.coin = coin;
+    }
+}

+ 151 - 0
common/src/main/java/com/wanyue/common/bean/ChatAnchorParam.java

@@ -0,0 +1,151 @@
+package com.wanyue.common.bean;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Created by cxf on 2019/4/19.
+ */
+
+public class ChatAnchorParam implements Parcelable {
+
+    private String mSessionId;//通话的ID
+    private int mChatType;//通话的类型
+    private String mAudienceID;//观众的ID
+    private String mAudienceAvatar;//观众的头像
+    private String mAudienceName;//观众的名字
+    private boolean mAnchorActive;//是否是主播主动发起的
+    private String mAnchorPlayUrl;//主播的播放地址
+    private String mAnchorPushUrl;//主播的推流地址
+    private String mPrice;//通话价格
+    private boolean mMatch;//是否是匹配的
+
+    public ChatAnchorParam() {
+    }
+
+    public String getSessionId() {
+        return mSessionId;
+    }
+
+    public void setSessionId(String sessionId) {
+        mSessionId = sessionId;
+    }
+
+    public int getChatType() {
+        return mChatType;
+    }
+
+    public void setChatType(int chatType) {
+        mChatType = chatType;
+    }
+
+    public String getAudienceID() {
+        return mAudienceID;
+    }
+
+    public void setAudienceID(String audienceID) {
+        mAudienceID = audienceID;
+    }
+
+    public String getAudienceAvatar() {
+        return mAudienceAvatar;
+    }
+
+    public void setAudienceAvatar(String audienceAvatar) {
+        mAudienceAvatar = audienceAvatar;
+    }
+
+    public String getAudienceName() {
+        return mAudienceName;
+    }
+
+    public void setAudienceName(String audienceName) {
+        mAudienceName = audienceName;
+    }
+
+    public boolean isAnchorActive() {
+        return mAnchorActive;
+    }
+
+    public void setAnchorActive(boolean anchorActive) {
+        mAnchorActive = anchorActive;
+    }
+
+
+    public String getAnchorPlayUrl() {
+        return mAnchorPlayUrl;
+    }
+
+    public void setAnchorPlayUrl(String anchorPlayUrl) {
+        mAnchorPlayUrl = anchorPlayUrl;
+    }
+
+    public String getAnchorPushUrl() {
+        return mAnchorPushUrl;
+    }
+
+    public void setAnchorPushUrl(String anchorPushUrl) {
+        mAnchorPushUrl = anchorPushUrl;
+    }
+
+
+    public String getPrice() {
+        return mPrice;
+    }
+
+    public void setPrice(String price) {
+        mPrice = price;
+    }
+
+    public boolean isMatch() {
+        return mMatch;
+    }
+
+    public void setMatch(boolean match) {
+        mMatch = match;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mSessionId);
+        dest.writeInt(mChatType);
+        dest.writeString(mAudienceID);
+        dest.writeString(mAudienceAvatar);
+        dest.writeString(mAudienceName);
+        dest.writeByte((byte) (mAnchorActive ? 1 : 0));
+        dest.writeString(mAnchorPlayUrl);
+        dest.writeString(mAnchorPushUrl);
+        dest.writeString(mPrice);
+        dest.writeByte((byte) (mMatch ? 1 : 0));
+    }
+
+    public ChatAnchorParam(Parcel in) {
+        mSessionId = in.readString();
+        mChatType = in.readInt();
+        mAudienceID = in.readString();
+        mAudienceAvatar = in.readString();
+        mAudienceName = in.readString();
+        mAnchorActive = in.readByte() != 0;
+        mAnchorPlayUrl = in.readString();
+        mAnchorPushUrl = in.readString();
+        mPrice = in.readString();
+        mMatch = in.readByte() != 0;
+    }
+
+    public static final Creator<ChatAnchorParam> CREATOR = new Creator<ChatAnchorParam>() {
+        @Override
+        public ChatAnchorParam createFromParcel(Parcel in) {
+            return new ChatAnchorParam(in);
+        }
+
+        @Override
+        public ChatAnchorParam[] newArray(int size) {
+            return new ChatAnchorParam[size];
+        }
+    };
+}

+ 164 - 0
common/src/main/java/com/wanyue/common/bean/ChatAudienceParam.java

@@ -0,0 +1,164 @@
+package com.wanyue.common.bean;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Created by cxf on 2019/4/19.
+ */
+
+public class ChatAudienceParam implements Parcelable {
+
+    private String mSessionId;//通话的ID
+    private int mChatType;//通话的类型
+    private String mAnchorID;//主播的ID
+    private String mAnchorAvatar;//主播的头像
+    private String mAnchorName;//主播的名字
+    private int mAnchorLevel;//主播的等级
+    private String mAudiencePlayUrl;//观众的播放地址
+    private String mAudiencePushUrl;//观众的推流地址
+    private String mAnchorPrice;//主播的价格
+    private boolean mAudienceActive;//是否是观众主动发起的
+    private boolean mMatch;//是否是匹配的
+
+    public ChatAudienceParam() {
+    }
+
+
+    public String getSessionId() {
+        return mSessionId;
+    }
+
+    public void setSessionId(String sessionId) {
+        mSessionId = sessionId;
+    }
+
+    public int getChatType() {
+        return mChatType;
+    }
+
+    public void setChatType(int chatType) {
+        mChatType = chatType;
+    }
+
+    public String getAnchorID() {
+        return mAnchorID;
+    }
+
+    public void setAnchorID(String anchorID) {
+        mAnchorID = anchorID;
+    }
+
+    public String getAnchorAvatar() {
+        return mAnchorAvatar;
+    }
+
+    public void setAnchorAvatar(String anchorAvatar) {
+        mAnchorAvatar = anchorAvatar;
+    }
+
+    public String getAnchorName() {
+        return mAnchorName;
+    }
+
+    public void setAnchorName(String anchorName) {
+        mAnchorName = anchorName;
+    }
+
+    public int getAnchorLevel() {
+        if (mAnchorLevel <= 0) {
+            return 1;
+        }
+        return mAnchorLevel;
+    }
+
+    public void setAnchorLevel(int anchorLevel) {
+        mAnchorLevel = anchorLevel;
+    }
+
+    public String getAudiencePlayUrl() {
+        return mAudiencePlayUrl;
+    }
+
+    public void setAudiencePlayUrl(String audiencePlayUrl) {
+        mAudiencePlayUrl = audiencePlayUrl;
+    }
+
+    public String getAudiencePushUrl() {
+        return mAudiencePushUrl;
+    }
+
+    public void setAudiencePushUrl(String audiencePushUrl) {
+        mAudiencePushUrl = audiencePushUrl;
+    }
+
+    public String getAnchorPrice() {
+        return mAnchorPrice;
+    }
+
+    public void setAnchorPrice(String anchorPrice) {
+        mAnchorPrice = anchorPrice;
+    }
+
+    public boolean isAudienceActive() {
+        return mAudienceActive;
+    }
+
+    public void setAudienceActive(boolean audienceActive) {
+        mAudienceActive = audienceActive;
+    }
+
+    public boolean isMatch() {
+        return mMatch;
+    }
+
+    public void setMatch(boolean match) {
+        mMatch = match;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mSessionId);
+        dest.writeInt(mChatType);
+        dest.writeString(mAnchorID);
+        dest.writeString(mAnchorAvatar);
+        dest.writeString(mAnchorName);
+        dest.writeInt(mAnchorLevel);
+        dest.writeString(mAudiencePlayUrl);
+        dest.writeString(mAudiencePushUrl);
+        dest.writeString(mAnchorPrice);
+        dest.writeByte((byte) (mAudienceActive ? 1 : 0));
+        dest.writeByte((byte) (mMatch ? 1 : 0));
+    }
+
+    public ChatAudienceParam(Parcel in) {
+        mSessionId = in.readString();
+        mChatType = in.readInt();
+        mAnchorID = in.readString();
+        mAnchorAvatar = in.readString();
+        mAnchorName = in.readString();
+        mAnchorLevel = in.readInt();
+        mAudiencePlayUrl = in.readString();
+        mAudiencePushUrl = in.readString();
+        mAnchorPrice = in.readString();
+        mAudienceActive = in.readByte() != 0;
+        mMatch = in.readByte() != 0;
+    }
+
+    public static final Creator<ChatAudienceParam> CREATOR = new Creator<ChatAudienceParam>() {
+        @Override
+        public ChatAudienceParam createFromParcel(Parcel in) {
+            return new ChatAudienceParam(in);
+        }
+
+        @Override
+        public ChatAudienceParam[] newArray(int size) {
+            return new ChatAudienceParam[size];
+        }
+    };
+}

+ 143 - 0
common/src/main/java/com/wanyue/common/bean/ChatGiftBean.java

@@ -0,0 +1,143 @@
+package com.wanyue.common.bean;
+
+import android.view.View;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.wanyue.common.CommonAppConfig;
+import com.wanyue.common.utils.StringUtil;
+
+/**
+ * Created by cxf on 2018/10/12.
+ */
+
+public class ChatGiftBean {
+
+    public static final int TYPE_NORMAL = 0;
+    public static final int TYPE_DELUXE = 1;
+    public static final int MARK_NORMAL = 0;
+    public static final int MARK_HOT = 1;
+    public static final int MARK_GUARD = 2;
+
+    private int id;
+    private int type;//0 普通礼物 1是豪华礼物
+    private int mark;// 0 普通  1热门  2守护
+    private String name;
+    private String price;
+    private String icon;
+    private boolean checked;
+    private int page;
+    private View mView;
+    private String swf;
+    private String swftype;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public int getMark() {
+        return mark;
+    }
+
+    public void setMark(int mark) {
+        this.mark = mark;
+    }
+
+    @JSONField(name = "giftname")
+    public String getName() {
+        return name;
+    }
+
+    @JSONField(name = "giftname")
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @JSONField(name = "needcoin")
+    public String getPrice() {
+        return price;
+    }
+
+    @JSONField(name = "needcoin")
+    public void setPrice(String price) {
+        this.price = price;
+    }
+
+    @JSONField(name = "gifticon")
+    public String getIcon() {
+        return icon;
+    }
+
+    @JSONField(name = "gifticon")
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    public boolean isChecked() {
+        return checked;
+    }
+
+    public void setChecked(boolean checked) {
+        this.checked = checked;
+    }
+
+    public int getPage() {
+        return page;
+    }
+
+    public void setPage(int page) {
+        this.page = page;
+    }
+
+    public View getView() {
+        return mView;
+    }
+
+    public void setView(View view) {
+        mView = view;
+    }
+
+    public String getSwf() {
+        return swf;
+    }
+
+    public void setSwf(String swf) {
+        this.swf = swf;
+    }
+
+    public String getSwftype() {
+        return swftype;
+    }
+
+    public void setSwftype(String swftype) {
+        this.swftype = swftype;
+    }
+
+    public ChatReceiveGiftBean valueToChatReceiveGiftBean(){
+        UserBean userBean=CommonAppConfig.getUserBean();
+        ChatReceiveGiftBean chatReceiveGiftBean=new ChatReceiveGiftBean();
+        chatReceiveGiftBean.setGiftIcon(icon);
+        chatReceiveGiftBean.setGiftName(name);
+        chatReceiveGiftBean.setGiftId(Integer.toString(id));
+        chatReceiveGiftBean.setAvatar(userBean.getAvatar());
+        chatReceiveGiftBean.setUserNiceName(userBean.getUserNiceName());
+        chatReceiveGiftBean.setUid(userBean.getId());
+        chatReceiveGiftBean.setGif(type);
+        if(StringUtil.isInt(swftype)){
+         chatReceiveGiftBean.setGitType(Integer.parseInt(swftype));
+        }
+        chatReceiveGiftBean.setGifUrl(swf);
+        return chatReceiveGiftBean;
+    }
+}

+ 190 - 0
common/src/main/java/com/wanyue/common/bean/ChatReceiveGiftBean.java

@@ -0,0 +1,190 @@
+package com.wanyue.common.bean;
+
+import android.text.TextUtils;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.wanyue.common.utils.StringUtil;
+
+/**
+ * Created by cxf on 2017/8/22.
+ * 收到送礼物消息的实体类
+ */
+
+public class ChatReceiveGiftBean {
+
+
+    private String uid;
+    private String avatar;
+    private String userNiceName;
+    private int level;
+    private String giftId;
+    private int giftCount;
+    private String giftName;
+    private String giftIcon;
+    private int lianCount = 1;
+    private int gif;//是否是gif礼物  1是 0不是
+    private int gitType;//豪华礼物类型 0是gif  1是svga
+    private String gifUrl;
+    private String mKey;
+    private String sessionId;
+    private String toname;
+    private String touid;
+    private float total;
+
+
+    public String getUid() {
+        return uid;
+    }
+
+    public void setUid(String uid) {
+        this.uid = uid;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    @JSONField(name = "user_nicename")
+    public String getUserNiceName() {
+        return userNiceName;
+    }
+
+    @JSONField(name = "user_nicename")
+    public void setUserNiceName(String userNiceName) {
+        this.userNiceName = userNiceName;
+    }
+
+    @JSONField(name = "level")
+    public int getLevel() {
+        return level;
+    }
+
+    @JSONField(name = "level")
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    @JSONField(name = "giftid")
+    public String getGiftId() {
+        return giftId;
+    }
+
+    @JSONField(name = "giftid")
+    public void setGiftId(String giftId) {
+        this.giftId = giftId;
+    }
+
+    @JSONField(name = "nums")
+    public int getGiftCount() {
+        return giftCount;
+    }
+
+    @JSONField(name = "nums")
+    public void setGiftCount(int giftCount) {
+        this.giftCount = giftCount;
+    }
+
+    @JSONField(name = "giftname")
+    public String getGiftName() {
+        return giftName;
+    }
+
+    @JSONField(name = "giftname")
+    public void setGiftName(String giftName) {
+        this.giftName = giftName;
+    }
+
+    @JSONField(name = "gifticon")
+    public String getGiftIcon() {
+        return giftIcon;
+    }
+
+    @JSONField(name = "gifticon")
+    public void setGiftIcon(String giftIcon) {
+        this.giftIcon = giftIcon;
+    }
+
+
+    @JSONField(name = "type")
+    public int getGif() {
+        return gif;
+    }
+
+    @JSONField(name = "type")
+    public void setGif(int gif) {
+        this.gif = gif;
+    }
+
+    @JSONField(name = "swf")
+    public String getGifUrl() {
+        return gifUrl;
+    }
+
+    @JSONField(name = "swf")
+    public void setGifUrl(String gifUrl) {
+        this.gifUrl = gifUrl;
+    }
+
+    @JSONField(name = "swftype")
+    public int getGitType() {
+        return gitType;
+    }
+
+    @JSONField(name = "swftype")
+    public void setGitType(int gitType) {
+        this.gitType = gitType;
+    }
+
+    @JSONField(name = "showid")
+    public String getSessionId() {
+        return sessionId;
+    }
+
+    @JSONField(name = "showid")
+    public void setSessionId(String sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public int getLianCount() {
+        return lianCount;
+    }
+
+    public void setLianCount(int lianCount) {
+        this.lianCount = lianCount;
+    }
+
+    public String getTouid() {
+        return touid;
+    }
+
+    public void setTouid(String touid) {
+        this.touid = touid;
+    }
+
+    public String getToname() {
+        return toname;
+    }
+
+    public void setToname(String toname) {
+        this.toname = toname;
+    }
+
+    public String getKey() {
+        if (TextUtils.isEmpty(mKey)) {
+            mKey = StringUtil.contact(this.uid,this.giftId,this.giftCount,this.touid)  ;
+        }
+        return mKey;
+    }
+
+    public float getTotal() {
+        return total;
+    }
+
+    public void setTotal(float total) {
+        this.total = total;
+    }
+}

+ 96 - 0
common/src/main/java/com/wanyue/common/bean/CoinBean.java

@@ -0,0 +1,96 @@
+package com.wanyue.common.bean;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Created by cxf on 2017/9/21.
+ */
+
+public class CoinBean implements Parcelable{
+
+    private String id;
+    private String coin;
+    private String money;
+    private String give;
+    private boolean checked;
+
+    public CoinBean(){
+
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getCoin() {
+        return coin;
+    }
+
+    public void setCoin(String coin) {
+        this.coin = coin;
+    }
+
+    public String getMoney() {
+        return money;
+    }
+
+    public void setMoney(String money) {
+        this.money = money;
+    }
+
+    public String getGive() {
+        return give;
+    }
+
+    public void setGive(String give) {
+        this.give = give;
+    }
+
+    public boolean isChecked() {
+        return checked;
+    }
+
+    public void setChecked(boolean checked) {
+        this.checked = checked;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public CoinBean(Parcel in) {
+        id = in.readString();
+        coin = in.readString();
+        money = in.readString();
+        give = in.readString();
+        checked = in.readByte() != 0;
+    }
+
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(id);
+        dest.writeString(coin);
+        dest.writeString(money);
+        dest.writeString(give);
+        dest.writeByte((byte) (checked ? 1 : 0));
+    }
+
+    public static final Creator<CoinBean> CREATOR = new Creator<CoinBean>() {
+        @Override
+        public CoinBean createFromParcel(Parcel in) {
+            return new CoinBean(in);
+        }
+
+        @Override
+        public CoinBean[] newArray(int size) {
+            return new CoinBean[size];
+        }
+    };
+}

+ 55 - 0
common/src/main/java/com/wanyue/common/bean/CoinPayBean.java

@@ -0,0 +1,55 @@
+package com.wanyue.common.bean;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Created by cxf on 2019/4/11.
+ */
+
+public class CoinPayBean {
+    @SerializedName("id")
+    @JSONField(name = "id")
+    private String mId;
+    @SerializedName("name")
+    @JSONField(name = "name")
+    private String mName;
+    @SerializedName("thumb")
+    @JSONField(name = "thumb")
+    private String mThumb;
+    private boolean mChecked;
+
+    public String getId() {
+        return mId;
+    }
+
+    public void setId(String id) {
+        mId = id;
+    }
+
+    public String getName() {
+        return mName;
+    }
+
+    public void setName(String name) {
+        mName = name;
+    }
+
+    public String getThumb() {
+        return mThumb;
+    }
+
+    public void setThumb(String thumb) {
+        mThumb = thumb;
+    }
+
+    @JSONField(serialize = false)
+    public boolean isChecked() {
+        return mChecked;
+    }
+
+    @JSONField(serialize = false)
+    public void setChecked(boolean checked) {
+        mChecked = checked;
+    }
+}

+ 39 - 0
common/src/main/java/com/wanyue/common/bean/ConditionLevel.java

@@ -0,0 +1,39 @@
+package com.wanyue.common.bean;
+
+import com.google.gson.annotations.SerializedName;
+
+public class ConditionLevel  implements ExportNamer{
+    @SerializedName("levelid")
+    private String id;
+    private String name;
+
+    public ConditionLevel(String id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+    public ConditionLevel(){
+
+    }
+    public String getId() {
+        return id;
+    }
+    public void setId(String id) {
+        this.id = id;
+    }
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String exportName() {
+        return name;
+    }
+
+    @Override
+    public String exportId() {
+        return id;
+    }
+}

+ 403 - 0
common/src/main/java/com/wanyue/common/bean/ConfigBean.java

@@ -0,0 +1,403 @@
+package com.wanyue.common.bean;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Created by cxf on 2017/8/5.
+ */
+
+public class ConfigBean {
+
+    @SerializedName( "apk_ver")
+    @JSONField(name = "apk_ver")
+    private String version;//Android apk安装包 版本号
+
+    @SerializedName( "apk_url")
+    @JSONField(name = "apk_url")
+    private String downloadApkUrl;//Android apk安装包 下载地址
+
+    @SerializedName( "apk_des")
+    @JSONField(name = "apk_des")
+    private String updateDes;//版本更新描述
+
+    @SerializedName( "login_type")
+    @JSONField(name = "login_type")
+    private String[] loginType;//三方登录类型
+    @SerializedName( "share_type")
+    @JSONField(name = "share_type")
+    private String[] shareType;//分享类型
+    private String coinName;//钻石名称
+    private String votesName;//映票名称
+    private String videoShareTitle;//短视频分享标题
+    private String videoShareDes;//短视频分享描述
+    private String agentShareTitle;//全民赚钱分享标题
+    private String agentShareDes;//全民赚钱分享描述
+    private int videoAuditSwitch;//短视频审核是否开启
+    private int videoCloudType;//短视频云储存类型 1七牛云 2腾讯云
+    private String videoQiNiuHost;//短视频七牛云域名
+    private String txCosAppId;//腾讯云存储appId
+    private String txCosRegion;//腾讯云存储区域
+    private String txCosBucketName;//腾讯云存储桶名字
+    private String txCosVideoPath;//腾讯云存储视频文件夹
+    private String txCosImagePath;//腾讯云存储图片文件夹
+    private int maintainSwitch;//维护开关
+    private String maintainTips;//维护提示
+    private String mTxImGroupId;//腾讯IM大群ID
+    private String beautyKey;//萌颜鉴权码
+    private int beautyMeiBai;//萌颜美白数值
+    private int beautyMoPi;//萌颜磨皮数值
+    private int beautyBaoHe;//萌颜饱和数值
+    private int beautyFenNen;//萌颜粉嫩数值
+    private int beautyBigEye;//萌颜大眼数值
+    private int beautyFace;//萌颜瘦脸数值
+    private String mImTip;
+    private String admin;
+
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+
+    public String getDownloadApkUrl() {
+        return downloadApkUrl;
+    }
+
+
+    public void setDownloadApkUrl(String downloadApkUrl) {
+        this.downloadApkUrl = downloadApkUrl;
+    }
+
+
+    public String getUpdateDes() {
+        return updateDes;
+    }
+
+    public void setUpdateDes(String updateDes) {
+        this.updateDes = updateDes;
+    }
+
+    @SerializedName( "name_coin")
+    @JSONField(name = "name_coin")
+    public String getCoinName() {
+        return coinName;
+    }
+
+    @SerializedName( "name_coin")
+    @JSONField(name = "name_coin")
+    public void setCoinName(String coinName) {
+        this.coinName = coinName;
+    }
+
+    @SerializedName( "name_votes")
+    @JSONField(name = "name_votes")
+    public String getVotesName() {
+        return votesName;
+    }
+
+    @SerializedName( "name_votes")
+    @JSONField(name = "name_votes")
+    public void setVotesName(String votesName) {
+        this.votesName = votesName;
+    }
+
+
+
+    public String[] getLoginType() {
+        return loginType;
+    }
+
+
+    public void setLoginType(String[] loginType) {
+        this.loginType = loginType;
+    }
+
+
+    @JSONField(name = "share_type")
+    public String[] getShareType() {
+        return shareType;
+    }
+
+
+    public void setShareType(String[] shareType) {
+        this.shareType = shareType;
+    }
+
+    @SerializedName( "maintain_switch")
+    @JSONField(name = "maintain_switch")
+    public int getMaintainSwitch() {
+        return maintainSwitch;
+    }
+
+    @SerializedName( "maintain_switch")
+    @JSONField(name = "maintain_switch")
+    public void setMaintainSwitch(int maintainSwitch) {
+        this.maintainSwitch = maintainSwitch;
+    }
+
+    @SerializedName( "im_admin_drip")
+    @JSONField(name = "maintain_tips")
+    public String getMaintainTips() {
+        return maintainTips;
+    }
+
+    @SerializedName( "maintain_tips")
+    @JSONField(name = "maintain_tips")
+    public void setMaintainTips(String maintainTips) {
+        this.maintainTips = maintainTips;
+    }
+
+    @SerializedName( "full_group_id")
+    @JSONField(name = "full_group_id")
+    public String getTxImGroupId() {
+        return mTxImGroupId;
+    }
+
+    @SerializedName( "full_group_id")
+    @JSONField(name = "full_group_id")
+    public void setTxImGroupId(String txImGroupId) {
+        mTxImGroupId = txImGroupId;
+    }
+
+    @SerializedName( "sprout_key")
+    @JSONField(name = "sprout_key")
+    public String getBeautyKey() {
+        return beautyKey;
+    }
+
+    @SerializedName( "sprout_key")
+    @JSONField(name = "sprout_key")
+    public void setBeautyKey(String beautyKey) {
+        this.beautyKey = beautyKey;
+    }
+
+    @SerializedName( "sprout_white")
+    @JSONField(name = "sprout_white")
+    public int getBeautyMeiBai() {
+        return beautyMeiBai;
+    }
+
+    @SerializedName( "sprout_white")
+    @JSONField(name = "sprout_white")
+    public void setBeautyMeiBai(int beautyMeiBai) {
+        this.beautyMeiBai = beautyMeiBai;
+    }
+
+    @SerializedName( "sprout_skin")
+    @JSONField(name = "sprout_skin")
+    public int getBeautyMoPi() {
+        return beautyMoPi;
+    }
+
+    @SerializedName( "sprout_skin")
+    @JSONField(name = "sprout_skin")
+    public void setBeautyMoPi(int beautyMoPi) {
+        this.beautyMoPi = beautyMoPi;
+    }
+
+    @SerializedName( "sprout_saturated")
+    @JSONField(name = "sprout_saturated")
+    public int getBeautyBaoHe() {
+        return beautyBaoHe;
+    }
+
+    @SerializedName( "sprout_saturated")
+    @JSONField(name = "sprout_saturated")
+    public void setBeautyBaoHe(int beautyBaoHe) {
+        this.beautyBaoHe = beautyBaoHe;
+    }
+
+    @SerializedName( "sprout_pink")
+    @JSONField(name = "sprout_pink")
+    public int getBeautyFenNen() {
+        return beautyFenNen;
+    }
+
+    @SerializedName( "sprout_pink")
+    @JSONField(name = "sprout_pink")
+    public void setBeautyFenNen(int beautyFenNen) {
+        this.beautyFenNen = beautyFenNen;
+    }
+
+    @SerializedName( "sprout_eye")
+    @JSONField(name = "sprout_eye")
+    public int getBeautyBigEye() {
+        return beautyBigEye;
+    }
+
+    @SerializedName( "sprout_eye")
+    @JSONField(name = "sprout_eye")
+    public void setBeautyBigEye(int beautyBigEye) {
+        this.beautyBigEye = beautyBigEye;
+    }
+
+    @SerializedName( "sprout_face")
+    @JSONField(name = "sprout_face")
+    public int getBeautyFace() {
+        return beautyFace;
+    }
+
+    @SerializedName( "sprout_face")
+    @JSONField(name = "sprout_face")
+    public void setBeautyFace(int beautyFace) {
+        this.beautyFace = beautyFace;
+    }
+
+
+    public String[] getVideoShareTypes() {
+        return shareType;
+    }
+
+    @SerializedName( "share_video_title")
+    @JSONField(name = "share_video_title")
+    public String getVideoShareTitle() {
+        return videoShareTitle;
+    }
+
+    @SerializedName( "share_video_title")
+    @JSONField(name = "share_video_title")
+    public void setVideoShareTitle(String videoShareTitle) {
+        this.videoShareTitle = videoShareTitle;
+    }
+
+    @SerializedName( "share_video_des")
+    @JSONField(name = "share_video_des")
+    public String getVideoShareDes() {
+        return videoShareDes;
+    }
+
+    @SerializedName( "share_video_des")
+    @JSONField(name = "share_video_des")
+    public void setVideoShareDes(String videoShareDes) {
+        this.videoShareDes = videoShareDes;
+    }
+
+    @SerializedName( "share_agent_title")
+    @JSONField(name = "share_agent_title")
+    public String getAgentShareTitle() {
+        return agentShareTitle;
+    }
+    @SerializedName( "share_agent_title")
+    @JSONField(name = "share_agent_title")
+    public void setAgentShareTitle(String agentShareTitle) {
+        this.agentShareTitle = agentShareTitle;
+    }
+    @SerializedName( "share_agent_des")
+    @JSONField(name = "share_agent_des")
+    public String getAgentShareDes() {
+        return agentShareDes;
+    }
+    @SerializedName( "share_agent_des")
+    @JSONField(name = "share_agent_des")
+    public void setAgentShareDes(String agentShareDes) {
+        this.agentShareDes = agentShareDes;
+    }
+
+    @SerializedName( "video_audit_switch")
+    @JSONField(name = "video_audit_switch")
+    public int getVideoAuditSwitch() {
+        return videoAuditSwitch;
+    }
+
+    @SerializedName( "video_audit_switch")
+    @JSONField(name = "video_audit_switch")
+    public void setVideoAuditSwitch(int videoAuditSwitch) {
+        this.videoAuditSwitch = videoAuditSwitch;
+    }
+
+    @SerializedName( "cloudtype")
+    @JSONField(name = "cloudtype")
+    public int getVideoCloudType() {
+        return videoCloudType;
+    }
+    @SerializedName( "cloudtype")
+    @JSONField(name = "cloudtype")
+    public void setVideoCloudType(int videoCloudType) {
+        this.videoCloudType = videoCloudType;
+    }
+    @SerializedName( "qiniu_domain")
+    @JSONField(name = "qiniu_domain")
+    public String getVideoQiNiuHost() {
+        return videoQiNiuHost;
+    }
+    @SerializedName( "qiniu_domain")
+    @JSONField(name = "qiniu_domain")
+    public void setVideoQiNiuHost(String videoQiNiuHost) {
+        this.videoQiNiuHost = videoQiNiuHost;
+    }
+    @SerializedName( "txcloud_appid")
+    @JSONField(name = "txcloud_appid")
+    public String getTxCosAppId() {
+        return txCosAppId;
+    }
+    @SerializedName( "txcloud_appid")
+    @JSONField(name = "txcloud_appid")
+    public void setTxCosAppId(String txCosAppId) {
+        this.txCosAppId = txCosAppId;
+    }
+    @SerializedName( "txcloud_region")
+    @JSONField(name = "txcloud_region")
+    public String getTxCosRegion() {
+        return txCosRegion;
+    }
+    @SerializedName( "txcloud_region")
+    @JSONField(name = "txcloud_region")
+    public void setTxCosRegion(String txCosRegion) {
+        this.txCosRegion = txCosRegion;
+    }
+    @SerializedName( "txcloud_bucket")
+    @JSONField(name = "txcloud_bucket")
+    public String getTxCosBucketName() {
+        return txCosBucketName;
+    }
+    @SerializedName( "txcloud_bucket")
+    @JSONField(name = "txcloud_bucket")
+    public void setTxCosBucketName(String txCosBucketName) {
+        this.txCosBucketName = txCosBucketName;
+    }
+    @SerializedName( "txvideofolder")
+    @JSONField(name = "txvideofolder")
+    public String getTxCosVideoPath() {
+        return txCosVideoPath;
+    }
+    @SerializedName( "txvideofolder")
+    @JSONField(name = "txvideofolder")
+    public void setTxCosVideoPath(String txCosVideoPath) {
+        this.txCosVideoPath = txCosVideoPath;
+    }
+    @SerializedName( "tximgfolder")
+    @JSONField(name = "tximgfolder")
+    public String getTxCosImagePath() {
+        return txCosImagePath;
+    }
+    @SerializedName( "tximgfolder")
+    @JSONField(name = "tximgfolder")
+    public void setTxCosImagePath(String txCosImagePath) {
+        this.txCosImagePath = txCosImagePath;
+    }
+    @SerializedName( "im_tips")
+    @JSONField(name = "im_tips")
+    public String getImTip() {
+        return mImTip;
+    }
+    @SerializedName( "im_tips")
+    @JSONField(name = "im_tips")
+    public void setImTip(String imTip) {
+        mImTip = imTip;
+    }
+
+    public String getAdmin() {
+        return admin;
+    }
+
+    public void setAdmin(String admin) {
+        this.admin = admin;
+    }
+
+
+}

+ 5 - 0
common/src/main/java/com/wanyue/common/bean/DataListner.java

@@ -0,0 +1,5 @@
+package com.wanyue.common.bean;
+
+public interface DataListner {
+    public void compelete(boolean isCompelete);
+}

+ 6 - 0
common/src/main/java/com/wanyue/common/bean/ExportNamer.java

@@ -0,0 +1,6 @@
+package com.wanyue.common.bean;
+
+public interface ExportNamer {
+    public String exportName();
+    public String exportId();
+}

+ 25 - 0
common/src/main/java/com/wanyue/common/bean/FansUserBean.java

@@ -0,0 +1,25 @@
+package com.wanyue.common.bean;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * Created by cxf on 2019/8/1.
+ */
+
+public class FansUserBean extends UserBean {
+    private int mAttention;
+
+    @JSONField(name = "isattent")
+    public int getAttention() {
+        return mAttention;
+    }
+
+    @JSONField(name = "isattent")
+    public void setAttention(int attention) {
+        mAttention = attention;
+    }
+
+    public boolean isAttent() {
+        return mAttention == 1;
+    }
+}

+ 33 - 0
common/src/main/java/com/wanyue/common/bean/LevelBean.java

@@ -0,0 +1,33 @@
+package com.wanyue.common.bean;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * Created by cxf on 2018/10/9.
+ */
+
+public class LevelBean {
+    private int level;
+    private String thumb;
+
+    @JSONField(name = "level")
+    public int getLevel() {
+        return level;
+    }
+
+    @JSONField(name = "level")
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    @JSONField(name = "thumb")
+    public String getThumb() {
+        return thumb;
+    }
+
+    @JSONField(name = "thumb")
+    public void setThumb(String thumb) {
+        this.thumb = thumb;
+    }
+
+}

+ 25 - 0
common/src/main/java/com/wanyue/common/bean/LiveInfo.java

@@ -0,0 +1,25 @@
+package com.wanyue.common.bean;
+
+public class LiveInfo {
+    private String mLiveUid;
+    private String mSteam;
+    private int mRoomId;
+    public String getLiveUid() {
+        return mLiveUid;
+    }
+    public void setLiveUid(String liveUid) {
+        mLiveUid = liveUid;
+    }
+    public String getSteam() {
+        return mSteam;
+    }
+    public void setSteam(String steam) {
+        mSteam = steam;
+    }
+    public int getRoomId() {
+        return mRoomId;
+    }
+    public void setRoomId(int roomId) {
+        mRoomId = roomId;
+    }
+}

+ 72 - 0
common/src/main/java/com/wanyue/common/bean/SimpleUserBean.java

@@ -0,0 +1,72 @@
+package com.wanyue.common.bean;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+public class SimpleUserBean implements Parcelable {
+    private String id;
+
+    @SerializedName("user_nickname")
+    @JSONField(name = "user_nickname")
+    private String userNickname;
+    private String avatar;
+
+    public SimpleUserBean() {
+    }
+
+    protected SimpleUserBean(Parcel in) {
+        id = in.readString();
+        userNickname = in.readString();
+        avatar = in.readString();
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(id);
+        dest.writeString(userNickname);
+        dest.writeString(avatar);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<SimpleUserBean> CREATOR = new Creator<SimpleUserBean>() {
+        @Override
+        public SimpleUserBean createFromParcel(Parcel in) {
+            return new SimpleUserBean(in);
+        }
+
+        @Override
+        public SimpleUserBean[] newArray(int size) {
+            return new SimpleUserBean[size];
+        }
+    };
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getUserNickname() {
+        return userNickname;
+    }
+
+    public void setUserNickname(String userNickname) {
+        this.userNickname = userNickname;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+}

+ 92 - 0
common/src/main/java/com/wanyue/common/bean/TxLocationBean.java

@@ -0,0 +1,92 @@
+package com.wanyue.common.bean;
+
+import java.util.List;
+
+/**
+ * Created by cxf on 2018/7/18.
+ * 腾讯定位结果的实体类
+ */
+
+public class TxLocationBean {
+    private double lng;//经度
+    private double lat;//纬度
+    private String nation;//国家
+    private String province;//省
+    private String city;//市
+    private String district;//区
+    private String street;//街道
+    private String address;//完整地址
+    private List<TxLocationPoiBean> poiList;//周边
+
+    public double getLng() {
+        return lng;
+    }
+
+    public void setLng(double lng) {
+        this.lng = lng;
+    }
+
+    public double getLat() {
+        return lat;
+    }
+
+    public void setLat(double lat) {
+        this.lat = lat;
+    }
+
+    public String getNation() {
+        return nation;
+    }
+
+    public void setNation(String nation) {
+        this.nation = nation;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getStreet() {
+        return street;
+    }
+
+    public void setStreet(String street) {
+        this.street = street;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public List<TxLocationPoiBean> getPoiList() {
+        return poiList;
+    }
+
+    public void setPoiList(List<TxLocationPoiBean> poiList) {
+        this.poiList = poiList;
+    }
+}

+ 103 - 0
common/src/main/java/com/wanyue/common/bean/TxLocationPoiBean.java

@@ -0,0 +1,103 @@
+package com.wanyue.common.bean;
+
+/**
+ * Created by cxf on 2018/7/18.
+ * 腾讯定位sdk 的poi 实体类
+ */
+
+public class TxLocationPoiBean {
+
+    private String id;
+    private String title;
+    private String address;
+    private String category;
+    private Location location;
+    private double _distance;
+    private String _dir_desc;
+    private boolean checked;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
+
+    public Location getLocation() {
+        return location;
+    }
+
+    public void setLocation(Location location) {
+        this.location = location;
+    }
+
+    public double get_distance() {
+        return _distance;
+    }
+
+    public void set_distance(double _distance) {
+        this._distance = _distance;
+    }
+
+    public String get_dir_desc() {
+        return _dir_desc;
+    }
+
+    public void set_dir_desc(String _dir_desc) {
+        this._dir_desc = _dir_desc;
+    }
+
+    public boolean isChecked() {
+        return checked;
+    }
+
+    public void setChecked(boolean checked) {
+        this.checked = checked;
+    }
+
+    public static class Location {
+        private double lat;
+        private double lng;
+
+        public double getLat() {
+            return lat;
+        }
+
+        public void setLat(double lat) {
+            this.lat = lat;
+        }
+
+        public double getLng() {
+            return lng;
+        }
+
+        public void setLng(double lng) {
+            this.lng = lng;
+        }
+    }
+}

+ 467 - 0
common/src/main/java/com/wanyue/common/bean/UserBean.java

@@ -0,0 +1,467 @@
+package com.wanyue.common.bean;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+import com.wanyue.common.utils.StringUtil;
+
+import java.util.List;
+
+/**
+ * Created by cxf on 2017/8/14.
+ */
+
+public class UserBean implements Parcelable {
+
+    /*暂且先用gson完成自动解析框架,后期有时间更换,统一解析库,见谅了*/
+    @SerializedName("id")
+    protected String mId;
+
+    @SerializedName("user_nickname")
+    protected String mUserNiceName;
+
+    @SerializedName("avatar")
+    protected String mAvatar;
+
+    @SerializedName("avatar_thumb")
+    protected String mAvatarThumb;
+
+    @SerializedName("sex")
+    protected int mSex;
+
+    @SerializedName("birthday")
+    protected String mBirthday;
+
+    @SerializedName("age")
+    protected String mAge;
+
+    @SerializedName("constellation")
+    protected String mXingZuo;
+
+    @SerializedName("signature")
+    protected String mSignature;
+
+    @SerializedName("addr")
+    protected String mCity;
+
+    @SerializedName("hobby")
+    protected String mInteret;
+
+    @SerializedName("school")
+    protected String mSchool;
+
+    @SerializedName("profession")
+    protected String mProfession;
+
+    @SerializedName("voice")
+    protected String mVoice;
+
+    @SerializedName("voice_l")
+    protected int mVoiceDuration;
+
+    @SerializedName("coin")
+    protected String mCoin;
+
+    @SerializedName("votes")
+    protected String mVotes;
+
+    @SerializedName("follows")
+    protected long mFollowNum;
+
+    @SerializedName("fans")
+    protected long mFansNum;
+
+    @SerializedName("star")
+    protected String mStar;
+
+    @SerializedName("auth_nums")
+    protected int mAuthNum;
+
+
+    @SerializedName("isattent")
+    @JSONField(name = "isattent")
+    private int isFollow;
+    private int mVisitNums;
+    private int mViewNums;
+    private int mNewNums;
+
+    private List<UserItemBean>list;
+    private boolean isHide;
+
+
+    public UserBean(){
+
+    }
+
+    protected UserBean(Parcel in) {
+        mId = in.readString();
+        mUserNiceName = in.readString();
+        mAvatar = in.readString();
+        mAvatarThumb = in.readString();
+        mSex = in.readInt();
+        mBirthday = in.readString();
+        mAge = in.readString();
+        mXingZuo = in.readString();
+        mSignature = in.readString();
+        mCity = in.readString();
+        mInteret = in.readString();
+        mSchool = in.readString();
+        mProfession = in.readString();
+        mVoice = in.readString();
+        mVoiceDuration = in.readInt();
+        mCoin = in.readString();
+        mVotes = in.readString();
+        mFollowNum = in.readLong();
+        mFansNum = in.readLong();
+        mStar = in.readString();
+        mAuthNum = in.readInt();
+        isFollow = in.readInt();
+        mVisitNums = in.readInt();
+        mViewNums = in.readInt();
+        mNewNums = in.readInt();
+
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mId);
+        dest.writeString(mUserNiceName);
+        dest.writeString(mAvatar);
+        dest.writeString(mAvatarThumb);
+        dest.writeInt(mSex);
+        dest.writeString(mBirthday);
+        dest.writeString(mAge);
+        dest.writeString(mXingZuo);
+        dest.writeString(mSignature);
+        dest.writeString(mCity);
+        dest.writeString(mInteret);
+        dest.writeString(mSchool);
+        dest.writeString(mProfession);
+        dest.writeString(mVoice);
+        dest.writeInt(mVoiceDuration);
+        dest.writeString(mCoin);
+        dest.writeString(mVotes);
+        dest.writeLong(mFollowNum);
+        dest.writeLong(mFansNum);
+        dest.writeString(mStar);
+        dest.writeInt(mAuthNum);
+        dest.writeInt(isFollow);
+        dest.writeInt(mVisitNums);
+        dest.writeInt(mViewNums);
+        dest.writeInt(mNewNums);
+
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<UserBean> CREATOR = new Creator<UserBean>() {
+        @Override
+        public UserBean createFromParcel(Parcel in) {
+            return new UserBean(in);
+        }
+
+        @Override
+        public UserBean[] newArray(int size) {
+            return new UserBean[size];
+        }
+    };
+
+    public String getId() {
+        if(mId==null){
+           mId="";
+        }
+        return mId;
+    }
+
+    @JSONField(name = "id")
+    public void setId(String id) {
+        mId = id;
+    }
+
+    @JSONField(name = "user_nickname")
+    public String getUserNiceName() {
+        return mUserNiceName;
+    }
+
+    @JSONField(name = "user_nickname")
+    public void setUserNiceName(String userNiceName) {
+        mUserNiceName = userNiceName;
+    }
+
+    @JSONField(name = "avatar")
+    public String getAvatar() {
+        return mAvatar;
+    }
+
+    @JSONField(name = "avatar")
+    public void setAvatar(String avatar) {
+        mAvatar = avatar;
+    }
+
+    @JSONField(name = "avatar_thumb")
+    public String getAvatarThumb() {
+        return mAvatarThumb;
+    }
+
+    @JSONField(name = "avatar_thumb")
+    public void setAvatarThumb(String avatarThumb) {
+        mAvatarThumb = avatarThumb;
+    }
+
+    @JSONField(name = "sex")
+    public int getSex() {
+        return mSex;
+    }
+
+    @JSONField(name = "sex")
+    public void setSex(int sex) {
+        mSex = sex;
+    }
+
+    @JSONField(name = "birthday")
+    public String getBirthday() {
+        return mBirthday;
+    }
+
+    @JSONField(name = "birthday")
+    public void setBirthday(String birthday) {
+        mBirthday = birthday;
+    }
+
+    @JSONField(name = "age")
+    public String getAge() {
+        return mAge;
+    }
+
+    @JSONField(name = "age")
+    public void setAge(String age) {
+        mAge = age;
+    }
+
+    @JSONField(name = "constellation")
+    public String getXingZuo() {
+        return mXingZuo;
+    }
+
+    @JSONField(name = "constellation")
+    public void setXingZuo(String xingZuo) {
+        mXingZuo = xingZuo;
+    }
+
+    @JSONField(name = "signature")
+    public String getSignature() {
+        return mSignature;
+    }
+
+    @JSONField(name = "signature")
+    public void setSignature(String signature) {
+        mSignature = signature;
+    }
+
+    @JSONField(name = "addr")
+    public String getCity() {
+        return mCity;
+    }
+
+    @JSONField(name = "addr")
+    public void setCity(String city) {
+        mCity = city;
+    }
+
+    @JSONField(name = "hobby")
+    public String getInteret() {
+        return mInteret;
+    }
+
+    @JSONField(name = "hobby")
+    public void setInteret(String interet) {
+        mInteret = interet;
+    }
+
+    @JSONField(name = "school")
+    public String getSchool() {
+        return mSchool;
+    }
+
+    @JSONField(name = "school")
+    public void setSchool(String school) {
+        mSchool = school;
+    }
+
+    @JSONField(name = "profession")
+    public String getProfession() {
+        return mProfession;
+    }
+
+    @JSONField(name = "profession")
+    public void setProfession(String profession) {
+        mProfession = profession;
+    }
+
+    @JSONField(name = "voice")
+    public String getVoice() {
+        return mVoice;
+    }
+
+    @JSONField(name = "voice")
+    public void setVoice(String voice) {
+        mVoice = voice;
+    }
+
+    @JSONField(name = "voice_l")
+    public int getVoiceDuration() {
+        return mVoiceDuration;
+    }
+
+    @JSONField(name = "voice_l")
+    public void setVoiceDuration(int voiceDuration) {
+        mVoiceDuration = voiceDuration;
+    }
+
+    @JSONField(name = "coin")
+    public String getCoin() {
+        return mCoin;
+    }
+
+    @JSONField(name = "coin")
+    public void setCoin(String coin) {
+        mCoin = coin;
+    }
+
+    @JSONField(name = "votes")
+    public String getVotes() {
+        return mVotes;
+    }
+
+    @JSONField(name = "votes")
+    public void setVotes(String votes) {
+        mVotes = votes;
+    }
+
+    @JSONField(name = "follows")
+    public long getFollowNum() {
+        return mFollowNum;
+    }
+
+    @JSONField(name = "follows")
+    public void setFollowNum(long followNum) {
+        mFollowNum = followNum;
+    }
+
+    @JSONField(name = "fans")
+    public long getFansNum() {
+        return mFansNum;
+    }
+
+    @JSONField(name = "fans")
+    public void setFansNum(long fansNum) {
+        mFansNum = fansNum;
+    }
+
+    @JSONField(name = "star")
+    public String getStar() {
+        return mStar;
+    }
+
+    @JSONField(name = "star")
+    public void setStar(String star) {
+        mStar = star;
+    }
+    @JSONField(name = "auth_nums")
+    public int getAuthNum() {
+        return mAuthNum;
+    }
+
+    @JSONField(name = "auth_nums")
+    public void setAuthNum(int authNum) {
+        mAuthNum = authNum;
+    }
+
+
+    @JSONField(name = "visitnums")
+    public int getVisitNums() {
+        return mVisitNums;
+    }
+    @JSONField(name = "visitnums")
+    public void setVisitNums(int mVisitNums) {
+        this.mVisitNums = mVisitNums;
+    }
+
+    @JSONField(name = "viewnums")
+    public int getViewNums() {
+        return mViewNums;
+    }
+
+    @JSONField(name = "viewnums")
+    public void setViewNums(int mViewNums) {
+        this.mViewNums = mViewNums;
+    }
+
+    @JSONField(name = "newnums")
+    public int getNewNums() {
+        return mNewNums;
+    }
+    @JSONField(name = "newnums")
+    public void setNewNums(int mNewNums) {
+        this.mNewNums = mNewNums;
+    }
+
+    public int getIsFollow() {
+        return isFollow;
+    }
+
+    public void setIsFollow(int isFollow) {
+        this.isFollow = isFollow;
+    }
+
+    @Override
+    public boolean equals( Object obj) {
+        if(obj!=null &&obj instanceof UserBean){
+            UserBean userBean= (UserBean) obj;
+            return StringUtil.equals(userBean.getId(),mId);
+        }else{
+            return obj.equals(this);
+        }
+    }
+    public static boolean isSameUser(UserBean userBean1,UserBean userBean2){
+        if(userBean1==null||userBean2==null){
+            return false;
+        }
+        return StringUtil.equals(userBean1.getId(),userBean2.getId());
+    }
+
+    private static UserBean compareUserBean;
+    public static UserBean getCompareUserBean(String uid){
+       if(compareUserBean==null){
+          compareUserBean=new UserBean();
+       }
+        compareUserBean.setId(uid);
+       return compareUserBean;
+    }
+
+    public boolean isHide() {
+        return isHide;
+    }
+
+    public void setHide(boolean hide) {
+        isHide = hide;
+    }
+
+    public List<UserItemBean> getList() {
+        return list;
+    }
+
+    public void setList(List<UserItemBean> list) {
+        this.list = list;
+    }
+
+}
+
+
+
+
+

+ 73 - 0
common/src/main/java/com/wanyue/common/bean/UserItemBean.java

@@ -0,0 +1,73 @@
+package com.wanyue.common.bean;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Created by cxf on 2018/9/28.
+ * 我的 页面的item
+ */
+
+public class UserItemBean {
+
+    @SerializedName( "id")
+    @JSONField(name = "id")
+    private int mId;
+
+    @SerializedName("name")
+    @JSONField(name = "name")
+    private String mName;
+
+    @SerializedName( "thumb")
+    @JSONField(name = "thumb")
+    private String mThumb;
+
+    @SerializedName( "href")
+    @JSONField(name = "href")
+    private String mHref;
+
+    private String mText;
+
+
+    public int getId() {
+        return mId;
+    }
+
+    public void setId(int id) {
+        mId = id;
+    }
+
+    public String getName() {
+        return mName;
+    }
+
+    public void setName(String name) {
+        mName = name;
+    }
+
+    public String getThumb() {
+        return mThumb;
+    }
+
+    public void setThumb(String thumb) {
+        mThumb = thumb;
+    }
+
+    public String getHref() {
+        return mHref;
+    }
+
+    public void setHref(String href) {
+        mHref = href;
+    }
+
+    @JSONField(serialize = false)
+    public String getText() {
+        return mText;
+    }
+
+    @JSONField(serialize = false)
+    public void setText(String text) {
+        mText = text;
+    }
+}

+ 52 - 0
common/src/main/java/com/wanyue/common/bean/XingZuoBean.java

@@ -0,0 +1,52 @@
+package com.wanyue.common.bean;
+
+/**
+ * Created by cxf on 2019/7/24.
+ */
+
+public class XingZuoBean {
+
+    private int mNameResId;
+    private int mStartMonth;
+    private int mStartDay;
+    private int mEndMonth;
+    private int mEndDay;
+
+    public XingZuoBean(int nameResId, int startMonth, int startDay, int endMonth, int endDay) {
+        mNameResId = nameResId;
+        mStartMonth = startMonth;
+        mStartDay = startDay;
+        mEndMonth = endMonth;
+        mEndDay = endDay;
+    }
+
+
+    /**
+     * <string name="xingzuo_00">白羊座(3.21-4.19)</string>
+     * <string name="xingzuo_01">金牛座(4.20-5.20)</string>
+     * <string name="xingzuo_02">双子座(5.21-6.21)</string>
+     * <string name="xingzuo_03">巨蟹座(6.22-7.22)</string>
+     * <string name="xingzuo_04">狮子座(7.23-8.22)</string>
+     * <string name="xingzuo_05">处女座(8.23-9.22)</string>
+     * <string name="xingzuo_06">天秤座(9.23-10.23)</string>
+     * <string name="xingzuo_07">天蝎座(10.24-11.22)</string>
+     * <string name="xingzuo_08">射手座(11.23-12.21)</string>
+     * <string name="xingzuo_09">摩羯座(12.22-1.19)</string>
+     * <string name="xingzuo_10">水瓶座(1.20-2.18)</string>
+     * <string name="xingzuo_11">双鱼座(2.19-3.20)</string>
+     *
+     * @param month
+     * @param day
+     * @return
+     */
+
+
+    public boolean match(int month, int day) {
+        return month == mStartMonth && mStartDay <= day
+                || month == mEndMonth && mEndDay >= day;
+    }
+
+    public int getNameResId() {
+        return mNameResId;
+    }
+}

+ 68 - 0
common/src/main/java/com/wanyue/common/bean/commit/BaseObservableField.java

@@ -0,0 +1,68 @@
+package com.wanyue.common.bean.commit;
+
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.widget.TextView;
+
+import org.jetbrains.annotations.NotNull;
+
+public abstract class BaseObservableField<T> {
+    private TextView textView;
+    protected T data;
+    private CommitEntity mCommitEntity;
+    public BaseObservableField(CommitEntity commitEntity){
+        mCommitEntity=commitEntity;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    /*view和实体类属性进行数据双向绑定*/
+    public void bind(TextView textView){
+        this.textView=textView;
+        if(textView!=null){
+            textView.addTextChangedListener(new TextWatcher() {
+                @Override
+                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+                }
+                @Override
+                public void onTextChanged(CharSequence s, int start, int before, int count) {
+                }
+                @Override
+                public void afterTextChanged(Editable s) {
+                    inputData(s);
+                }
+            });
+        }
+    }
+    /*data!=null&&newData!=null&&!newData.equals(data)&&*/
+
+    private void inputData(Editable s) {
+        T newData=changeData(s.toString());
+        data=newData;
+        if(mCommitEntity!=null){
+           mCommitEntity.observer();
+        }
+    }
+
+    public void  setData(T t){
+        String content=t==null?null:t.toString();
+        this.data=t;
+        if(textView!=null){
+           textView.setText(content);
+        }
+    }
+    @NotNull
+    @Override
+    public String toString() {
+        return data==null?null:data.toString();
+    }
+
+    public void release(){
+        mCommitEntity=null;
+        textView=null;
+        data=null;
+    }
+    public abstract T changeData(String s);
+}

+ 52 - 0
common/src/main/java/com/wanyue/common/bean/commit/CommitEntity.java

@@ -0,0 +1,52 @@
+package com.wanyue.common.bean.commit;
+
+
+import android.text.TextUtils;
+
+import com.wanyue.common.bean.DataListner;
+
+public abstract class CommitEntity{
+  private DataListner dataListner;
+  public static final String DEFAUlT_VALUE="0";
+
+
+  public void observer(){
+      if(dataListner!=null){
+          dataListner.compelete(observerCondition());
+      }
+  }
+
+  public boolean fieldNotEmpty(Object object ){
+      if(object instanceof String){
+          String str= (String) object;
+          return !TextUtils.isEmpty(str);
+      }else{
+          return object!=null;
+      }
+  }
+
+    public boolean fieldNotEmptyAndNoZero(Object object){
+        if(object==null){
+          return false;
+        }
+        else if(object instanceof String){
+            String str= (String) object;
+            return !TextUtils.isEmpty(str)&&!str.equals(CommitEntity.DEFAUlT_VALUE);
+        }else if(object instanceof Integer){
+            Integer integer= (Integer) object;
+            return integer!=0;
+        }
+        else{
+            return object!=null;
+        }
+    }
+
+    public void release(){
+        dataListner=null;
+    }
+
+  public abstract boolean observerCondition();
+    public void setDataListner(DataListner dataListner) {
+        this.dataListner = dataListner;
+    }
+}

+ 13 - 0
common/src/main/java/com/wanyue/common/bean/commit/ObservableInteager.java

@@ -0,0 +1,13 @@
+package com.wanyue.common.bean.commit;
+
+import com.wanyue.common.utils.FieldUtil;
+
+public class ObservableInteager extends BaseObservableField<Integer>{
+    public ObservableInteager(CommitEntity commitEntity) {
+        super(commitEntity);
+    }
+    @Override
+    public Integer changeData(String s) {
+       return FieldUtil.parseInt(s);
+    }
+}

+ 13 - 0
common/src/main/java/com/wanyue/common/bean/commit/ObservableLong.java

@@ -0,0 +1,13 @@
+package com.wanyue.common.bean.commit;
+
+import com.wanyue.common.utils.FieldUtil;
+
+public class ObservableLong extends BaseObservableField<Long> {
+    public ObservableLong(CommitEntity commitEntity) {
+        super(commitEntity);
+    }
+    @Override
+    public Long changeData(String s) {
+      return FieldUtil.parseLong(s);
+    }
+}

+ 13 - 0
common/src/main/java/com/wanyue/common/bean/commit/ObservableString.java

@@ -0,0 +1,13 @@
+package com.wanyue.common.bean.commit;
+
+public class ObservableString extends BaseObservableField<String>{
+
+    public ObservableString(CommitEntity commitEntity) {
+        super(commitEntity);
+    }
+
+    @Override
+    public String changeData(String s) {
+        return s;
+    }
+}

+ 27 - 0
common/src/main/java/com/wanyue/common/business/JumpInterceptor.java

@@ -0,0 +1,27 @@
+package com.wanyue.common.business;
+
+import android.app.Activity;
+import android.content.Context;
+import com.wanyue.common.CommonAppConfig;
+import com.wanyue.common.api.CommonAPI;
+import com.wanyue.common.business.acmannger.ActivityMannger;
+import com.wanyue.common.utils.RouteUtil;
+import io.reactivex.Observable;
+public class JumpInterceptor {
+  public static Observable<Boolean> shouldInterceptor(Context context) {
+      if (!CommonAppConfig.isLogin()){
+           RouteUtil.forwardLogin();
+           return Observable.just(false);
+      }
+      return CommonAPI.checkToken();
+  }
+
+    public static void interceptorAndFinshActivity(){
+      Activity activity= ActivityMannger.getInstance().getMainStackTopActivity();
+      boolean isBaseActivity=ActivityMannger.getInstance().isBaseActivity(activity);
+      if(activity!=null&&!isBaseActivity&&!activity.isFinishing()){
+         activity.finish();
+      }
+        RouteUtil.forwardLogin();
+    }
+}

+ 150 - 0
common/src/main/java/com/wanyue/common/business/TimeModel.java

@@ -0,0 +1,150 @@
+package com.wanyue.common.business;
+
+import com.wanyue.common.utils.Parser;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.functions.Consumer;
+
+public class TimeModel {
+    public static final int COUNT_DOWN=1;
+    public static final int DEFAULT=0;
+    private int mState=DEFAULT;
+
+    public static final int MAXIMUM=1000000000;
+    private static  TimeModel timeModel=null;
+    private Disposable disposable;
+    private Parser parser;
+    private List<TimeListner> timeListnerList;
+    private String time;
+
+    private long totalUseTime;
+    public TimeModel(){
+        parser=new Parser();
+        timeListnerList=new ArrayList<>(1);
+    }
+
+    public TimeModel setParserMode(int model){
+        if(parser!=null){
+            parser.setModel(model);
+        }
+        return this;
+    }
+
+    public TimeModel setBeforeString(String beforeString) {
+        if(parser!=null){
+            parser.setBeforeString(beforeString);
+        }
+        return this;
+    }
+
+    public TimeModel setAfterString(String beforeString) {
+        if(parser!=null){
+            parser.setAfterString(beforeString);
+        }
+        return this;
+    }
+
+
+    public TimeModel setState(int state) {
+        this.mState = state;
+        return this;
+    }
+
+    public TimeModel setTotalUseTime(long totalUseTime) {
+        this.totalUseTime = totalUseTime;
+        return this;
+    }
+
+
+    //目前进入房间回调成功的时候开始进行计时
+    public void start(){
+        dispose();
+        disposable= Observable.interval(0, 1, TimeUnit.SECONDS).take(totalUseTime).
+                subscribeOn(AndroidSchedulers.mainThread())
+                .observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Long>() {
+                    @Override
+                    public void accept(Long aLong) throws Exception {
+                        long timeNum=0;
+                        if(mState==DEFAULT){
+                            timeNum=aLong;
+                        }else{
+                            timeNum=totalUseTime-aLong;
+                        }
+                        time= parser.parse(timeNum);
+                        if(timeListnerList!=null){
+                            for(TimeListner timeListner:timeListnerList){
+                                timeListner.time(time);
+                            }
+                        }
+                        if(totalUseTime==aLong+1){
+                            if(timeListnerList!=null){
+                                for(TimeListner timeListner:timeListnerList){
+                                    timeListner.compelete();
+                                }
+                            }
+                        }
+
+
+                    }
+                });
+    }
+
+    public void addTimeListner(TimeListner timeListner){
+        if(timeListnerList==null){
+           timeListnerList=new ArrayList<>();
+        }
+        if(timeListnerList.contains(timeListner)){
+            return;
+        }
+        timeListnerList.add(timeListner);
+    }
+
+    public void removeTimeListner(TimeListner timeListner){
+        if(timeListner==null||timeListnerList==null){
+            return;
+        }
+        timeListnerList.remove(timeListner);
+    }
+
+
+    public void clear(){
+        dispose();
+        time=null;
+        if(timeListnerList!=null){
+           timeListnerList.clear();
+           timeListnerList=null;
+        }
+    }
+
+
+
+
+    public static Observable<Long>delay(long time,TimeUnit timeUnit){
+       return Observable.timer(time,timeUnit).observeOn(AndroidSchedulers.mainThread());
+    }
+
+    public String getTime() {
+        return time;
+    }
+    public  interface TimeListner{
+        public void time(String string);
+        public void compelete();
+    }
+
+    /*是活跃的状态*/
+    public boolean isActivitve(){
+        return disposable!=null&&!disposable.isDisposed();
+    }
+
+    public void dispose() {
+         if(isActivitve()){
+            disposable.dispose();
+        }
+    }
+
+}

+ 185 - 0
common/src/main/java/com/wanyue/common/business/acmannger/ActivityMannger.java

@@ -0,0 +1,185 @@
+package com.wanyue.common.business.acmannger;
+
+import android.app.Activity;
+import android.content.Intent;
+
+import com.wanyue.common.utils.ListUtil;
+
+import java.util.LinkedHashSet;
+
+public class ActivityMannger {
+ private static ActivityMannger mActivityMannger;
+ /*使用该数据结构是因为要去重*/
+ private LinkedHashSet<Activity>mActivityLinkedHashSet;
+    /*存储其他栈的activity*/
+ private LinkedHashSet<Activity> mOntherStack;
+ private Activity mBaseActivity;
+ private Activity mTopMainStackActivity;
+ private boolean isBackGround;
+ private OnLaunchListner mOnLaunchListner;
+
+ private ActivityMannger(){
+     mActivityLinkedHashSet=new LinkedHashSet<>();
+     mOntherStack=new LinkedHashSet<>();
+ }
+
+ public static ActivityMannger getInstance(){
+        if(mActivityMannger==null){
+            synchronized (ActivityMannger.class){
+                mActivityMannger=new ActivityMannger();
+            }
+        }
+        return mActivityMannger;
+ }
+
+
+ public void addActivityByNewStack(Activity activity){
+     if(activity==null){
+         return;
+     }
+     if(mOntherStack==null){
+        mOntherStack=new LinkedHashSet<>();
+     }
+        mOntherStack.add(activity);
+        addActivity(activity);
+ }
+
+    /*从set集合取出最后的一个数据*/
+    private Activity getLastActivity(LinkedHashSet<Activity> linkedHashSet) {
+       Activity activity=null;
+     if(linkedHashSet!=null){
+           for(Activity temp:linkedHashSet){
+               activity=temp;
+           }
+       }
+     return activity;
+    }
+
+
+    public boolean  checkStackOpenCondition(){
+        if(mOnLaunchListner!=null){
+           return mOnLaunchListner.launchFromBackGround();
+        }
+        return false;
+    }
+
+    public void launchOntherStackToTopActivity(boolean shouldLimitBackGround,Activity activity){
+        if((shouldLimitBackGround&&!isBackGround)||!checkStackOpenCondition()){
+            return;
+        }
+        Activity lastActivity=getLastActivity(mOntherStack);
+        if(lastActivity!=null&&lastActivity!=activity){
+           startActivity(lastActivity,Intent.FLAG_ACTIVITY_NEW_TASK);
+       }
+  }
+
+  public void finishStack(Activity stackActivity){
+      if(!removeActiviy(mOntherStack,stackActivity)){
+          return;
+      }
+      Activity lastStackActivity=getLastActivity(mActivityLinkedHashSet);
+      if(lastStackActivity==null){
+          return;
+      }
+      startActivity(lastStackActivity,Intent.FLAG_ACTIVITY_SINGLE_TOP);
+  }
+
+
+
+
+    private boolean removeActiviy(LinkedHashSet<Activity> set, Activity activity) {
+     if(set!=null&&activity!=null&&set.contains(activity)){
+         return set.remove(activity);
+     }
+     return false;
+    }
+
+    public void startActivity(Activity activity,int...flagArray){
+     if(mBaseActivity==null){
+         return;
+     }
+      Intent intent=new Intent(mBaseActivity,activity.getClass());
+      if(flagArray!=null){
+          for(int flag:flagArray){
+              intent.addFlags(flag);
+          }
+      }
+      mBaseActivity.startActivity(intent);
+  }
+
+    public void addActivity(Activity activity){
+        if(mActivityLinkedHashSet==null){
+            mActivityLinkedHashSet=new LinkedHashSet<>();
+        }
+        if(activity==null){
+          return;
+        }
+        mActivityLinkedHashSet.add(activity);
+        if(!mOntherStack.contains(activity)){
+           mTopMainStackActivity=activity;
+        }
+    }
+
+    public void setBackGround(boolean backGround) {
+        isBackGround = backGround;
+    }
+
+    public void removeActivity(Activity activity){
+        if(mTopMainStackActivity!=null&&activity!=null&&mTopMainStackActivity==activity){
+           mTopMainStackActivity=null;
+        }
+        removeActiviy(mActivityLinkedHashSet,activity);
+
+        finishStack(activity);
+  }
+
+  public void setBaseActivity(Activity baseActivity) {
+      mBaseActivity = baseActivity;
+  }
+
+
+
+  public void releaseBaseActivity(Activity baseActivity) {
+        if(baseActivity!=null&&mBaseActivity!=null&&baseActivity==mBaseActivity){
+           mBaseActivity=null;
+        }
+    }
+
+    public boolean isBackGround() {
+        return isBackGround;
+    }
+
+   public Activity getMainStackTopActivity(){
+     return mTopMainStackActivity;
+   }
+
+    public void setOnLaunchListner(OnLaunchListner onLaunchListner) {
+        mOnLaunchListner = onLaunchListner;
+
+    }
+
+    /*是否是基类*/
+    public boolean isBaseActivity(Activity activity) {
+        if(activity!=null&&mBaseActivity!=null&&activity==mBaseActivity){
+            return true;
+        }
+        return false;
+    }
+
+    public Activity getFirstClassTypeActivieActivity(Class<? extends Activity>cs){
+        if(!ListUtil.haveData(mActivityLinkedHashSet)){
+            return null;
+        }
+        for(Activity activity:mActivityLinkedHashSet){
+            if(activity.getClass()==cs&&!activity.isFinishing()){
+               return activity;
+            }
+        }
+        return null;
+    }
+
+
+    public static interface OnLaunchListner{
+        public boolean launchFromBackGround();
+    }
+}

+ 5 - 0
common/src/main/java/com/wanyue/common/business/acmannger/ReleaseListner.java

@@ -0,0 +1,5 @@
+package com.wanyue.common.business.acmannger;
+
+public interface ReleaseListner {
+  public void release();
+}

+ 192 - 0
common/src/main/java/com/wanyue/common/custom/AppBarLayoutBehavior.java

@@ -0,0 +1,192 @@
+package com.wanyue.common.custom;
+
+import android.content.Context;
+import android.support.design.widget.AppBarLayout;
+import android.support.design.widget.CoordinatorLayout;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.OverScroller;
+
+import java.lang.reflect.Field;
+import java.util.Objects;
+
+public class AppBarLayoutBehavior extends AppBarLayout.Behavior {
+
+    private static final String TAG = "AppbarLayoutBehavior";
+    private static final int TYPE_FLING = 1;
+    private boolean isFlinging;
+    private boolean shouldBlockNestedScroll;
+
+    public AppBarLayoutBehavior(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
+        LogUtil.d(TAG, "onInterceptTouchEvent:" + child.getTotalScrollRange());
+        shouldBlockNestedScroll = isFlinging;
+        switch (ev.getActionMasked()) {
+            case MotionEvent.ACTION_DOWN:
+                //手指触摸屏幕的时候停止fling事件
+                stopAppbarLayoutFling(child);
+                break;
+            default:
+                break;
+        }
+        return super.onInterceptTouchEvent(parent, child, ev);
+    }
+
+    /**
+     * 反射获取私有的flingRunnable 属性,考虑support 28以后变量名修改的问题
+     * @return Field
+     * @throws NoSuchFieldException
+     */
+    private Field getFlingRunnableField() throws NoSuchFieldException {
+        Class<?> superclass = this.getClass().getSuperclass();
+        try {
+            // support design 27及一下版本
+            Class<?> headerBehaviorType = null;
+            if (superclass != null) {
+                headerBehaviorType = superclass.getSuperclass();
+            }
+            if (headerBehaviorType != null) {
+                return headerBehaviorType.getDeclaredField("mFlingRunnable");
+            }else {
+                return null;
+            }
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+            // 可能是28及以上版本
+            Class<?> headerBehaviorType = superclass.getSuperclass().getSuperclass();
+            if (headerBehaviorType != null) {
+                return headerBehaviorType.getDeclaredField("flingRunnable");
+            } else {
+                return null;
+            }
+        }
+    }
+
+    /**
+     * 反射获取私有的scroller 属性,考虑support 28以后变量名修改的问题
+     * @return Field
+     * @throws NoSuchFieldException
+     */
+    private Field getScrollerField() throws NoSuchFieldException {
+        Class<?> superclass = this.getClass().getSuperclass();
+        try {
+            // support design 27及一下版本
+            Class<?> headerBehaviorType = null;
+            if (superclass != null) {
+                headerBehaviorType = superclass.getSuperclass();
+            }
+            if (headerBehaviorType != null) {
+                return headerBehaviorType.getDeclaredField("mScroller");
+            }else {
+                return null;
+            }
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+            // 可能是28及以上版本
+            Class<?> headerBehaviorType = superclass.getSuperclass().getSuperclass();
+            if (headerBehaviorType != null) {
+                return headerBehaviorType.getDeclaredField("scroller");
+            }else {
+                return null;
+            }
+        }
+    }
+
+    /**
+     * 停止appbarLayout的fling事件
+     * @param appBarLayout
+     */
+    private void stopAppbarLayoutFling(AppBarLayout appBarLayout) {
+        //通过反射拿到HeaderBehavior中的flingRunnable变量
+        try {
+            Field flingRunnableField = getFlingRunnableField();
+            Field scrollerField = getScrollerField();
+            if (flingRunnableField != null) {
+                flingRunnableField.setAccessible(true);
+            }
+            if (scrollerField != null) {
+                scrollerField.setAccessible(true);
+            }
+            Runnable flingRunnable = null;
+            if (flingRunnableField != null) {
+                flingRunnable = (Runnable) flingRunnableField.get(this);
+            }
+            OverScroller overScroller = (OverScroller) Objects.requireNonNull(scrollerField).get(this);
+            if (flingRunnable != null) {
+                LogUtil.d(TAG, "存在flingRunnable");
+                appBarLayout.removeCallbacks(flingRunnable);
+                flingRunnableField.set(this, null);
+            }
+            if (overScroller != null && !overScroller.isFinished()) {
+                overScroller.abortAnimation();
+            }
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child,
+                                       View directTargetChild, View target,
+                                       int nestedScrollAxes, int type) {
+        LogUtil.d(TAG, "onStartNestedScroll");
+        stopAppbarLayoutFling(child);
+        return super.onStartNestedScroll(parent, child, directTargetChild, target,
+                nestedScrollAxes, type);
+    }
+
+    @Override
+    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout,
+                                  AppBarLayout child, View target,
+                                  int dx, int dy, int[] consumed, int type) {
+        LogUtil.d(TAG, "onNestedPreScroll:" + child.getTotalScrollRange()
+                + " ,dx:" + dx + " ,dy:" + dy + " ,type:" + type);
+        //type返回1时,表示当前target处于非touch的滑动,
+        //该bug的引起是因为appbar在滑动时,CoordinatorLayout内的实现NestedScrollingChild2接口的滑动
+        //子类还未结束其自身的fling
+        //所以这里监听子类的非touch时的滑动,然后block掉滑动事件传递给AppBarLayout
+        if (type == TYPE_FLING) {
+            isFlinging = true;
+        }
+        if (!shouldBlockNestedScroll) {
+            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
+        }
+    }
+
+    @Override
+    public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
+                               View target, int dxConsumed, int dyConsumed, int
+            dxUnconsumed, int dyUnconsumed, int type) {
+        LogUtil.d(TAG, "onNestedScroll: target:" + target.getClass() + " ,"
+                + child.getTotalScrollRange() + " ,dxConsumed:"
+                + dxConsumed + " ,dyConsumed:" + dyConsumed + " " + ",type:" + type);
+        if (!shouldBlockNestedScroll) {
+            super.onNestedScroll(coordinatorLayout, child, target, dxConsumed,
+                    dyConsumed, dxUnconsumed, dyUnconsumed, type);
+        }
+    }
+
+    @Override
+    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout abl,
+                                   View target, int type) {
+        LogUtil.d(TAG, "onStopNestedScroll");
+        super.onStopNestedScroll(coordinatorLayout, abl, target, type);
+        isFlinging = false;
+        shouldBlockNestedScroll = false;
+    }
+
+    private static class LogUtil{
+        static void d(String tag, String string){
+            Log.d(tag,string);
+        }
+    }
+
+}

+ 0 - 0
common/src/main/java/com/wanyue/common/custom/BigPageTitleView.java


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä