Commit 22a28a6eddbee90bc5abafdbe7deb6b450a2e62c

Authored by 韩亚云
0 parents

first commit

Showing 82 changed files with 4832 additions and 0 deletions

Too many changes to show.

To preserve performance only 82 of 597 files are displayed.

.gitignore 0 → 100644
  1 +++ a/.gitignore
  1 +*.iml
  2 +.gradle
  3 +/local.properties
  4 +/.idea/caches
  5 +/.idea/libraries
  6 +/.idea/modules.xml
  7 +/.idea/workspace.xml
  8 +/.idea/navEditor.xml
  9 +/.idea/assetWizardSettings.xml
  10 +.DS_Store
  11 +/build
  12 +/captures
  13 +.externalNativeBuild
  14 +.cxx
.idea/codeStyles/Project.xml 0 → 100644
  1 +++ a/.idea/codeStyles/Project.xml
  1 +<component name="ProjectCodeStyleConfiguration">
  2 + <code_scheme name="Project" version="173">
  3 + <codeStyleSettings language="XML">
  4 + <indentOptions>
  5 + <option name="CONTINUATION_INDENT_SIZE" value="4" />
  6 + </indentOptions>
  7 + <arrangement>
  8 + <rules>
  9 + <section>
  10 + <rule>
  11 + <match>
  12 + <AND>
  13 + <NAME>xmlns:android</NAME>
  14 + <XML_ATTRIBUTE />
  15 + <XML_NAMESPACE>^$</XML_NAMESPACE>
  16 + </AND>
  17 + </match>
  18 + </rule>
  19 + </section>
  20 + <section>
  21 + <rule>
  22 + <match>
  23 + <AND>
  24 + <NAME>xmlns:.*</NAME>
  25 + <XML_ATTRIBUTE />
  26 + <XML_NAMESPACE>^$</XML_NAMESPACE>
  27 + </AND>
  28 + </match>
  29 + <order>BY_NAME</order>
  30 + </rule>
  31 + </section>
  32 + <section>
  33 + <rule>
  34 + <match>
  35 + <AND>
  36 + <NAME>.*:id</NAME>
  37 + <XML_ATTRIBUTE />
  38 + <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
  39 + </AND>
  40 + </match>
  41 + </rule>
  42 + </section>
  43 + <section>
  44 + <rule>
  45 + <match>
  46 + <AND>
  47 + <NAME>.*:name</NAME>
  48 + <XML_ATTRIBUTE />
  49 + <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
  50 + </AND>
  51 + </match>
  52 + </rule>
  53 + </section>
  54 + <section>
  55 + <rule>
  56 + <match>
  57 + <AND>
  58 + <NAME>name</NAME>
  59 + <XML_ATTRIBUTE />
  60 + <XML_NAMESPACE>^$</XML_NAMESPACE>
  61 + </AND>
  62 + </match>
  63 + </rule>
  64 + </section>
  65 + <section>
  66 + <rule>
  67 + <match>
  68 + <AND>
  69 + <NAME>style</NAME>
  70 + <XML_ATTRIBUTE />
  71 + <XML_NAMESPACE>^$</XML_NAMESPACE>
  72 + </AND>
  73 + </match>
  74 + </rule>
  75 + </section>
  76 + <section>
  77 + <rule>
  78 + <match>
  79 + <AND>
  80 + <NAME>.*</NAME>
  81 + <XML_ATTRIBUTE />
  82 + <XML_NAMESPACE>^$</XML_NAMESPACE>
  83 + </AND>
  84 + </match>
  85 + <order>BY_NAME</order>
  86 + </rule>
  87 + </section>
  88 + <section>
  89 + <rule>
  90 + <match>
  91 + <AND>
  92 + <NAME>.*</NAME>
  93 + <XML_ATTRIBUTE />
  94 + <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
  95 + </AND>
  96 + </match>
  97 + <order>ANDROID_ATTRIBUTE_ORDER</order>
  98 + </rule>
  99 + </section>
  100 + <section>
  101 + <rule>
  102 + <match>
  103 + <AND>
  104 + <NAME>.*</NAME>
  105 + <XML_ATTRIBUTE />
  106 + <XML_NAMESPACE>.*</XML_NAMESPACE>
  107 + </AND>
  108 + </match>
  109 + <order>BY_NAME</order>
  110 + </rule>
  111 + </section>
  112 + </rules>
  113 + </arrangement>
  114 + </codeStyleSettings>
  115 + </code_scheme>
  116 +</component>
0 \ No newline at end of file 117 \ No newline at end of file
.idea/gradle.xml 0 → 100644
  1 +++ a/.idea/gradle.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="GradleSettings">
  4 + <option name="linkedExternalProjectsSettings">
  5 + <GradleProjectSettings>
  6 + <compositeConfiguration>
  7 + <compositeBuild compositeDefinitionSource="SCRIPT" />
  8 + </compositeConfiguration>
  9 + <option name="distributionType" value="DEFAULT_WRAPPED" />
  10 + <option name="externalProjectPath" value="$PROJECT_DIR$" />
  11 + <option name="resolveModulePerSourceSet" value="false" />
  12 + <option name="testRunner" value="PLATFORM" />
  13 + </GradleProjectSettings>
  14 + </option>
  15 + </component>
  16 +</project>
0 \ No newline at end of file 17 \ No newline at end of file
.idea/misc.xml 0 → 100644
  1 +++ a/.idea/misc.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
  4 + <output url="file://$PROJECT_DIR$/build/classes" />
  5 + </component>
  6 + <component name="ProjectType">
  7 + <option name="id" value="Android" />
  8 + </component>
  9 +</project>
0 \ No newline at end of file 10 \ No newline at end of file
.idea/runConfigurations.xml 0 → 100644
  1 +++ a/.idea/runConfigurations.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="RunConfigurationProducerService">
  4 + <option name="ignoredProducers">
  5 + <set>
  6 + <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
  7 + <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
  8 + <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
  9 + </set>
  10 + </option>
  11 + </component>
  12 +</project>
0 \ No newline at end of file 13 \ No newline at end of file
app/strike/.gitignore 0 → 100644
  1 +++ a/app/strike/.gitignore
  1 +/build
app/strike/build.gradle 0 → 100644
  1 +++ a/app/strike/build.gradle
  1 +apply plugin: 'com.android.application'
  2 +android {
  3 + compileSdkVersion 29
  4 + buildToolsVersion "29.0.2"
  5 +
  6 +
  7 + defaultConfig {
  8 + applicationId "com.cnlive.strike"
  9 + minSdkVersion 16
  10 + targetSdkVersion 29
  11 + versionCode 1
  12 + versionName "1.0"
  13 +
  14 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  15 + consumerProguardFiles 'consumer-rules.pro'
  16 + manifestPlaceholders = [
  17 + APP_ID : "802_jhbqccxw08",
  18 + APP_KEY : "9c5619e9be747bb3b925dd215ca5923d86f12c09b9394f",
  19 + APP_SECRET : "1e6380cb347255e777f72b5aa60f41daa68443a132aaea",
  20 + H5_CNLIVE : "http://wjjh5test.cnlive.com/cnnews.html",
  21 + H5_DP : "http://wjjh5test.cnlive.com/cndr.html",
  22 + APP_START_HOST : "http://wjjh5test.cnlive.com",
  23 + APP_WEB_START_HOST : "wjjh5test.cnlive.com",
  24 + BAIDU_APP_KEY : "ibl8vbKkPVYBw5IOvR8tVGGo",
  25 + BAIDU_APP_SECRET : "QEd6n1qruIGG8AYkyLyqepksO2uUe0GK",
  26 + PAY_ACCOUNT : "wjj_app_test",
  27 + WECHAT_APPID : "wx9b7f9443a8ccf15a",
  28 + SHARE_ICON : "http://wjjh5test.cnlive.com/static/logo.png",
  29 + SHARE_TITLE : "快来加入中国网家家,优享美好生活!",
  30 + SHARE_DOWNLOAD : "https://fir.im/d35h",
  31 + SHARE_APP_KEY : "@string/SHARE_APP_KEY_DEBUG",
  32 + SHARE_APP_SCERET : "BNK5YVWfIBLir6WFaXTCNQLSFGTRs+Hnz5EkIfngJmOPLFBlUwmAbw==",
  33 + SPECIAL_GROUP_MEMBER_LIMIT: 3
  34 + ]
  35 + }
  36 +
  37 + buildTypes {
  38 + release {
  39 + minifyEnabled false
  40 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  41 + }
  42 + }
  43 +
  44 +}
  45 +
  46 +dependencies {
  47 + implementation fileTree(dir: 'libs', include: ['*.jar'])
  48 +
  49 + implementation 'androidx.appcompat:appcompat:1.1.0'
  50 + implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
  51 + testImplementation 'junit:junit:4.12'
  52 + androidTestImplementation 'androidx.test.ext:junit:1.1.1'
  53 + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
  54 +
  55 +// implementation project(path: ':core:database')
  56 + implementation project(path: ':core:network')
  57 +// implementation project(path: ':core:util')
  58 +// implementation project(path: ':core:encipher')
  59 + implementation project(path: ':cloud:user')
  60 +}
app/strike/consumer-rules.pro 0 → 100644
  1 +++ a/app/strike/consumer-rules.pro
app/strike/proguard-rules.pro 0 → 100644
  1 +++ a/app/strike/proguard-rules.pro
  1 +# Add project specific ProGuard rules here.
  2 +# You can control the set of applied configuration files using the
  3 +# proguardFiles setting in build.gradle.
  4 +#
  5 +# For more details, see
  6 +# http://developer.android.com/guide/developing/tools/proguard.html
  7 +
  8 +# If your project uses WebView with JS, uncomment the following
  9 +# and specify the fully qualified class name to the JavaScript interface
  10 +# class:
  11 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  12 +# public *;
  13 +#}
  14 +
  15 +# Uncomment this to preserve the line number information for
  16 +# debugging stack traces.
  17 +#-keepattributes SourceFile,LineNumberTable
  18 +
  19 +# If you keep the line number information, uncomment this to
  20 +# hide the original source file name.
  21 +#-renamesourcefileattribute SourceFile
app/strike/src/androidTest/java/com/cnlive/strike/strike2/ExampleInstrumentedTest.java 0 → 100644
  1 +++ a/app/strike/src/androidTest/java/com/cnlive/strike/strike2/ExampleInstrumentedTest.java
  1 +package com.cnlive.strike.strike2;
  2 +
  3 +import android.content.Context;
  4 +
  5 +import androidx.test.platform.app.InstrumentationRegistry;
  6 +import androidx.test.ext.junit.runners.AndroidJUnit4;
  7 +
  8 +import org.junit.Test;
  9 +import org.junit.runner.RunWith;
  10 +
  11 +import static org.junit.Assert.*;
  12 +
  13 +/**
  14 + * Instrumented test, which will execute on an Android device.
  15 + *
  16 + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
  17 + */
  18 +@RunWith(AndroidJUnit4.class)
  19 +public class ExampleInstrumentedTest {
  20 + @Test
  21 + public void useAppContext() {
  22 + // Context of the app under test.
  23 + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
  24 +
  25 + assertEquals("com.cnlive.strike.strike2.test", appContext.getPackageName());
  26 + }
  27 +}
app/strike/src/main/AndroidManifest.xml 0 → 100644
  1 +++ a/app/strike/src/main/AndroidManifest.xml
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3 + package="com.cnlive.strike">
  4 +
  5 + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  6 + <uses-permission android:name="android.permission.INTERNET" />
  7 +
  8 + <application
  9 + android:name=".MyApp"
  10 + android:allowBackup="true"
  11 + android:icon="@mipmap/ic_launcher"
  12 + android:label="@string/app_name"
  13 + android:roundIcon="@mipmap/ic_launcher_round"
  14 + android:supportsRtl="true"
  15 + android:theme="@style/AppTheme">
  16 + <activity android:name=".MainActivity">
  17 + <intent-filter>
  18 + <action android:name="android.intent.action.MAIN" />
  19 +
  20 + <category android:name="android.intent.category.LAUNCHER" />
  21 + </intent-filter>
  22 + </activity>
  23 +
  24 + <meta-data
  25 + android:name="com.cnlive.sdk.APP_ID"
  26 + android:value="${APP_ID}" />
  27 + <meta-data
  28 + android:name="com.cnlive.sdk.APP_KEY"
  29 + android:value="${APP_KEY}" />
  30 + <meta-data
  31 + android:name="com.cnlive.sdk.APP_SECRET"
  32 + android:value="${APP_SECRET}" />
  33 + <meta-data
  34 + android:name="com.cnlive.app.H5_CNLIVE"
  35 + android:value="${H5_CNLIVE}" />
  36 + <meta-data
  37 + android:name="com.cnlive.app.H5_DP"
  38 + android:value="${H5_DP}" />
  39 + <meta-data
  40 + android:name="com.cnlive.app.APP_START_HOST"
  41 + android:value="${APP_START_HOST}" />
  42 + <meta-data
  43 + android:name="com.cnlive.app.APP_WEB_START_HOST"
  44 + android:value="${APP_WEB_START_HOST}" />
  45 + <meta-data
  46 + android:name="com.cnlive.app.BAIDU_APP_KEY"
  47 + android:value="${BAIDU_APP_KEY}" />
  48 + <meta-data
  49 + android:name="com.cnlive.app.BAIDU_APP_SECRET"
  50 + android:value="${BAIDU_APP_SECRET}" />
  51 + <meta-data
  52 + android:name="com.cnlive.app.PAY_ACCOUNT"
  53 + android:value="${PAY_ACCOUNT}" />
  54 + <meta-data
  55 + android:name="com.cnlive.app.WECHAT_APPID"
  56 + android:value="${WECHAT_APPID}" />
  57 + <meta-data
  58 + android:name="com.cnlive.app.SHARE_ICON"
  59 + android:value="${SHARE_ICON}" />
  60 + <meta-data
  61 + android:name="com.cnlive.app.SHARE_TITLE"
  62 + android:value="${SHARE_TITLE}" />
  63 + <meta-data
  64 + android:name="com.cnlive.app.SHARE_DOWNLOAD"
  65 + android:value="${SHARE_DOWNLOAD}" />
  66 + <meta-data
  67 + android:name="com.cnlive.app.SHARE_APP_KEY"
  68 + android:value="${SHARE_APP_KEY}" />
  69 + <meta-data
  70 + android:name="com.cnlive.app.SHARE_APP_SCERET"
  71 + android:value="${SHARE_APP_SCERET}" />
  72 + <meta-data
  73 + android:name="com.cnlive.app.SPECIAL_GROUP_MEMBER_LIMIT"
  74 + android:value="${SPECIAL_GROUP_MEMBER_LIMIT}" />
  75 + </application>
  76 +
  77 +</manifest>
0 \ No newline at end of file 78 \ No newline at end of file
app/strike/src/main/java/com/cnlive/strike/MainActivity.java 0 → 100644
  1 +++ a/app/strike/src/main/java/com/cnlive/strike/MainActivity.java
  1 +package com.cnlive.strike;
  2 +
  3 +import androidx.appcompat.app.AppCompatActivity;
  4 +
  5 +import android.os.Bundle;
  6 +
  7 +public class MainActivity extends AppCompatActivity {
  8 +
  9 + @Override
  10 + protected void onCreate(Bundle savedInstanceState) {
  11 + super.onCreate(savedInstanceState);
  12 + setContentView(R.layout.activity_main);
  13 + }
  14 +}
app/strike/src/main/java/com/cnlive/strike/MyApp.java 0 → 100644
  1 +++ a/app/strike/src/main/java/com/cnlive/strike/MyApp.java
  1 +package com.cnlive.strike;
  2 +
  3 +import android.app.Application;
  4 +
  5 +public class MyApp extends Application {
  6 + @Override
  7 + public void onCreate() {
  8 + super.onCreate();
  9 + }
  10 +}
app/strike/src/main/res/layout/activity_main.xml 0 → 100644
  1 +++ a/app/strike/src/main/res/layout/activity_main.xml
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:app="http://schemas.android.com/apk/res-auto"
  4 + xmlns:tools="http://schemas.android.com/tools"
  5 + android:layout_width="match_parent"
  6 + android:layout_height="match_parent"
  7 + tools:context=".MainActivity">
  8 +
  9 +</androidx.constraintlayout.widget.ConstraintLayout>
0 \ No newline at end of file 10 \ No newline at end of file
app/strike/src/main/res/mipmap-hdpi/ic_launcher.png 0 → 100644

2.89 KB

app/strike/src/main/res/mipmap-hdpi/ic_launcher_round.png 0 → 100644

4.79 KB

app/strike/src/main/res/mipmap-mdpi/ic_launcher.png 0 → 100644

2.01 KB

app/strike/src/main/res/mipmap-mdpi/ic_launcher_round.png 0 → 100644

2.72 KB

app/strike/src/main/res/mipmap-xhdpi/ic_launcher.png 0 → 100644

4.38 KB

app/strike/src/main/res/mipmap-xhdpi/ic_launcher_round.png 0 → 100644

6.73 KB

app/strike/src/main/res/mipmap-xxhdpi/ic_launcher.png 0 → 100644

6.24 KB

app/strike/src/main/res/mipmap-xxhdpi/ic_launcher_round.png 0 → 100644

10.2 KB

app/strike/src/main/res/mipmap-xxxhdpi/ic_launcher.png 0 → 100644

8.91 KB

app/strike/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png 0 → 100644

14.8 KB

app/strike/src/main/res/values/strings.xml 0 → 100644
  1 +++ a/app/strike/src/main/res/values/strings.xml
  1 +<resources>
  2 + <string name="app_name">strike</string>
  3 +</resources>
app/strike/src/main/res/values/styles.xml 0 → 100644
  1 +++ a/app/strike/src/main/res/values/styles.xml
  1 +<resources>
  2 +
  3 + <!-- Base application theme. -->
  4 + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  5 + <!-- Customize your theme here. -->
  6 + <item name="colorPrimary">@color/colorPrimary</item>
  7 + <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  8 + <item name="colorAccent">@color/colorAccent</item>
  9 + </style>
  10 +
  11 +</resources>
app/strike/src/test/java/com/cnlive/strike/strike2/ExampleUnitTest.java 0 → 100644
  1 +++ a/app/strike/src/test/java/com/cnlive/strike/strike2/ExampleUnitTest.java
  1 +package com.cnlive.strike.strike2;
  2 +
  3 +import org.junit.Test;
  4 +
  5 +import static org.junit.Assert.*;
  6 +
  7 +/**
  8 + * Example local unit test, which will execute on the development machine (host).
  9 + *
  10 + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
  11 + */
  12 +public class ExampleUnitTest {
  13 + @Test
  14 + public void addition_isCorrect() {
  15 + assertEquals(4, 2 + 2);
  16 + }
  17 +}
0 \ No newline at end of file 18 \ No newline at end of file
build.gradle 0 → 100644
  1 +++ a/build.gradle
  1 +// Top-level build file where you can add configuration options common to all sub-projects/modules.
  2 +apply from: "config.gradle"
  3 +
  4 +static void imput(String type, Project project, Object dependencyNotation) {
  5 + if (project != dependencyNotation) project.dependencies.add(type, dependencyNotation)
  6 +
  7 +}
  8 +
  9 +buildscript {
  10 + repositories {
  11 + google()
  12 + jcenter()
  13 +
  14 + }
  15 + dependencies {
  16 + classpath 'com.android.tools.build:gradle:3.5.1'
  17 +
  18 + // NOTE: Do not place your application dependencies here; they belong
  19 + // in the individual module build.gradle files
  20 + classpath "com.alibaba:arouter-register:1.0.2"
  21 + classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
  22 + }
  23 +}
  24 +
  25 +allprojects {
  26 + repositories {
  27 + google()
  28 + jcenter()
  29 +
  30 + }
  31 +}
  32 +allprojects {
  33 + afterEvaluate {
  34 + if (project.parent == null || project.parent == rootProject) return
  35 +
  36 + android {
  37 + compileSdkVersion 29
  38 + buildToolsVersion "29.0.0"
  39 + defaultConfig {
  40 + if (minSdkVersion == null) minSdkVersion 16
  41 + if (targetSdkVersion == null) targetSdkVersion 29
  42 + if (versionCode == null) versionCode 1
  43 + if (versionName == null) versionName "1.2"
  44 +
  45 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  46 +
  47 + javaCompileOptions {
  48 + annotationProcessorOptions {
  49 + arguments = [
  50 + AROUTER_MODULE_NAME: project.getName()
  51 +// ,
  52 +// AROUTER_GENERATE_DOC: "enable"
  53 + ]
  54 + }
  55 + }
  56 +
  57 + ndk {
  58 + abiFilters(
  59 + "armeabi-v7a"
  60 +// , "x86"
  61 + )
  62 + }
  63 + }
  64 +
  65 + compileOptions {
  66 + sourceCompatibility JavaVersion.VERSION_1_8
  67 + targetCompatibility JavaVersion.VERSION_1_8
  68 + }
  69 +
  70 + dataBinding {
  71 + enabled true
  72 + }
  73 +
  74 + dexOptions {
  75 + javaMaxHeapSize '4g'
  76 + }
  77 +
  78 + signingConfigs {
  79 + debugConfig {
  80 + storeFile file("www.cnlive.com.key")
  81 + storePassword "www.cnlive.comPassw0rd"
  82 + keyAlias "strike-debug"
  83 + keyPassword "www.cnlive.com"
  84 + }
  85 + releaseConfig {
  86 + if (store_file != null) storeFile file(store_file)
  87 + if (store_password != null) storePassword store_password
  88 + if (key_alias != null) keyAlias key_alias
  89 + if (key_password != null) keyPassword key_password
  90 + }
  91 + }
  92 + }
  93 + //核心库
  94 + imput("implementation", project, moudle.core_base)
  95 +
  96 + //Tripartite Base
  97 + for (String moudle : base_librarys) imput('implementation', project, moudle)
  98 + for (String moudle : base_compilers) imput('annotationProcessor', project, moudle)
  99 +
  100 + }
  101 +
  102 + repositories {
  103 + google()
  104 + jcenter()
  105 + maven {
  106 + url mixedUrl
  107 + credentials { username = mavenUsername; password = mavenPassword }
  108 + }
  109 + maven { url 'https://jitpack.io' }
  110 + maven { url 'http://developer.huawei.com/repo' }
  111 + }
  112 +}
  113 +task clean(type: Delete) {
  114 + delete rootProject.buildDir
  115 +}
cloud/user/.gitignore 0 → 100644
  1 +++ a/cloud/user/.gitignore
  1 +/build
cloud/user/build.gradle 0 → 100644
  1 +++ a/cloud/user/build.gradle
  1 +apply plugin: 'com.android.library'
  2 +
  3 +static def stringValue(def value) {
  4 + return "\"${value}\""
  5 +}
  6 +
  7 +
  8 +android {
  9 +
  10 + defaultConfig {
  11 + }
  12 +
  13 + buildTypes {
  14 + debug {
  15 + resValue("string", "ACCOUNT_LABEL", "网家家 内测")
  16 + resValue("string", "ACCOUNT_TYPE", "com.c nlive.strike.debug.AccountType")
  17 + resValue("string", "ACCOUNT_PROVIDE", "com.cnlive.strike.debug.AccountProvide")
  18 + zipAlignEnabled true
  19 + }
  20 + release {
  21 + resValue("string", "ACCOUNT_LABEL", "网家家")
  22 + resValue("string", "ACCOUNT_TYPE", "com.cnlive.strike.AccountType")
  23 + resValue("string", "ACCOUNT_PROVIDE", "com.cnlive.strike.AccountProvide")
  24 + minifyEnabled false
  25 + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  26 + zipAlignEnabled true
  27 + }
  28 + }
  29 + dataBinding {
  30 + enabled true
  31 + }
  32 +
  33 +}
  34 +
  35 +dependencies {
  36 + implementation fileTree(dir: 'libs', include: ['*.jar'])
  37 + implementation project(path: ':core:network')
  38 +}
cloud/user/consumer-rules.pro 0 → 100644
  1 +++ a/cloud/user/consumer-rules.pro
cloud/user/proguard-rules.pro 0 → 100644
  1 +++ a/cloud/user/proguard-rules.pro
  1 +# Add project specific ProGuard rules here.
  2 +# You can control the set of applied configuration files using the
  3 +# proguardFiles setting in build.gradle.
  4 +#
  5 +# For more details, see
  6 +# http://developer.android.com/guide/developing/tools/proguard.html
  7 +
  8 +# If your project uses WebView with JS, uncomment the following
  9 +# and specify the fully qualified class name to the JavaScript interface
  10 +# class:
  11 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  12 +# public *;
  13 +#}
  14 +
  15 +# Uncomment this to preserve the line number information for
  16 +# debugging stack traces.
  17 +#-keepattributes SourceFile,LineNumberTable
  18 +
  19 +# If you keep the line number information, uncomment this to
  20 +# hide the original source file name.
  21 +#-renamesourcefileattribute SourceFile
cloud/user/src/androidTest/java/com/cnlive/core/user/ExampleInstrumentedTest.java 0 → 100644
  1 +++ a/cloud/user/src/androidTest/java/com/cnlive/core/user/ExampleInstrumentedTest.java
  1 +package com.cnlive.core.user;
  2 +
  3 +import android.content.Context;
  4 +
  5 +import androidx.test.platform.app.InstrumentationRegistry;
  6 +import androidx.test.ext.junit.runners.AndroidJUnit4;
  7 +
  8 +import org.junit.Test;
  9 +import org.junit.runner.RunWith;
  10 +
  11 +import static org.junit.Assert.*;
  12 +
  13 +/**
  14 + * Instrumented test, which will execute on an Android device.
  15 + *
  16 + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
  17 + */
  18 +@RunWith(AndroidJUnit4.class)
  19 +public class ExampleInstrumentedTest {
  20 + @Test
  21 + public void useAppContext() {
  22 + // Context of the app under test.
  23 + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
  24 +
  25 + assertEquals("com.cnlive.strike.user.test", appContext.getPackageName());
  26 + }
  27 +}
cloud/user/src/debug/res/mipmap-hdpi/icon_account.png 0 → 100644

4.41 KB

cloud/user/src/debug/res/mipmap-ldpi/icon_account.png 0 → 100644

2.17 KB

cloud/user/src/debug/res/mipmap-xhdpi/icon_account.png 0 → 100644

5.93 KB

cloud/user/src/debug/res/mipmap-xxhdpi/icon_account.png 0 → 100644

9.25 KB

cloud/user/src/debug/res/mipmap-xxxhdpi/icon_account.png 0 → 100644

13.2 KB

cloud/user/src/main/AndroidManifest.xml 0 → 100644
  1 +++ a/cloud/user/src/main/AndroidManifest.xml
  1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2 + xmlns:tools="http://schemas.android.com/tools"
  3 + package="com.cnlive.core.user">
  4 + <uses-permission android:name="android.permission.INTERNET" />
  5 +
  6 + <!-- for mta statistics, not necessary-->
  7 + <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  8 + <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  9 + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  10 + <uses-permission
  11 + android:name="android.permission.AUTHENTICATE_ACCOUNTS"
  12 + android:maxSdkVersion="22" />
  13 + <uses-permission
  14 + android:name="android.permission.GET_ACCOUNTS"
  15 + android:maxSdkVersion="22" />
  16 + <uses-permission
  17 + android:name="android.permission.MANAGE_ACCOUNTS"
  18 + android:maxSdkVersion="22" />
  19 + <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> <!-- 账户自动更新 App保活相关 -->
  20 + <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  21 + <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
  22 + <uses-permission android:name="android.permission.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED" />
  23 + <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 账户权限相关 -->
  24 + <uses-permission
  25 + android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
  26 + tools:ignore="ProtectedPermissions" />
  27 + <uses-permission
  28 + android:name="android.permission.ACCOUNT_MANAGER"
  29 + tools:ignore="ProtectedPermissions" />
  30 + <uses-permission android:name="android.permission.INTERNET" />
  31 +
  32 + <application android:largeHeap="true">
  33 +
  34 + <activity android:name="com.cnlive.strike.moudle.user.ui.activity.MainTestActivity" />
  35 + <activity
  36 + android:name="com.cnlive.strike.moudle.user.ui.activity.LoginActivity"
  37 + android:configChanges="keyboardHidden|screenSize|orientation|smallestScreenSize|screenLayout"
  38 + android:launchMode="singleTop"
  39 + android:screenOrientation="portrait"
  40 + android:windowSoftInputMode="stateHidden|adjustPan">
  41 + <intent-filter>
  42 + <action android:name="android.accounts.AccountAuthenticator" />
  43 + </intent-filter>
  44 + </activity>
  45 +
  46 + <activity
  47 + android:name="com.cnlive.strike.moudle.user.ui.activity.BindPhoneNumberActivity"
  48 + android:configChanges="keyboardHidden|screenSize|smallestScreenSize|screenLayout|orientation"
  49 + android:launchMode="singleTop"
  50 + android:screenOrientation="portrait" />
  51 + <activity
  52 + android:name="com.cnlive.strike.moudle.user.ui.activity.FirstLoginActivity"
  53 + android:configChanges="keyboardHidden|screenSize|smallestScreenSize|screenLayout|orientation"
  54 + android:launchMode="singleTop"
  55 + android:screenOrientation="portrait" />
  56 + <activity
  57 + android:name="com.cnlive.strike.moudle.user.ui.activity.SelectCountryActivity"
  58 + android:configChanges="keyboardHidden|screenSize|smallestScreenSize|screenLayout|orientation"
  59 + android:launchMode="singleTask"
  60 + android:screenOrientation="portrait"
  61 + android:windowSoftInputMode="adjustResize" />
  62 + <!-- 个人资料页-->
  63 + <activity
  64 + android:name="com.cnlive.strike.moudle.user.ui.activity.PersonalDataActivity"
  65 + android:configChanges="keyboardHidden|screenSize|smallestScreenSize|screenLayout|orientation"
  66 + android:launchMode="singleTop"
  67 + android:screenOrientation="portrait" />
  68 + <!--预览头像-->
  69 + <activity
  70 + android:name="com.cnlive.strike.moudle.user.ui.activity.PersonalImageActivity"
  71 + android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
  72 + android:launchMode="singleTop"
  73 + android:screenOrientation="portrait" />
  74 + <!-- 个人资料姓名-->
  75 + <activity
  76 + android:name="com.cnlive.strike.moudle.user.ui.activity.UpdateContentActivity"
  77 + android:configChanges="keyboardHidden|screenSize|smallestScreenSize|screenLayout|orientation"
  78 + android:launchMode="singleTop"
  79 + android:screenOrientation="portrait"
  80 + android:windowSoftInputMode="stateVisible|adjustPan" />
  81 + <!-- 个人签名-->
  82 + <activity
  83 + android:name="com.cnlive.strike.moudle.user.ui.activity.SignatureActivity"
  84 + android:configChanges="keyboardHidden|screenSize|smallestScreenSize|screenLayout|orientation"
  85 + android:launchMode="singleTop"
  86 + android:screenOrientation="portrait"
  87 + android:windowSoftInputMode="stateVisible|adjustPan" />
  88 + </application>
  89 +</manifest>
cloud/user/src/main/java/com/cnlive/strike/data/network/api/ApiBaseRequest.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/data/network/api/ApiBaseRequest.java
  1 +package com.cnlive.strike.data.network.api;
  2 +
  3 +import android.content.Context;
  4 +import android.util.Log;
  5 +
  6 +import com.cnlive.libs.data.network.ApiBuild;
  7 +import com.cnlive.libs.data.network.Subscriber;
  8 +import com.cnlive.libs.data.network.interceptor.DESEncryptInterceptor;
  9 +import com.cnlive.libs.data.network.interceptor.DefaultEncryptInterceptor;
  10 +import com.cnlive.libs.data.network.interceptor.NetPPEncryptInterceptor;
  11 +import com.cnlive.libs.data.network.interceptor.NetPPPayEncryptInterceptor;
  12 +import com.cnlive.libs.data.network.interceptor.SignEncrypt2Interceptor;
  13 +import com.cnlive.libs.data.network.interceptor.SignEncryptInterceptor;
  14 +import com.cnlive.strike.data.network.model.BaseInfo;
  15 +import com.cnlive.libs.base.application.AppConfig;
  16 +import com.cnlive.libs.base.logic.callback.DataCallback;
  17 +
  18 +import io.reactivex.android.schedulers.AndroidSchedulers;
  19 +import io.reactivex.disposables.Disposable;
  20 +import io.reactivex.schedulers.Schedulers;
  21 +import okhttp3.Interceptor;
  22 +import okhttp3.OkHttpClient;
  23 +import okhttp3.Request;
  24 +import okhttp3.Response;
  25 +import retrofit2.adapter.rxjava2.Result;
  26 +
  27 +import static com.cnlive.libs.base.logic.Config.SUCCESS;
  28 +
  29 +
  30 +/**
  31 + * Created by xiansong on 2017/9/8.
  32 + */
  33 +
  34 +public class ApiBaseRequest<Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo> {
  35 +
  36 + private static final int OKHTTP_KEEP_ALIVE_DURATION_SECONDS = 10;
  37 +
  38 + //网家家 接口域名
  39 + public static final String BASE_URL = "https://apiwjj.cnlive.com/";
  40 + //网家家 测试环境 接口域名
  41 + public static final String DEBUG_URL = "http://apiwjjtest.cnlive.com/";
  42 + //IM 接口域名
  43 + private static final String IM_URL = "https://wjjim.cnlive.com/";
  44 + //IM 测试环境 接口域名
  45 + public static final String IM_DEBUG_URL = "http://imtest.cnlive.com/";
  46 + //OPEN API 接口域名
  47 + public static final String OPEN_URL = "https://api.cnlive.com/";
  48 + //WJJ JSON
  49 + private static final String JSON_URL = "https://wjj.ys1.cnliveimg.com/";
  50 +
  51 + private static final String DEBUG_CMS_URL = "http://cmstest.cnlive.com:8768/";
  52 + // TODO: 2018/11/27 cms正式地址
  53 + private static final String CMS_URL = "http://cms.cnlive.com:8768/";
  54 +
  55 + public static <T> String baseEndpoint() {
  56 + return AppConfig.isDebug() ? DEBUG_URL : BASE_URL;
  57 + }
  58 +
  59 +
  60 + public static <T> String baseIMEndpoint() {
  61 + return AppConfig.isDebug() ? IM_DEBUG_URL : IM_URL;
  62 + }
  63 +
  64 + public static <T> String baseCMSEndpoint() {
  65 + return AppConfig.isDebug() ? DEBUG_CMS_URL : CMS_URL;
  66 + }
  67 +
  68 + private static <T> String serviceEndpoint(Class<T> clazz) {
  69 + if (clazz == ApiBaseServiceOpen.class) {
  70 + return OPEN_URL;
  71 + } else
  72 + return baseEndpoint();
  73 + }
  74 +
  75 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  76 + ApiBaseRequest<Observable, BaseData> observable(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  77 + return observable(clazz, false, api, null);
  78 + }
  79 +
  80 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  81 + ApiBaseRequest<Observable, BaseData> observable(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api, Interceptor interceptor) {
  82 + return observable(clazz, false, api, interceptor);
  83 + }
  84 +
  85 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  86 + ApiBaseRequest<Observable, BaseData> observable(Class<Service> clazz, boolean decode, ApiBuild.Api<Service, Observable, BaseData> api, Interceptor interceptor) {
  87 + ApiBaseRequest<Observable, BaseData> request = new ApiBaseRequest<>();
  88 + ApiBuild<Service, Observable, BaseData> build = ApiBuild.service(clazz, api);
  89 + build.setEndpoint(serviceEndpoint(clazz));
  90 + if (interceptor != null) build.addInterceptor(interceptor);
  91 + request.observable = build.build(decode, OKHTTP_KEEP_ALIVE_DURATION_SECONDS);
  92 + return request;
  93 + }
  94 +
  95 + public static <Service> Service serviceNoSign(Class<Service> clazz) {
  96 + return service(clazz, (Interceptor) new DefaultEncryptInterceptor());
  97 + }
  98 +
  99 + public static <Service> Service service(Class<Service> clazz) {
  100 + return service(clazz, new SignEncryptInterceptor());
  101 + }
  102 +
  103 + public static <Service> Service service(Class<Service> clazz, boolean valueUrlencode, boolean responseUrldecode) {
  104 + return service(clazz, responseUrldecode, new SignEncryptInterceptor(valueUrlencode));
  105 + }
  106 +
  107 + public static <Service> Service serviceDES(Class<Service> clazz) {
  108 + return service(clazz, new DESEncryptInterceptor());
  109 + }
  110 +
  111 + public static <Service> Service serviceNetPP(Class<Service> clazz) {
  112 + return service(clazz, new NetPPEncryptInterceptor());
  113 + }
  114 +
  115 + public static <Service> Service serviceNetPPPay(Class<Service> clazz) {
  116 + return service(clazz, new NetPPPayEncryptInterceptor());
  117 + }
  118 +
  119 +
  120 + private static <Service> Service service(Class<Service> clazz, Interceptor... interceptor) {
  121 + return service(clazz, false, interceptor);
  122 + }
  123 +
  124 + private static <Service> Service service(Class<Service> clazz, boolean decode, Interceptor... interceptor) {
  125 + return ApiBuild.service(clazz, null)
  126 + .setEndpoint(serviceEndpoint(clazz))
  127 + .addInterceptor(interceptor)
  128 + .service(decode, OKHTTP_KEEP_ALIVE_DURATION_SECONDS);
  129 + }
  130 +
  131 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  132 + ApiBaseRequest<Observable, BaseData> serviceNoSign(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  133 + return service(clazz, api, new DefaultEncryptInterceptor());
  134 + }
  135 +
  136 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  137 + ApiBaseRequest<Observable, BaseData> service(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  138 + return service(clazz, api, new SignEncryptInterceptor());
  139 + }
  140 +
  141 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  142 + ApiBaseRequest<Observable, BaseData> serviceNewVersion(Class<Service> clazz, long connectTimeout, long readTimeout, ApiBuild.Api<Service, Observable, BaseData> api) {
  143 + return serviceNewVersion(clazz, false, api, connectTimeout, readTimeout, new SignEncryptInterceptor());
  144 + }
  145 +
  146 +
  147 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  148 + ApiBaseRequest<Observable, BaseData> service(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api, boolean valueUrlencode, boolean responseUrldecode) {
  149 + return service(clazz, responseUrldecode, api, new SignEncryptInterceptor(valueUrlencode));
  150 + }
  151 +
  152 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  153 + ApiBaseRequest<Observable, BaseData> serviceDES(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  154 + return service(clazz, api, new DESEncryptInterceptor());
  155 + }
  156 +
  157 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  158 + ApiBaseRequest<Observable, BaseData> service2encode(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  159 + return service(clazz, api, new SignEncrypt2Interceptor());
  160 + }
  161 +
  162 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  163 + ApiBaseRequest<Observable, BaseData> serviceNetPP(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  164 + return service(clazz, api, new NetPPEncryptInterceptor());
  165 + }
  166 +
  167 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  168 + ApiBaseRequest<Observable, BaseData> serviceNetPPPay(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  169 + return service(clazz, api, new NetPPPayEncryptInterceptor());
  170 + }
  171 +
  172 + private static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  173 + ApiBaseRequest<Observable, BaseData> service(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api, Interceptor... interceptor) {
  174 + return service(clazz, false, api, interceptor);
  175 + }
  176 +
  177 + private static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  178 + ApiBaseRequest<Observable, BaseData> service(Class<Service> clazz, boolean decode, ApiBuild.Api<Service, Observable, BaseData> api, Interceptor... interceptor) {
  179 +
  180 + ApiBaseRequest<Observable, BaseData> request = new ApiBaseRequest<>();
  181 +
  182 + request.observable = ApiBuild.service(clazz, api)
  183 + .setEndpoint(serviceEndpoint(clazz))
  184 + .addInterceptor(interceptor)
  185 + .build(decode, OKHTTP_KEEP_ALIVE_DURATION_SECONDS);
  186 +
  187 + return request;
  188 + }
  189 +
  190 +
  191 + private static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  192 + ApiBaseRequest<Observable, BaseData> serviceNewVersion(Class<Service> clazz, boolean decode, ApiBuild.Api<Service, Observable, BaseData> api, long connectTimeout, long readTimeout, Interceptor... interceptor) {
  193 +
  194 + ApiBaseRequest<Observable, BaseData> request = new ApiBaseRequest<>();
  195 +
  196 + request.observable = ApiBuild.service(clazz, api)
  197 + .setEndpoint(serviceEndpoint(clazz))
  198 + .setConnectTimeout(connectTimeout)
  199 + .setReadTimeout(readTimeout)
  200 + .addInterceptor(interceptor)
  201 + .build(decode);
  202 +
  203 + return request;
  204 + }
  205 +
  206 + private Observable observable;
  207 +
  208 + private ApiBaseRequest() {
  209 + }
  210 +
  211 + public static <Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  212 + Disposable subscribe(Observable observable, Subscriber<BaseData> subscriber) {
  213 + return observable.take(1)
  214 + .subscribeOn(Schedulers.io())
  215 + .observeOn(AndroidSchedulers.mainThread())
  216 + .subscribe(subscriber.next, subscriber.error, subscriber.complete, subscriber.subscribe);
  217 + }
  218 +
  219 + public Disposable subscribe(Subscriber<BaseData> subscriber) {
  220 + return observable.take(1)
  221 + .subscribeOn(Schedulers.io())
  222 + .observeOn(AndroidSchedulers.mainThread())
  223 + .subscribe(subscriber.next, subscriber.error, subscriber.complete, subscriber.subscribe);
  224 + }
  225 +
  226 + public Disposable subscribe(Context context, DataCallback<BaseData> callback) {
  227 + Subscriber<BaseData> subscriber = new Subscriber<BaseData>(context) {
  228 + @Override
  229 + public void onCompleted(String s, String s1, BaseData data) {
  230 + if (callback == null) return;
  231 + callback.callback(SUCCESS, "", data);
  232 + }
  233 +
  234 + @Override
  235 + public void onError(String code, String message) {
  236 + if (callback == null) return;
  237 + int errorCode = -1;
  238 + try {
  239 + errorCode = Integer.valueOf(code);
  240 + } catch (Exception ignored) {
  241 + }
  242 +
  243 + Log.e("LynnTest read", code + " \n " + message);
  244 + callback.callback(errorCode, message, null);
  245 + }
  246 + };
  247 +
  248 + return observable.take(1)
  249 + .subscribeOn(Schedulers.io())
  250 + .observeOn(AndroidSchedulers.mainThread())
  251 + .subscribe(subscriber.next, subscriber.error, subscriber.complete, subscriber.subscribe);
  252 + }
  253 +
  254 + public static Disposable loadData(String url, DataCallback<String> callback) {
  255 + return io.reactivex.Observable
  256 + .just(url)
  257 + .map(s -> {
  258 + Response response = null;
  259 + String data = null;
  260 + try {
  261 + OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
  262 + Request request = new Request.Builder().url(url).build();
  263 + response = client.newCall(request).execute();//得到Response 对
  264 + if (response.isSuccessful()) data = response.body().string();
  265 + } catch (Exception e) {
  266 + Log.e("Api", "", e);
  267 + }
  268 +
  269 + if (data != null) {
  270 +// Log.e("DemoView", "response.code()==" + response.code());
  271 +// Log.e("DemoView", "response.message()==" + response.message());
  272 +// Log.e("DemoView", "res==" + data);
  273 + //此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。
  274 + }
  275 + return data;
  276 + })
  277 + .subscribeOn(Schedulers.io())
  278 + .observeOn(AndroidSchedulers.mainThread())
  279 + .subscribe(s -> callback.callback(0, "", s));
  280 + }
  281 +
  282 + public interface SetUrl {
  283 + <T> BaseRequest getUrl(Class<T> clazz);
  284 +
  285 + class BaseRequest {
  286 + Class clazz;
  287 +
  288 + }
  289 + }
  290 +}
cloud/user/src/main/java/com/cnlive/strike/data/network/api/ApiBaseServiceOpen.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/data/network/api/ApiBaseServiceOpen.java
  1 +package com.cnlive.strike.data.network.api;
  2 +
  3 +
  4 +import com.cnlive.strike.data.network.model.BaseInfo;
  5 +import com.cnlive.strike.data.network.model.FaceData;
  6 +import com.cnlive.strike.data.network.model.TokenData;
  7 +import com.cnlive.strike.data.network.model.UserData;
  8 +
  9 +import java.util.List;
  10 +import java.util.Map;
  11 +
  12 +import io.reactivex.Observable;
  13 +import okhttp3.MultipartBody;
  14 +import okhttp3.RequestBody;
  15 +import retrofit2.adapter.rxjava2.Result;
  16 +import retrofit2.http.Multipart;
  17 +import retrofit2.http.POST;
  18 +import retrofit2.http.Part;
  19 +import retrofit2.http.PartMap;
  20 +import retrofit2.http.QueryMap;
  21 +
  22 +/**
  23 + * Created by xiansong on 2018/3/22.
  24 + */
  25 +
  26 +public interface ApiBaseServiceOpen {
  27 +
  28 +
  29 + /**
  30 + * 顶踩一条节目 0:踩 1:顶
  31 + *
  32 + * @param map
  33 + * @return
  34 + */
  35 + @POST("open/api2/ctServices/supportForHd/support")
  36 + Observable<Result<BaseInfo>> support(@QueryMap Map<String, String> map);
  37 +
  38 +
  39 + /**
  40 + * 快捷登录前发送验证码
  41 + *
  42 + * @param map
  43 + * @return
  44 + */
  45 + @POST("open/api2/user/sendVerifyCode")
  46 + Observable<Result<BaseInfo>> sendVerifyCodeBefQuickLogin(@QueryMap Map<String, String> map);
  47 +
  48 + /**
  49 + * 快捷登录
  50 + *
  51 + * @param map
  52 + * @return
  53 + */
  54 + @POST("open/api2/user/loginInQuickly")
  55 + Observable<Result<BaseInfo<UserData>>> quickLogin(@QueryMap Map<String, String> map);
  56 +
  57 + /**
  58 + * 登录
  59 + *
  60 + * @param map
  61 + * @return
  62 + */
  63 + @POST("open/api2/user/loginIn")
  64 + Observable<Result<BaseInfo<UserData>>> login(@QueryMap Map<String, String> map);
  65 +
  66 + /**
  67 + * 查询用户信息
  68 + *
  69 + * @param map
  70 + * @return
  71 + */
  72 + @POST("open/api2/user/readUserById")
  73 + Observable<Result<BaseInfo<UserData>>> queryUserInfo(@QueryMap Map<String, String> map);
  74 +
  75 + /**
  76 + * 更新用户附加信息
  77 + *
  78 + * @param map
  79 + * @return
  80 + */
  81 + @POST("open/api2/user/updateUserExtInfo")
  82 + Observable<Result<BaseInfo>> updateUserExtInfo(@QueryMap Map<String, String> map);
  83 +
  84 + /**
  85 + * 修改用户单项信息
  86 + *
  87 + * @param map
  88 + * @return
  89 + */
  90 + @POST("open/api2/user/updateUserById")
  91 + Observable<Result<BaseInfo>> modifyUserInfo(@QueryMap Map<String, String> map);
  92 +
  93 +
  94 + /**
  95 + * 注册或修改手机号前发手机验证码
  96 + *
  97 + * @param map
  98 + * @return
  99 + */
  100 + @POST("open/api2/user/sendVerifyCodeForUnRegistered")
  101 + Observable<Result<BaseInfo>> sendVerifyCodeForUnRegistered(@QueryMap Map<String, String> map);
  102 +
  103 + /**
  104 + * 更新手机号
  105 + *
  106 + * @param map
  107 + * @return
  108 + */
  109 + @POST("open/api2/user/updateMobileById")
  110 + Observable<Result<BaseInfo>> updateMobile(@QueryMap Map<String, String> map);
  111 +
  112 + /**
  113 + * 注册
  114 + *
  115 + * @param map
  116 + * @return
  117 + */
  118 + @POST("open/api2/user/register")
  119 + Observable<Result<BaseInfo<UserData>>> register(@QueryMap Map<String, String> map);
  120 +
  121 +
  122 + /**
  123 + * 获取access_token
  124 + *
  125 + * @param map
  126 + * @return
  127 + */
  128 + @POST("open/api2/token")
  129 + Observable<Result<BaseInfo<TokenData>>> accessToken(@QueryMap Map<String, String> map);
  130 +
  131 + /**
  132 + * 上传头像
  133 + *
  134 + * @param map
  135 + * @param params
  136 + * @return
  137 + */
  138 + @Multipart
  139 + @POST("open/api2/user/updateUserFaceById")
  140 + Observable<Result<BaseInfo<FaceData>>> updateUserFace(@PartMap Map<String, RequestBody> map,
  141 + @Part List<MultipartBody.Part> params);
  142 +
  143 +
  144 +
  145 + /**
  146 + * 音频播放鉴权接口
  147 + * @param map
  148 + * @return
  149 + */
  150 + @POST("open/api2/user/loginIn3rdForWJJ")
  151 + Observable<Result<BaseInfo<UserData>>> loginIn3rdForWJJ(@QueryMap Map<String, String> map);
  152 + /**
  153 + * 登陆
  154 + * @param map
  155 + * @return
  156 + */
  157 + @POST("open/api2/user/loginIn3rdAndMobileForWJJ")
  158 + Observable<Result<BaseInfo<UserData>>> loginIn3rdAndMobileForWJJ(@QueryMap Map<String, String> map);
  159 +
  160 +}
cloud/user/src/main/java/com/cnlive/strike/data/network/api/ApiBaseSubscriber.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/data/network/api/ApiBaseSubscriber.java
  1 +package com.cnlive.strike.data.network.api;
  2 +
  3 +
  4 +import com.cnlive.libs.data.network.Subscriber;
  5 +
  6 +/**
  7 + * Created by xiansong on 2017/9/8.
  8 + */
  9 +
  10 +public class ApiBaseSubscriber {
  11 +
  12 + private static final String success_code = "0";
  13 + private static final String success_message = "数据加载成功";
  14 +
  15 + public static final Subscriber.Config subscriberBuild = Subscriber.newConfig()
  16 + .putInfo(Subscriber.Config.response_success, success_code, success_message) ;
  17 +
  18 + public static String getSuccessCode(){
  19 + return success_code;
  20 + }
  21 +}
cloud/user/src/main/java/com/cnlive/strike/data/network/api/Test.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/data/network/api/Test.java
  1 +package com.cnlive.strike.data.network.api;
  2 +
  3 +import android.content.Context;
  4 +
  5 +import com.cnlive.libs.data.network.ApiBuild;
  6 +import com.cnlive.libs.data.network.Subscriber;
  7 +import com.cnlive.strike.data.network.model.BaseInfo;
  8 +import com.cnlive.libs.base.logic.callback.DataCallback;
  9 +
  10 +import io.reactivex.disposables.Disposable;
  11 +import okhttp3.Interceptor;
  12 +import retrofit2.adapter.rxjava2.Result;
  13 +
  14 +public interface Test<Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo> {
  15 + public static final int OKHTTP_KEEP_ALIVE_DURATION_SECONDS = 10;
  16 +
  17 + //网家家 接口域名
  18 + public static final String BASE_URL = "https://apiwjj.cnlive.com/";
  19 + //网家家 测试环境 接口域名
  20 + public static final String DEBUG_URL = "http://apiwjjtest.cnlive.com/";
  21 + //IM 接口域名
  22 + public static final String IM_URL = "https://wjjim.cnlive.com/";
  23 + //IM 测试环境 接口域名
  24 + public static final String IM_DEBUG_URL = "http://imtest.cnlive.com/";
  25 + //OPEN API 接口域名
  26 + public static final String OPEN_URL = "https://api.cnlive.com/";
  27 + //WJJ JSON
  28 + public static final String JSON_URL = "https://wjj.ys1.cnliveimg.com/";
  29 +
  30 + public static final String DEBUG_CMS_URL = "http://cmstest.cnlive.com:8768/";
  31 + // TODO: 2018/11/27 cms正式地址
  32 + public static final String CMS_URL = "http://cms.cnlive.com:8768/";
  33 +
  34 + public <T> String baseEndpoint();
  35 +
  36 +
  37 + public <T> String baseIMEndpoint();
  38 +
  39 + public <T> String baseCMSEndpoint();
  40 +
  41 + public <T> String serviceEndpoint(Class<T> clazz);
  42 +
  43 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  44 + ApiBaseRequest<Observable, BaseData> observable(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api);
  45 +
  46 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  47 + ApiBaseRequest<Observable, BaseData> observable(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api, Interceptor interceptor);
  48 +
  49 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  50 + ApiBaseRequest<Observable, BaseData> observable(Class<Service> clazz, boolean decode, ApiBuild.Api<Service, Observable, BaseData> api, Interceptor interceptor);
  51 +
  52 + public <Service> Service serviceNoSign(Class<Service> clazz);
  53 +
  54 + public <Service> Service service(Class<Service> clazz);
  55 +
  56 + public <Service> Service service(Class<Service> clazz, boolean valueUrlencode, boolean responseUrldecode);
  57 +
  58 + public <Service> Service serviceDES(Class<Service> clazz);
  59 +
  60 + public <Service> Service serviceNetPP(Class<Service> clazz);
  61 +
  62 + public <Service> Service serviceNetPPPay(Class<Service> clazz);
  63 +
  64 +
  65 + public <Service> Service service(Class<Service> clazz, Interceptor... interceptor);
  66 +
  67 + public <Service> Service service(Class<Service> clazz, boolean decode, Interceptor... interceptor);
  68 +
  69 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  70 + ApiBaseRequest<Observable, BaseData> serviceNoSign(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api);
  71 +
  72 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  73 + ApiBaseRequest<Observable, BaseData> service(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api);
  74 +
  75 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  76 + ApiBaseRequest<Observable, BaseData> serviceNewVersion(Class<Service> clazz, long connectTimeout, long readTimeout, ApiBuild.Api<Service, Observable, BaseData> api);
  77 +
  78 +
  79 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  80 + ApiBaseRequest<Observable, BaseData> service(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api, boolean valueUrlencode, boolean responseUrldecode);
  81 +
  82 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  83 + ApiBaseRequest<Observable, BaseData> serviceDES(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api);
  84 +
  85 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  86 + ApiBaseRequest<Observable, BaseData> service2encode(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api);
  87 +
  88 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  89 + ApiBaseRequest<Observable, BaseData> serviceNetPP(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api);
  90 +
  91 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  92 + ApiBaseRequest<Observable, BaseData> serviceNetPPPay(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api);
  93 +
  94 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  95 + ApiBaseRequest<Observable, BaseData> service(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api, Interceptor... interceptor);
  96 +
  97 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  98 + ApiBaseRequest<Observable, BaseData> service(Class<Service> clazz, boolean decode, ApiBuild.Api<Service, Observable, BaseData> api, Interceptor... interceptor);
  99 +
  100 +
  101 + public <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  102 + ApiBaseRequest<Observable, BaseData> serviceNewVersion(Class<Service> clazz, boolean decode, ApiBuild.Api<Service, Observable, BaseData> api, long connectTimeout, long readTimeout, Interceptor... interceptor);
  103 +
  104 +
  105 + public <Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  106 + Disposable subscribe(Observable observable, Subscriber<BaseData> subscriber);
  107 +
  108 + public Disposable subscribe(Subscriber<BaseData> subscriber);
  109 +
  110 + public Disposable subscribe(Context context, DataCallback<BaseData> callback);
  111 +
  112 +
  113 + public Disposable loadData(String url, DataCallback<String> callback);
  114 +
  115 +}
cloud/user/src/main/java/com/cnlive/strike/data/network/model/BaseInfo.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/data/network/model/BaseInfo.java
  1 +package com.cnlive.strike.data.network.model;
  2 +
  3 +import com.cnlive.libs.base.model.IBaseInfo;
  4 +import com.cnlive.strike.data.network.api.ApiBaseSubscriber;
  5 +
  6 +
  7 +public class BaseInfo<T> implements IBaseInfo {
  8 + //TODO 接口错误信息 需要自定义
  9 + private String errorCode = ApiBaseSubscriber.getSuccessCode();
  10 + private String errorMessage = "";
  11 +
  12 + //TODO 接口内容数据 需要自定义
  13 + private T data;
  14 +
  15 + public void setCode(String status_code) {
  16 + this.errorCode = status_code;
  17 + }
  18 +
  19 + @Override
  20 + public String getCode() {
  21 + return errorCode;
  22 + }
  23 +
  24 + public void setMessage(String errorMessage) {
  25 + this.errorMessage = errorMessage;
  26 + }
  27 +
  28 + @Override
  29 + public String getMessage() {
  30 + return errorMessage;
  31 + }
  32 +
  33 + public void setData(T data) {
  34 + this.data = data;
  35 + }
  36 +
  37 + public T getData() {
  38 + return data;
  39 + }
  40 +}
cloud/user/src/main/java/com/cnlive/strike/data/network/model/FaceData.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/data/network/model/FaceData.java
  1 +package com.cnlive.strike.data.network.model;
  2 +
  3 +/**
  4 + * Created by Lynn on 2018/10/15.
  5 + */
  6 +
  7 +public class FaceData {
  8 + private String faceUrl;
  9 + private String bigFaceUrl;
  10 +
  11 + public String getFaceUrl() {
  12 + return faceUrl;
  13 + }
  14 +
  15 + public void setFaceUrl(String faceUrl) {
  16 + this.faceUrl = faceUrl;
  17 + }
  18 +
  19 + public String getBigFaceUrl() {
  20 + return bigFaceUrl;
  21 + }
  22 +
  23 + public void setBigFaceUrl(String bigFaceUrl) {
  24 + this.bigFaceUrl = bigFaceUrl;
  25 + }
  26 +}
cloud/user/src/main/java/com/cnlive/strike/data/network/model/StorageInfoData.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/data/network/model/StorageInfoData.java
  1 +package com.cnlive.strike.data.network.model;
  2 +
  3 +/**
  4 + * Created by cnlive201803 on 2018/5/31.
  5 + */
  6 +
  7 +public class StorageInfoData {
  8 + private int storageId;
  9 + private String storageName;
  10 + private int storageType;
  11 + private int state;
  12 + private int contentType;
  13 + private int profile;
  14 + private String domain;
  15 +
  16 +
  17 + public int getStorageId() {
  18 + return storageId;
  19 + }
  20 +
  21 + public void setStorageId(int storageId) {
  22 + this.storageId = storageId;
  23 + }
  24 +
  25 + public String getStorageName() {
  26 + return storageName;
  27 + }
  28 +
  29 + public void setStorageName(String storageName) {
  30 + this.storageName = storageName;
  31 + }
  32 +
  33 + public int getStorageType() {
  34 + return storageType;
  35 + }
  36 +
  37 + public void setStorageType(int storageType) {
  38 + this.storageType = storageType;
  39 + }
  40 +
  41 + public int getState() {
  42 + return state;
  43 + }
  44 +
  45 + public void setState(int state) {
  46 + this.state = state;
  47 + }
  48 +
  49 + public int getContentType() {
  50 + return contentType;
  51 + }
  52 +
  53 + public void setContentType(int contentType) {
  54 + this.contentType = contentType;
  55 + }
  56 +
  57 + public int getProfile() {
  58 + return profile;
  59 + }
  60 +
  61 + public void setProfile(int profile) {
  62 + this.profile = profile;
  63 + }
  64 +
  65 + public String getDomain() {
  66 + return domain;
  67 + }
  68 +
  69 + public void setDomain(String domain) {
  70 + this.domain = domain;
  71 + }
  72 +}
cloud/user/src/main/java/com/cnlive/strike/data/network/model/TimeStampInfo.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/data/network/model/TimeStampInfo.java
  1 +package com.cnlive.strike.data.network.model;
  2 +
  3 +/**
  4 + * 作者: 吴奎庆
  5 + * <p>
  6 + * 时间: 2019/8/27
  7 + * <p>
  8 + * 简介:
  9 + */
  10 +public class TimeStampInfo {
  11 + long timestamp;
  12 +
  13 + public long getTimestamp() {
  14 + return timestamp;
  15 + }
  16 +
  17 + public void setTimestamp(long timestamp) {
  18 + this.timestamp = timestamp;
  19 + }
  20 +}
cloud/user/src/main/java/com/cnlive/strike/data/network/model/TokenData.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/data/network/model/TokenData.java
  1 +package com.cnlive.strike.data.network.model;
  2 +
  3 +/**
  4 + * Created by Lynn on 2018/10/15.
  5 + */
  6 +
  7 +public class TokenData {
  8 +
  9 + private String access_token;
  10 + private int expires_in;
  11 +
  12 + public String getAccess_token() {
  13 + return access_token;
  14 + }
  15 +
  16 + public void setAccess_token(String access_token) {
  17 + this.access_token = access_token;
  18 + }
  19 +
  20 + public int getExpires_in() {
  21 + return expires_in;
  22 + }
  23 +
  24 + public void setExpires_in(int expires_in) {
  25 + this.expires_in = expires_in;
  26 + }
  27 +}
cloud/user/src/main/java/com/cnlive/strike/data/network/model/UserData.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/data/network/model/UserData.java
  1 +package com.cnlive.strike.data.network.model;
  2 +
  3 +/**
  4 + * Created by Lynn on 2018/10/15.
  5 + */
  6 +
  7 +public class UserData {
  8 + private String uid;
  9 + private String nickName;
  10 + private String gender;
  11 + private String location;
  12 + private String faceUrl;
  13 + private String mobile;
  14 + private String email;
  15 + private String extInfo;
  16 + private String qqUid;
  17 + private String wxUid;
  18 + private String sinaUid;
  19 + private String renrenUid;
  20 + private String hUid;
  21 + private String platformId;
  22 + private String token;
  23 + private String callbackAcitvityStatushttpPostUrl;
  24 + private boolean isNewUser;
  25 + private String bigFaceUrl;
  26 + private String countryCode = "86";//手机号国家码
  27 +
  28 + public String getUid() {
  29 + return uid;
  30 + }
  31 +
  32 + public void setUid(String uid) {
  33 + this.uid = uid;
  34 + }
  35 +
  36 + public String getNickName() {
  37 + return nickName;
  38 + }
  39 +
  40 + public void setNickName(String nickName) {
  41 + this.nickName = nickName;
  42 + }
  43 +
  44 + public String getLocation() {
  45 + return location;
  46 + }
  47 +
  48 + public void setLocation(String location) {
  49 + this.location = location;
  50 + }
  51 +
  52 + public String getGender() {
  53 + return gender;
  54 + }
  55 +
  56 + public void setGender(String gender) {
  57 + this.gender = gender;
  58 + }
  59 +
  60 + public String getFaceUrl() {
  61 + return faceUrl;
  62 + }
  63 +
  64 + public void setFaceUrl(String faceUrl) {
  65 + this.faceUrl = faceUrl;
  66 + }
  67 +
  68 + public String getToken() {
  69 + return token;
  70 + }
  71 +
  72 + public void setToken(String token) {
  73 + this.token = token;
  74 + }
  75 +
  76 + public String getExtInfo() {
  77 + return extInfo;
  78 + }
  79 +
  80 + public void setExtInfo(String extInfo) {
  81 + this.extInfo = extInfo;
  82 + }
  83 +
  84 + public String getMobile() {
  85 + return mobile;
  86 + }
  87 +
  88 + public void setMobile(String mobile) {
  89 + this.mobile = mobile;
  90 + }
  91 +
  92 + public String getEmail() {
  93 + return email;
  94 + }
  95 +
  96 + public void setEmail(String email) {
  97 + this.email = email;
  98 + }
  99 +
  100 + public String getQqUid() {
  101 + return qqUid;
  102 + }
  103 +
  104 + public void setQqUid(String qqUid) {
  105 + this.qqUid = qqUid;
  106 + }
  107 +
  108 + public String getWxUid() {
  109 + return wxUid;
  110 + }
  111 +
  112 + public void setWxUid(String wxUid) {
  113 + this.wxUid = wxUid;
  114 + }
  115 +
  116 + public String getSinaUid() {
  117 + return sinaUid;
  118 + }
  119 +
  120 + public void setSinaUid(String sinaUid) {
  121 + this.sinaUid = sinaUid;
  122 + }
  123 +
  124 + public String getRenrenUid() {
  125 + return renrenUid;
  126 + }
  127 +
  128 + public void setRenrenUid(String renrenUid) {
  129 + this.renrenUid = renrenUid;
  130 + }
  131 +
  132 + public String gethUid() {
  133 + return hUid;
  134 + }
  135 +
  136 + public void sethUid(String hUid) {
  137 + this.hUid = hUid;
  138 + }
  139 +
  140 + public String getPlatformId() {
  141 + return platformId;
  142 + }
  143 +
  144 + public void setPlatformId(String platformId) {
  145 + this.platformId = platformId;
  146 + }
  147 +
  148 + public boolean isNewUser() {
  149 + return isNewUser;
  150 + }
  151 +
  152 + public void setNewUser(boolean newUser) {
  153 + isNewUser = newUser;
  154 + }
  155 +
  156 + public String getBigFaceUrl() {
  157 + return bigFaceUrl;
  158 + }
  159 +
  160 + public void setBigFaceUrl(String bigFaceUrl) {
  161 + this.bigFaceUrl = bigFaceUrl;
  162 + }
  163 +
  164 + public String getCountryCode() {
  165 + return countryCode;
  166 + }
  167 +
  168 + public void setCountryCode(String countryCode) {
  169 + this.countryCode = countryCode;
  170 + }
  171 +
  172 + public String getCallbackAcitvityStatushttpPostUrl() {
  173 + return callbackAcitvityStatushttpPostUrl;
  174 + }
  175 +
  176 + public void setCallbackAcitvityStatushttpPostUrl(String callbackAcitvityStatushttpPostUrl) {
  177 + this.callbackAcitvityStatushttpPostUrl = callbackAcitvityStatushttpPostUrl;
  178 + }
  179 +
  180 + @Override
  181 + public String toString() {
  182 + return "UserData{" +
  183 + "uid='" + uid + '\'' +
  184 + ", nickName='" + nickName + '\'' +
  185 + ", gender='" + gender + '\'' +
  186 + ", location='" + location + '\'' +
  187 + ", faceUrl='" + faceUrl + '\'' +
  188 + ", mobile='" + mobile + '\'' +
  189 + ", email='" + email + '\'' +
  190 + ", extInfo='" + extInfo + '\'' +
  191 + ", qqUid='" + qqUid + '\'' +
  192 + ", wxUid='" + wxUid + '\'' +
  193 + ", sinaUid='" + sinaUid + '\'' +
  194 + ", renrenUid='" + renrenUid + '\'' +
  195 + ", hUid='" + hUid + '\'' +
  196 + ", platformId='" + platformId + '\'' +
  197 + ", token='" + token + '\'' +
  198 + ", callbackAcitvityStatushttpPostUrl='" + callbackAcitvityStatushttpPostUrl + '\'' +
  199 + ", isNewUser=" + isNewUser +
  200 + ", bigFaceUrl='" + bigFaceUrl + '\'' +
  201 + ", countryCode='" + countryCode + '\'' +
  202 + '}';
  203 + }
  204 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/base/BaseBackActivity.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/base/BaseBackActivity.java
  1 +package com.cnlive.strike.moudle.base;
  2 +
  3 +import android.content.Context;
  4 +import android.os.Bundle;
  5 +import androidx.core.app.Fragment;
  6 +import android.support.v7.app.AppCompatActivity;
  7 +import android.text.TextUtils;
  8 +import android.view.Gravity;
  9 +import android.view.LayoutInflater;
  10 +import android.view.View;
  11 +import android.widget.ImageView;
  12 +import android.widget.RelativeLayout;
  13 +import android.widget.TextView;
  14 +
  15 +import com.cnlive.core.user.R;
  16 +import com.cnlive.libs.base.util.StatusBarUtil;
  17 +import com.cnlive.libs.base.util.StatusBarUtil2;
  18 +import com.cnlive.strike.moudle.conversation.util.QMUIUtil;
  19 +import com.qmuiteam.qmui.widget.QMUITopBar;
  20 +
  21 +/**
  22 + * Created by gujun on 2017/9/7.
  23 + */
  24 +
  25 +public abstract class BaseBackActivity extends AppCompatActivity {
  26 + protected QMUITopBar toolbar;
  27 + protected Fragment mFragment;
  28 +
  29 + protected void setupToolBar(String title) {
  30 + StatusBarUtil.setStatusBarWrite(this);
  31 + StatusBarUtil2.setColor(this, getResources().getColor(R.color.color_fff), 0);
  32 + toolbar = findViewById(R.id.includeToolbar);
  33 + toolbar.setTitle(title);
  34 + toolbar.setVisibility(View.VISIBLE);
  35 + toolbar.addLeftImageButton(R.drawable.drd_fanhui, R.id.qmui_topbar_item_left_back).setOnClickListener(v -> onBackPressed());
  36 +
  37 + QMUIUtil.setTopBar(toolbar, TextUtils.TruncateAt.MARQUEE);
  38 + }
  39 +
  40 + public TextView addRightTextButtonWrapContent(int bgId) {
  41 + int dp_10 = DensityUtils.dp2px(this, 10);
  42 + TextView textView = new TextView(this);
  43 + textView.setBackgroundResource(bgId > 0 ? bgId : android.R.color.transparent);
  44 + textView.setGravity(Gravity.CENTER);
  45 + textView.setTextSize(15f);
  46 + textView.setPadding(dp_10, 0, dp_10, 0);
  47 + RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
  48 + rl.addRule(RelativeLayout.CENTER_IN_PARENT);
  49 + toolbar.addRightView(textView, R.id.rightBtn, rl);
  50 + return textView;
  51 + }
  52 +
  53 + public void setToolBarTitle(String title) {
  54 + if (toolbar == null) return;
  55 + toolbar.setTitle(title);
  56 + }
  57 +
  58 + public View addRightView(int imageResId, int viewId) {
  59 + if (toolbar == null) return null;
  60 + View view = LayoutInflater.from(this).inflate(R.layout.layout_toolbar_menu, null);
  61 + ImageView btn = view.findViewById(R.id.image);
  62 + btn.setImageResource(imageResId);
  63 + RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
  64 + rl.addRule(RelativeLayout.CENTER_IN_PARENT);
  65 + toolbar.addRightView(view, viewId, rl);
  66 + return view;
  67 + }
  68 +
  69 + public View addRightView(int imageResId, int viewId, int paddingLeft, int paddingRight) {
  70 + if (toolbar == null) return null;
  71 + View view = LayoutInflater.from(this).inflate(R.layout.layout_toolbar_menu, null);
  72 + view.setPadding(paddingLeft, 0, paddingRight, 0);
  73 + ImageView btn = view.findViewById(R.id.image);
  74 + btn.setImageResource(imageResId);
  75 + RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
  76 + rl.addRule(RelativeLayout.CENTER_IN_PARENT);
  77 + toolbar.addRightView(view, viewId, rl);
  78 + return view;
  79 + }
  80 +
  81 + public static View addRightView(Context context, QMUITopBar toolbar, int layoutId, int imageResId, int viewId) {
  82 + if (toolbar == null) return null;
  83 + View view = LayoutInflater.from(context).inflate(layoutId, null);
  84 + ImageView btn = view.findViewById(R.id.image);
  85 + btn.setImageResource(imageResId);
  86 + RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
  87 + rl.addRule(RelativeLayout.CENTER_IN_PARENT);
  88 + rl.setMargins(DensityUtil.dp2px(5), 0, DensityUtil.dp2px(15), 0);
  89 + toolbar.addRightView(view, viewId, rl);
  90 + return view;
  91 + }
  92 +
  93 + public static View addRightView(Context context, QMUITopBar toolbar, int imageResId, int viewId) {
  94 + if (toolbar == null) return null;
  95 + View view = LayoutInflater.from(context).inflate(R.layout.layout_toolbar_menu, null);
  96 + ImageView btn = view.findViewById(R.id.image);
  97 + btn.setImageResource(imageResId);
  98 + RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
  99 + rl.addRule(RelativeLayout.CENTER_IN_PARENT);
  100 + toolbar.addRightView(view, viewId, rl);
  101 + return view;
  102 + }
  103 +
  104 + @Override
  105 + protected void onSaveInstanceState(Bundle outState) {
  106 + super.onSaveInstanceState(outState);
  107 + if (mFragment != null) {
  108 + getSupportFragmentManager().putFragment(outState, "fragment", mFragment);
  109 + }
  110 + }
  111 +
  112 + protected Fragment getSaveFragment(Bundle savedInstanceState) {
  113 + if (savedInstanceState == null) return null;
  114 + return getSupportFragmentManager().getFragment(savedInstanceState, "fragment");
  115 + }
  116 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/base/adapter/DataBindingAdapter.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/base/adapter/DataBindingAdapter.java
  1 +package com.cnlive.strike.moudle.base.adapter;
  2 +
  3 +import android.content.Context;
  4 +import android.support.v7.widget.RecyclerView;
  5 +import android.view.LayoutInflater;
  6 +import android.view.View;
  7 +import android.view.ViewGroup;
  8 +
  9 +import androidx.databinding.DataBindingUtil;
  10 +import androidx.databinding.ViewDataBinding;
  11 +
  12 +import com.cnlive.libs.base.ui.adapter.BaseRecyclerAdapter;
  13 +import com.cnlive.libs.base.ui.adapter.holder.DataBindingViewHolder;
  14 +import com.cnlive.core.user.BR;
  15 +
  16 +/**
  17 + * Created by gujun on 2017/5/23.
  18 + */
  19 +
  20 +public class DataBindingAdapter<T> extends BaseRecyclerAdapter<T> {
  21 + private int layoutId;
  22 + protected int itemBRId;
  23 +
  24 + protected OnAdapterViewClickListener<T> l;
  25 + protected OnAdapterViewLoadMoreListener loadMoreListener;
  26 +
  27 + public DataBindingAdapter(Context context) {
  28 + super(context);
  29 + }
  30 +
  31 + public DataBindingAdapter(Context context, int layoutId, int itemBRId) {
  32 + super(context);
  33 + this.layoutId = layoutId;
  34 + this.itemBRId = itemBRId;
  35 + }
  36 +
  37 + public void setOnViewClickListener(OnAdapterViewClickListener listener) {
  38 + l = listener;
  39 + }
  40 +
  41 + public void setOnLoadMoreListener(OnAdapterViewLoadMoreListener listener) {
  42 + loadMoreListener = listener;
  43 + }
  44 +
  45 + @Override
  46 + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  47 + ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), layoutId, parent, false);
  48 + DataBindingViewHolder viewHolder = new DataBindingViewHolder(binding.getRoot());
  49 + viewHolder.setBinding(binding);
  50 + return viewHolder;
  51 + }
  52 +
  53 + @Override
  54 + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  55 + DataBindingViewHolder videoListViewHolder = (DataBindingViewHolder) holder;
  56 + videoListViewHolder.getBinding().setVariable(itemBRId, getItem(position));
  57 + if (l != null)
  58 + videoListViewHolder.getBinding().setVariable(BR.clickListener, l);
  59 + videoListViewHolder.getBinding().executePendingBindings();
  60 + if (loadMoreListener != null && position == getList().size() - 1) {
  61 + loadMoreListener.onLoadMore();
  62 + }
  63 + }
  64 +
  65 + public interface OnAdapterViewClickListener<T> {
  66 + void onViewClick(View v, T program);
  67 + }
  68 +
  69 + public interface OnAdapterViewLoadMoreListener {
  70 + void onLoadMore();
  71 + }
  72 +
  73 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/routers/UserRouter.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/routers/UserRouter.java
  1 +package com.cnlive.strike.moudle.baseim.routers;
  2 +
  3 +import android.content.Context;
  4 +
  5 +import com.alibaba.android.arouter.launcher.ARouter;
  6 +
  7 +public class UserRouter {
  8 +
  9 + public static void startRestartActivity(Context context) {
  10 + ARouter.getInstance().build("/cnuser/RestartActivity").navigation(context);
  11 + }
  12 +
  13 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/PinyinUtil.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/PinyinUtil.java
  1 +package com.cnlive.strike.moudle.baseim.util;
  2 +
  3 +
  4 +import net.sourceforge.pinyin4j.PinyinHelper;
  5 +import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
  6 +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
  7 +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
  8 +
  9 +/**
  10 + * 拼音工具类
  11 + *
  12 + * @author Liu Wenzhu
  13 + */
  14 +public class PinyinUtil {
  15 + private static HanyuPinyinOutputFormat outputFormat;
  16 +
  17 + static {
  18 + outputFormat = new HanyuPinyinOutputFormat(); // 设置格式
  19 + outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 没有音标
  20 + outputFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE); // 输出拼音为大写字母
  21 + }
  22 +
  23 + private PinyinUtil() {
  24 + }
  25 +
  26 + /**
  27 + * 将字符串的第一个汉字转化为拼音 <br>
  28 + * 若该字符串的第一个字为英文字母,则原样返回
  29 + *
  30 + * @param str 欲要将首字转换为拼音的字符串
  31 + * @return String 拼音/英文
  32 + */
  33 + public static String getPinyin(String str) {
  34 + // 去除中英文标点及空格
  35 + str = str.trim().replaceAll("\\p{P}", "").trim();
  36 + String[] strs = null;
  37 + try {
  38 + strs = PinyinHelper.toHanyuPinyinStringArray(str.charAt(0), outputFormat);
  39 + } catch (Exception e) {
  40 + }
  41 + if (strs != null) {
  42 + str = strs[0];
  43 + }
  44 + return str;
  45 + }
  46 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/im/IMReconnect.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/im/IMReconnect.java
  1 +package com.cnlive.strike.moudle.baseim.util.im;
  2 +
  3 +public enum IMReconnect {
  4 + CONNECTED, DISCONNECT
  5 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/im/IMReconnectObservable.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/im/IMReconnectObservable.java
  1 +package com.cnlive.strike.moudle.baseim.util.im;
  2 +
  3 +
  4 +import java.util.Observable;
  5 +
  6 +public class IMReconnectObservable extends Observable {
  7 +
  8 + private static IMReconnectObservable instance = new IMReconnectObservable();
  9 +
  10 + public static IMReconnectObservable getInstance() {
  11 + return instance;
  12 + }
  13 +
  14 + public void updateState(IMReconnect info) {
  15 + setChanged();
  16 + notifyObservers(info);
  17 + }
  18 +
  19 +}
0 \ No newline at end of file 20 \ No newline at end of file
cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/search/CharacterParser.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/search/CharacterParser.java
  1 +package com.cnlive.strike.moudle.baseim.util.search;
  2 +
  3 +public class CharacterParser {
  4 + private static int[] pyvalue = new int[]{-20319, -20317, -20304, -20295,
  5 + -20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036,
  6 + -20032, -20026, -20002, -19990, -19986, -19982, -19976, -19805,
  7 + -19784, -19775, -19774, -19763, -19756, -19751, -19746, -19741,
  8 + -19739, -19728, -19725, -19715, -19540, -19531, -19525, -19515,
  9 + -19500, -19484, -19479, -19467, -19289, -19288, -19281, -19275,
  10 + -19270, -19263, -19261, -19249, -19243, -19242, -19238, -19235,
  11 + -19227, -19224, -19218, -19212, -19038, -19023, -19018, -19006,
  12 + -19003, -18996, -18977, -18961, -18952, -18783, -18774, -18773,
  13 + -18763, -18756, -18741, -18735, -18731, -18722, -18710, -18697,
  14 + -18696, -18526, -18518, -18501, -18490, -18478, -18463, -18448,
  15 + -18447, -18446, -18239, -18237, -18231, -18220, -18211, -18201,
  16 + -18184, -18183, -18181, -18012, -17997, -17988, -17970, -17964,
  17 + -17961, -17950, -17947, -17931, -17928, -17922, -17759, -17752,
  18 + -17733, -17730, -17721, -17703, -17701, -17697, -17692, -17683,
  19 + -17676, -17496, -17487, -17482, -17468, -17454, -17433, -17427,
  20 + -17417, -17202, -17185, -16983, -16970, -16942, -16915, -16733,
  21 + -16708, -16706, -16689, -16664, -16657, -16647, -16474, -16470,
  22 + -16465, -16459, -16452, -16448, -16433, -16429, -16427, -16423,
  23 + -16419, -16412, -16407, -16403, -16401, -16393, -16220, -16216,
  24 + -16212, -16205, -16202, -16187, -16180, -16171, -16169, -16158,
  25 + -16155, -15959, -15958, -15944, -15933, -15920, -15915, -15903,
  26 + -15889, -15878, -15707, -15701, -15681, -15667, -15661, -15659,
  27 + -15652, -15640, -15631, -15625, -15454, -15448, -15436, -15435,
  28 + -15419, -15416, -15408, -15394, -15385, -15377, -15375, -15369,
  29 + -15363, -15362, -15183, -15180, -15165, -15158, -15153, -15150,
  30 + -15149, -15144, -15143, -15141, -15140, -15139, -15128, -15121,
  31 + -15119, -15117, -15110, -15109, -14941, -14937, -14933, -14930,
  32 + -14929, -14928, -14926, -14922, -14921, -14914, -14908, -14902,
  33 + -14894, -14889, -14882, -14873, -14871, -14857, -14678, -14674,
  34 + -14670, -14668, -14663, -14654, -14645, -14630, -14594, -14429,
  35 + -14407, -14399, -14384, -14379, -14368, -14355, -14353, -14345,
  36 + -14170, -14159, -14151, -14149, -14145, -14140, -14137, -14135,
  37 + -14125, -14123, -14122, -14112, -14109, -14099, -14097, -14094,
  38 + -14092, -14090, -14087, -14083, -13917, -13914, -13910, -13907,
  39 + -13906, -13905, -13896, -13894, -13878, -13870, -13859, -13847,
  40 + -13831, -13658, -13611, -13601, -13406, -13404, -13400, -13398,
  41 + -13395, -13391, -13387, -13383, -13367, -13359, -13356, -13343,
  42 + -13340, -13329, -13326, -13318, -13147, -13138, -13120, -13107,
  43 + -13096, -13095, -13091, -13076, -13068, -13063, -13060, -12888,
  44 + -12875, -12871, -12860, -12858, -12852, -12849, -12838, -12831,
  45 + -12829, -12812, -12802, -12607, -12597, -12594, -12585, -12556,
  46 + -12359, -12346, -12320, -12300, -12120, -12099, -12089, -12074,
  47 + -12067, -12058, -12039, -11867, -11861, -11847, -11831, -11798,
  48 + -11781, -11604, -11589, -11536, -11358, -11340, -11339, -11324,
  49 + -11303, -11097, -11077, -11067, -11055, -11052, -11045, -11041,
  50 + -11038, -11024, -11020, -11019, -11018, -11014, -10838, -10832,
  51 + -10815, -10800, -10790, -10780, -10764, -10587, -10544, -10533,
  52 + -10519, -10331, -10329, -10328, -10322, -10315, -10309, -10307,
  53 + -10296, -10281, -10274, -10270, -10262, -10260, -10256, -10254};
  54 + public static String[] pystr = new String[]{"a", "ai", "an", "ang", "ao",
  55 + "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi",
  56 + "bian", "biao", "bie", "bin", "bing", "bo", "bu", "ca", "cai",
  57 + "can", "cang", "cao", "ce", "ceng", "cha", "chai", "chan", "chang",
  58 + "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu",
  59 + "chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong",
  60 + "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan",
  61 + "dang", "dao", "de", "deng", "di", "dian", "diao", "die", "ding",
  62 + "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e", "en",
  63 + "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu",
  64 + "ga", "gai", "gan", "gang", "gao", "ge", "gei", "gen", "geng",
  65 + "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun",
  66 + "guo", "ha", "hai", "han", "hang", "hao", "he", "hei", "hen",
  67 + "heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang", "hui",
  68 + "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin",
  69 + "jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai",
  70 + "kan", "kang", "kao", "ke", "ken", "keng", "kong", "kou", "ku",
  71 + "kua", "kuai", "kuan", "kuang", "kui", "kun", "kuo", "la", "lai",
  72 + "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian",
  73 + "liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu",
  74 + "lv", "luan", "lue", "lun", "luo", "ma", "mai", "man", "mang",
  75 + "mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie",
  76 + "min", "ming", "miu", "mo", "mou", "mu", "na", "nai", "nan",
  77 + "nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang",
  78 + "niao", "nie", "nin", "ning", "niu", "nong", "nu", "nv", "nuan",
  79 + "nue", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei",
  80 + "pen", "peng", "pi", "pian", "piao", "pie", "pin", "ping", "po",
  81 + "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", "qing",
  82 + "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao",
  83 + "re", "ren", "reng", "ri", "rong", "rou", "ru", "ruan", "rui",
  84 + "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sen",
  85 + "seng", "sha", "shai", "shan", "shang", "shao", "she", "shen",
  86 + "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang",
  87 + "shui", "shun", "shuo", "si", "song", "sou", "su", "suan", "sui",
  88 + "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", "teng",
  89 + "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan",
  90 + "tui", "tun", "tuo", "wa", "wai", "wan", "wang", "wei", "wen",
  91 + "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie",
  92 + "xin", "xing", "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya",
  93 + "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yo", "yong",
  94 + "you", "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang",
  95 + "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang",
  96 + "zhao", "zhe", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu",
  97 + "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi",
  98 + "zong", "zou", "zu", "zuan", "zui", "zun", "zuo"};
  99 + private StringBuilder buffer;
  100 + private String resource;
  101 + private static CharacterParser characterParser = new CharacterParser();
  102 +
  103 + public static CharacterParser getInstance() {
  104 + return characterParser;
  105 + }
  106 +
  107 + public String getResource() {
  108 + return resource;
  109 + }
  110 +
  111 + public void setResource(String resource) {
  112 + this.resource = resource;
  113 + }
  114 +
  115 + /**
  116 + * 汉字转成ASCII码
  117 + *
  118 + * @param chs
  119 + * @return
  120 + */
  121 + private int getChsAscii(String chs) {
  122 + int asc = 0;
  123 + try {
  124 + byte[] bytes = chs.getBytes("gb2312");
  125 + if (bytes == null || bytes.length > 2 || bytes.length <= 0) {
  126 + throw new RuntimeException("illegal resource string");
  127 + }
  128 + if (bytes.length == 1) {
  129 + asc = bytes[0];
  130 + }
  131 + if (bytes.length == 2) {
  132 + int hightByte = 256 + bytes[0];
  133 + int lowByte = 256 + bytes[1];
  134 + asc = (256 * hightByte + lowByte) - 256 * 256;
  135 + }
  136 + } catch (Exception e) {
  137 + System.out
  138 + .println("ERROR:ChineseSpelling.class-getChsAscii(String chs)"
  139 + + e);
  140 + }
  141 + return asc;
  142 + }
  143 +
  144 + /**
  145 + * 单字解析
  146 + **/
  147 + public String convert(String str) {
  148 + String result = null;
  149 + int ascii = getChsAscii(str);
  150 + if (ascii > 0 && ascii < 160) {
  151 + result = String.valueOf((char) ascii);
  152 + } else {
  153 + for (int i = (pyvalue.length - 1); i >= 0; i--) {
  154 + if (pyvalue[i] <= ascii) {
  155 + result = pystr[i];
  156 + break;
  157 + }
  158 + }
  159 + }
  160 + return result;
  161 + }
  162 +
  163 + /**
  164 + * 词组解析
  165 + *
  166 + * @param chs
  167 + * @return
  168 + */
  169 + public String getSelling(String chs) {
  170 + String key, value;
  171 + buffer = new StringBuilder();
  172 + for (int i = 0; i < chs.length(); i++) {
  173 + key = chs.substring(i, i + 1);
  174 + if (key.getBytes().length >= 2) {
  175 + value = (String) convert(key);
  176 + if (value == null) {
  177 + value = "unknown";
  178 + }
  179 + } else {
  180 + value = key;
  181 + }
  182 + buffer.append(value);
  183 + }
  184 + return buffer.toString();
  185 + }
  186 +
  187 + public String getSpelling() {
  188 + return this.getSelling(this.getResource());
  189 + }
  190 +
  191 +}
0 \ No newline at end of file 192 \ No newline at end of file
cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/search/FirstLetterUtil.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/search/FirstLetterUtil.java
  1 +package com.cnlive.strike.moudle.baseim.util.search;
  2 +
  3 +public class FirstLetterUtil {
  4 + private static int BEGIN = 45217;
  5 + private static int END = 63486;
  6 + // 按照声母表示,这个表是在GB2312中的出现的第一个汉字,也就是说“啊”是代表首字母a的第一个汉字。
  7 + // i, u, v都不做声母, 自定规则跟随前面的字母
  8 + private static char[] chartable = {'啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈',
  9 + '哈', '击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然', '撒', '塌', '塌',
  10 + '塌', '挖', '昔', '压', '匝',};
  11 + // 二十六个字母区间对应二十七个端点
  12 + // GB2312码汉字区间十进制表示
  13 + private static int[] table = new int[27];
  14 + // 对应首字母区间表
  15 + private static char[] initialtable = {'a', 'b', 'c', 'd', 'e', 'f', 'g',
  16 + 'h', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
  17 + 't', 't', 'w', 'x', 'y', 'z',};
  18 +
  19 + // 初始化
  20 + static {
  21 + for (int i = 0; i < 26; i++) {
  22 + table[i] = gbValue(chartable[i]);// 得到GB2312码的首字母区间端点表,十进制。
  23 + }
  24 + table[26] = END;// 区间表结尾
  25 + }
  26 +
  27 + /**
  28 + * 根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串 最重要的一个方法,思路如下:一个个字符读入、判断、输出
  29 + */
  30 + public static String getFirstLetter(String sourceStr) {
  31 + String result = "";
  32 + String str = sourceStr.toLowerCase();
  33 + int StrLength = str.length();
  34 + int i;
  35 + try {
  36 + for (i = 0; i < StrLength; i++) {
  37 + result += Char2Initial(str.charAt(i));
  38 + }
  39 + } catch (Exception e) {
  40 + result = "";
  41 + }
  42 + return result;
  43 + }
  44 +
  45 + /**
  46 + * 输入字符,得到他的声母,英文字母返回对应的大写字母,其他非简体汉字返回 '0'
  47 + */
  48 + private static char Char2Initial(char ch) {
  49 + // 对英文字母的处理:小写字母转换为大写,大写的直接返回
  50 + if (ch >= 'a' && ch <= 'z') {
  51 + return ch;
  52 + }
  53 + if (ch >= 'A' && ch <= 'Z') {
  54 +
  55 + return ch;
  56 + }
  57 + // 对非英文字母的处理:转化为首字母,然后判断是否在码表范围内,
  58 + // 若不是,则直接返回。
  59 + // 若是,则在码表内的进行判断。
  60 + int gb = gbValue(ch);// 汉字转换首字母
  61 +
  62 + if ((gb < BEGIN) || (gb > END))// 在码表区间之前,直接返回
  63 + {
  64 + return ch;
  65 + }
  66 +
  67 + int i;
  68 + for (i = 0; i < 26; i++) {// 判断匹配码表区间,匹配到就break,判断区间形如“[,)”
  69 + if ((gb >= table[i]) && (gb < table[i + 1])) {
  70 + break;
  71 + }
  72 + }
  73 +
  74 + if (gb == END) {// 补上GB2312区间最右端
  75 + i = 25;
  76 + }
  77 + return initialtable[i]; // 在码表区间中,返回首字母
  78 + }
  79 +
  80 + /**
  81 + * 取出汉字的编码 cn 汉字
  82 + */
  83 + private static int gbValue(char ch) {// 将一个汉字(GB2312)转换为十进制表示。
  84 + String str = new String();
  85 + str += ch;
  86 + try {
  87 + byte[] bytes = str.getBytes("GB2312");
  88 + if (bytes.length < 2) {
  89 + return 0;
  90 + }
  91 + return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
  92 + } catch (Exception e) {
  93 + return 0;
  94 + }
  95 + }
  96 +
  97 +
  98 +}
0 \ No newline at end of file 99 \ No newline at end of file
cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/search/SearchData.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/search/SearchData.java
  1 +package com.cnlive.strike.moudle.baseim.util.search;
  2 +
  3 +import java.io.Serializable;
  4 +
  5 +/**
  6 + * author gujun
  7 + * date: 2019/4/2
  8 + * desc:
  9 + */
  10 +public class SearchData implements Serializable {
  11 +
  12 + private String searchContent;
  13 + private int spannableNickStartIndex;
  14 + private int spannableNickEndIndex;
  15 +
  16 + public String getSearchContent() {
  17 + return searchContent;
  18 + }
  19 +
  20 + public void setSearchContent(String searchContent) {
  21 + this.searchContent = searchContent;
  22 + }
  23 +
  24 + public int getSpannableNickStartIndex() {
  25 + return spannableNickStartIndex;
  26 + }
  27 +
  28 + public void setSpannableNickStartIndex(int spannableNickStartIndex) {
  29 + this.spannableNickStartIndex = spannableNickStartIndex;
  30 + }
  31 +
  32 + public int getSpannableNickEndIndex() {
  33 + return spannableNickEndIndex;
  34 + }
  35 +
  36 + public void setSpannableNickEndIndex(int spannableNickEndIndex) {
  37 + this.spannableNickEndIndex = spannableNickEndIndex;
  38 + }
  39 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/search/SearchUtil.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/baseim/util/search/SearchUtil.java
  1 +package com.cnlive.strike.moudle.baseim.util.search;
  2 +
  3 +import android.text.TextUtils;
  4 +
  5 +import java.util.ArrayList;
  6 +import java.util.List;
  7 +import java.util.regex.Matcher;
  8 +import java.util.regex.Pattern;
  9 +
  10 +/**
  11 + * Created by gujun on 2018/1/9.
  12 + */
  13 +
  14 +public class SearchUtil {
  15 +
  16 + /**
  17 + * 获取联系人模糊查询列表
  18 + *
  19 + * @param filter 过滤条件
  20 + * @param list 原始列表
  21 + * @return
  22 + */
  23 + public static <T extends SearchData> List<T> getFilterContactList(CharSequence filter, List<T> list) {
  24 + if (list == null || list.size() <= 0) return null;
  25 + List<T> filterList = new ArrayList<>();
  26 +
  27 + for (T contactInfo : list) {
  28 + if (!TextUtils.isEmpty(filter)) {
  29 + if (contains(contactInfo, filter.toString())) {
  30 + filterList.add(contactInfo);
  31 + }
  32 + } else {
  33 + contactInfo.setSpannableNickEndIndex(0);
  34 + contactInfo.setSpannableNickStartIndex(0);
  35 + filterList.add(contactInfo);
  36 + }
  37 + }
  38 + return filterList;
  39 + }
  40 +
  41 + /**
  42 + * 判断某个联系人昵称是否包含查询字段
  43 + *
  44 + * @param searchData
  45 + * @param filter
  46 + * @return
  47 + */
  48 + private static boolean contains(SearchData searchData, String filter) {
  49 + String name = searchData.getSearchContent();
  50 + if (TextUtils.isEmpty(name)
  51 + && TextUtils.isEmpty(name)) {
  52 + return false;
  53 + }
  54 +
  55 + int startIndex = 0;
  56 + int endIndex = 0;
  57 + boolean flag = false;
  58 +
  59 + if (!isAllEnglish(filter)) {
  60 + // 只要不全是英文就字符串对比
  61 + if (name.contains(filter)) {
  62 + flag = true;
  63 + startIndex = name.indexOf(filter);
  64 + endIndex = startIndex + filter.length();
  65 + }
  66 + } else {
  67 + String key = "";
  68 + String searchPinYin = "";
  69 + if (!flag) {
  70 + CharacterParser finder = CharacterParser.getInstance();
  71 + // 先将输入的字符串转换为拼音
  72 + finder.setResource(filter);
  73 + searchPinYin = finder.getSpelling();
  74 + //处理通配符
  75 + key = processingWildcards(searchPinYin);
  76 +
  77 + // 简拼匹配,如果输入在字符串长度大于6就不按首字母匹配了
  78 + if (key.length() < 6) {
  79 + String firstLetters = FirstLetterUtil
  80 + .getFirstLetter(name);
  81 + // 不区分大小写
  82 + Pattern firstLetterPattern = Pattern.compile(key,
  83 + Pattern.CASE_INSENSITIVE);
  84 + Matcher firstLetterMatcher = firstLetterPattern.matcher(firstLetters);
  85 + flag = firstLetterMatcher.find();
  86 + if (flag) {
  87 + startIndex = firstLetterMatcher.start();
  88 + endIndex = firstLetterMatcher.end();
  89 + }
  90 + }
  91 + }
  92 +
  93 + if (!flag && key.length() > 1) {
  94 + //key.length() > 1代表:仅有一个字母时必须匹配首字母,不能使用全拼
  95 + // 全拼匹配
  96 + CharacterParser finder = CharacterParser.getInstance();
  97 + finder.setResource(name);
  98 + // 不区分大小写
  99 + Pattern pattern = Pattern
  100 + .compile(key, Pattern.CASE_INSENSITIVE);
  101 + Matcher matcher = pattern.matcher(finder.getSpelling());
  102 + flag = matcher.find();
  103 + if (flag) {
  104 + int matcherStart = matcher.start();
  105 + int matcherEnd = matcher.end();
  106 + if (matcherStart < matcherEnd) {
  107 + int scanPinYinCount = 0;
  108 + char nickNameChar[] = name.toCharArray();
  109 + for (int i = 0; i < nickNameChar.length; i++) {
  110 + CharacterParser finderNick = CharacterParser.getInstance();
  111 + finderNick.setResource(String.valueOf(nickNameChar[i]));
  112 + String nickNamePinYin = finderNick.getSpelling();
  113 + if (matcherStart >= scanPinYinCount && matcherStart < scanPinYinCount + nickNamePinYin.length()) {
  114 + startIndex = i;
  115 + }
  116 + if (matcherEnd > scanPinYinCount && matcherEnd <= scanPinYinCount + nickNamePinYin.length()) {
  117 + endIndex = i + 1;
  118 + }
  119 + scanPinYinCount += nickNamePinYin.length();
  120 + }
  121 + }
  122 + }
  123 + }
  124 + }
  125 +
  126 + if (flag) {
  127 + searchData.setSpannableNickStartIndex(startIndex);
  128 + searchData.setSpannableNickEndIndex(endIndex);
  129 + }
  130 +
  131 + return flag;
  132 + }
  133 +
  134 + /**
  135 + * 处理转义字符包括 * . ? + $ ^ [ ] ( ) { } | \
  136 + *
  137 + * @param searchPinYin
  138 + * @return
  139 + */
  140 + private static String processingWildcards(String searchPinYin) {
  141 + String key = "";
  142 + // 处理通配符问题
  143 + if (searchPinYin.contains("*") ||
  144 + searchPinYin.contains(".") ||
  145 + searchPinYin.contains("?") ||
  146 + searchPinYin.contains("+") ||
  147 + searchPinYin.contains("$") ||
  148 + searchPinYin.contains("^") ||
  149 + searchPinYin.contains("[") ||
  150 + searchPinYin.contains("]") ||
  151 + searchPinYin.contains("(") ||
  152 + searchPinYin.contains(")") ||
  153 + searchPinYin.contains("{") ||
  154 + searchPinYin.contains("}") ||
  155 + searchPinYin.contains("|") ||
  156 + searchPinYin.contains("\\")) {
  157 + char[] chars = searchPinYin.toCharArray();
  158 + for (int k = 0; k < chars.length; k++) {
  159 + if (chars[k] == '*') {
  160 + key = key + "\\*";
  161 + } else if (chars[k] == '(') {
  162 + key = key + "\\(";
  163 + } else if (chars[k] == ')') {
  164 + key = key + "\\)";
  165 + } else if (chars[k] == '?') {
  166 + key = key + "\\?";
  167 + } else if (chars[k] == '.') {
  168 + key = key + "\\.";
  169 + } else if (chars[k] == '+') {
  170 + key = key + "\\+";
  171 + } else if (chars[k] == '$') {
  172 + key = key + "\\$";
  173 + } else if (chars[k] == '^') {
  174 + key = key + "\\^";
  175 + } else if (chars[k] == '[') {
  176 + key = key + "\\[";
  177 + } else if (chars[k] == ']') {
  178 + key = key + "\\]";
  179 + } else if (chars[k] == '{') {
  180 + key = key + "\\{";
  181 + } else if (chars[k] == '}') {
  182 + key = key + "\\}";
  183 + } else if (chars[k] == '|') {
  184 + key = key + "\\|";
  185 + } else if (chars[k] == '\\') {
  186 + key = key + "\\\\";
  187 + } else {
  188 + key = key + String.valueOf(chars[k]);
  189 + }
  190 + }
  191 + } else {
  192 + key = searchPinYin;
  193 + }
  194 + return key;
  195 + }
  196 +
  197 + /**
  198 + * 是否全是英文
  199 + *
  200 + * @param str
  201 + * @return
  202 + */
  203 + public static boolean isAllEnglish(String str) {
  204 + Pattern p = Pattern.compile("[a-zA-Z]");
  205 + Matcher m = p.matcher(str);
  206 + if (m.find()) {
  207 + return true;
  208 + }
  209 + return false;
  210 + }
  211 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/conversation/util/QMUIUtil.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/conversation/util/QMUIUtil.java
  1 +package com.cnlive.strike.moudle.conversation.util;
  2 +
  3 +import android.content.Context;
  4 +import android.text.TextUtils;
  5 +import android.view.Gravity;
  6 +import android.view.View;
  7 +import android.widget.LinearLayout;
  8 +import android.widget.TextView;
  9 +
  10 +import com.qmuiteam.qmui.widget.QMUITopBar;
  11 +
  12 +import java.lang.reflect.Field;
  13 +
  14 +public class QMUIUtil {
  15 + /**
  16 + * 文本自动滚动功能回填视图(需要一直获取选中状态)
  17 + */
  18 + public static class MarqueeTextView extends android.support.v7.widget.AppCompatTextView {
  19 + public MarqueeTextView(Context context) {
  20 + super(context);
  21 + }
  22 +
  23 + @Override
  24 + public boolean isSelected() {
  25 + return true;
  26 + }
  27 + }
  28 +
  29 + /**
  30 + * 设置QMUI头部视图方法,内部可以随意定制功能
  31 + */
  32 + public static void setTopBar(QMUITopBar toolbar, TextUtils.TruncateAt ta) {
  33 + if (toolbar == null || ta == null) return;
  34 + for (int i = 0; i < toolbar.getChildCount(); i++) {
  35 + View view = toolbar.getChildAt(i);
  36 + if (view.getId() != -1) continue;
  37 + if (!(view instanceof LinearLayout)) continue;
  38 + for (int j = 0; j < ((LinearLayout) view).getChildCount(); j++) {
  39 + View child = ((LinearLayout) view).getChildAt(j);
  40 + if (child.getId() != -1) continue;
  41 + if (!(child instanceof TextView)) continue;
  42 + if (((TextView) child).getEllipsize() != TextUtils.TruncateAt.MIDDLE) continue;
  43 +
  44 + //将原有视图配置信息取出
  45 + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) child.getLayoutParams();
  46 + float textSize = px2sp(toolbar.getContext(), ((TextView) child).getTextSize());
  47 + String textValue = ((TextView) child).getText().toString();
  48 + //移除原有视图
  49 + ((LinearLayout) view).removeView(child);
  50 + //创建新的视图
  51 + MarqueeTextView newView = new MarqueeTextView(toolbar.getContext());
  52 + newView.setGravity(Gravity.CENTER_VERTICAL);
  53 + newView.setHorizontallyScrolling(true);
  54 + newView.setMarqueeRepeatLimit(-1);
  55 + newView.setFocusable(true);
  56 + newView.setFocusableInTouchMode(true);
  57 + newView.setEllipsize(ta);
  58 + newView.setSingleLine();
  59 + newView.invalidate();
  60 + newView.setTextSize(textSize);
  61 + newView.setText(textValue);
  62 + //填充新视图
  63 + if (layoutParams != null) ((LinearLayout) view).addView(newView, layoutParams);
  64 + else ((LinearLayout) view).addView(newView);
  65 + //原视图缓存对象替换
  66 + try {
  67 + Field darkFlag = QMUITopBar.class.getDeclaredField("mTitleView");
  68 + darkFlag.setAccessible(true);
  69 + darkFlag.set(toolbar, newView);
  70 + } catch (Exception ignored) {
  71 + }
  72 + }
  73 + }
  74 + }
  75 +
  76 + public static int px2sp(Context context, float pxValue) {
  77 + final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
  78 + return (int) (pxValue / fontScale + 0.5f);
  79 + }
  80 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/launch/frame/presenter/BindPhoneNumberPresenter.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/launch/frame/presenter/BindPhoneNumberPresenter.java
  1 +package com.cnlive.strike.moudle.launch.frame.presenter;
  2 +
  3 +import android.content.Context;
  4 +import android.text.TextUtils;
  5 +
  6 +import com.cnlive.strike.data.network.model.BaseInfo;
  7 +import com.cnlive.libs.base.application.AppConfig;
  8 +import com.cnlive.libs.base.logic.Event;
  9 +import com.cnlive.libs.base.logic.Logic;
  10 +import com.cnlive.libs.base.util.TimerUtil;
  11 +import com.cnlive.strike.moudle.qr.uitl.RegexUtils;
  12 +import com.cnlive.strike.moudle.user.frame.data.OtherUserInfo;
  13 +import com.cnlive.strike.moudle.user.frame.view.BindPhoneNumberView;
  14 +import com.cnlive.strike.moudle.user.ui.activity.BindPhoneNumberActivity;
  15 +import com.cnlive.strike.moudle_user.R;
  16 +import com.cnlive.strike.router.user.UserAction;
  17 +import com.cnlive.strike.user.UserUtilAction;
  18 +import com.cnlive.strike.user.auth.UserService;
  19 +import com.cnlive.strike.user.model.CNLiveUserInfo;
  20 +import com.cnlive.strike.util.TimeEvent;
  21 +import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
  22 +
  23 +import java.util.HashMap;
  24 +
  25 +
  26 +/**
  27 + * 作者: 吴奎庆
  28 + * <p>
  29 + * 时间: 2019/9/9
  30 + * <p>
  31 + * 简介:
  32 + */
  33 +public class BindPhoneNumberPresenter extends MvpBasePresenter<BindPhoneNumberView> {
  34 +
  35 + private Event sendMsgBefQuickLogin;
  36 + private TimerUtil timerUtil;
  37 + private long currentTime = 0;
  38 +
  39 + private void startTimer() {
  40 + if (timerUtil != null) timerUtil.cancel();
  41 +
  42 + timerUtil = new TimerUtil();
  43 + timerUtil.setTotalTime(60_000);//设置毫秒数
  44 + timerUtil.setIntervalTime(500);//设置间隔数
  45 + timerUtil.start();
  46 + timerUtil.setTimerLiener(new TimerUtil.TimeListener() {
  47 + @Override
  48 + public void onFinish() {
  49 + currentTime = 0;
  50 + if (getView() != null) getView().onTimerFinish();
  51 + }
  52 +
  53 + @Override
  54 + public void onInterval(long remainTime) {
  55 + currentTime = remainTime;
  56 + if (getView() != null) getView().onTimerInterval(remainTime / 1000);
  57 + }
  58 + });
  59 + }
  60 +
  61 + public void sendCode(Context context, String phone, String countryCode) {
  62 + if (getView() == null) return;
  63 + if (TimeEvent.debounce(2_000)) return;
  64 + if (TextUtils.isEmpty(phone)) {
  65 + getView().showMessage(context.getString(R.string.user_toast_quick_login_empty_phone));
  66 + return;
  67 + }
  68 + if ("86".equals(countryCode) && !RegexUtils.isMobileSimple(phone)) {
  69 + getView().showMessage(context.getString(R.string.user_toast_quick_login_error_phone));
  70 + return;
  71 + }
  72 + if (currentTime!=0){
  73 + getView().showMessage("处理中请稍后...");
  74 + return;
  75 + }
  76 + if (sendMsgBefQuickLogin != null && sendMsgBefQuickLogin.active) {
  77 + getView().showMessage("处理中请稍后...");
  78 + } else {
  79 + sendMsgBefQuickLogin = Logic.create()
  80 + .action(UserUtilAction.sendMsgBefQuickLoginAction(context, phone, countryCode))
  81 + .<BaseInfo>event()
  82 + .setFailureCallback((state, message) -> {
  83 + if (getView() != null) getView().showMessage(message);
  84 + })
  85 + .setSuccessCallback(data -> {
  86 + startTimer();
  87 + if (getView() != null) getView().showMessage("验证码已发送");
  88 + }).start();
  89 + }
  90 + }
  91 +
  92 + public void cancle() {
  93 + if (timerUtil != null) {
  94 + timerUtil.cancel();
  95 + }
  96 + if (sendMsgBefQuickLogin != null) sendMsgBefQuickLogin.cencel();
  97 + }
  98 +
  99 + public void bindOther(BindPhoneNumberActivity activity, OtherUserInfo otherUserInfo, String phone, String ems) {
  100 + HashMap<String, String> requestMap = new HashMap<>();
  101 + requestMap.put("appId", AppConfig.getAppId());
  102 + requestMap.put("mobile", phone);
  103 + requestMap.put("countryCode", activity.countryCode);
  104 + requestMap.put("frmId", AppConfig.getAppChannel());
  105 + requestMap.put("verificationCode", ems);
  106 +
  107 + requestMap.put("thirdPartyPlat", otherUserInfo.getLoginType());
  108 + requestMap.put("thirdPartyId", otherUserInfo.getThirdPartyId());
  109 + requestMap.put("uuid", AppConfig.getAppUUID());
  110 + requestMap.put("clientPlat", "a");
  111 + requestMap.put("nickName", otherUserInfo.getNickName());
  112 + requestMap.put("gender", otherUserInfo.getGender());
  113 + requestMap.put("location", otherUserInfo.getLocation());
  114 + requestMap.put("faceUrl", otherUserInfo.getFaceUrl());
  115 +
  116 + UserAction.otherLoginBindMobile(activity, phone, activity.countryCode, ems,
  117 + otherUserInfo.getLoginType(), otherUserInfo.getThirdPartyId(),
  118 + otherUserInfo.getNickName(), otherUserInfo.getGender(), otherUserInfo.getLocation(),
  119 + otherUserInfo.getFaceUrl(), initLoginEvent(activity, false, otherUserInfo)
  120 + );
  121 +
  122 + }
  123 +
  124 + public Event<CNLiveUserInfo> initLoginEvent(BindPhoneNumberActivity context, Boolean retry, OtherUserInfo otherUserInfo) {
  125 + return new Event<CNLiveUserInfo>()
  126 + .setFailureCallback((state, message) -> {
  127 + if (context == null) return;
  128 + if (getView() == null) return;
  129 + switch (state) {
  130 + case 41010: //手机号无效
  131 + getView().showMessage(message);
  132 + break;
  133 + case 41002: //验证码为6位数字
  134 + getView().showMessage(message);
  135 + break;
  136 + case 41009: //验证码错误
  137 + getView().showMessage(message);
  138 + break;
  139 + case 41006: //手机号已存在
  140 + getView().showMessage(message);
  141 + break;
  142 + case 6208: //当前用户在其他地点登陆
  143 + if (retry) {
  144 + UserAction.otherLoginBindMobile(context, context.phoneNum, context.countryCode, context.phoneEms,
  145 + otherUserInfo.getLoginType(), otherUserInfo.getThirdPartyId(),
  146 + otherUserInfo.getNickName(), otherUserInfo.getGender(), otherUserInfo.getLocation(),
  147 + otherUserInfo.getFaceUrl(), initLoginEvent(context, false, otherUserInfo)
  148 + );
  149 + return;
  150 + } else getView().showMessage("用户登录失败,再试一次吧.");
  151 + break;
  152 + default: //其他错误
  153 + getView().showMessage(message);
  154 + break;
  155 + }
  156 + }).setSuccessCallback((info) -> {
  157 + if (context == null) return;
  158 + if (getView() == null) return;
  159 + CNLiveUserInfo user = UserService.getInstance(context).getAppAccount();
  160 + if (user == null || (user != null && TextUtils.isEmpty(user.getToken()))) {
  161 + getView().showMessage("用户登陆失败,再试一次吧.");
  162 + } else if (user.isNewUser()) {
  163 + //TODO 必须设置用户头像
  164 + //OpenInstall用户注册统计
  165 +// OpenInstall.reportRegister();
  166 + //友盟账号登录统计,暂时只有平台登录,后续对接三方登录
  167 +// MobclickAgent.onProfileSignIn("CNLive", user.getUid());
  168 + if (otherUserInfo != null) {
  169 + getView().showMainView();
  170 + } else {
  171 + getView().showEditView();
  172 + }
  173 + } else {
  174 + //友盟账号登录统计,暂时只有平台登录,后续对接三方登录
  175 +// MobclickAgent.onProfileSignIn("CNLive", user.getUid());
  176 + getView().showMainView();
  177 + }
  178 + AppConfig.setCountryCode("");
  179 + AppConfig.setVerificationCode("");
  180 + AppConfig.setUserPhone("");
  181 + });
  182 + }
  183 +
  184 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/launch/model/LaunchPage.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/launch/model/LaunchPage.java
  1 +package com.cnlive.strike.moudle.launch.model;
  2 +
  3 +import androidx.databinding.BaseObservable;
  4 +import androidx.databinding.Bindable;
  5 +import android.view.View;
  6 +
  7 +import com.cnlive.strike.moudle_user.BR;
  8 +
  9 +
  10 +public class LaunchPage extends BaseObservable {
  11 +
  12 + private int loading = View.GONE;
  13 +
  14 + @Bindable
  15 + public int getLoading() {
  16 + return loading;
  17 + }
  18 +
  19 + public void setLoading(int loading) {
  20 + this.loading = loading;
  21 + notifyPropertyChanged(com.cnlive.strike.moudle_user.BR.loading);
  22 + }
  23 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/mian/ui/widget/TokenErrorDialog.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/mian/ui/widget/TokenErrorDialog.java
  1 +package com.cnlive.strike.moudle.mian.ui.widget;
  2 +
  3 +import android.app.Dialog;
  4 +import android.content.Context;
  5 +
  6 +import com.cnlive.media.picker.utils.AlertDialogUtils;
  7 +import com.cnlive.strike.moudle.user.ui.activity.LoginActivity;
  8 +import com.cnlive.strike.moudle_user.R;
  9 +
  10 +/**
  11 + * Created by Lynn on 2019/1/19.
  12 + */
  13 +
  14 +public class TokenErrorDialog {
  15 + public static Dialog showTokenErrorDialog(Context context) {
  16 + return AlertDialogUtils.showTwoButtonDialog(context,
  17 + "取消",
  18 + "重新登录",
  19 + "修改个人信息",
  20 + R.color.color_dialog_btn,
  21 + R.color.color_ffa300,
  22 + new AlertDialogUtils.DialogTwoListener() {
  23 + @Override
  24 + public void onClickLeft(Dialog dialog) {
  25 + dialog.dismiss();
  26 + }
  27 +
  28 + @Override
  29 + public void onClickRight(Dialog dialog) {
  30 + dialog.dismiss();
  31 + LoginActivity.start(context, true);
  32 + }
  33 + }
  34 + );
  35 + }
  36 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/preview/ui/widget/DownLoadImageService.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/preview/ui/widget/DownLoadImageService.java
  1 +package com.cnlive.strike.moudle.preview.ui.widget;
  2 +
  3 +import android.content.Context;
  4 +import android.content.Intent;
  5 +import android.net.Uri;
  6 +import android.os.Environment;
  7 +import android.text.TextUtils;
  8 +import android.util.Log;
  9 +
  10 +import com.bumptech.glide.Glide;
  11 +import com.bumptech.glide.request.target.Target;
  12 +import com.cnlive.media.picker.utils.FileTypeUtil;
  13 +import com.cnlive.libs.base.util.MD5Util;
  14 +
  15 +import java.io.File;
  16 +import java.io.FileInputStream;
  17 +import java.io.FileOutputStream;
  18 +import java.io.InputStream;
  19 +
  20 +/**
  21 + * 创建:wukuiqing
  22 + * <p>
  23 + * 时间:2018/3/17
  24 + * <p>
  25 + * 描述:图片下载的工具类
  26 + */
  27 +
  28 +public class DownLoadImageService implements Runnable {
  29 + private String url;
  30 + private Context context;
  31 + private ImageDownLoadCallBack callBack;
  32 + private File file;
  33 +
  34 + public DownLoadImageService(Context context, String url, ImageDownLoadCallBack callBack) {
  35 + this.url = url;
  36 + this.callBack = callBack;
  37 + this.context = context;
  38 + }
  39 +
  40 + @Override
  41 + public void run() {
  42 + try {
  43 + if (!TextUtils.isEmpty(url)) file = Glide.with(context).asFile()
  44 + .load(url)
  45 + .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
  46 + .get();
  47 + if (file != null) saveImageToGallery(context, file);
  48 + } catch (Exception e) {
  49 + Log.e("DownLoadFile", "", e);
  50 + } finally {
  51 + if (file != null && file.exists()) callBack.onDownLoadSuccess(file.getAbsolutePath());
  52 + else callBack.onDownLoadFailed();
  53 + }
  54 + }
  55 +
  56 + public void saveImageToGallery(Context context, File file) {
  57 + try {
  58 + String md5 = MD5Util.getMD5(file);
  59 + InputStream inStream = new FileInputStream(file); //读入原文件
  60 + File appDir = new File(Environment.getExternalStorageDirectory(), "strike");
  61 + if (!appDir.exists()) appDir.mkdir();
  62 +
  63 + String type = FileTypeUtil.getFileType(file.getAbsolutePath());
  64 + String extension;//初始文件扩展名
  65 + if (TextUtils.isEmpty(type)) {
  66 + extension = ".jpg";
  67 + } else {
  68 + extension = "." + type;
  69 + }
  70 +
  71 + File newFile = new File(appDir, md5 + extension);
  72 + FileOutputStream outputStream = new FileOutputStream(newFile);
  73 +
  74 + int byteread = 0;
  75 + byte[] buffer2 = new byte[1444];
  76 + while ((byteread = inStream.read(buffer2)) != -1)
  77 + outputStream.write(buffer2, 0, byteread);
  78 + inStream.close();
  79 + outputStream.close();
  80 +
  81 + context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + newFile.getAbsolutePath())));
  82 + //TODO 文件缓存已经完成 待优化~!!
  83 + } catch (Exception e) {
  84 + Log.e("ImageDownloadService", "Exception ", e);
  85 + }
  86 + }
  87 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/preview/ui/widget/ImageDownLoadCallBack.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/preview/ui/widget/ImageDownLoadCallBack.java
  1 +package com.cnlive.strike.moudle.preview.ui.widget;
  2 +
  3 +import java.io.File;
  4 +import java.io.IOException;
  5 +
  6 +/**
  7 + * 创建:wukuiqing
  8 + * <p>
  9 + * 时间:2018/3/17
  10 + * <p>
  11 + * 描述:
  12 + */
  13 +
  14 +public interface ImageDownLoadCallBack {
  15 +
  16 + void onDownLoadSuccess(File file) throws IOException;
  17 + void onDownLoadSuccess(String path);
  18 +
  19 + void onDownLoadFailed();
  20 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/qr/uitl/RegexConstants.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/qr/uitl/RegexConstants.java
  1 +package com.cnlive.strike.moudle.qr.uitl;
  2 +
  3 +public final class RegexConstants {
  4 +
  5 + /**
  6 + * 正则:手机号(简单)
  7 + */
  8 + public static final String REGEX_MOBILE_SIMPLE = "^[1]\\d{10}$";
  9 + /**
  10 + * 正则:手机号(精确)
  11 + * <p>移动:134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188</p>
  12 + * <p>联通:130、131、132、145、155、156、171、175、176、185、186</p>
  13 + * <p>电信:133、153、173、177、180、181、189</p>
  14 + * <p>全球星:1349</p>
  15 + * <p>虚拟运营商:170</p>
  16 + */
  17 + public static final String REGEX_MOBILE_EXACT = "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(16[6,9])|(17[0,1,3,5-8])|(18[0-9])|(147))\\d{8}$";
  18 + /**
  19 + * 正则:电话号码
  20 + */
  21 + public static final String REGEX_TEL = "^0\\d{2,3}[- ]?\\d{7,8}";
  22 + /**
  23 + * 正则:身份证号码15位
  24 + */
  25 + public static final String REGEX_ID_CARD15 = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$";
  26 + /**
  27 + * 正则:身份证号码18位
  28 + */
  29 + public static final String REGEX_ID_CARD18 = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9Xx])$";
  30 + /**
  31 + * 正则:邮箱
  32 + */
  33 + public static final String REGEX_EMAIL = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
  34 + /**
  35 + * 正则:URL
  36 + */
  37 + public static final String REGEX_URL = "[a-zA-z]+://[^\\s]*";
  38 + /**
  39 + * 正则:汉字
  40 + */
  41 + public static final String REGEX_ZH = "^[\\u4e00-\\u9fa5]+$";
  42 + /**
  43 + * 正则:用户名,取值范围为a-z,A-Z,0-9,"_",汉字,不能以"_"结尾,用户名必须是6-20位
  44 + */
  45 + public static final String REGEX_USERNAME = "^[\\w\\u4e00-\\u9fa5]{6,20}(?<!_)$";
  46 + /**
  47 + * 正则:yyyy-MM-dd格式的日期校验,已考虑平闰年
  48 + */
  49 + public static final String REGEX_DATE = "^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$";
  50 + /**
  51 + * 正则:IP地址
  52 + */
  53 + public static final String REGEX_IP = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";
  54 +
  55 + ///////////////////////////////////////////////////////////////////////////
  56 + // 以下摘自http://tool.oschina.net/regex
  57 + ///////////////////////////////////////////////////////////////////////////
  58 +
  59 + /**
  60 + * 正则:双字节字符(包括汉字在内)
  61 + */
  62 + public static final String REGEX_DOUBLE_BYTE_CHAR = "[^\\x00-\\xff]";
  63 + /**
  64 + * 正则:空白行
  65 + */
  66 + public static final String REGEX_BLANK_LINE = "\\n\\s*\\r";
  67 + /**
  68 + * 正则:QQ号
  69 + */
  70 + public static final String REGEX_TENCENT_NUM = "[1-9][0-9]{4,}";
  71 + /**
  72 + * 正则:中国邮政编码
  73 + */
  74 + public static final String REGEX_ZIP_CODE = "[1-9]\\d{5}(?!\\d)";
  75 + /**
  76 + * 正则:正整数
  77 + */
  78 + public static final String REGEX_POSITIVE_INTEGER = "^[1-9]\\d*$";
  79 + /**
  80 + * 正则:负整数
  81 + */
  82 + public static final String REGEX_NEGATIVE_INTEGER = "^-[1-9]\\d*$";
  83 + /**
  84 + * 正则:整数
  85 + */
  86 + public static final String REGEX_INTEGER = "^-?[1-9]\\d*$";
  87 + /**
  88 + * 正则:非负整数(正整数 + 0)
  89 + */
  90 + public static final String REGEX_NOT_NEGATIVE_INTEGER = "^[1-9]\\d*|0$";
  91 + /**
  92 + * 正则:非正整数(负整数 + 0)
  93 + */
  94 + public static final String REGEX_NOT_POSITIVE_INTEGER = "^-[1-9]\\d*|0$";
  95 + /**
  96 + * 正则:正浮点数
  97 + */
  98 + public static final String REGEX_POSITIVE_FLOAT = "^[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*$";
  99 + /**
  100 + * 正则:负浮点数
  101 + */
  102 + public static final String REGEX_NEGATIVE_FLOAT = "^-[1-9]\\d*\\.\\d*|-0\\.\\d*[1-9]\\d*$";
  103 +
  104 + ///////////////////////////////////////////////////////////////////////////
  105 + // If u want more please visit http://toutiao.com/i6231678548520731137
  106 + ///////////////////////////////////////////////////////////////////////////
  107 +}
0 \ No newline at end of file 108 \ No newline at end of file
cloud/user/src/main/java/com/cnlive/strike/moudle/qr/uitl/RegexUtils.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/qr/uitl/RegexUtils.java
  1 +package com.cnlive.strike.moudle.qr.uitl;
  2 +
  3 +import java.util.ArrayList;
  4 +import java.util.List;
  5 +import java.util.regex.Matcher;
  6 +import java.util.regex.Pattern;
  7 +
  8 +public final class RegexUtils {
  9 +
  10 + private RegexUtils() {
  11 + throw new UnsupportedOperationException("u can't instantiate me...");
  12 + }
  13 +
  14 + ///////////////////////////////////////////////////////////////////////////
  15 + // If u want more please visit http://toutiao.com/i6231678548520731137
  16 + ///////////////////////////////////////////////////////////////////////////
  17 +
  18 + /**
  19 + * 验证手机号(简单)
  20 + *
  21 + * @param input 待验证文本
  22 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  23 + */
  24 + public static boolean isMobileSimple(final CharSequence input) {
  25 + return isMatch(RegexConstants.REGEX_MOBILE_SIMPLE, input);
  26 + }
  27 +
  28 + /**
  29 + * 验证手机号(精确)
  30 + *
  31 + * @param input 待验证文本
  32 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  33 + */
  34 + public static boolean isMobileExact(final CharSequence input) {
  35 + return isMatch(RegexConstants.REGEX_MOBILE_EXACT, input);
  36 + }
  37 +
  38 + /**
  39 + * 验证电话号码
  40 + *
  41 + * @param input 待验证文本
  42 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  43 + */
  44 + public static boolean isTel(final CharSequence input) {
  45 + return isMatch(RegexConstants.REGEX_TEL, input);
  46 + }
  47 +
  48 + /**
  49 + * 验证身份证号码15位
  50 + *
  51 + * @param input 待验证文本
  52 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  53 + */
  54 + public static boolean isIDCard15(final CharSequence input) {
  55 + return isMatch(RegexConstants.REGEX_ID_CARD15, input);
  56 + }
  57 +
  58 + /**
  59 + * 验证身份证号码18位
  60 + *
  61 + * @param input 待验证文本
  62 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  63 + */
  64 + public static boolean isIDCard18(final CharSequence input) {
  65 + return isMatch(RegexConstants.REGEX_ID_CARD18, input);
  66 + }
  67 +
  68 + /**
  69 + * 验证邮箱
  70 + *
  71 + * @param input 待验证文本
  72 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  73 + */
  74 + public static boolean isEmail(final CharSequence input) {
  75 + return isMatch(RegexConstants.REGEX_EMAIL, input);
  76 + }
  77 +
  78 + /**
  79 + * 验证URL
  80 + *
  81 + * @param input 待验证文本
  82 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  83 + */
  84 + public static boolean isURL(final CharSequence input) {
  85 + return isMatch(RegexConstants.REGEX_URL, input);
  86 + }
  87 +
  88 + /**
  89 + * 验证汉字
  90 + *
  91 + * @param input 待验证文本
  92 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  93 + */
  94 + public static boolean isZh(final CharSequence input) {
  95 + return isMatch(RegexConstants.REGEX_ZH, input);
  96 + }
  97 +
  98 + /**
  99 + * 验证用户名
  100 + * <p>取值范围为a-z,A-Z,0-9,"_",汉字,不能以"_"结尾,用户名必须是6-20位</p>
  101 + *
  102 + * @param input 待验证文本
  103 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  104 + */
  105 + public static boolean isUsername(final CharSequence input) {
  106 + return isMatch(RegexConstants.REGEX_USERNAME, input);
  107 + }
  108 +
  109 + /**
  110 + * 验证yyyy-MM-dd格式的日期校验,已考虑平闰年
  111 + *
  112 + * @param input 待验证文本
  113 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  114 + */
  115 + public static boolean isDate(final CharSequence input) {
  116 + return isMatch(RegexConstants.REGEX_DATE, input);
  117 + }
  118 +
  119 + /**
  120 + * 验证IP地址
  121 + *
  122 + * @param input 待验证文本
  123 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  124 + */
  125 + public static boolean isIP(final CharSequence input) {
  126 + return isMatch(RegexConstants.REGEX_IP, input);
  127 + }
  128 + /**
  129 + * 验证数字
  130 + *
  131 + * @param input 待验证文本
  132 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  133 + */
  134 + public static boolean isIntNym(final CharSequence input) {
  135 + return isMatch(RegexConstants.REGEX_INTEGER, input);
  136 + }
  137 +
  138 + /**
  139 + * 判断是否匹配正则
  140 + *
  141 + * @param regex 正则表达式
  142 + * @param input 要匹配的字符串
  143 + * @return {@code true}: 匹配<br>{@code false}: 不匹配
  144 + */
  145 + public static boolean isMatch(final String regex, final CharSequence input) {
  146 + return input != null && input.length() > 0 && Pattern.matches(regex, input);
  147 + }
  148 +
  149 + /**
  150 + * 获取正则匹配的部分
  151 + *
  152 + * @param regex 正则表达式
  153 + * @param input 要匹配的字符串
  154 + * @return 正则匹配的部分
  155 + */
  156 + public static List<String> getMatches(final String regex, final CharSequence input) {
  157 + if (input == null) return null;
  158 + List<String> matches = new ArrayList<>();
  159 + Pattern pattern = Pattern.compile(regex);
  160 + Matcher matcher = pattern.matcher(input);
  161 + while (matcher.find()) {
  162 + matches.add(matcher.group());
  163 + }
  164 + return matches;
  165 + }
  166 +
  167 + /**
  168 + * 获取正则匹配分组
  169 + *
  170 + * @param input 要分组的字符串
  171 + * @param regex 正则表达式
  172 + * @return 正则匹配分组
  173 + */
  174 + public static String[] getSplits(final String input, final String regex) {
  175 + if (input == null) return null;
  176 + return input.split(regex);
  177 + }
  178 +
  179 + /**
  180 + * 替换正则匹配的第一部分
  181 + *
  182 + * @param input 要替换的字符串
  183 + * @param regex 正则表达式
  184 + * @param replacement 代替者
  185 + * @return 替换正则匹配的第一部分
  186 + */
  187 + public static String getReplaceFirst(final String input, final String regex, final String replacement) {
  188 + if (input == null) return null;
  189 + return Pattern.compile(regex).matcher(input).replaceFirst(replacement);
  190 + }
  191 +
  192 + /**
  193 + * 替换所有正则匹配的部分
  194 + *
  195 + * @param input 要替换的字符串
  196 + * @param regex 正则表达式
  197 + * @param replacement 代替者
  198 + * @return 替换所有正则匹配的部分
  199 + */
  200 + public static String getReplaceAll(final String input, final String regex, final String replacement) {
  201 + if (input == null) return null;
  202 + return Pattern.compile(regex).matcher(input).replaceAll(replacement);
  203 + }
  204 +}
0 \ No newline at end of file 205 \ No newline at end of file
cloud/user/src/main/java/com/cnlive/strike/moudle/user/arouters/UserRouters.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/arouters/UserRouters.java
  1 +package com.cnlive.strike.moudle.user.arouters;
  2 +
  3 +import android.content.Context;
  4 +import android.content.Intent;
  5 +
  6 +import com.alibaba.android.arouter.launcher.ARouter;
  7 +
  8 +public class UserRouters {
  9 +
  10 + public static void startVodPlayer(Context context,
  11 + String contentId,
  12 + String videoId,
  13 + String videoTitle,
  14 + String shareSubTitle,
  15 + String shareImg,
  16 + String shareUrl,
  17 + String channelName) {
  18 + ARouter.getInstance().build("/cnvideo/PlayerVodActivity")
  19 + .withString("contentId", contentId)
  20 + .withString("videoId", videoId)
  21 + .withString("videoTitle", videoTitle)
  22 + .withString("shareSubTitle", shareSubTitle)
  23 + .withString("shareImg", shareImg)
  24 + .withString("shareUrl", shareUrl)
  25 + .withString("channelName", channelName)
  26 + .withFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
  27 + .navigation(context);
  28 + }
  29 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/IFirstLoginView.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/IFirstLoginView.java
  1 +package com.cnlive.strike.moudle.user.frame;
  2 +
  3 +import com.hannesdorfmann.mosby3.mvp.MvpView;
  4 +
  5 +/**
  6 + * Created by xiansong on 2018/1/19.
  7 + */
  8 +
  9 +public interface IFirstLoginView extends MvpView {
  10 + String TAG = "IFirstLoginView";
  11 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/IQuickLoginView.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/IQuickLoginView.java
  1 +package com.cnlive.strike.moudle.user.frame;
  2 +
  3 +import com.hannesdorfmann.mosby3.mvp.MvpView;
  4 +
  5 +/**
  6 + * @author Lynn
  7 + * @date 2017/12/22
  8 + */
  9 +
  10 +public interface IQuickLoginView extends MvpView {
  11 + String TAG = "IQuickLoginView";
  12 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/data/FirstLoginData.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/data/FirstLoginData.java
  1 +package com.cnlive.strike.moudle.user.frame.data;
  2 +
  3 +import androidx.databinding.BaseObservable;
  4 +import androidx.databinding.Bindable;
  5 +
  6 +import com.cnlive.strike.moudle_user.BR;
  7 +
  8 +
  9 +/**
  10 + * Created by xiansong on 2018/1/19.
  11 + */
  12 +
  13 +public class FirstLoginData extends BaseObservable {
  14 +
  15 + private String name;
  16 + private String image;
  17 +
  18 + @Bindable
  19 + public String getImage() {
  20 + return image;
  21 + }
  22 +
  23 + public void setImage(String image) {
  24 + this.image = image;
  25 + super.notifyPropertyChanged(BR.image);
  26 + }
  27 +
  28 + @Bindable
  29 + public String getName() {
  30 + return name;
  31 + }
  32 +
  33 + public void setName(String name) {
  34 + this.name = name;
  35 + super.notifyPropertyChanged(BR.name);
  36 + }
  37 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/data/LoginData.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/data/LoginData.java
  1 +package com.cnlive.strike.moudle.user.frame.data;
  2 +
  3 +
  4 +import androidx.databinding.BaseObservable;
  5 +import androidx.databinding.Bindable;
  6 +
  7 +import com.cnlive.libs.base.logic.Config;
  8 +import com.cnlive.libs.base.logic.callback.StateCallback;
  9 +
  10 +import static android.view.View.GONE;
  11 +import static android.view.View.VISIBLE;
  12 +import com.cnlive.core.user.BR;
  13 +/**
  14 + * Created by xiansong on 2018/1/2.
  15 + */
  16 +@Deprecated
  17 +public class LoginData extends BaseObservable implements StateCallback {
  18 + private String name = "";
  19 + private String password = "";
  20 + private int loadVisibility = GONE;
  21 +
  22 + @Bindable
  23 + public String getName() {
  24 + return name;
  25 + }
  26 +
  27 + public void setName(String name) {
  28 + this.name = name;
  29 + notifyPropertyChanged(BR.name);
  30 + }
  31 +
  32 + @Bindable
  33 + public String getPassword() {
  34 + return password;
  35 + }
  36 +
  37 + public void setPassword(String password) {
  38 + this.password = password;
  39 + notifyPropertyChanged(BR.password);
  40 + }
  41 +
  42 + @Bindable
  43 + public int getLoadVisibility() {
  44 + return loadVisibility;
  45 + }
  46 +
  47 + public void setLoadVisibility(int loadVisibility) {
  48 + this.loadVisibility = loadVisibility;
  49 + notifyPropertyChanged(BR.loadVisibility);
  50 + }
  51 +
  52 + @Override
  53 + public void onState(int state) {
  54 + loadVisibility = state == Config.STATE_LOAD ? VISIBLE : GONE;
  55 + }
  56 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/data/OtherUserInfo.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/data/OtherUserInfo.java
  1 +package com.cnlive.strike.moudle.user.frame.data;
  2 +
  3 +import java.io.Serializable;
  4 +
  5 +/**
  6 + * 作者: 吴奎庆
  7 + * <p>
  8 + * 时间: 2019/9/10
  9 + * <p>
  10 + * 简介: 三方登陆的用户信息
  11 + */
  12 +public class OtherUserInfo implements Serializable {
  13 + // 用户昵称
  14 + String nickName;
  15 + //性别,m:男、f:女、n:未知
  16 + String gender;
  17 + //用户所在地
  18 + String location;
  19 + //头像,约100*100
  20 + String faceUrl;
  21 +
  22 + //第三方用户ID
  23 + //[qq: 建议使用openid, wx: 建议使用unionid, sina: 建议使用idstr];
  24 + //注意:同一用户在登录Sp下不同app时,thirdPartyId必须相同
  25 + String thirdPartyId;
  26 + //三方登陆的类型 微信: weixin 微博 :sina qq :qq
  27 + String loginType;
  28 +
  29 + public String getLoginType() {
  30 + return loginType;
  31 + }
  32 +
  33 + public void setLoginType(String loginType) {
  34 + this.loginType = loginType;
  35 + }
  36 +
  37 + public String getNickName() {
  38 + return nickName;
  39 + }
  40 +
  41 + public void setNickName(String nickName) {
  42 + this.nickName = nickName;
  43 + }
  44 +
  45 + public String getGender() {
  46 + return gender;
  47 + }
  48 +
  49 + public void setGender(String gender) {
  50 + this.gender = gender;
  51 + }
  52 +
  53 + public String getLocation() {
  54 + return location;
  55 + }
  56 +
  57 + public void setLocation(String location) {
  58 + this.location = location;
  59 + }
  60 +
  61 + public String getFaceUrl() {
  62 + return faceUrl;
  63 + }
  64 +
  65 + public void setFaceUrl(String faceUrl) {
  66 + this.faceUrl = faceUrl;
  67 + }
  68 +
  69 + public String getThirdPartyId() {
  70 + return thirdPartyId;
  71 + }
  72 +
  73 + public void setThirdPartyId(String thirdPartyId) {
  74 + this.thirdPartyId = thirdPartyId;
  75 + }
  76 +
  77 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/data/QuickLoginData.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/data/QuickLoginData.java
  1 +package com.cnlive.strike.moudle.user.frame.data;
  2 +
  3 +
  4 +import androidx.databinding.BaseObservable;
  5 +import androidx.databinding.Bindable;
  6 +
  7 +import com.cnlive.libs.base.logic.Config;
  8 +import com.cnlive.libs.base.logic.callback.StateCallback;
  9 +import com.cnlive.core.user.BR;
  10 +
  11 +import static android.view.View.GONE;
  12 +import static android.view.View.VISIBLE;
  13 +import com.cnlive.core.user.BR;
  14 +/**
  15 + * Created by xiansong on 2018/1/11.
  16 + */
  17 +
  18 +public class QuickLoginData extends BaseObservable implements StateCallback {
  19 + private static final String send = "获取验证码";
  20 + private static final String time_format = "%s秒后重发";
  21 +
  22 + private String phone = "";
  23 + private String code = "";
  24 + private String sendBtnText = send;
  25 + private int time;
  26 + private boolean sendEnabled = true;
  27 + private int loadVisibility = GONE;
  28 +
  29 + @Bindable
  30 + public String getPhone() {
  31 + return phone;
  32 + }
  33 +
  34 + public void setPhone(String phone) {
  35 + this.phone = phone;
  36 + notifyPropertyChanged(BR.phone);
  37 + }
  38 +
  39 + @Bindable
  40 + public String getCode() {
  41 + return code;
  42 + }
  43 +
  44 + public void setCode(String code) {
  45 + this.code = code;
  46 + notifyPropertyChanged(BR.code);
  47 + }
  48 +
  49 + @Bindable
  50 + public int getTime() {
  51 + return time;
  52 + }
  53 +
  54 + public void setTime(int time) {
  55 + this.time = time;
  56 + setSendBtnText(time <= 0 ? send : String.format(time_format, time));
  57 + setSendEnabled(time <= 0);
  58 + notifyPropertyChanged(BR.time);
  59 + }
  60 +
  61 + @Bindable
  62 + public String getSendBtnText() {
  63 + return sendBtnText;
  64 + }
  65 +
  66 + public void setSendBtnText(String sendBtnText) {
  67 + this.sendBtnText = sendBtnText;
  68 + notifyPropertyChanged(BR.sendBtnText);
  69 + }
  70 +
  71 + @Bindable
  72 + public boolean getSendEnabled() {
  73 + return sendEnabled;
  74 + }
  75 +
  76 + public void setSendEnabled(boolean sendEnabled) {
  77 + this.sendEnabled = sendEnabled;
  78 + notifyPropertyChanged(BR.sendEnabled);
  79 + }
  80 +
  81 + @Bindable
  82 + public int getLoadVisibility() {
  83 + return loadVisibility;
  84 + }
  85 +
  86 + public void setLoadVisibility(int loadVisibility) {
  87 + this.loadVisibility = loadVisibility;
  88 + notifyPropertyChanged(BR.loadVisibility);
  89 + }
  90 +
  91 + @Override
  92 + public void onState(int state) {
  93 + loadVisibility = state == Config.STATE_LOAD ? VISIBLE : GONE;
  94 + }
  95 +}
0 \ No newline at end of file 96 \ No newline at end of file
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/presenter/FirstLoginPresenter.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/presenter/FirstLoginPresenter.java
  1 +package com.cnlive.strike.moudle.user.frame.presenter;
  2 +
  3 +import android.content.Context;
  4 +import android.text.TextUtils;
  5 +
  6 +import com.cnlive.strike.data.network.model.BaseInfo;
  7 +import com.cnlive.strike.data.network.model.FaceData;
  8 +import com.cnlive.strike.data.network.model.TokenData;
  9 +import com.cnlive.strike.data.network.model.UserData;
  10 +import com.cnlive.libs.base.logic.Event;
  11 +import com.cnlive.libs.base.logic.Logic;
  12 +import com.cnlive.libs.base.logic.callback.DataCallback;
  13 +import com.cnlive.strike.moudle.user.frame.view.FirstLoginView;
  14 +import com.cnlive.strike.moudle_user.R;
  15 +import com.cnlive.strike.user.UserUtilAction;
  16 +import com.cnlive.strike.user.auth.UserService;
  17 +import com.cnlive.strike.util.HelperUtil;
  18 +import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
  19 +
  20 +import java.io.File;
  21 +
  22 +import static com.cnlive.libs.base.logic.Config.STATE_IDLE;
  23 +import static com.cnlive.libs.base.logic.Config.STATE_LOAD;
  24 +
  25 +
  26 +/**
  27 + * Created by xiansong on 2018/1/19.
  28 + */
  29 +
  30 +public class FirstLoginPresenter extends MvpBasePresenter<FirstLoginView> {
  31 +
  32 + private static final String TAG = "FirstLoginPresenter";
  33 +
  34 + private Event<BaseInfo<FaceData>> updateFaceEvent;
  35 + private Event updateNameEvent;
  36 +
  37 + public void loadUserInfo(Context context) {
  38 + UserService userService = UserService.getInstance(context);
  39 + if (userService != null && userService.getAppAccount() != null) {
  40 + String sid = UserService.getUid(context);
  41 + String token = userService.getAppAccount().getToken();
  42 + Logic.create()
  43 + .action(UserUtilAction.queryUserInfo(context, sid, sid, token))
  44 + .action((BaseInfo<UserData> data, DataCallback<UserData> callback) -> Logic.process(() -> {
  45 + userService.setUserInfo(data.getData());
  46 + return data.getData() == null ? null : data.getData();
  47 + }, callback))
  48 + .event()
  49 + .setSuccessCallback(data -> {
  50 + })
  51 + .start();
  52 + }
  53 + }
  54 +
  55 + public void uploadName(Context context, String nickName) {
  56 + if (updateNameEvent != null) updateNameEvent.cencel();
  57 + if (getView() == null) return;
  58 + if (TextUtils.isEmpty(nickName)) {
  59 + if (getView() != null)
  60 + getView().showToast(context.getString(R.string.user_toast_edit_nickname_empty));
  61 + return;
  62 + }
  63 + if (nickName.trim().length() == 0) {
  64 + if (getView() != null)
  65 + getView().showToast(context.getString(R.string.user_toast_edit_nickname_only_space));
  66 + return;
  67 + }
  68 +// 请输入昵称(不支持表情符号)
  69 + UserService userService = UserService.getInstance(context);
  70 + String sid = UserService.getUid(context);
  71 + String token = userService.getAppAccount().getToken();
  72 + updateNameEvent = Logic.create()
  73 + .action(UserUtilAction.modifyUserInfo(context, sid, "nickName", nickName.trim().replaceAll("[\r\n]", ""), token))
  74 + .action(UserUtilAction.queryUserInfo(context, sid, sid, token))
  75 + .action((BaseInfo<UserData> data, DataCallback<UserData> callback) -> Logic.process(() -> {
  76 + userService.setUserInfo(data.getData());
  77 + return data == null ? null : data.getData();
  78 + }, callback))
  79 + .event()
  80 + .setStateCallback(state -> {
  81 + if (getView() == null) return;
  82 + if (state == STATE_LOAD) {
  83 + getView().showProgress(R.string.upload_nickname_dialog);
  84 + } else if (state == STATE_IDLE) {
  85 + getView().hideProgress();
  86 + }
  87 + })
  88 + .setFailureCallback((state, message) -> {
  89 + if (getView() == null) return;
  90 + if (state == 8 || state == 9) {
  91 +// UserOfflineUtil.userInvalid(context);
  92 + HelperUtil.userInvalid(context);
  93 + } else if (state == UserUtilAction.TOKEN_ERROR_CODE) {
  94 + getView().showTokenErrorDialog();
  95 + } else {
  96 + getView().showToast(message);
  97 + }
  98 + })
  99 + .setSuccessCallback(data -> {
  100 +// LoginManager.modifyUserName( UserService.getUid(context), nickName);
  101 + HelperUtil.modifyUserName(context, nickName);
  102 + userService.setUserNickName(nickName);
  103 + if (getView() == null) return;
  104 + getView().showMainPage();
  105 + })
  106 + .start();
  107 +
  108 + }
  109 +
  110 + public void uploadFile(Context context, String filePath) {
  111 + if (updateFaceEvent != null) updateFaceEvent.cencel();
  112 + if (getView() == null) return;
  113 + getView().showProgress(R.string.upload_image_dialog);
  114 + File file = new File(filePath);
  115 + UserService userService = UserService.getInstance(context);
  116 + if (file.exists()) {
  117 +
  118 + updateFaceEvent = Logic.create()
  119 + .action(UserUtilAction.accessToken(context))
  120 + .action((BaseInfo<TokenData> data, DataCallback<BaseInfo<FaceData>> callback) -> {
  121 + UserUtilAction.updateUserFace(context, UserService.getUid(context), file, userService.getAppAccount().getToken(), data.getData().getAccess_token(), callback);
  122 + return null;
  123 + })
  124 + .<BaseInfo<FaceData>>event()
  125 + .setStateCallback(state -> {
  126 + if (getView() == null) return;
  127 + if (state == STATE_LOAD) {
  128 +
  129 + } else if (state == STATE_IDLE) {
  130 + getView().hideProgress();
  131 + }
  132 + })
  133 + .setFailureCallback((state, message) -> {
  134 + if (getView() == null) return;
  135 + if (state == 8 || state == 9) {
  136 +// UserOfflineUtil.userInvalid(context);
  137 + HelperUtil.userInvalid(context);
  138 + } else if (state == UserUtilAction.TOKEN_ERROR_CODE) {
  139 + getView().showTokenErrorDialog();
  140 + } else {
  141 + getView().showToast(message);
  142 + }
  143 + })
  144 + .setSuccessCallback(data -> {
  145 + HelperUtil.modifyUserImage(context,data.getData().getFaceUrl());
  146 +// LoginManager.modifyUserImage( UserService.getUid(context), data.getData().getFaceUrl());
  147 + userService.setUserFaceUrl(data.getData().getFaceUrl(), data.getData().getBigFaceUrl());
  148 + if (getView() == null) return;
  149 + getView().photoChange(data.getData().getFaceUrl());
  150 + })
  151 + .start();
  152 + } else {
  153 + if (getView() != null) getView().showToast("文件不存在");
  154 + }
  155 + }
  156 +
  157 +}
  158 +
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/presenter/PersonalDataPresenter.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/presenter/PersonalDataPresenter.java
  1 +package com.cnlive.strike.moudle.user.frame.presenter;
  2 +
  3 +import android.content.Context;
  4 +import android.text.InputFilter;
  5 +import android.text.InputType;
  6 +import android.text.TextUtils;
  7 +import android.widget.EditText;
  8 +import android.widget.Toast;
  9 +
  10 +import com.cnlive.strike.data.network.model.BaseInfo;
  11 +import com.cnlive.libs.base.logic.Event;
  12 +import com.cnlive.libs.base.logic.Logic;
  13 +import com.cnlive.libs.base.logic.callback.FailureCallback;
  14 +import com.cnlive.libs.base.logic.callback.SuccessCallback;
  15 +import com.cnlive.libs.base.util.AlertUtil;
  16 +import com.cnlive.strike.moudle.user.frame.view.PersonalDataView;
  17 +import com.cnlive.strike.moudle.user.model.msg.UserEventMsg;
  18 +import com.cnlive.strike.moudle.user.ui.activity.PersonalDataActivity;
  19 +import com.cnlive.strike.user.UserUtilAction;
  20 +import com.cnlive.strike.user.auth.UserService;
  21 +import com.cnlive.strike.user.model.CNLiveUserInfoExt;
  22 +//import com.cnlive.tcsdk.LoginManager;
  23 +import com.google.gson.Gson;
  24 +import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
  25 +import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
  26 +import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
  27 +
  28 +import org.greenrobot.eventbus.EventBus;
  29 +
  30 +/**
  31 + * 创建:wukuiqing
  32 + * <p>
  33 + * 时间:2018/3/22
  34 + * <p>
  35 + * 描述:
  36 + */
  37 +
  38 +public class PersonalDataPresenter extends MvpBasePresenter<PersonalDataView> {
  39 +
  40 + private Event updateUserExtInfoEvent;
  41 + private Event modifyUserInfoEvent;
  42 +
  43 + public void setData(UserService userService) {
  44 + if (getView() == null) return;
  45 + getView().setView(userService);
  46 + }
  47 +
  48 + public void upLoadNickName(PersonalDataActivity personalDataActivity, UserService userService) {
  49 + QMUIDialog.EditTextDialogBuilder builderNickName = new QMUIDialog.EditTextDialogBuilder(personalDataActivity);
  50 + EditText name = builderNickName.getEditText();
  51 + name.setFilters(new InputFilter[]{new InputFilter.LengthFilter(15)});
  52 + name.setLines(1);
  53 + builderNickName.setTitle("修改昵称")
  54 + .setPlaceholder("昵称最多15个字")
  55 + .setInputType(InputType.TYPE_CLASS_TEXT)
  56 + .addAction("取消", new QMUIDialogAction.ActionListener() {
  57 + @Override
  58 + public void onClick(QMUIDialog dialog, int index) {
  59 + dialog.cancel();
  60 + }
  61 + })
  62 + .addAction("确定", new QMUIDialogAction.ActionListener() {
  63 + @Override
  64 + public void onClick(QMUIDialog dialog, int index) {
  65 + String name = builderNickName.getEditText().getText().toString();
  66 +
  67 + if (name != null && name.trim().length() > 0) {
  68 + if (name.length() > 15) {
  69 + AlertUtil.showDeftToast(personalDataActivity, "昵称最多十五个字");
  70 + } else {
  71 + dialog.dismiss();
  72 +
  73 + upLoadUserInfo(personalDataActivity, userService, "nickName", name);
  74 + }
  75 +
  76 +
  77 + } else {
  78 + AlertUtil.showDeftToast(personalDataActivity, "昵称不能为空");
  79 + }
  80 + }
  81 + }).show();
  82 + }
  83 +
  84 + public void upLoadUserInfo(Context context, UserService userService, String type, String value) {
  85 +
  86 +
  87 + /**
  88 + * @param uid 用户ID
  89 + * @param type nickName-昵称,gender-性别,email-邮箱, location-联系方式
  90 + * @param value 对应的信息,性别,m:男、f:女、n:未知
  91 + * @param callback 回调
  92 + *
  93 + *
  94 + */
  95 + if (modifyUserInfoEvent != null) modifyUserInfoEvent.cencel();
  96 + String uid = UserService.getUid(context);
  97 + String token = userService.getAppAccount().getToken();
  98 +
  99 + modifyUserInfoEvent = Logic.create()
  100 + .action(UserUtilAction.modifyUserInfo(context, uid, type, value, token))
  101 + .<BaseInfo>event()
  102 + .setFailureCallback(new FailureCallback() {
  103 + @Override
  104 + public void onFailure(int state, String message) {
  105 + if (getView() == null) return;
  106 + if (state == UserUtilAction.TOKEN_ERROR_CODE) {
  107 + getView().showTokenErrorDialog();
  108 + } else {
  109 + getView().showMessage(message);
  110 + }
  111 + }
  112 + })
  113 + .setSuccessCallback(new SuccessCallback<BaseInfo>() {
  114 + @Override
  115 + public void onSuccess(BaseInfo data) {
  116 + if (type.equals("nickName")) {
  117 + userService.setUserNickName(value);
  118 + if (getView() != null) {
  119 + getView().upDataNickName(value);
  120 + }
  121 + EventBus.getDefault().post(new UserEventMsg(UserEventMsg.MODIFY_USER_IMAGE, value));
  122 +
  123 +// LoginManager.modifyUserName( UserService.getUid(context), value);
  124 + } else if (type.equals("gender")) {
  125 + userService.setUserSex(value);
  126 + if (getView() != null) {
  127 +
  128 + getView().upDataSex(value);
  129 + }
  130 +
  131 + } else if (type.equals("location")) {
  132 + userService.setUserLocation(value);
  133 + if (getView() != null) {
  134 + getView().upDataLocation(value);
  135 + }
  136 + }
  137 + }
  138 + }).start();
  139 +
  140 + }
  141 +
  142 +
  143 + public void upDataLocation(PersonalDataActivity personalDataActivity, UserService userService) {
  144 +
  145 + QMUIDialog.EditTextDialogBuilder builderNickName = new QMUIDialog.EditTextDialogBuilder(personalDataActivity);
  146 + EditText where = builderNickName.getEditText();
  147 + where.setFilters(new InputFilter[]{new InputFilter.LengthFilter(12)});
  148 + where.setLines(1);
  149 + builderNickName.setTitle("修改位置")
  150 + .setPlaceholder("在此输入您的位置")
  151 + .setInputType(InputType.TYPE_CLASS_TEXT)
  152 + .addAction("取消", new QMUIDialogAction.ActionListener() {
  153 + @Override
  154 + public void onClick(QMUIDialog dialog, int index) {
  155 + dialog.cancel();
  156 + }
  157 + })
  158 + .addAction("确定", new QMUIDialogAction.ActionListener() {
  159 + @Override
  160 + public void onClick(QMUIDialog dialog, int index) {
  161 + String location = builderNickName.getEditText().getText().toString();
  162 + if (location != null && location.length() > 0) {
  163 + dialog.dismiss();
  164 +
  165 + upLoadUserInfo(personalDataActivity, userService, "location", location);
  166 + } else {
  167 +
  168 + AlertUtil.showDeftToast(personalDataActivity, "请填入您的位置");
  169 + }
  170 + }
  171 + }).show();
  172 + }
  173 +
  174 + /**
  175 + * 修改个人信息 名字 性别 地址
  176 + *
  177 + * @param personalDataActivity
  178 + * @param userService
  179 + */
  180 + public void upDataSignature(PersonalDataActivity personalDataActivity, UserService userService) {
  181 + QMUIDialog.EditTextDialogBuilder builderNickName = new QMUIDialog.EditTextDialogBuilder(personalDataActivity);
  182 + builderNickName.setTitle("修改个性签名")
  183 + .setPlaceholder("请输入您的个性签名")
  184 + .setInputType(InputType.TYPE_CLASS_TEXT)
  185 + .addAction("取消", new QMUIDialogAction.ActionListener() {
  186 + @Override
  187 + public void onClick(QMUIDialog dialog, int index) {
  188 + dialog.cancel();
  189 + }
  190 + })
  191 + .addAction("确定", new QMUIDialogAction.ActionListener() {
  192 + @Override
  193 + public void onClick(QMUIDialog dialog, int index) {
  194 + String location = builderNickName.getEditText().getText().toString();
  195 + if (!TextUtils.isEmpty(location)) {
  196 + if (location.length() > 15) {
  197 + AlertUtil.showDeftToast(personalDataActivity, "个性签名最多十五个字");
  198 + } else {
  199 + dialog.dismiss();
  200 + upLoadSignature(personalDataActivity, userService, location);
  201 + }
  202 +
  203 +
  204 + } else {
  205 +
  206 + AlertUtil.showDeftToast(personalDataActivity, "请输入您的个性签名");
  207 + }
  208 + }
  209 + }).show();
  210 +
  211 + }
  212 +
  213 + /**
  214 + * 修改个人签名
  215 + *
  216 + * @param personalDataActivity
  217 + * @param userService
  218 + * @param value
  219 + */
  220 + public void upLoadSignature(PersonalDataActivity personalDataActivity, UserService userService, String value) {
  221 + if (updateUserExtInfoEvent != null) updateUserExtInfoEvent.cencel();
  222 + String uid = UserService.getUid(personalDataActivity);
  223 + String token = userService.getAppAccount().getToken();
  224 +
  225 + CNLiveUserInfoExt info = new CNLiveUserInfoExt();
  226 + info.setUserSign(value);
  227 +
  228 + String signature = new Gson().toJson(info);
  229 + updateUserExtInfoEvent = Logic.create()
  230 + .action(UserUtilAction.updateUserExtInfo(personalDataActivity, uid, signature, token))
  231 + .<BaseInfo>event()
  232 + .setFailureCallback((state, message) -> {
  233 + if (state == UserUtilAction.TOKEN_ERROR_CODE) {
  234 + if (getView() != null) getView().showTokenErrorDialog();
  235 + } else {
  236 + Toast.makeText(personalDataActivity, message, Toast.LENGTH_SHORT).show();
  237 + }
  238 + })
  239 + .setSuccessCallback(data -> {
  240 + userService.setUserSign(value);
  241 + if (getView() != null) getView().upSignature(value);
  242 + }).start();
  243 + }
  244 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/presenter/PersonalImagePresenter.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/presenter/PersonalImagePresenter.java
  1 +package com.cnlive.strike.moudle.user.frame.presenter;
  2 +
  3 +import android.content.SharedPreferences;
  4 +
  5 +import com.cnlive.libs.base.logic.Event;
  6 +import com.cnlive.libs.base.logic.Logic;
  7 +import com.cnlive.libs.base.logic.callback.DataCallback;
  8 +import com.cnlive.libs.base.util.AlertUtil;
  9 +import com.cnlive.libs.base.util.SharedPreferencesHelper;
  10 +import com.cnlive.strike.data.network.model.BaseInfo;
  11 +import com.cnlive.strike.data.network.model.FaceData;
  12 +import com.cnlive.strike.data.network.model.TokenData;
  13 +import com.cnlive.strike.moudle.user.frame.view.PersonalImageView;
  14 +import com.cnlive.strike.moudle.user.model.msg.UserEventMsg;
  15 +import com.cnlive.strike.moudle.user.ui.activity.PersonalImageActivity;
  16 +import com.cnlive.strike.user.UserUtilAction;
  17 +import com.cnlive.strike.user.auth.UserService;
  18 +import com.cnlive.strike.util.HelperUtil;
  19 +import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
  20 +
  21 +import org.greenrobot.eventbus.EventBus;
  22 +
  23 +import java.io.File;
  24 +
  25 +import static android.content.Context.MODE_PRIVATE;
  26 +
  27 +/**
  28 + * 创建:wukuiqing
  29 + * <p>
  30 + * 时间:2018/3/22
  31 + * <p>
  32 + * 描述:
  33 + */
  34 +
  35 +
  36 +public class PersonalImagePresenter extends MvpBasePresenter<PersonalImageView> {
  37 +
  38 + private Event<BaseInfo<FaceData>> updateFaceEvent;
  39 + private UserService userService;
  40 +
  41 + public void showBottomSheet() {
  42 + if (getView() != null) {
  43 + getView().showBottomSheet();
  44 + }
  45 +
  46 + }
  47 +
  48 + public void uploadUserIcon(PersonalImageActivity activity, String path) {
  49 +
  50 + if (updateFaceEvent != null) updateFaceEvent.cencel();
  51 + userService = UserService.getInstance(activity);
  52 + String uid = UserService.getUid(activity);
  53 + String token = userService.getAppAccount().getToken();
  54 + /**
  55 + * @param uid 用户ID
  56 + * @param secret 获取access_token 凭证
  57 + * @param file 头像文件
  58 + * @param callback 回调
  59 + */
  60 + File file = new File(path);
  61 + updateFaceEvent = Logic.create()
  62 + .action(UserUtilAction.accessToken(activity))
  63 + .action((BaseInfo<TokenData> data, DataCallback<BaseInfo<FaceData>> callback) -> {
  64 + UserUtilAction.updateUserFace(activity, uid, file, token, data.getData().getAccess_token(), callback);
  65 + return null;
  66 + })
  67 + .<BaseInfo<FaceData>>event()
  68 + .setFailureCallback((state, message) -> {
  69 + if (getView() == null) return;
  70 + getView().hideLoading();
  71 + if (state == UserUtilAction.TOKEN_ERROR_CODE) {
  72 + getView().showTokenErrorDialog();
  73 + } else {
  74 + AlertUtil.showDeftToast(activity, message);
  75 + }
  76 + })
  77 + .setSuccessCallback(data -> {
  78 + userService.setUserFaceUrl(data.getData().getFaceUrl(), data.getData().getBigFaceUrl());
  79 + if (getView() != null) {
  80 + SharedPreferences preferences = activity.getSharedPreferences("updateface", MODE_PRIVATE);
  81 + boolean status = preferences.getBoolean(UserService.getUid(activity), false);
  82 + Boolean app_is_show_integral = SharedPreferencesHelper.getInstance(activity).getBoolValue("APP_IS_SHOW_INTEGRAL");
  83 + if (!status && app_is_show_integral) {
  84 + //todo
  85 + HelperUtil.goToCoinRainAction(activity,"update_face", "", "updateface",false);
  86 +
  87 +// CoinRainAction.code(activity, UserService.getUid(activity), "update_face", "", "updateface",false);
  88 + }
  89 + getView().upDataUserIcon(data.getData().getBigFaceUrl());
  90 + }
  91 + })
  92 + .start();
  93 +
  94 + }
  95 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/presenter/QuickLoginPresenter.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/presenter/QuickLoginPresenter.java
  1 +package com.cnlive.strike.moudle.user.frame.presenter;
  2 +
  3 +import android.accounts.Account;
  4 +import android.content.Context;
  5 +import android.text.TextUtils;
  6 +
  7 +import com.cnlive.strike.data.network.model.BaseInfo;
  8 +import com.cnlive.libs.base.application.AppConfig;
  9 +import com.cnlive.libs.base.logic.Config;
  10 +import com.cnlive.libs.base.logic.Event;
  11 +import com.cnlive.libs.base.logic.Logic;
  12 +import com.cnlive.libs.base.util.TimerUtil;
  13 +import com.cnlive.strike.moudle.qr.uitl.RegexUtils;
  14 +import com.cnlive.strike.moudle.user.frame.data.OtherUserInfo;
  15 +import com.cnlive.strike.moudle.user.frame.data.QuickLoginData;
  16 +import com.cnlive.strike.moudle.user.frame.view.QuickLoginView;
  17 +import com.cnlive.strike.moudle.user.model.msg.UserEventMsg;
  18 +import com.cnlive.strike.moudle.user.ui.fragment.QuickLoginFragment;
  19 +import com.cnlive.strike.moudle_user.R;
  20 +import com.cnlive.strike.router.user.UserAction;
  21 +import com.cnlive.strike.user.UserUtilAction;
  22 +import com.cnlive.strike.user.auth.UserService;
  23 +import com.cnlive.strike.user.model.CNLiveUserInfo;
  24 +import com.cnlive.strike.util.TimeEvent;
  25 +import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
  26 +
  27 +import org.greenrobot.eventbus.EventBus;
  28 +
  29 +import java.util.Arrays;
  30 +import java.util.Collections;
  31 +
  32 +
  33 +/**
  34 + * @author Lynn
  35 + * @date 2017/12/22
  36 + */
  37 +
  38 +public class QuickLoginPresenter extends MvpBasePresenter<QuickLoginView> {
  39 +
  40 +
  41 + private static final String TAG = "QuickLoginPresenter";
  42 +
  43 + private Event<CNLiveUserInfo> event;
  44 + private Event sendMsgBefQuickLogin;
  45 + private TimerUtil timerUtil; //计时工具类
  46 + private Event otherEvent;
  47 +
  48 + public void deleteUserInfo(Context context, String userName) {
  49 + UserService.getInstance(context).removeUser(userName, future -> {
  50 + if (getView() == null) return;
  51 + //获取已登录用户列表
  52 + Account[] accounts = UserService.getInstance(context).getUserList();
  53 + //倒序输出最近登录用户
  54 +
  55 + Collections.reverse(Arrays.asList(accounts));
  56 + getView().uploadListData(accounts);
  57 + });
  58 + }
  59 +
  60 + public void init(Context context) {
  61 + if (getView() == null) return;
  62 + UserService us = UserService.getInstance(context);
  63 + //获取已登录用户列表
  64 + Account[] accounts = us.getUserList();
  65 + //倒序输出最近登录用户
  66 + Collections.reverse(Arrays.asList(accounts));
  67 + //获取最近登录用户数据
  68 + Account account = accounts.length > 0 ? accounts[0] : null;
  69 + String name = account == null ? "" : account.name;
  70 + //页面填充数据
  71 + getView().uploadInputData(name);
  72 + getView().uploadListData(accounts);
  73 + }
  74 +
  75 + private void startTimer() {
  76 + if (timerUtil != null) timerUtil.cancel();
  77 +
  78 + timerUtil = new TimerUtil();
  79 + timerUtil.setTotalTime(60_000);//设置毫秒数
  80 + timerUtil.setIntervalTime(500);//设置间隔数
  81 + timerUtil.start();
  82 + timerUtil.setTimerLiener(new TimerUtil.TimeListener() {
  83 + @Override
  84 + public void onFinish() {
  85 + if (getView() != null) getView().onTimerFinish();
  86 + }
  87 +
  88 + @Override
  89 + public void onInterval(long remainTime) {
  90 + if (getView() != null) getView().onTimerInterval(remainTime / 1000);
  91 + }
  92 + });
  93 + }
  94 +
  95 + public void sendCode(Context context, String phone, String countryCode) {
  96 + if (getView() == null) return;
  97 + if (TimeEvent.debounce(2_000)) return;
  98 + if (TextUtils.isEmpty(phone)) {
  99 + getView().showToast(context.getString(R.string.user_toast_quick_login_empty_phone));
  100 + return;
  101 + }
  102 + if ("86".equals(countryCode) && !RegexUtils.isMobileSimple(phone)) {
  103 + getView().showToast(context.getString(R.string.user_toast_quick_login_error_phone));
  104 + return;
  105 + }
  106 + if (sendMsgBefQuickLogin != null && sendMsgBefQuickLogin.active) {
  107 + getView().showToast("处理中请稍后...");
  108 + } else {
  109 + sendMsgBefQuickLogin = Logic.create()
  110 + .action(UserUtilAction.sendMsgBefQuickLoginAction(context, phone, countryCode))
  111 + .<BaseInfo>event()
  112 + .setFailureCallback((state, message) -> {
  113 + if (getView() != null) getView().showToast(message);
  114 + })
  115 + .setSuccessCallback(data -> {
  116 + startTimer();
  117 + if (getView() != null) getView().showToast("验证码已发送");
  118 + }).start();
  119 + }
  120 + }
  121 +
  122 + public void login(QuickLoginFragment context, QuickLoginData data, String countryCode) {
  123 + if (getView() == null) return;
  124 +
  125 + if (TextUtils.isEmpty(data.getPhone())) {
  126 + getView().showToast(context.getString(R.string.user_toast_quick_login_empty_phone));
  127 + } else if (TextUtils.isEmpty(data.getCode())) {
  128 + getView().showToast(context.getString(R.string.user_toast_quick_login_empty_code));
  129 + } else {
  130 + cancelLoad();
  131 + context.isLogin = true;
  132 + UserAction.mobileLogin(context.getActivity(), data.getPhone(), data.getCode(), countryCode, initLoginEvent(context, true));
  133 + }
  134 + }
  135 +
  136 + private Event<CNLiveUserInfo> initLoginEvent(QuickLoginFragment context, Boolean retry) {
  137 + return initLoginEvent(context, retry, null);
  138 + }
  139 +
  140 + private Event<CNLiveUserInfo> initLoginEvent(QuickLoginFragment context, Boolean retry, OtherUserInfo otherUserInfo) {
  141 + return event = new Event<CNLiveUserInfo>()
  142 + .setStateCallback(state -> {
  143 + if (state == Config.STATE_LOAD) getView().showProgress();
  144 + else getView().hideProgress();
  145 + }).setFailureCallback((state, message) -> {
  146 + if (context == null) return;
  147 + if (getView() == null) return;
  148 + switch (state) {
  149 + case 41010: //手机号无效
  150 + getView().showToast(message);
  151 + break;
  152 + case 41002: //验证码为6位数字
  153 + getView().showToast(message);
  154 + break;
  155 + case 41009: //验证码错误
  156 + getView().showToast(message);
  157 + break;
  158 + case 41006: //手机号已存在
  159 + getView().showToast(message);
  160 + break;
  161 + case 42013: //此帐号未注册,请先注册
  162 + getView().bindPhone(otherUserInfo);
  163 + break;
  164 + case 6208: //当前用户在其他地点登陆
  165 + if (retry) {
  166 + if (otherUserInfo == null) {
  167 + UserAction.mobileLogin(context.getActivity(), context.data.getPhone(), context.data.getCode(), "", initLoginEvent(context, false));
  168 + }
  169 + return;
  170 + } else getView().showToast("用户登录失败,再试一次吧.");
  171 + break;
  172 + default: //其他错误
  173 + getView().showToast(message);
  174 + break;
  175 + }
  176 + context.hasLogin = false;
  177 + if (context != null) context.isLogin = false;
  178 + }).setSuccessCallback((info) -> {
  179 + if (context == null) return;
  180 + if (getView() == null) return;
  181 + CNLiveUserInfo user = UserService.getInstance(context.getActivity()).getAppAccount();
  182 + if (user == null || (user != null && TextUtils.isEmpty(user.getToken()))) {
  183 + getView().showToast("用户登陆失败,再试一次吧.");
  184 + } else if (user.isNewUser()) {
  185 + //是新用户
  186 + EventBus.getDefault().post(new UserEventMsg(UserEventMsg.IS_NEW_USER, null));
  187 + //TODO 必须设置用户头像
  188 + //OpenInstall用户注册统计
  189 +// OpenInstall.reportRegister();
  190 + //友盟账号登录统计,暂时只有平台登录,后续对接三方登录
  191 +// MobclickAgent.onProfileSignIn("CNLive", user.getUid());
  192 + //三方登陆不需要重新设置头像 otherUserInfo不为空表示三方登陆
  193 + if (otherUserInfo != null) {
  194 + getView().showMainView(true, true);
  195 + } else {
  196 + getView().showEditView(false);
  197 + }
  198 +
  199 + } else {
  200 + //友盟账号登录统计,暂时只有平台登录,后续对接三方登录
  201 +// MobclickAgent.onProfileSignIn("CNLive", user.getUid());
  202 + getView().showMainView(false, false);
  203 + }
  204 + AppConfig.setCountryCode("");
  205 + AppConfig.setVerificationCode("");
  206 + AppConfig.setUserPhone("");
  207 + context.hasLogin = true;
  208 + if (context != null) context.isLogin = false;
  209 + }).setCancelCallback(() -> {
  210 + //取消操作可能被触发多次 ,根据页面逻辑选择使用
  211 + context.hasLogin = false;
  212 + if (context != null) context.isLogin = false;
  213 + });
  214 + }
  215 +
  216 + public void cancelLoad() {
  217 + if (event != null) {
  218 + event.cencel();
  219 + event = null;
  220 + }
  221 + }
  222 +
  223 + /**
  224 + * 销毁
  225 + */
  226 + public void destroy() {
  227 + if (timerUtil != null) {
  228 + timerUtil.cancel();
  229 + }
  230 + if (event != null) {
  231 + event.cencel();
  232 + event = null;
  233 + }
  234 + if (otherEvent != null) otherEvent.cencel();
  235 + }
  236 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/presenter/SelectCountryPresenter.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/presenter/SelectCountryPresenter.java
  1 +package com.cnlive.strike.moudle.user.frame.presenter;
  2 +
  3 +import com.cnlive.strike.moudle.user.frame.view.SelectCountryView;
  4 +import com.cnlive.strike.moudle.user.model.CountryData;
  5 +import com.cnlive.strike.moudle.user.ui.activity.SelectCountryActivity;
  6 +import com.google.gson.Gson;
  7 +import com.google.gson.reflect.TypeToken;
  8 +import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
  9 +
  10 +import java.lang.reflect.Type;
  11 +import java.util.ArrayList;
  12 +import java.util.List;
  13 +
  14 +import io.reactivex.Observable;
  15 +import io.reactivex.ObservableEmitter;
  16 +import io.reactivex.ObservableOnSubscribe;
  17 +import io.reactivex.Observer;
  18 +import io.reactivex.android.schedulers.AndroidSchedulers;
  19 +import io.reactivex.disposables.Disposable;
  20 +import io.reactivex.schedulers.Schedulers;
  21 +
  22 +/**
  23 + * 作者: 吴奎庆
  24 + * <p>
  25 + * 时间: 2018/11/17
  26 + * <p>
  27 + * 简介:
  28 + */
  29 +public class SelectCountryPresenter extends MvpBasePresenter<SelectCountryView> {
  30 + public void processData(SelectCountryActivity countryActivity, String countryCode) {
  31 +
  32 +
  33 + Observable.create(new ObservableOnSubscribe<List<CountryData>>() {
  34 + @Override
  35 + public void subscribe(ObservableEmitter<List<CountryData>> emitter) throws Exception {
  36 + String country = "[{\"contryName\":\"阿尔巴尼亚\",\"contryCode\":\"355\"},{\"contryName\":\"阿尔及利亚\",\"contryCode\":\"213\"},{\"contryName\":\"阿富汗\",\"contryCode\":\"93\"},{\"contryName\":\"阿根廷\",\"contryCode\":\"54\"},{\"contryName\":\"阿拉伯联合酋长国\",\"contryCode\":\"971\"},{\"contryName\":\"阿鲁巴\",\"contryCode\":\"297\"},{\"contryName\":\"阿曼\",\"contryCode\":\"968\"},{\"contryName\":\"阿塞拜疆\",\"contryCode\":\"994\"},{\"contryName\":\"埃及\",\"contryCode\":\"20\"},{\"contryName\":\"埃塞俄比亚\",\"contryCode\":\"251\"},{\"contryName\":\"爱尔兰\",\"contryCode\":\"353\"},{\"contryName\":\"爱沙尼亚\",\"contryCode\":\"372\"},{\"contryName\":\"安道尔\",\"contryCode\":\"376\"},{\"contryName\":\"安哥拉\",\"contryCode\":\"244\"},{\"contryName\":\"安圭拉\",\"contryCode\":\"1264\"},{\"contryName\":\"安提瓜和巴布达\",\"contryCode\":\"1268\"},{\"contryName\":\"奥地利\",\"contryCode\":\"43\"},{\"contryName\":\"澳大利亚\",\"contryCode\":\"61\"},{\"contryName\":\"巴巴多斯\",\"contryCode\":\"1246\"},{\"contryName\":\"巴布亚新几内亚\",\"contryCode\":\"675\"},{\"contryName\":\"巴哈马\",\"contryCode\":\"1242\"},{\"contryName\":\"巴基斯坦\",\"contryCode\":\"92\"},{\"contryName\":\"巴拉圭\",\"contryCode\":\"595\"},{\"contryName\":\"巴林\",\"contryCode\":\"973\"},{\"contryName\":\"巴拿马\",\"contryCode\":\"507\"},{\"contryName\":\"巴西\",\"contryCode\":\"55\"},{\"contryName\":\"白俄罗斯\",\"contryCode\":\"375\"},{\"contryName\":\"百慕大群岛\",\"contryCode\":\"1441\"},{\"contryName\":\"保加利亚\",\"contryCode\":\"359\"},{\"contryName\":\"贝宁\",\"contryCode\":\"229\"},{\"contryName\":\"比利时\",\"contryCode\":\"32\"},{\"contryName\":\"冰岛\",\"contryCode\":\"354\"},{\"contryName\":\"波多黎各\",\"contryCode\":\"1787\"},{\"contryName\":\"波兰\",\"contryCode\":\"48\"},{\"contryName\":\"波斯尼亚和黑塞哥维那\",\"contryCode\":\"387\"},{\"contryName\":\"玻利维亚\",\"contryCode\":\"591\"},{\"contryName\":\"伯利兹\",\"contryCode\":\"501\"},{\"contryName\":\"博茨瓦纳\",\"contryCode\":\"267\"},{\"contryName\":\"不丹\",\"contryCode\":\"975\"},{\"contryName\":\"布基纳法索\",\"contryCode\":\"226\"},{\"contryName\":\"布隆迪\",\"contryCode\":\"257\"},{\"contryName\":\"朝鲜\",\"contryCode\":\"850\"},{\"contryName\":\"赤道几内亚\",\"contryCode\":\"240\"},{\"contryName\":\"丹麦\",\"contryCode\":\"45\"},{\"contryName\":\"德国\",\"contryCode\":\"49\"},{\"contryName\":\"东帝汶\",\"contryCode\":\"670\"},{\"contryName\":\"多哥\",\"contryCode\":\"228\"},{\"contryName\":\"多米尼加\",\"contryCode\":\"1767\"},{\"contryName\":\"多米尼加共和国\",\"contryCode\":\"1809\"},{\"contryName\":\"俄罗斯\",\"contryCode\":\"7\"},{\"contryName\":\"厄瓜多尔\",\"contryCode\":\"593\"},{\"contryName\":\"厄立特里亚\",\"contryCode\":\"291\"},{\"contryName\":\"法国\",\"contryCode\":\"33\"},{\"contryName\":\"法罗群岛\",\"contryCode\":\"298\"},{\"contryName\":\"法属波利尼西亚\",\"contryCode\":\"689\"},{\"contryName\":\"法属圭亚那\",\"contryCode\":\"594\"},{\"contryName\":\"菲律宾\",\"contryCode\":\"63\"},{\"contryName\":\"斐济\",\"contryCode\":\"679\"},{\"contryName\":\"芬兰\",\"contryCode\":\"358\"},{\"contryName\":\"冈比亚\",\"contryCode\":\"220\"},{\"contryName\":\"刚果共和国\",\"contryCode\":\"242\"},{\"contryName\":\"刚果民主共和国\",\"contryCode\":\"243\"},{\"contryName\":\"哥伦比亚\",\"contryCode\":\"57\"},{\"contryName\":\"哥斯达黎加\",\"contryCode\":\"506\"},{\"contryName\":\"格林纳达\",\"contryCode\":\"1473\"},{\"contryName\":\"格陵兰岛\",\"contryCode\":\"299\"},{\"contryName\":\"格鲁吉亚\",\"contryCode\":\"995\"},{\"contryName\":\"古巴\",\"contryCode\":\"53\"},{\"contryName\":\"瓜德罗普岛\",\"contryCode\":\"590\"},{\"contryName\":\"瓜地马拉\",\"contryCode\":\"502\"},{\"contryName\":\"关岛\",\"contryCode\":\"1671\"},{\"contryName\":\"圭亚那\",\"contryCode\":\"592\"},{\"contryName\":\"哈萨克斯坦\",\"contryCode\":\"7\"},{\"contryName\":\"海地\",\"contryCode\":\"509\"},{\"contryName\":\"韩国\",\"contryCode\":\"82\"},{\"contryName\":\"荷兰\",\"contryCode\":\"31\"},{\"contryName\":\"荷兰加勒比\",\"contryCode\":\"599\"},{\"contryName\":\"黑山\",\"contryCode\":\"382\"},{\"contryName\":\"洪都拉斯\",\"contryCode\":\"504\"},{\"contryName\":\"基里巴斯\",\"contryCode\":\"686\"},{\"contryName\":\"吉布提\",\"contryCode\":\"253\"},{\"contryName\":\"吉尔吉斯斯坦\",\"contryCode\":\"996\"},{\"contryName\":\"几内亚\",\"contryCode\":\"224\"},{\"contryName\":\"几内亚比绍共和国\",\"contryCode\":\"245\"},{\"contryName\":\"加拿大\",\"contryCode\":\"1\"},{\"contryName\":\"加纳\",\"contryCode\":\"233\"},{\"contryName\":\"加蓬\",\"contryCode\":\"241\"},{\"contryName\":\"柬埔寨\",\"contryCode\":\"855\"},{\"contryName\":\"捷克\",\"contryCode\":\"420\"},{\"contryName\":\"津巴布韦\",\"contryCode\":\"263\"},{\"contryName\":\"喀麦隆\",\"contryCode\":\"237\"},{\"contryName\":\"卡塔尔\",\"contryCode\":\"974\"},{\"contryName\":\"开曼群岛\",\"contryCode\":\"1345\"},{\"contryName\":\"开普\",\"contryCode\":\"238\"},{\"contryName\":\"科摩罗\",\"contryCode\":\"269\"},{\"contryName\":\"科威特\",\"contryCode\":\"965\"},{\"contryName\":\"克罗地亚\",\"contryCode\":\"385\"},{\"contryName\":\"肯尼亚\",\"contryCode\":\"254\"},{\"contryName\":\"库克群岛\",\"contryCode\":\"682\"},{\"contryName\":\"库拉索\",\"contryCode\":\"599\"},{\"contryName\":\"拉脱维亚\",\"contryCode\":\"371\"},{\"contryName\":\"莱索托\",\"contryCode\":\"266\"},{\"contryName\":\"老挝\",\"contryCode\":\"856\"},{\"contryName\":\"黎巴嫩\",\"contryCode\":\"961\"},{\"contryName\":\"立陶宛\",\"contryCode\":\"370\"},{\"contryName\":\"利比里亚\",\"contryCode\":\"231\"},{\"contryName\":\"利比亚\",\"contryCode\":\"218\"},{\"contryName\":\"列支敦士登\",\"contryCode\":\"423\"},{\"contryName\":\"留尼汪\",\"contryCode\":\"262\"},{\"contryName\":\"卢森堡\",\"contryCode\":\"352\"},{\"contryName\":\"卢旺达\",\"contryCode\":\"250\"},{\"contryName\":\"罗马尼亚\",\"contryCode\":\"40\"},{\"contryName\":\"马达加斯加\",\"contryCode\":\"261\"},{\"contryName\":\"马尔代夫\",\"contryCode\":\"960\"},{\"contryName\":\"马耳他\",\"contryCode\":\"356\"},{\"contryName\":\"马拉维\",\"contryCode\":\"265\"},{\"contryName\":\"马来西亚\",\"contryCode\":\"60\"},{\"contryName\":\"马里\",\"contryCode\":\"223\"},{\"contryName\":\"马其顿\",\"contryCode\":\"389\"},{\"contryName\":\"马绍尔群岛\",\"contryCode\":\"692\"},{\"contryName\":\"马约特\",\"contryCode\":\"269\"},{\"contryName\":\"毛里求斯\",\"contryCode\":\"230\"},{\"contryName\":\"毛里塔尼亚\",\"contryCode\":\"222\"},{\"contryName\":\"美国\",\"contryCode\":\"1\"},{\"contryName\":\"美属萨摩亚\",\"contryCode\":\"1684\"},{\"contryName\":\"蒙古\",\"contryCode\":\"976\"},{\"contryName\":\"蒙特塞拉特岛\",\"contryCode\":\"1664\"},{\"contryName\":\"孟加拉国\",\"contryCode\":\"880\"},{\"contryName\":\"秘鲁\",\"contryCode\":\"51\"},{\"contryName\":\"密克罗尼西亚\",\"contryCode\":\"691\"},{\"contryName\":\"缅甸\",\"contryCode\":\"95\"},{\"contryName\":\"摩尔多瓦\",\"contryCode\":\"373\"},{\"contryName\":\"摩洛哥\",\"contryCode\":\"212\"},{\"contryName\":\"摩纳哥\",\"contryCode\":\"377\"},{\"contryName\":\"莫桑比克\",\"contryCode\":\"258\"},{\"contryName\":\"墨西哥\",\"contryCode\":\"52\"},{\"contryName\":\"拿鲁岛\",\"contryCode\":\"674\"},{\"contryName\":\"纳米比亚\",\"contryCode\":\"264\"},{\"contryName\":\"南非\",\"contryCode\":\"27\"},{\"contryName\":\"尼泊尔\",\"contryCode\":\"977\"},{\"contryName\":\"尼加拉瓜\",\"contryCode\":\"505\"},{\"contryName\":\"尼日尔\",\"contryCode\":\"227\"},{\"contryName\":\"尼日利亚\",\"contryCode\":\"234\"},{\"contryName\":\"挪威\",\"contryCode\":\"47\"},{\"contryName\":\"帕劳\",\"contryCode\":\"680\"},{\"contryName\":\"葡萄牙\",\"contryCode\":\"351\"},{\"contryName\":\"日本\",\"contryCode\":\"81\"},{\"contryName\":\"瑞典\",\"contryCode\":\"46\"},{\"contryName\":\"瑞士\",\"contryCode\":\"41\"},{\"contryName\":\"萨尔瓦多\",\"contryCode\":\"503\"},{\"contryName\":\"萨摩亚\",\"contryCode\":\"685\"},{\"contryName\":\"塞尔维亚\",\"contryCode\":\"381\"},{\"contryName\":\"塞拉利昂\",\"contryCode\":\"232\"},{\"contryName\":\"塞内加尔\",\"contryCode\":\"221\"},{\"contryName\":\"塞浦路斯\",\"contryCode\":\"357\"},{\"contryName\":\"塞舌尔\",\"contryCode\":\"248\"},{\"contryName\":\"沙特阿拉伯\",\"contryCode\":\"966\"},{\"contryName\":\"圣彼埃尔和密克隆岛\",\"contryCode\":\"508\"},{\"contryName\":\"圣多美和普林西比\",\"contryCode\":\"239\"},{\"contryName\":\"圣基茨和尼维斯\",\"contryCode\":\"1869\"},{\"contryName\":\"圣露西亚\",\"contryCode\":\"1758\"},{\"contryName\":\"圣马力诺\",\"contryCode\":\"378\"},{\"contryName\":\"圣文森特和格林纳丁斯\",\"contryCode\":\"1784\"},{\"contryName\":\"斯里兰卡\",\"contryCode\":\"94\"},{\"contryName\":\"斯洛伐克\",\"contryCode\":\"421\"},{\"contryName\":\"斯洛文尼亚\",\"contryCode\":\"386\"},{\"contryName\":\"斯威士兰\",\"contryCode\":\"268\"},{\"contryName\":\"苏丹\",\"contryCode\":\"249\"},{\"contryName\":\"苏里南\",\"contryCode\":\"597\"},{\"contryName\":\"所罗门群岛\",\"contryCode\":\"677\"},{\"contryName\":\"索马里\",\"contryCode\":\"252\"},{\"contryName\":\"塔吉克斯坦\",\"contryCode\":\"992\"},{\"contryName\":\"泰国\",\"contryCode\":\"66\"},{\"contryName\":\"坦桑尼亚\",\"contryCode\":\"255\"},{\"contryName\":\"汤加\",\"contryCode\":\"676\"},{\"contryName\":\"特克斯和凯科斯群岛\",\"contryCode\":\"1649\"},{\"contryName\":\"特立尼达和多巴哥\",\"contryCode\":\"1868\"},{\"contryName\":\"突尼斯\",\"contryCode\":\"216\"},{\"contryName\":\"土耳其\",\"contryCode\":\"90\"},{\"contryName\":\"土库曼斯坦\",\"contryCode\":\"993\"},{\"contryName\":\"瓦努阿图\",\"contryCode\":\"678\"},{\"contryName\":\"委内瑞拉\",\"contryCode\":\"58\"},{\"contryName\":\"文莱\",\"contryCode\":\"673\"},{\"contryName\":\"乌干达\",\"contryCode\":\"256\"},{\"contryName\":\"乌克兰\",\"contryCode\":\"380\"},{\"contryName\":\"乌拉圭\",\"contryCode\":\"598\"},{\"contryName\":\"乌兹别克斯坦\",\"contryCode\":\"998\"},{\"contryName\":\"西班牙\",\"contryCode\":\"34\"},{\"contryName\":\"希腊\",\"contryCode\":\"30\"},{\"contryName\":\"象牙海岸\",\"contryCode\":\"225\"},{\"contryName\":\"新加坡\",\"contryCode\":\"65\"},{\"contryName\":\"新喀里多尼亚\",\"contryCode\":\"687\"},{\"contryName\":\"新西兰\",\"contryCode\":\"64\"},{\"contryName\":\"匈牙利\",\"contryCode\":\"36\"},{\"contryName\":\"叙利亚\",\"contryCode\":\"963\"},{\"contryName\":\"牙买加\",\"contryCode\":\"1876\"},{\"contryName\":\"亚美尼亚\",\"contryCode\":\"374\"},{\"contryName\":\"也门\",\"contryCode\":\"967\"},{\"contryName\":\"伊拉克\",\"contryCode\":\"964\"},{\"contryName\":\"伊朗\",\"contryCode\":\"98\"},{\"contryName\":\"以色列\",\"contryCode\":\"972\"},{\"contryName\":\"意大利\",\"contryCode\":\"39\"},{\"contryName\":\"印度\",\"contryCode\":\"91\"},{\"contryName\":\"印度尼西亚\",\"contryCode\":\"62\"},{\"contryName\":\"英国\",\"contryCode\":\"44\"},{\"contryName\":\"英属处女群岛\",\"contryCode\":\"1284\"},{\"contryName\":\"约旦\",\"contryCode\":\"962\"},{\"contryName\":\"越南\",\"contryCode\":\"84\"},{\"contryName\":\"赞比亚\",\"contryCode\":\"260\"},{\"contryName\":\"乍得\",\"contryCode\":\"235\"},{\"contryName\":\"直布罗陀\",\"contryCode\":\"350\"},{\"contryName\":\"智利\",\"contryCode\":\"56\"},{\"contryName\":\"中非共和国\",\"contryCode\":\"236\"},{\"contryName\":\"中国(澳门)\",\"contryCode\":\"853\"},{\"contryName\":\"中国(台湾)\",\"contryCode\":\"886\"},{\"contryName\":\"中国(香港)\",\"contryCode\":\"852\"},{\"contryName\":\"中国\",\"contryCode\":\"86\"}]";
  37 +
  38 + Gson gson = new Gson();
  39 + Type type = new TypeToken<List<CountryData>>() {
  40 + }.getType();
  41 + List<CountryData> countryDataList = gson.fromJson(country, type);
  42 + countryDataList.size();
  43 + //处理数据 设置Letter
  44 + for (CountryData countryData : countryDataList) {
  45 + countryData.setLetterContent(countryData.getContryName());
  46 + }
  47 + //处理数据
  48 + String letter = "";
  49 + List<CountryData> newList = new ArrayList<>();
  50 + for (CountryData data : countryDataList) {
  51 + if (!letter.equals(data.getLetter().substring(0, 1))) {
  52 + letter = data.getLetter().substring(0, 1);
  53 + CountryData newBean = new CountryData();
  54 + newBean.setLetter(letter);
  55 + newBean.setType(CountryData.TYPE_CATGORY);
  56 + newList.add(newBean);
  57 + countryActivity.contactLetterGuideMap.put(letter, newList.size());
  58 + }
  59 +
  60 + data.setType(CountryData.TYPE_COUNTRY);
  61 + newList.add(data);
  62 + if (countryCode.equals(data.getContryCode())){
  63 + data.setSelect(true);
  64 + countryActivity.fistPosition=newList.indexOf(data);
  65 + }else {
  66 + data.setSelect(false);
  67 + }
  68 + }
  69 + if (emitter != null && newList != null) {
  70 + emitter.onNext(newList);
  71 + }
  72 + }
  73 + }).subscribeOn(Schedulers.io())
  74 + .observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<List<CountryData>>() {
  75 + @Override
  76 + public void onSubscribe(Disposable d) {
  77 +
  78 + }
  79 +
  80 + @Override
  81 + public void onNext(List<CountryData> countryData) {
  82 + if (getView()!=null)getView().showView(countryData);
  83 + }
  84 +
  85 + @Override
  86 + public void onError(Throwable e) {
  87 +
  88 + }
  89 +
  90 + @Override
  91 + public void onComplete() {
  92 +
  93 + }
  94 + });
  95 + }
  96 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/view/BindPhoneNumberView.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/view/BindPhoneNumberView.java
  1 +package com.cnlive.strike.moudle.user.frame.view;
  2 +
  3 +import android.content.Intent;
  4 +import android.net.Uri;
  5 +import android.text.Spannable;
  6 +import android.text.SpannableStringBuilder;
  7 +import android.text.TextPaint;
  8 +import android.text.TextUtils;
  9 +import android.text.method.LinkMovementMethod;
  10 +import android.text.style.ClickableSpan;
  11 +import android.text.style.ForegroundColorSpan;
  12 +import android.util.Log;
  13 +import android.view.View;
  14 +
  15 +import com.alibaba.android.arouter.launcher.ARouter;
  16 +import com.cnlive.libs.base.util.AlertUtil;
  17 +import com.cnlive.libs.base.util.DoublePressed;
  18 +import com.cnlive.libs.base.util.StatusBarUtil;
  19 +import com.cnlive.libs.base.util.StatusBarUtil2;
  20 +import com.cnlive.strike.moudle.user.model.LoginSuccessInfo;
  21 +import com.cnlive.strike.moudle.user.model.msg.UserEventMsg;
  22 +import com.cnlive.strike.moudle.user.ui.activity.BindPhoneNumberActivity;
  23 +import com.cnlive.strike.moudle.user.ui.activity.FirstLoginActivity;
  24 +import com.cnlive.strike.moudle.user.ui.activity.LoginActivity;
  25 +import com.cnlive.strike.moudle.user.ui.activity.MainTestActivity;
  26 +import com.cnlive.strike.moudle_user.R;
  27 +import com.cnlive.strike.myinterfacce.IUSERAPI;
  28 +import com.cnlive.strike.myinterfacce.IUserLoginFactory;
  29 +import com.cnlive.strike.router.user.UserAction;
  30 +import com.hannesdorfmann.mosby3.mvp.MvpView;
  31 +import com.qmuiteam.qmui.widget.QMUITopBar;
  32 +
  33 +import org.greenrobot.eventbus.EventBus;
  34 +
  35 +/**
  36 + * 作者: 吴奎庆
  37 + * <p>
  38 + * 时间: 2019/9/9
  39 + * <p>
  40 + * 简介:
  41 + */
  42 +public class BindPhoneNumberView implements MvpView {
  43 + BindPhoneNumberActivity mActivity;
  44 + private IUSERAPI userApi;
  45 +
  46 + public BindPhoneNumberView(BindPhoneNumberActivity activity) {
  47 + mActivity = activity;
  48 + userApi = IUserLoginFactory.createWXAPI(activity);
  49 + }
  50 +
  51 + String al = "确定后,此%s将与网家家账号绑定";
  52 +
  53 + public void initView() {
  54 + StatusBarUtil.setStatusBarWrite(mActivity);
  55 + StatusBarUtil2.setColor(mActivity, mActivity.getResources().getColor(R.color.color_fff), 0);
  56 + QMUITopBar toolbar = (QMUITopBar) mActivity.binding.includeToolbar;
  57 + toolbar.setTitle("绑定手机号");
  58 + toolbar.setBackgroundColor(mActivity.getResources().getColor(R.color.white));
  59 + toolbar.addLeftImageButton(R.drawable.back_black, R.id.qmui_topbar_item_left_back).setOnClickListener(new View.OnClickListener() {
  60 + @Override
  61 + public void onClick(View v) {
  62 + mActivity.finish();
  63 + }
  64 + });
  65 + switch (mActivity.otherUserInfo.getLoginType()) {
  66 +
  67 + case "1":
  68 + //sina
  69 + mActivity.binding.ivThree.setBackgroundResource(R.drawable.iv_bind_wb);
  70 + mActivity.binding.tvThree.setText("微博");
  71 +
  72 + String weibos = String.format(al, "微博账号");
  73 + mActivity.binding.tvBind.setText(weibos);
  74 +
  75 +// 微博账号
  76 + break;
  77 + case "2":
  78 + //qq
  79 + mActivity.binding.ivThree.setBackgroundResource(R.drawable.iv_bind_qq);
  80 + mActivity.binding.tvThree.setText("QQ");
  81 + String qqs = String.format(al, "QQ账号");
  82 + mActivity.binding.tvBind.setText(qqs);
  83 + break;
  84 + case "3":
  85 + //wechat
  86 + mActivity.binding.ivThree.setBackgroundResource(R.drawable.iv_bind_wechat);
  87 + mActivity.binding.tvThree.setText("微信");
  88 +
  89 + String wechats = String.format(al, "微信账号");
  90 + mActivity.binding.tvBind.setText(wechats);
  91 + break;
  92 +
  93 + }
  94 + String textContent = "已阅读并同意《账户绑定确认书(网家家)》";
  95 + SpannableStringBuilder ssb = new SpannableStringBuilder(textContent);
  96 + ssb.setSpan(new ClickableSpan() {
  97 + @Override
  98 + public void onClick(View widget) {
  99 + if (mActivity != null && DoublePressed.onDoublePressed()) {
  100 + startWebView("sfdlxy");
  101 + }
  102 + }
  103 +
  104 + @Override
  105 + public void updateDrawState(TextPaint ds) {
  106 + ds.setUnderlineText(false);
  107 + }
  108 + }, 7, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  109 +
  110 + ssb.setSpan(new ForegroundColorSpan(mActivity.getResources().getColor(R.color.color_23d41e)), 7, 19, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
  111 + mActivity.binding.tvAgreement.setMovementMethod(LinkMovementMethod.getInstance());
  112 + mActivity.binding.tvAgreement.setText(ssb);
  113 + mActivity.binding.tvVc.setOnClickListener(mActivity);
  114 + mActivity.binding.llCountry.setOnClickListener(mActivity);
  115 + mActivity.binding.login.setOnClickListener(mActivity);
  116 + mActivity.binding.tvCountry.setText("+ " + mActivity.countryCode);
  117 + mActivity.binding.tvCountryName.setText(mActivity.countryName);
  118 + }
  119 +
  120 + private void startWebView(String type) {
  121 + Log.e("csc", "startWebView: ");
  122 +// WWebView wWebView = new WWebView.Builder()
  123 +// .urlType(type)
  124 +// .isOther(true)
  125 +// .enableTitle(false)
  126 +// .enableJump(true)
  127 +// .enableRefresh(false)
  128 +// .enableImageLongClick(false)
  129 +// .builder();
  130 +// wWebView.startWebViewActivity(mActivity);
  131 +
  132 + ARouter.getInstance().build("/web/WebViewActivity")
  133 + .withString("rUrlType", type)
  134 + .withBoolean("rIsOther", true)
  135 + .withBoolean("rEnableTitle", false)
  136 + .withBoolean("rEnableJump", true)
  137 + .withBoolean("rEnableRefresh", false)
  138 + .withBoolean("rEnableImageLongClick", false)
  139 + .navigation(mActivity);
  140 + }
  141 +
  142 +
  143 + public void showMessage(String message) {
  144 + if (mActivity == null || TextUtils.isEmpty(message)) return;
  145 + AlertUtil.showDeftToast(mActivity, message);
  146 + }
  147 +
  148 + public void onTimerFinish() {
  149 + mActivity.binding.tvVc.setText("获取验证码");
  150 + mActivity.binding.tvVc.setTextColor(mActivity.getResources().getColor(R.color.color_23d41e));
  151 + }
  152 +
  153 + private static final String time_format = "已发送 | %ss";
  154 +
  155 + public void onTimerInterval(long l) {
  156 + String text = String.format(time_format, (int) l);
  157 + mActivity.binding.tvVc.setText(text);
  158 + mActivity.binding.tvVc.setTextColor(mActivity.getResources().getColor(R.color.color_999));
  159 + }
  160 +
  161 + public void showEditView() {
  162 + if (mActivity == null) return;
  163 + Intent intent = new Intent(mActivity, FirstLoginActivity.class);
  164 + intent.putExtra(mActivity.TAG_CLICK_AD, mActivity.clickAd);
  165 + intent.putExtra(LoginActivity.TAG_MSG, TextUtils.isEmpty(mActivity.tagMsg) ? "" : mActivity.tagMsg);
  166 + mActivity.startActivity(intent);
  167 + mActivity.finish();
  168 + }
  169 +
  170 + public void showMainView() {
  171 + if (mActivity == null) return;
  172 + //判断如果是因为token为空跳转到的登录页面则不需要跳转到MainActivity,直接关闭登录页面即可
  173 + if (mActivity.fromTokenError) {
  174 + mActivity.finish();
  175 + return;
  176 + }
  177 + Uri uri = UserAction.getUri(mActivity);
  178 +
  179 + //设置跳转信息
  180 + LoginSuccessInfo successInfo = new LoginSuccessInfo();
  181 + successInfo.setType("login");
  182 + successInfo.setUri(uri);
  183 + successInfo.setClickAd(mActivity.clickAd);
  184 + successInfo.setTagShare(mActivity.tagShare);
  185 + successInfo.setTagMsg(mActivity.tagMsg);
  186 + EventBus.getDefault().post(new UserEventMsg(UserEventMsg.LOGIN_SUCCESS, successInfo));
  187 +
  188 + if (null != userApi) {
  189 + userApi.showMainView(successInfo);
  190 + }
  191 + Intent intent = new Intent(mActivity, MainTestActivity.class);
  192 + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
  193 + intent.putExtra("type", "login");
  194 + intent.putExtra("uri", uri);
  195 + intent.putExtra("sharetype", mActivity.tagShare);
  196 + intent.putExtra(mActivity.TAG_CLICK_AD, mActivity.clickAd);
  197 + if (!TextUtils.isEmpty(mActivity.tagMsg))
  198 + intent.putExtra("classifyTagMsg", mActivity.tagMsg);
  199 + mActivity.startActivity(intent);
  200 + }
  201 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/view/FirstLoginView.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/view/FirstLoginView.java
  1 +package com.cnlive.strike.moudle.user.frame.view;
  2 +
  3 +import android.app.Activity;
  4 +import android.content.Context;
  5 +import android.content.Intent;
  6 +import android.text.TextUtils;
  7 +
  8 +import com.cnlive.core.user.R;
  9 +import com.cnlive.libs.base.util.AlertUtil;
  10 +import com.cnlive.libs.base.util.GlideUtil;
  11 +import com.cnlive.strike.moudle.mian.ui.widget.TokenErrorDialog;
  12 +import com.cnlive.strike.moudle.user.frame.IFirstLoginView;
  13 +import com.cnlive.strike.moudle.user.model.LoginSuccessInfo;
  14 +import com.cnlive.strike.moudle.user.model.msg.UserEventMsg;
  15 +import com.cnlive.strike.moudle.user.ui.activity.FirstLoginActivity;
  16 +import com.cnlive.strike.moudle.user.ui.activity.MainTestActivity;
  17 +import com.cnlive.strike.moudle.user.ui.fragment.FirstLoginFragment;
  18 +
  19 +import org.greenrobot.eventbus.EventBus;
  20 +
  21 +/**
  22 + * Created by xiansong on 2018/1/19.
  23 + */
  24 +
  25 +public class FirstLoginView implements IFirstLoginView {
  26 + private FirstLoginFragment fragment;
  27 +
  28 + public FirstLoginView(FirstLoginFragment fragment) {
  29 + this.fragment = fragment;
  30 + }
  31 +
  32 + private Activity getContext() {
  33 + return fragment.getActivity();
  34 + }
  35 +
  36 + public void showToast(String msg) {
  37 + if (getContext() == null) return;
  38 + Context context = getContext();
  39 + AlertUtil.showDeftToast(context, msg);
  40 + }
  41 +
  42 + public void showProgress(int stringId) {
  43 + if (!fragment.mProgressDialog.isShowing()) {
  44 + String tag = getContext().getString(stringId);
  45 + fragment.mProgressDialog.setMessage(tag);
  46 + fragment.mProgressDialog.show();
  47 + }
  48 + }
  49 +
  50 + public void hideProgress() {
  51 + if (fragment.mProgressDialog.isShowing()) fragment.mProgressDialog.dismiss();
  52 + }
  53 +
  54 + public void photoChange(String faceUrl) {
  55 + if (getContext() == null) return;
  56 + GlideUtil.init(fragment, faceUrl).error(R.drawable.touxiang_circle).circleCrop().into(fragment.binding.ivUserIcon);
  57 + }
  58 +
  59 + public void showMainPage() {
  60 + if (getContext() == null) return;
  61 + //设置跳转信息
  62 + LoginSuccessInfo successInfo = new LoginSuccessInfo();
  63 + successInfo.setClickAd(fragment.clickAd);
  64 + successInfo.setTagMsg(fragment.tagMsg);
  65 + EventBus.getDefault().post(new UserEventMsg(UserEventMsg.LOGIN_SUCCESS, successInfo));
  66 +
  67 +
  68 +
  69 + Intent intent = new Intent(getContext(), MainTestActivity.class);
  70 + if (!TextUtils.isEmpty(fragment.tagMsg))
  71 + intent.putExtra("classifyTagMsg", fragment.tagMsg);
  72 +
  73 + intent.putExtra(FirstLoginActivity.TAG_CLICK_AD, fragment.clickAd);
  74 + getContext().startActivity(intent);
  75 + getContext().finish();
  76 + }
  77 +
  78 + public void showTokenErrorDialog() {
  79 + if (fragment.tokenErrorDialog != null)
  80 + fragment.tokenErrorDialog.dismiss();
  81 + fragment.tokenErrorDialog = TokenErrorDialog.showTokenErrorDialog(fragment.getActivity());
  82 + }
  83 +
  84 +
  85 +}
cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/view/PersonalDataView.java 0 → 100644
  1 +++ a/cloud/user/src/main/java/com/cnlive/strike/moudle/user/frame/view/PersonalDataView.java
  1 +package com.cnlive.strike.moudle.user.frame.view;
  2 +
  3 +import android.text.TextUtils;
  4 +
  5 +import com.bumptech.glide.Priority;
  6 +import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
  7 +import com.bumptech.glide.request.RequestOptions;
  8 +import com.cnlive.core.user.R;
  9 +import com.cnlive.libs.base.util.AlertUtil;
  10 +import com.cnlive.libs.base.util.GlideUtil;
  11 +import com.cnlive.strike.moudle.mian.ui.widget.TokenErrorDialog;
  12 +import com.cnlive.strike.moudle.user.ui.activity.PersonalDataActivity;
  13 +import com.cnlive.strike.user.auth.UserService;
  14 +import com.cnlive.strike.user.model.CNLiveUserInfo;
  15 +import com.hannesdorfmann.mosby3.mvp.MvpView;
  16 +
  17 +import static com.bumptech.glide.request.RequestOptions.bitmapTransform;
  18 +
  19 +/**
  20 + * 创建:wukuiqing
  21 + * <p>
  22 + * 时间:2018/3/22
  23 + * <p>
  24 + * 描述:
  25 + */
  26 +public class PersonalDataView implements MvpView {
  27 + PersonalDataActivity activity;
  28 +
  29 + public PersonalDataView(PersonalDataActivity activity) {
  30 + this.activity = activity;
  31 + }
  32 +
  33 + public void setView(UserService userService) {
  34 + CNLiveUserInfo info = userService == null ? null : userService.getAppAccount();
  35 + if (info == null) return;
  36 + activity.binding.tvName.setText(info.getNickName());
  37 + if ("m".equals(info.getGender())) {
  38 + activity.binding.tvSex.setText("男");
  39 + } else if ("f".equals(info.getGender())) {
  40 + activity.binding.tvSex.setText("女");
  41 + } else {
  42 + activity.binding.tvSex.setText("男");
  43 + }
  44 +
  45 + String location = info.getLocation();
  46 + activity.binding.tvWhere.setText(TextUtils.isEmpty(location) ? "中国" : location);
  47 +
  48 + RequestOptions options = bitmapTransform(new RoundedCorners(10))
  49 + .placeholder(R.drawable.touxiang_round)
  50 + .error(R.drawable.touxiang_round)
  51 + .priority(Priority.HIGH);
  52 + if (TextUtils.isEmpty(info.getFaceUrl())) {
  53 + GlideUtil.into(activity.binding.ivIcon, "http://wjj.ys1.cnliveimg.com/admin/test/head.png", options);
  54 + } else {
  55 + GlideUtil.into(activity.binding.ivIcon, info.getFaceUrl(), options);
  56 + }
  57 +
  58 + if (!TextUtils.isEmpty(info.getUserSign())) {
  59 + activity.binding.tvAutograph.setText(info.getUserSign());
  60 + }
  61 + }
  62 +
  63 + public void upDataSex(String value) {
  64 + if ("m".equals(value)) {
  65 + activity.binding.tvSex.setText("男");
  66 + } else if ("f".equals(value)) {
  67 + activity.binding.tvSex.setText("女");
  68 + } else {
  69 + activity.binding.tvSex.setText("其他");
  70 + }
  71 + }
  72 +
  73 + public void upDataNickName(String value) {
  74 + activity.binding.tvName.setText(value);
  75 + }
  76 +
  77 + public void upDataLocation(String value) {
  78 + activity.binding.tvWhere.setText(value);
  79 + }
  80 +
  81 + public void upSignature(String value) {
  82 + activity.binding.tvAutograph.setText(value);
  83 + }
  84 +
  85 + public void showMessage(String s) {
  86 + if (activity == null) return;
  87 +
  88 + AlertUtil.showDeftToast(activity, s);
  89 + }
  90 +
  91 + public void showTokenErrorDialog() {
  92 + if (activity.tokenErrorDialog != null)
  93 + activity.tokenErrorDialog.dismiss();
  94 + activity.tokenErrorDialog = TokenErrorDialog.showTokenErrorDialog(activity);
  95 + }
  96 +
  97 +
  98 +}