Commit 22a28a6eddbee90bc5abafdbe7deb6b450a2e62c
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
.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 | 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 | 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 | 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 | 13 | \ No newline at end of file | ... | ... |
app/strike/.gitignore
0 → 100644
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 | 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
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 | 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
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 | 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
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
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 | 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 | 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 | 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 | 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 | 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 | 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 | ||
| 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 | ||
| 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 | +} | ... | ... |